"ext-xmlwriter": "*",
"apereo/phpcas": "^1.3",
"diogocomposer/xmpphp": "^3.0",
+ "embed/embed": "^3.4",
"ezyang/htmlpurifier": "^4.10",
"hoa/consistency": "^1.17.05.02",
"masterminds/html5": "^2.6",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "f84a3a1654cf40103976cea8b2365b8c",
+ "content-hash": "9dbe59b01bc30be42026849f1dafe00b",
"packages": [
{
"name": "apereo/phpcas",
],
"time": "2019-04-22T19:48:16+00:00"
},
+ {
+ "name": "composer/ca-bundle",
+ "version": "1.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/ca-bundle.git",
+ "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/558f321c52faeb4828c03e7dc0cfe39a09e09a2d",
+ "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "php": "^5.3.2 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
+ "psr/log": "^1.0",
+ "symfony/process": "^2.5 || ^3.0 || ^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\CaBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+ "keywords": [
+ "cabundle",
+ "cacert",
+ "certificate",
+ "ssl",
+ "tls"
+ ],
+ "time": "2019-01-28T09:30:10+00:00"
+ },
{
"name": "diogocomposer/xmpphp",
"version": "v3.0.0",
],
"time": "2019-06-19T02:32:32+00:00"
},
+ {
+ "name": "embed/embed",
+ "version": "v3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/oscarotero/Embed.git",
+ "reference": "5594b253dee90888c14cdca43696183c98f078e9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/oscarotero/Embed/zipball/5594b253dee90888c14cdca43696183c98f078e9",
+ "reference": "5594b253dee90888c14cdca43696183c98f078e9",
+ "shasum": ""
+ },
+ "require": {
+ "composer/ca-bundle": "^1.0",
+ "ext-curl": "*",
+ "ext-mbstring": "*",
+ "php": "^5.6|^7.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.0",
+ "phpunit/phpunit": "^4.8|^5.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Embed\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oscar Otero",
+ "email": "oom@oscarotero.com",
+ "homepage": "http://oscarotero.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP library to retrieve page info using oembed, opengraph, etc",
+ "homepage": "https://github.com/oscarotero/Embed",
+ "keywords": [
+ "embed",
+ "embedly",
+ "oembed",
+ "opengraph",
+ "twitter cards"
+ ],
+ "time": "2019-06-23T11:12:03+00:00"
+ },
{
"name": "ezyang/htmlpurifier",
- "version": "v4.10.0",
+ "version": "v4.11.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
- "reference": "d85d39da4576a6934b72480be6978fb10c860021"
+ "reference": "83ab08bc1af7d808a9e0fbf024f1c24bfd73c0a7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/d85d39da4576a6934b72480be6978fb10c860021",
- "reference": "d85d39da4576a6934b72480be6978fb10c860021",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/83ab08bc1af7d808a9e0fbf024f1c24bfd73c0a7",
+ "reference": "83ab08bc1af7d808a9e0fbf024f1c24bfd73c0a7",
"shasum": ""
},
"require": {
"php": ">=5.2"
},
"require-dev": {
- "simpletest/simpletest": "^1.1"
+ "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd"
},
"type": "library",
"autoload": {
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL"
+ "LGPL-2.1-or-later"
],
"authors": [
{
"keywords": [
"html"
],
- "time": "2018-02-23T01:58:20+00:00"
+ "time": "2019-07-14T18:58:38+00:00"
},
{
"name": "hoa/consistency",
-Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: Composer
-Upstream-Contact: Jordi Boggiano <j.boggiano@seld.be>
-Source: https://github.com/composer/composer
-Files: *
-Copyright: 2016, Nils Adermann <naderman@naderman.de>
- 2016, Jordi Boggiano <j.boggiano@seld.be>
-License: Expat
+Copyright (c) Nils Adermann, Jordi Boggiano
-Files: src/Composer/Util/TlsHelper.php
-Copyright: 2016, Nils Adermann <naderman@naderman.de>
- 2016, Jordi Boggiano <j.boggiano@seld.be>
- 2013, Evan Coury <me@evancoury.com>
-License: Expat and BSD-2-Clause
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
-License: BSD-2-Clause
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
- .
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- .
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- .
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
-License: Expat
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is furnished
- to do so, subject to the following conditions:
- .
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- .
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
'CAS_Request_MultiRequestInterface' => $vendorDir . '/apereo/phpcas/source/CAS/Request/MultiRequestInterface.php',
'CAS_Request_RequestInterface' => $vendorDir . '/apereo/phpcas/source/CAS/Request/RequestInterface.php',
'CAS_TypeMismatchException' => $vendorDir . '/apereo/phpcas/source/CAS/TypeMismatchException.php',
+ 'Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php',
'Console_Getopt' => $vendorDir . '/pear/console_getopt/Console/Getopt.php',
+ 'Embed\\Adapters\\Adapter' => $vendorDir . '/embed/embed/src/Adapters/Adapter.php',
+ 'Embed\\Adapters\\Archive' => $vendorDir . '/embed/embed/src/Adapters/Archive.php',
+ 'Embed\\Adapters\\Cadenaser' => $vendorDir . '/embed/embed/src/Adapters/Cadenaser.php',
+ 'Embed\\Adapters\\Carto' => $vendorDir . '/embed/embed/src/Adapters/Carto.php',
+ 'Embed\\Adapters\\Cnn' => $vendorDir . '/embed/embed/src/Adapters/Cnn.php',
+ 'Embed\\Adapters\\Facebook' => $vendorDir . '/embed/embed/src/Adapters/Facebook.php',
+ 'Embed\\Adapters\\File' => $vendorDir . '/embed/embed/src/Adapters/File.php',
+ 'Embed\\Adapters\\Flickr' => $vendorDir . '/embed/embed/src/Adapters/Flickr.php',
+ 'Embed\\Adapters\\Github' => $vendorDir . '/embed/embed/src/Adapters/Github.php',
+ 'Embed\\Adapters\\Google' => $vendorDir . '/embed/embed/src/Adapters/Google.php',
+ 'Embed\\Adapters\\Howcast' => $vendorDir . '/embed/embed/src/Adapters/Howcast.php',
+ 'Embed\\Adapters\\Ideone' => $vendorDir . '/embed/embed/src/Adapters/Ideone.php',
+ 'Embed\\Adapters\\Imageshack' => $vendorDir . '/embed/embed/src/Adapters/Imageshack.php',
+ 'Embed\\Adapters\\Jsfiddle' => $vendorDir . '/embed/embed/src/Adapters/Jsfiddle.php',
+ 'Embed\\Adapters\\Lavozdegalicia' => $vendorDir . '/embed/embed/src/Adapters/Lavozdegalicia.php',
+ 'Embed\\Adapters\\Line' => $vendorDir . '/embed/embed/src/Adapters/Line.php',
+ 'Embed\\Adapters\\N500px' => $vendorDir . '/embed/embed/src/Adapters/N500px.php',
+ 'Embed\\Adapters\\Parleys' => $vendorDir . '/embed/embed/src/Adapters/Parleys.php',
+ 'Embed\\Adapters\\Pastebin' => $vendorDir . '/embed/embed/src/Adapters/Pastebin.php',
+ 'Embed\\Adapters\\Pastie' => $vendorDir . '/embed/embed/src/Adapters/Pastie.php',
+ 'Embed\\Adapters\\Pinterest' => $vendorDir . '/embed/embed/src/Adapters/Pinterest.php',
+ 'Embed\\Adapters\\Sassmeister' => $vendorDir . '/embed/embed/src/Adapters/Sassmeister.php',
+ 'Embed\\Adapters\\Slides' => $vendorDir . '/embed/embed/src/Adapters/Slides.php',
+ 'Embed\\Adapters\\Snipplr' => $vendorDir . '/embed/embed/src/Adapters/Snipplr.php',
+ 'Embed\\Adapters\\Webpage' => $vendorDir . '/embed/embed/src/Adapters/Webpage.php',
+ 'Embed\\Adapters\\Wikipedia' => $vendorDir . '/embed/embed/src/Adapters/Wikipedia.php',
+ 'Embed\\Adapters\\Youtube' => $vendorDir . '/embed/embed/src/Adapters/Youtube.php',
+ 'Embed\\Bag' => $vendorDir . '/embed/embed/src/Bag.php',
+ 'Embed\\DataInterface' => $vendorDir . '/embed/embed/src/DataInterface.php',
+ 'Embed\\Embed' => $vendorDir . '/embed/embed/src/Embed.php',
+ 'Embed\\Exceptions\\EmbedException' => $vendorDir . '/embed/embed/src/Exceptions/EmbedException.php',
+ 'Embed\\Exceptions\\InvalidUrlException' => $vendorDir . '/embed/embed/src/Exceptions/InvalidUrlException.php',
+ 'Embed\\Http\\AbstractResponse' => $vendorDir . '/embed/embed/src/Http/AbstractResponse.php',
+ 'Embed\\Http\\CurlDispatcher' => $vendorDir . '/embed/embed/src/Http/CurlDispatcher.php',
+ 'Embed\\Http\\CurlResult' => $vendorDir . '/embed/embed/src/Http/CurlResult.php',
+ 'Embed\\Http\\DispatcherInterface' => $vendorDir . '/embed/embed/src/Http/DispatcherInterface.php',
+ 'Embed\\Http\\ImageResponse' => $vendorDir . '/embed/embed/src/Http/ImageResponse.php',
+ 'Embed\\Http\\Redirects' => $vendorDir . '/embed/embed/src/Http/Redirects.php',
+ 'Embed\\Http\\Response' => $vendorDir . '/embed/embed/src/Http/Response.php',
+ 'Embed\\Http\\Url' => $vendorDir . '/embed/embed/src/Http/Url.php',
+ 'Embed\\Providers\\Api\\Archive' => $vendorDir . '/embed/embed/src/Providers/Api/Archive.php',
+ 'Embed\\Providers\\Api\\Facebook' => $vendorDir . '/embed/embed/src/Providers/Api/Facebook.php',
+ 'Embed\\Providers\\Api\\Gist' => $vendorDir . '/embed/embed/src/Providers/Api/Gist.php',
+ 'Embed\\Providers\\Api\\GoogleMaps' => $vendorDir . '/embed/embed/src/Providers/Api/GoogleMaps.php',
+ 'Embed\\Providers\\Api\\Imageshack' => $vendorDir . '/embed/embed/src/Providers/Api/Imageshack.php',
+ 'Embed\\Providers\\Api\\Soundcloud' => $vendorDir . '/embed/embed/src/Providers/Api/Soundcloud.php',
+ 'Embed\\Providers\\Api\\Wikipedia' => $vendorDir . '/embed/embed/src/Providers/Api/Wikipedia.php',
+ 'Embed\\Providers\\Dcterms' => $vendorDir . '/embed/embed/src/Providers/Dcterms.php',
+ 'Embed\\Providers\\Html' => $vendorDir . '/embed/embed/src/Providers/Html.php',
+ 'Embed\\Providers\\Linkpulse' => $vendorDir . '/embed/embed/src/Providers/Linkpulse.php',
+ 'Embed\\Providers\\OEmbed' => $vendorDir . '/embed/embed/src/Providers/OEmbed.php',
+ 'Embed\\Providers\\OEmbed\\Amcharts' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Amcharts.php',
+ 'Embed\\Providers\\OEmbed\\Bambuser' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Bambuser.php',
+ 'Embed\\Providers\\OEmbed\\DOM' => $vendorDir . '/embed/embed/src/Providers/OEmbed/DOM.php',
+ 'Embed\\Providers\\OEmbed\\Dailymotion' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Dailymotion.php',
+ 'Embed\\Providers\\OEmbed\\Deviantart' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Deviantart.php',
+ 'Embed\\Providers\\OEmbed\\Dotsub' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Dotsub.php',
+ 'Embed\\Providers\\OEmbed\\Embedly' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Embedly.php',
+ 'Embed\\Providers\\OEmbed\\EndPoint' => $vendorDir . '/embed/embed/src/Providers/OEmbed/EndPoint.php',
+ 'Embed\\Providers\\OEmbed\\EndPointInterface' => $vendorDir . '/embed/embed/src/Providers/OEmbed/EndPointInterface.php',
+ 'Embed\\Providers\\OEmbed\\Facebook' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Facebook.php',
+ 'Embed\\Providers\\OEmbed\\Flickr' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Flickr.php',
+ 'Embed\\Providers\\OEmbed\\Iframely' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Iframely.php',
+ 'Embed\\Providers\\OEmbed\\Imgur' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Imgur.php',
+ 'Embed\\Providers\\OEmbed\\Infogram' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Infogram.php',
+ 'Embed\\Providers\\OEmbed\\Instagram' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Instagram.php',
+ 'Embed\\Providers\\OEmbed\\Jsbin' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Jsbin.php',
+ 'Embed\\Providers\\OEmbed\\Kickstarter' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Kickstarter.php',
+ 'Embed\\Providers\\OEmbed\\Meetup' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Meetup.php',
+ 'Embed\\Providers\\OEmbed\\Photobucket' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Photobucket.php',
+ 'Embed\\Providers\\OEmbed\\Poll' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Poll.php',
+ 'Embed\\Providers\\OEmbed\\Polldaddy' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Polldaddy.php',
+ 'Embed\\Providers\\OEmbed\\Reddit' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Reddit.php',
+ 'Embed\\Providers\\OEmbed\\Scribd' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Scribd.php',
+ 'Embed\\Providers\\OEmbed\\Shoudio' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Shoudio.php',
+ 'Embed\\Providers\\OEmbed\\Smugmug' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Smugmug.php',
+ 'Embed\\Providers\\OEmbed\\Soundcloud' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Soundcloud.php',
+ 'Embed\\Providers\\OEmbed\\Spotify' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Spotify.php',
+ 'Embed\\Providers\\OEmbed\\Tumblr' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Tumblr.php',
+ 'Embed\\Providers\\OEmbed\\Twitch' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Twitch.php',
+ 'Embed\\Providers\\OEmbed\\Twitter' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Twitter.php',
+ 'Embed\\Providers\\OEmbed\\Ustream' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Ustream.php',
+ 'Embed\\Providers\\OEmbed\\WordPress' => $vendorDir . '/embed/embed/src/Providers/OEmbed/WordPress.php',
+ 'Embed\\Providers\\OEmbed\\Youtube' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Youtube.php',
+ 'Embed\\Providers\\OpenGraph' => $vendorDir . '/embed/embed/src/Providers/OpenGraph.php',
+ 'Embed\\Providers\\Provider' => $vendorDir . '/embed/embed/src/Providers/Provider.php',
+ 'Embed\\Providers\\Sailthru' => $vendorDir . '/embed/embed/src/Providers/Sailthru.php',
+ 'Embed\\Providers\\TwitterCards' => $vendorDir . '/embed/embed/src/Providers/TwitterCards.php',
+ 'Embed\\Utils' => $vendorDir . '/embed/embed/src/Utils.php',
'HTMLPurifier' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.php',
'HTMLPurifier_Arborize' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php',
'HTMLPurifier_AttrCollections' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php',
'Hoa\\Exception\\' => array($vendorDir . '/hoa/exception'),
'Hoa\\Event\\' => array($vendorDir . '/hoa/event'),
'Hoa\\Consistency\\' => array($vendorDir . '/hoa/consistency'),
+ 'Embed\\' => array($vendorDir . '/embed/embed/src'),
+ 'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'),
);
'Hoa\\Event\\' => 10,
'Hoa\\Consistency\\' => 16,
),
+ 'E' =>
+ array (
+ 'Embed\\' => 6,
+ ),
+ 'C' =>
+ array (
+ 'Composer\\CaBundle\\' => 18,
+ ),
);
public static $prefixDirsPsr4 = array (
array (
0 => __DIR__ . '/..' . '/hoa/consistency',
),
+ 'Embed\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/embed/embed/src',
+ ),
+ 'Composer\\CaBundle\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/composer/ca-bundle/src',
+ ),
);
public static $prefixesPsr0 = array (
'CAS_Request_MultiRequestInterface' => __DIR__ . '/..' . '/apereo/phpcas/source/CAS/Request/MultiRequestInterface.php',
'CAS_Request_RequestInterface' => __DIR__ . '/..' . '/apereo/phpcas/source/CAS/Request/RequestInterface.php',
'CAS_TypeMismatchException' => __DIR__ . '/..' . '/apereo/phpcas/source/CAS/TypeMismatchException.php',
+ 'Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php',
'Console_Getopt' => __DIR__ . '/..' . '/pear/console_getopt/Console/Getopt.php',
+ 'Embed\\Adapters\\Adapter' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Adapter.php',
+ 'Embed\\Adapters\\Archive' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Archive.php',
+ 'Embed\\Adapters\\Cadenaser' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Cadenaser.php',
+ 'Embed\\Adapters\\Carto' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Carto.php',
+ 'Embed\\Adapters\\Cnn' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Cnn.php',
+ 'Embed\\Adapters\\Facebook' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Facebook.php',
+ 'Embed\\Adapters\\File' => __DIR__ . '/..' . '/embed/embed/src/Adapters/File.php',
+ 'Embed\\Adapters\\Flickr' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Flickr.php',
+ 'Embed\\Adapters\\Github' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Github.php',
+ 'Embed\\Adapters\\Google' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Google.php',
+ 'Embed\\Adapters\\Howcast' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Howcast.php',
+ 'Embed\\Adapters\\Ideone' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Ideone.php',
+ 'Embed\\Adapters\\Imageshack' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Imageshack.php',
+ 'Embed\\Adapters\\Jsfiddle' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Jsfiddle.php',
+ 'Embed\\Adapters\\Lavozdegalicia' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Lavozdegalicia.php',
+ 'Embed\\Adapters\\Line' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Line.php',
+ 'Embed\\Adapters\\N500px' => __DIR__ . '/..' . '/embed/embed/src/Adapters/N500px.php',
+ 'Embed\\Adapters\\Parleys' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Parleys.php',
+ 'Embed\\Adapters\\Pastebin' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Pastebin.php',
+ 'Embed\\Adapters\\Pastie' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Pastie.php',
+ 'Embed\\Adapters\\Pinterest' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Pinterest.php',
+ 'Embed\\Adapters\\Sassmeister' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Sassmeister.php',
+ 'Embed\\Adapters\\Slides' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Slides.php',
+ 'Embed\\Adapters\\Snipplr' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Snipplr.php',
+ 'Embed\\Adapters\\Webpage' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Webpage.php',
+ 'Embed\\Adapters\\Wikipedia' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Wikipedia.php',
+ 'Embed\\Adapters\\Youtube' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Youtube.php',
+ 'Embed\\Bag' => __DIR__ . '/..' . '/embed/embed/src/Bag.php',
+ 'Embed\\DataInterface' => __DIR__ . '/..' . '/embed/embed/src/DataInterface.php',
+ 'Embed\\Embed' => __DIR__ . '/..' . '/embed/embed/src/Embed.php',
+ 'Embed\\Exceptions\\EmbedException' => __DIR__ . '/..' . '/embed/embed/src/Exceptions/EmbedException.php',
+ 'Embed\\Exceptions\\InvalidUrlException' => __DIR__ . '/..' . '/embed/embed/src/Exceptions/InvalidUrlException.php',
+ 'Embed\\Http\\AbstractResponse' => __DIR__ . '/..' . '/embed/embed/src/Http/AbstractResponse.php',
+ 'Embed\\Http\\CurlDispatcher' => __DIR__ . '/..' . '/embed/embed/src/Http/CurlDispatcher.php',
+ 'Embed\\Http\\CurlResult' => __DIR__ . '/..' . '/embed/embed/src/Http/CurlResult.php',
+ 'Embed\\Http\\DispatcherInterface' => __DIR__ . '/..' . '/embed/embed/src/Http/DispatcherInterface.php',
+ 'Embed\\Http\\ImageResponse' => __DIR__ . '/..' . '/embed/embed/src/Http/ImageResponse.php',
+ 'Embed\\Http\\Redirects' => __DIR__ . '/..' . '/embed/embed/src/Http/Redirects.php',
+ 'Embed\\Http\\Response' => __DIR__ . '/..' . '/embed/embed/src/Http/Response.php',
+ 'Embed\\Http\\Url' => __DIR__ . '/..' . '/embed/embed/src/Http/Url.php',
+ 'Embed\\Providers\\Api\\Archive' => __DIR__ . '/..' . '/embed/embed/src/Providers/Api/Archive.php',
+ 'Embed\\Providers\\Api\\Facebook' => __DIR__ . '/..' . '/embed/embed/src/Providers/Api/Facebook.php',
+ 'Embed\\Providers\\Api\\Gist' => __DIR__ . '/..' . '/embed/embed/src/Providers/Api/Gist.php',
+ 'Embed\\Providers\\Api\\GoogleMaps' => __DIR__ . '/..' . '/embed/embed/src/Providers/Api/GoogleMaps.php',
+ 'Embed\\Providers\\Api\\Imageshack' => __DIR__ . '/..' . '/embed/embed/src/Providers/Api/Imageshack.php',
+ 'Embed\\Providers\\Api\\Soundcloud' => __DIR__ . '/..' . '/embed/embed/src/Providers/Api/Soundcloud.php',
+ 'Embed\\Providers\\Api\\Wikipedia' => __DIR__ . '/..' . '/embed/embed/src/Providers/Api/Wikipedia.php',
+ 'Embed\\Providers\\Dcterms' => __DIR__ . '/..' . '/embed/embed/src/Providers/Dcterms.php',
+ 'Embed\\Providers\\Html' => __DIR__ . '/..' . '/embed/embed/src/Providers/Html.php',
+ 'Embed\\Providers\\Linkpulse' => __DIR__ . '/..' . '/embed/embed/src/Providers/Linkpulse.php',
+ 'Embed\\Providers\\OEmbed' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed.php',
+ 'Embed\\Providers\\OEmbed\\Amcharts' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Amcharts.php',
+ 'Embed\\Providers\\OEmbed\\Bambuser' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Bambuser.php',
+ 'Embed\\Providers\\OEmbed\\DOM' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/DOM.php',
+ 'Embed\\Providers\\OEmbed\\Dailymotion' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Dailymotion.php',
+ 'Embed\\Providers\\OEmbed\\Deviantart' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Deviantart.php',
+ 'Embed\\Providers\\OEmbed\\Dotsub' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Dotsub.php',
+ 'Embed\\Providers\\OEmbed\\Embedly' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Embedly.php',
+ 'Embed\\Providers\\OEmbed\\EndPoint' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/EndPoint.php',
+ 'Embed\\Providers\\OEmbed\\EndPointInterface' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/EndPointInterface.php',
+ 'Embed\\Providers\\OEmbed\\Facebook' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Facebook.php',
+ 'Embed\\Providers\\OEmbed\\Flickr' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Flickr.php',
+ 'Embed\\Providers\\OEmbed\\Iframely' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Iframely.php',
+ 'Embed\\Providers\\OEmbed\\Imgur' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Imgur.php',
+ 'Embed\\Providers\\OEmbed\\Infogram' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Infogram.php',
+ 'Embed\\Providers\\OEmbed\\Instagram' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Instagram.php',
+ 'Embed\\Providers\\OEmbed\\Jsbin' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Jsbin.php',
+ 'Embed\\Providers\\OEmbed\\Kickstarter' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Kickstarter.php',
+ 'Embed\\Providers\\OEmbed\\Meetup' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Meetup.php',
+ 'Embed\\Providers\\OEmbed\\Photobucket' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Photobucket.php',
+ 'Embed\\Providers\\OEmbed\\Poll' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Poll.php',
+ 'Embed\\Providers\\OEmbed\\Polldaddy' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Polldaddy.php',
+ 'Embed\\Providers\\OEmbed\\Reddit' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Reddit.php',
+ 'Embed\\Providers\\OEmbed\\Scribd' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Scribd.php',
+ 'Embed\\Providers\\OEmbed\\Shoudio' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Shoudio.php',
+ 'Embed\\Providers\\OEmbed\\Smugmug' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Smugmug.php',
+ 'Embed\\Providers\\OEmbed\\Soundcloud' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Soundcloud.php',
+ 'Embed\\Providers\\OEmbed\\Spotify' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Spotify.php',
+ 'Embed\\Providers\\OEmbed\\Tumblr' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Tumblr.php',
+ 'Embed\\Providers\\OEmbed\\Twitch' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Twitch.php',
+ 'Embed\\Providers\\OEmbed\\Twitter' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Twitter.php',
+ 'Embed\\Providers\\OEmbed\\Ustream' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Ustream.php',
+ 'Embed\\Providers\\OEmbed\\WordPress' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/WordPress.php',
+ 'Embed\\Providers\\OEmbed\\Youtube' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Youtube.php',
+ 'Embed\\Providers\\OpenGraph' => __DIR__ . '/..' . '/embed/embed/src/Providers/OpenGraph.php',
+ 'Embed\\Providers\\Provider' => __DIR__ . '/..' . '/embed/embed/src/Providers/Provider.php',
+ 'Embed\\Providers\\Sailthru' => __DIR__ . '/..' . '/embed/embed/src/Providers/Sailthru.php',
+ 'Embed\\Providers\\TwitterCards' => __DIR__ . '/..' . '/embed/embed/src/Providers/TwitterCards.php',
+ 'Embed\\Utils' => __DIR__ . '/..' . '/embed/embed/src/Utils.php',
'HTMLPurifier' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.php',
'HTMLPurifier_Arborize' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php',
'HTMLPurifier_AttrCollections' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php',
--- /dev/null
+Copyright (C) 2016 Composer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
--- /dev/null
+composer/ca-bundle
+==================
+
+Small utility library that lets you find a path to the system CA bundle,
+and includes a fallback to the Mozilla CA bundle.
+
+Originally written as part of [composer/composer](https://github.com/composer/composer),
+now extracted and made available as a stand-alone library.
+
+
+Installation
+------------
+
+Install the latest version with:
+
+```bash
+$ composer require composer/ca-bundle
+```
+
+
+Requirements
+------------
+
+* PHP 5.3.2 is required but using the latest version of PHP is highly recommended.
+
+
+Basic usage
+-----------
+
+# `Composer\CaBundle\CaBundle`
+
+- `CaBundle::getSystemCaRootBundlePath()`: Returns the system CA bundle path, or a path to the bundled one as fallback
+- `CaBundle::getBundledCaBundlePath()`: Returns the path to the bundled CA file
+- `CaBundle::validateCaFile($filename)`: Validates a CA file using opensl_x509_parse only if it is safe to use
+- `CaBundle::isOpensslParseSafe()`: Test if it is safe to use the PHP function openssl_x509_parse()
+- `CaBundle::reset()`: Resets the static caches
+
+
+## To use with curl
+
+```php
+$curl = curl_init("https://example.org/");
+
+$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
+if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathOrFile)))) {
+ curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile);
+} else {
+ curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile);
+}
+
+$result = curl_exec($curl);
+```
+
+## To use with php streams
+
+```php
+$opts = array(
+ 'http' => array(
+ 'method' => "GET"
+ )
+);
+
+$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
+if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathOrFile)))) {
+ $opts['ssl']['capath'] = $caPathOrFile;
+} else {
+ $opts['ssl']['cafile'] = $caPathOrFile;
+}
+
+$context = stream_context_create($opts);
+$result = file_get_contents('https://example.com', false, $context);
+```
+
+## To use with Guzzle
+
+```php
+$client = new \GuzzleHttp\Client([
+ \GuzzleHttp\RequestOptions::VERIFY => \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath()
+]);
+```
+
+License
+-------
+
+composer/ca-bundle is licensed under the MIT License, see the LICENSE file for details.
--- /dev/null
+{
+ "name": "composer/ca-bundle",
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+ "type": "library",
+ "license": "MIT",
+ "keywords": [
+ "cabundle",
+ "cacert",
+ "certificate",
+ "ssl",
+ "tls"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/ca-bundle/issues"
+ },
+ "require": {
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "php": "^5.3.2 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
+ "psr/log": "^1.0",
+ "symfony/process": "^2.5 || ^3.0 || ^4.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\CaBundle\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Composer\\CaBundle\\": "tests"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "config": {
+ "platform": {
+ "php": "5.3.9"
+ }
+ }
+}
--- /dev/null
+##
+## Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Wed Jan 23 04:12:09 2019 GMT
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt). This file can be found in the mozilla source tree:
+## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+## Conversion done with mk-ca-bundle.pl version 1.27.
+## SHA256: 18372117493b5b7ec006c31d966143fc95a9464a2b5f8d5188e23c5557b2292d
+##
+
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
+KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
+T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
+J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
+nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+AddTrust External Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+GeoTrust Global CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
+Mw==
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
+MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
+Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
+JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
+RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
+7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
+8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
+qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
+Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
+Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
+KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
+ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
+XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
+hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
+qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
+oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
+xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
+KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
+DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
+xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
+p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
+P/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA 2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
+5nrQNiOKSnQ2+Q==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+Sonera Class 2 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
+llpwrN9M
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+Taiwan GRCA
+===========
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
+EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
+DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
+dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
+w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
+BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
+1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
+htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
+J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
+Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
+B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
+O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
+lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
+HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
+09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
+Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
+Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
+D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
+DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
+Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
+7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
+CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+Certplus Class 2 Primary CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
+BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
+OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
+dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
+5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
+Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
+YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
+e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
+CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
+YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
+L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
+P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
+TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
+7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
+//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+DST Root CA X3
+==============
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
+DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
+aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
+N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
+6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
+MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
+qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
+FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
+ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
+celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
+CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
+tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
+4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
+kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
+3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
+/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
+DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
+e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
+WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
+DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
+DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+thawte Primary Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G5
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GA CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+Deutsche Telekom Root CA 2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
+RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
+A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
+MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
+A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
+b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
+bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
+KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
+AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
+Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
+jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
+HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
+E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
+zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
+rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
+dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G3
+=============================================
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
+npaqBA+K
+-----END CERTIFICATE-----
+
+VeriSign Universal Root Certification Authority
+===============================================
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
+mJO37M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G4
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) Főtanúsítvány
+========================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G2
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
+5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
+vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
+CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
+e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
+OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
+CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
+48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
+trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
+qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
+AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
+ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
+A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
+f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
+kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
+CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
+URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
+CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
+oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
+IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
+66+KAQ==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 1
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
+-----END CERTIFICATE-----
+
+SecureSign RootCA11
+===================
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+Chambers of Commerce Root - 2008
+================================
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
+Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
+ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
+EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
+cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
+XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
+h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
+ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
+NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
+D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
+lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
+0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
+EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
+G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
+BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
+bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
+bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
+CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
+AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
+wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
+3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
+RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
+M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
+YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
+9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
+zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
+nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
+-----END CERTIFICATE-----
+
+Global Chambersign Root - 2008
+==============================
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
+NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
+Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
+QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
+VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
+XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
+ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
+/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
+TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
+H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
+Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
+HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
+AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
+BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
+BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
+aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
+aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
+1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
+dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
+/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
+ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
+dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
+9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
+foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
+qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
+P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
+c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+Security Communication RootCA2
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+EC-ACC
+======
+-----BEGIN CERTIFICATE-----
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
+BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
+ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
+VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
+CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
+BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
+MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
+SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
+Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
+cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
+w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
+ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
+HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
+E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
+0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
+VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
+Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
+dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
+lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
+Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
+l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
+E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
+5EI=
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2011
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
+O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
+aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
+AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
+IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
+1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
+71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
+8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
+3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
+MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
+MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
+b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
+XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
+/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
+7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+Actalis Authentication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
+BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
+AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
+MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
+IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
+wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
+by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
+zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
+YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
+oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
+EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
+hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
+EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
+jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
+iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
+WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
+JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
+K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
+Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
+4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
+2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
+lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
+OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
+vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+Trustis FPS Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
+EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
+IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
+BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
+RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
+H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
+cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
+o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
+AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
+BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
+GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
+yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
+8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
+l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
+iB6XzCGcKQENZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+Buypass Class 2 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
+DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
+g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
+9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
+/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
+CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
+awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
+zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
+Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
+Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
+M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
+osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
+aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
+DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
+LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
+oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
+wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
+CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
+rJgWVqA=
+-----END CERTIFICATE-----
+
+Buypass Class 3 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
+DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
+sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
+5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
+7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
+ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
+2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
+/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
+RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
+Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
+j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
+uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
+Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
+ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
+KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
+6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
+UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
+eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
+Cp/HuZc=
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 3
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
+MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
+9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
+NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
+iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
+0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
+AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
+fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
+ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
+P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
+-----END CERTIFICATE-----
+
+EE Certification Centre Root CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
+dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
+MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
+UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
+ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
+TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
+rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
+93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
+P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
+MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
+BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
+xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
+lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
+3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
+dcGWxZ0=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
+Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
+LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
+ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
+BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
+KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
+p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
+AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
+4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
+eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
+MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
+PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
+OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
+2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
+dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
+X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 EV 2009
+=================================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
+egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
+zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
+7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
+sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
+11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
+cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
+ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
+MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
+b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
+c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
+PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
+ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
+NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
+w9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+CA Disig Root R2
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
+w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
+xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
+A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
+GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
+g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
+5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
+koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
+Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
+Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
+Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
+sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
+dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
+1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
+mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
+utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
+sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
+UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
+7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+ACCVRAIZ1
+=========
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
+SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
+MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
+UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
+jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
+RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
+aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
+0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
+WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
+8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
+5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
+9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
+Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
+Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
+Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
+Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
+QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
+AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
+YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
+AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
+IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
+aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
+dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
+MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
+hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
+R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
+YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
+nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
+TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
+sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
+Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
+3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
+EfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+TWCA Global Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
+CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
+QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
+EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
+Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
+nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
+r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
+Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
+tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
+KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
+sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
+yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
+kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
+zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
+cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
+8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
+/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
+lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
+A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
+i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
+EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
+zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
+-----END CERTIFICATE-----
+
+TeliaSonera Root CA v1
+======================
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
+CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
+MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
+VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
+6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
+3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
+B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
+Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
+oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
+F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
+oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
+gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
+TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
+AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
+DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
+zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
+pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
+G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
+c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
+JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
+qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
+Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
+WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+E-Tugra Certification Authority
+===============================
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
+DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
+ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
+NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
+QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
+cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
+DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
+hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
+CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
+ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
+BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
+E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
+rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
+jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
+dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
+/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
+MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
+kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
+XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
+VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
+a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
+dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
+KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
+Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
+8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
+C7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 2
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
+MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
+SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
+vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
+2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
+WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
+YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
+r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
+vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
+3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+Atos TrustedRoot 2011
+=====================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
+cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
+MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
+A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
+hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
+54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
+HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
+z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
+l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
+bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
+k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
+TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
+61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
+3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 1 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
+PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
+PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
+Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
+ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
+g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
+7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
+9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
+iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
+t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
+hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
+GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
+Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
+3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
+wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
+O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
+FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
+hMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
+ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
+NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
+oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
+MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
+V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
+L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
+sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
+6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
+lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
+hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
+pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
+x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
+dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
+U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
+mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
+zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
+JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
+O3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
+IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
+Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
+6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
+I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
+VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
+5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
+Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
+dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
+rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
+hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
+t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
+TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
+DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
+Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
+hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
+0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
+dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
+PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
+MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
+35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
+bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
+VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
+YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
+lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
+w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
+0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
+d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
+hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
+jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
+VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
+BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
+RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
+KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
+UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
+YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
+1vUhZscv6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+DigiCert Global Root G2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
+MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
+kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
+3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
+BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
+UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
+5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
+F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
+WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
+QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
+iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+DigiCert Global Root G3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
+VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
+MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
+aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
+AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
+YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
+Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
+3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
+VOKa5Vt8sycX
+-----END CERTIFICATE-----
+
+DigiCert Trusted Root G4
+========================
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
+HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
+pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
+k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
+vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
+QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
+MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
+mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
+f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
+dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
+oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
+ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
+yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
+7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
+ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
+5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
+/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
+5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
+G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
+82Z+
+-----END CERTIFICATE-----
+
+COMODO RSA Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn
+dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ
+FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+
+5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG
+x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
+2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL
+OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3
+sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
+GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5
+WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt
+rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+
+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg
+tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
+sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp
+pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA
+zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
+ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52
+7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I
+LaZRfyHBNVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+USERTrust RSA Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
+0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j
+Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn
+RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O
++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq
+/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE
+Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM
+lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8
+yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+
+eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW
+FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ
+7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ
+Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
+8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
+FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi
+yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
+J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw
+sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx
+Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+USERTrust ECC Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
+0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
+nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
+HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
+HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
+9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R4
+===========================
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
+OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
+AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
+MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
+JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R5
+===========================
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
+SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
+h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
+uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
+yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G3
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y
+olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t
+x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy
+EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K
+Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur
+mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5
+1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp
+07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo
+FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE
+41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu
+yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq
+KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
+v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
+8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b
+8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r
+mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq
+1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI
+JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV
+tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden EV Root CA
+================================
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
+MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
+cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
+SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
+O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
+0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
+Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
+XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
+08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
+0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
+74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
+fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
+ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
+c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
+5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
+b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
+f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
+5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
+WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
+DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
+eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
+-----END CERTIFICATE-----
+
+IdenTrust Commercial Root CA 1
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
+b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
+MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
+IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
+hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
+mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
+1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
+XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
+3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
+NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
+WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
+xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
+uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
+hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
+ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
+ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
+YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
+feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
+kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
+2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
+Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
+cGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+IdenTrust Public Sector Root CA 1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
+ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
+b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
+P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
+Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
+rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
+qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
+mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
+ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
+LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
+iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
+4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
+Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
+DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
+mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
+GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
+m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
+NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
+Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
+ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
+ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
+3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
+bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
+b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
+HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
+DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
+OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
+/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
+HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
+s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
+TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
+AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
+0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
+iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
+nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
+e4pIb4tF9g==
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - EC1
+==========================================
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
+FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
+YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
+FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
+LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
+dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
+AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
+9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
+vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
+kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+CFCA EV ROOT
+============
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
+CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
+IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
+MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
+DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
+BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
+7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
+uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
+ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
+xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
+py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
+gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
+hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
+tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
+BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
+ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
+4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
+E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
+BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
+aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
+PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
+kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
+ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+Certinomis - Root CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg
+LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx
+EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD
+ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos
+P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo
+d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap
+z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00
+8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x
+RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE
+6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t
+FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV
+PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH
+i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj
+YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I
+6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV
+WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw
+Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX
+lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ
+y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9
+Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng
+DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi
+I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM
+cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr
+hkIGuUE=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GB CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
+EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
+MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
+b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
+scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
+rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
+9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
+Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
+GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
+hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
+dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
+VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
+HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+SZAFIR ROOT CA2
+===============
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
+A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
+BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
+BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
+VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
+qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
+DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
+2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
+ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
+ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
+AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
+O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
+oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
+4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA 2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
+BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
+bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
+ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
+TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
+IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
+7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
+CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
+Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
+uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
+GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
+9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
+Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
+hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
+BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
+hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
+Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
+L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
+clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
+pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
+w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
+J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
+ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
+is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
+zAYspsbiDrW5viSP
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2015
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
+BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
+aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
+YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
+MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
+QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
+BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
+MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
+bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
+iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
+6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
+FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
+i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
+GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
+fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
+iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
+hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
+D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
+d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
+d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
+82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
+davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
+Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
+J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
+JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
+p/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions ECC RootCA 2015
+===========================================================
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
+aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
+cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
+aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
+MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
+IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
+VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
+Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
+dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
+Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
+GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
+dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+ISRG Root X1
+============
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
+BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
+EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
+EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
+DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
+Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
+3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
+b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
+Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
+4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
+1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
+hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
+usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
+OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
+9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
+0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
+hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
+TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
+e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
+JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
+YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
+JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
+m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+
+AC RAIZ FNMT-RCM
+================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
+AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
+MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
+TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
+qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
+btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
+j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
+08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
+WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
+tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
+47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
+ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
+i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
+dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
+nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
+D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
+j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
+Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
+Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
+8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
+5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
+rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
+-----END CERTIFICATE-----
+
+Amazon Root CA 1
+================
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
+MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
+FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
+gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
+dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
+VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
+DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
+CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
+8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
+2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
+xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
+-----END CERTIFICATE-----
+
+Amazon Root CA 2
+================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
+MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
+kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
+N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
+AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
+fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
+kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
+btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
+Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
+c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
+DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
+A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
+YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
+xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
+gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
+aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
+Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
+KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
+JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
+-----END CERTIFICATE-----
+
+Amazon Root CA 3
+================
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
+f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
+Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
+rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
+eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+
+Amazon Root CA 4
+================
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
+/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
+83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
+MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
+AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
+-----END CERTIFICATE-----
+
+LuxTrust Global Root 2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG
+A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh
+bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW
+MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC
+AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm
+Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2
+xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC
+wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm
+1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm
+FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF
+wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/
+a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U
+ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ
+MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB
+/zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5
+Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT
++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ
+FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN
+H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW
+7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu
+ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA
+VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR
+TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt
+/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc
+7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I
+iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr
+-----END CERTIFICATE-----
+
+TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
+D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
+IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
+TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
+ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
+VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
+c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
+bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
+IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
+6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
+wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
+3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
+WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
+ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
+KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
+AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
+lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
+e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
+q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
+-----END CERTIFICATE-----
+
+GDCA TrustAUTH R5 ROOT
+======================
+-----BEGIN CERTIFICATE-----
+MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw
+BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD
+DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow
+YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
+IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs
+AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p
+OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr
+pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ
+9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ
+xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM
+R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ
+D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4
+oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx
+9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
+p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9
+H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35
+6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd
++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ
+HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD
+F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
+8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv
+/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT
+aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
+-----END CERTIFICATE-----
+
+TrustCor RootCert CA-1
+======================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP
+MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
+U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx
+MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu
+YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe
+VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy
+dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq
+jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4
+pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0
+JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h
+gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw
+/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j
+BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5
+mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
+ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C
+qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P
+3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=
+-----END CERTIFICATE-----
+
+TrustCor RootCert CA-2
+======================
+-----BEGIN CERTIFICATE-----
+MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w
+DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT
+eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0
+eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy
+MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h
+bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
+cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0
+IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb
+ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk
+RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1
+oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb
+XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1
+/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q
+jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP
+eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg
+rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
+8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU
+2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h
+Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp
+kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv
+2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3
+S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw
+PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv
+DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU
+RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE
+xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX
+RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ
+-----END CERTIFICATE-----
+
+TrustCor ECA-1
+==============
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP
+MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
+U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw
+N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5
+MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y
+IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR
+MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23
+xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc
+p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+
+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj
+YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL
+f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
+AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u
+/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
+hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs
+J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC
+jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==
+-----END CERTIFICATE-----
+
+SSL.com Root Certification Authority RSA
+========================================
+-----BEGIN CERTIFICATE-----
+MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM
+BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x
+MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw
+MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
+EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM
+LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C
+Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8
+P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge
+oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp
+k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z
+fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ
+gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2
+UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8
+1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s
+bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr
+dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf
+ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl
+u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq
+erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj
+MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ
+vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI
+Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y
+wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI
+WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=
+-----END CERTIFICATE-----
+
+SSL.com Root Certification Authority ECC
+========================================
+-----BEGIN CERTIFICATE-----
+MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV
+BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv
+BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy
+MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO
+BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
+bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+
+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR
+hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT
+jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW
+e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z
+5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
+-----END CERTIFICATE-----
+
+SSL.com EV Root Certification Authority RSA R2
+==============================================
+-----BEGIN CERTIFICATE-----
+MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w
+DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u
+MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
+MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
+DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD
+VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh
+hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w
+cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO
+Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+
+B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh
+CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim
+9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto
+RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm
+JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48
++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
+HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp
+qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1
+++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx
+Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G
+guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz
+OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7
+CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq
+lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR
+rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1
+hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX
+9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
+-----END CERTIFICATE-----
+
+SSL.com EV Root Certification Authority ECC
+===========================================
+-----BEGIN CERTIFICATE-----
+MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV
+BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy
+BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw
+MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
+EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM
+LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
+BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy
+3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O
+BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe
+5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ
+N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm
+m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R6
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX
+R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
+b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i
+YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs
+U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss
+grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE
+3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF
+vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM
+PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+
+azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O
+WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy
+CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP
+0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN
+b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE
+AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV
+HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
+nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0
+lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY
+BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym
+Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr
+3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1
+0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T
+uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK
+oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t
+JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GC CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD
+SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo
+MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa
+Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL
+ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
+bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr
+VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab
+NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E
+AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
+AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
+-----END CERTIFICATE-----
+
+GTS Root R1
+===========
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
+EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
+b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
+A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx
+9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r
+aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW
+r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM
+LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly
+4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr
+06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92
+wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om
+3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu
+JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM
+BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1
+d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv
+fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm
+ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b
+gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq
+4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr
+tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo
+pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0
+sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql
+CFF1pkgl
+-----END CERTIFICATE-----
+
+GTS Root R2
+===========
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
+EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
+b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
+A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk
+k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo
+7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI
+m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm
+dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu
+ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz
+cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW
+Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl
+aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy
+5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM
+BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT
+vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ
++YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw
+c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da
+WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r
+n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu
+Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ
+7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs
+gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld
+o/DUhgkC
+-----END CERTIFICATE-----
+
+GTS Root R3
+===========
+-----BEGIN CERTIFICATE-----
+MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
+UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
+UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
+ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU
+Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej
+QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP
+0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0
+glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa
+KaqW04MjyaR7YbPMAuhd
+-----END CERTIFICATE-----
+
+GTS Root R4
+===========
+-----BEGIN CERTIFICATE-----
+MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
+UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
+UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
+ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa
+6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj
+QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV
+2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI
+N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x
+zPKwTdb+mciUqXWi4w==
+-----END CERTIFICATE-----
+
+UCA Global G2 Root
+==================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG
+EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x
+NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU
+cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT
+oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV
+8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS
+h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o
+LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/
+R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe
+KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa
+4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc
+OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97
+8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo
+5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
+1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A
+Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9
+yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX
+c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo
+jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk
+bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x
+ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn
+RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A==
+-----END CERTIFICATE-----
+
+UCA Extended Validation Root
+============================
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG
+EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u
+IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G
+A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs
+iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF
+Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu
+eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR
+59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH
+0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR
+el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv
+B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth
+WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS
+NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS
+3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL
+BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
+ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM
+aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4
+dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb
++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW
+F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi
+GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc
+GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi
+djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr
+dhh2n1ax
+-----END CERTIFICATE-----
+
+Certigna Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE
+BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ
+MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda
+MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz
+MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX
+stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz
+KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8
+JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16
+XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq
+4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej
+wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ
+lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI
+jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/
+/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
+1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy
+dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h
+LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl
+cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt
+OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP
+TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq
+7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3
+4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd
+8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS
+6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY
+tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS
+aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde
+E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
+-----END CERTIFICATE-----
--- /dev/null
+<?php
+
+/*
+ * This file is part of composer/ca-bundle.
+ *
+ * (c) Composer <https://github.com/composer>
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Composer\CaBundle;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Process\PhpProcess;
+
+/**
+ * @author Chris Smith <chris@cs278.org>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class CaBundle
+{
+ private static $caPath;
+ private static $caFileValidity = array();
+ private static $useOpensslParse;
+
+ /**
+ * Returns the system CA bundle path, or a path to the bundled one
+ *
+ * This method was adapted from Sslurp.
+ * https://github.com/EvanDotPro/Sslurp
+ *
+ * (c) Evan Coury <me@evancoury.com>
+ *
+ * For the full copyright and license information, please see below:
+ *
+ * Copyright (c) 2013, Evan Coury
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @param LoggerInterface $logger optional logger for information about which CA files were loaded
+ * @return string path to a CA bundle file or directory
+ */
+ public static function getSystemCaRootBundlePath(LoggerInterface $logger = null)
+ {
+ if (self::$caPath !== null) {
+ return self::$caPath;
+ }
+
+ // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that.
+ // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
+ $envCertFile = getenv('SSL_CERT_FILE');
+ if ($envCertFile && is_readable($envCertFile) && static::validateCaFile($envCertFile, $logger)) {
+ return self::$caPath = $envCertFile;
+ }
+
+ // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that.
+ // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
+ $envCertDir = getenv('SSL_CERT_DIR');
+ if ($envCertDir && is_dir($envCertDir) && is_readable($envCertDir)) {
+ return self::$caPath = $envCertDir;
+ }
+
+ $configured = ini_get('openssl.cafile');
+ if ($configured && strlen($configured) > 0 && is_readable($configured) && static::validateCaFile($configured, $logger)) {
+ return self::$caPath = $configured;
+ }
+
+ $configured = ini_get('openssl.capath');
+ if ($configured && is_dir($configured) && is_readable($configured)) {
+ return self::$caPath = $configured;
+ }
+
+ $caBundlePaths = array(
+ '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package)
+ '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package)
+ '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package)
+ '/usr/local/share/certs/ca-root-nss.crt', // FreeBSD (ca_root_nss_package)
+ '/usr/ssl/certs/ca-bundle.crt', // Cygwin
+ '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package
+ '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option)
+ '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat?
+ '/etc/ssl/cert.pem', // OpenBSD
+ '/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x
+ '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package
+ );
+
+ foreach ($caBundlePaths as $caBundle) {
+ if (@is_readable($caBundle) && static::validateCaFile($caBundle, $logger)) {
+ return self::$caPath = $caBundle;
+ }
+ }
+
+ foreach ($caBundlePaths as $caBundle) {
+ $caBundle = dirname($caBundle);
+ if (@is_dir($caBundle) && glob($caBundle.'/*')) {
+ return self::$caPath = $caBundle;
+ }
+ }
+
+ return self::$caPath = static::getBundledCaBundlePath(); // Bundled CA file, last resort
+ }
+
+ /**
+ * Returns the path to the bundled CA file
+ *
+ * In case you don't want to trust the user or the system, you can use this directly
+ *
+ * @return string path to a CA bundle file
+ */
+ public static function getBundledCaBundlePath()
+ {
+ $caBundleFile = __DIR__.'/../res/cacert.pem';
+
+ // cURL does not understand 'phar://' paths
+ // see https://github.com/composer/ca-bundle/issues/10
+ if (0 === strpos($caBundleFile, 'phar://')) {
+ file_put_contents(
+ $tempCaBundleFile = tempnam(sys_get_temp_dir(), 'openssl-ca-bundle-'),
+ file_get_contents($caBundleFile)
+ );
+
+ register_shutdown_function(function() use ($tempCaBundleFile) {
+ @unlink($tempCaBundleFile);
+ });
+
+ $caBundleFile = $tempCaBundleFile;
+ }
+
+ return $caBundleFile;
+ }
+
+ /**
+ * Validates a CA file using opensl_x509_parse only if it is safe to use
+ *
+ * @param string $filename
+ * @param LoggerInterface $logger optional logger for information about which CA files were loaded
+ *
+ * @return bool
+ */
+ public static function validateCaFile($filename, LoggerInterface $logger = null)
+ {
+ static $warned = false;
+
+ if (isset(self::$caFileValidity[$filename])) {
+ return self::$caFileValidity[$filename];
+ }
+
+ $contents = file_get_contents($filename);
+
+ // assume the CA is valid if php is vulnerable to
+ // https://www.sektioneins.de/advisories/advisory-012013-php-openssl_x509_parse-memory-corruption-vulnerability.html
+ if (!static::isOpensslParseSafe()) {
+ if (!$warned && $logger) {
+ $logger->warning(sprintf(
+ 'Your version of PHP, %s, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.',
+ PHP_VERSION
+ ));
+ $warned = true;
+ }
+
+ $isValid = !empty($contents);
+ } else {
+ $isValid = (bool) openssl_x509_parse($contents);
+ }
+
+ if ($logger) {
+ $logger->debug('Checked CA file '.realpath($filename).': '.($isValid ? 'valid' : 'invalid'));
+ }
+
+ return self::$caFileValidity[$filename] = $isValid;
+ }
+
+ /**
+ * Test if it is safe to use the PHP function openssl_x509_parse().
+ *
+ * This checks if OpenSSL extensions is vulnerable to remote code execution
+ * via the exploit documented as CVE-2013-6420.
+ *
+ * @return bool
+ */
+ public static function isOpensslParseSafe()
+ {
+ if (null !== self::$useOpensslParse) {
+ return self::$useOpensslParse;
+ }
+
+ if (PHP_VERSION_ID >= 50600) {
+ return self::$useOpensslParse = true;
+ }
+
+ // Vulnerable:
+ // PHP 5.3.0 - PHP 5.3.27
+ // PHP 5.4.0 - PHP 5.4.22
+ // PHP 5.5.0 - PHP 5.5.6
+ if (
+ (PHP_VERSION_ID < 50400 && PHP_VERSION_ID >= 50328)
+ || (PHP_VERSION_ID < 50500 && PHP_VERSION_ID >= 50423)
+ || (PHP_VERSION_ID < 50600 && PHP_VERSION_ID >= 50507)
+ ) {
+ // This version of PHP has the fix for CVE-2013-6420 applied.
+ return self::$useOpensslParse = true;
+ }
+
+ if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+ // Windows is probably insecure in this case.
+ return self::$useOpensslParse = false;
+ }
+
+ $compareDistroVersionPrefix = function ($prefix, $fixedVersion) {
+ $regex = '{^'.preg_quote($prefix).'([0-9]+)$}';
+
+ if (preg_match($regex, PHP_VERSION, $m)) {
+ return ((int) $m[1]) >= $fixedVersion;
+ }
+
+ return false;
+ };
+
+ // Hard coded list of PHP distributions with the fix backported.
+ if (
+ $compareDistroVersionPrefix('5.3.3-7+squeeze', 18) // Debian 6 (Squeeze)
+ || $compareDistroVersionPrefix('5.4.4-14+deb7u', 7) // Debian 7 (Wheezy)
+ || $compareDistroVersionPrefix('5.3.10-1ubuntu3.', 9) // Ubuntu 12.04 (Precise)
+ ) {
+ return self::$useOpensslParse = true;
+ }
+
+ // Symfony Process component is missing so we assume it is unsafe at this point
+ if (!class_exists('Symfony\Component\Process\PhpProcess')) {
+ return self::$useOpensslParse = false;
+ }
+
+ // This is where things get crazy, because distros backport security
+ // fixes the chances are on NIX systems the fix has been applied but
+ // it's not possible to verify that from the PHP version.
+ //
+ // To verify exec a new PHP process and run the issue testcase with
+ // known safe input that replicates the bug.
+
+ // Based on testcase in https://github.com/php/php-src/commit/c1224573c773b6845e83505f717fbf820fc18415
+ // changes in https://github.com/php/php-src/commit/76a7fd893b7d6101300cc656058704a73254d593
+ $cert = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVwRENDQTR5Z0F3SUJBZ0lKQUp6dThyNnU2ZUJjTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhETVFzd0NRWUQKVlFRR0V3SkVSVEVjTUJvR0ExVUVDQXdUVG05eVpISm9aV2x1TFZkbGMzUm1ZV3hsYmpFUU1BNEdBMVVFQnd3SApTOE9Ed3Jac2JqRVVNQklHQTFVRUNnd0xVMlZyZEdsdmJrVnBibk14SHpBZEJnTlZCQXNNRmsxaGJHbGphVzkxCmN5QkRaWEowSUZObFkzUnBiMjR4SVRBZkJnTlZCQU1NR0cxaGJHbGphVzkxY3k1elpXdDBhVzl1WldsdWN5NWsKWlRFcU1DZ0dDU3FHU0liM0RRRUpBUlliYzNSbFptRnVMbVZ6YzJWeVFITmxhM1JwYjI1bGFXNXpMbVJsTUhVWQpaREU1TnpBd01UQXhNREF3TURBd1dnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKQUFBQUFBQVhEVEUwTVRFeU9ERXhNemt6TlZvd2djTXhDekFKQmdOVkJBWVRBa1JGTVJ3d0dnWURWUVFJREJOTwpiM0prY21obGFXNHRWMlZ6ZEdaaGJHVnVNUkF3RGdZRFZRUUhEQWRMdzRQQ3RteHVNUlF3RWdZRFZRUUtEQXRUClpXdDBhVzl1UldsdWN6RWZNQjBHQTFVRUN3d1dUV0ZzYVdOcGIzVnpJRU5sY25RZ1UyVmpkR2x2YmpFaE1COEcKQTFVRUF3d1liV0ZzYVdOcGIzVnpMbk5sYTNScGIyNWxhVzV6TG1SbE1Tb3dLQVlKS29aSWh2Y05BUWtCRmh0egpkR1ZtWVc0dVpYTnpaWEpBYzJWcmRHbHZibVZwYm5NdVpHVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCCkR3QXdnZ0VLQW9JQkFRRERBZjNobDdKWTBYY0ZuaXlFSnBTU0RxbjBPcUJyNlFQNjV1c0pQUnQvOFBhRG9xQnUKd0VZVC9OYSs2ZnNnUGpDMHVLOURaZ1dnMnRIV1dvYW5TYmxBTW96NVBINlorUzRTSFJaN2UyZERJalBqZGhqaAowbUxnMlVNTzV5cDBWNzk3R2dzOWxOdDZKUmZIODFNTjJvYlhXczROdHp0TE11RDZlZ3FwcjhkRGJyMzRhT3M4CnBrZHVpNVVhd1Raa3N5NXBMUEhxNWNNaEZHbTA2djY1Q0xvMFYyUGQ5K0tBb2tQclBjTjVLTEtlYno3bUxwazYKU01lRVhPS1A0aWRFcXh5UTdPN2ZCdUhNZWRzUWh1K3ByWTNzaTNCVXlLZlF0UDVDWm5YMmJwMHdLSHhYMTJEWAoxbmZGSXQ5RGJHdkhUY3lPdU4rblpMUEJtM3ZXeG50eUlJdlZBZ01CQUFHalFqQkFNQWtHQTFVZEV3UUNNQUF3CkVRWUpZSVpJQVliNFFnRUJCQVFEQWdlQU1Bc0dBMVVkRHdRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFHMGZaWVlDVGJkajFYWWMrMVNub2FQUit2SThDOENhRAo4KzBVWWhkbnlVNGdnYTBCQWNEclk5ZTk0ZUVBdTZacXljRjZGakxxWFhkQWJvcHBXb2NyNlQ2R0QxeDMzQ2tsClZBcnpHL0t4UW9oR0QySmVxa2hJTWxEb214SE83a2EzOStPYThpMnZXTFZ5alU4QVp2V01BcnVIYTRFRU55RzcKbFcyQWFnYUZLRkNyOVRuWFRmcmR4R1ZFYnY3S1ZRNmJkaGc1cDVTanBXSDErTXEwM3VSM1pYUEJZZHlWODMxOQpvMGxWajFLRkkyRENML2xpV2lzSlJvb2YrMWNSMzVDdGQwd1lCY3BCNlRac2xNY09QbDc2ZHdLd0pnZUpvMlFnClpzZm1jMnZDMS9xT2xOdU5xLzBUenprVkd2OEVUVDNDZ2FVK1VYZTRYT1Z2a2NjZWJKbjJkZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K';
+ $script = <<<'EOT'
+
+error_reporting(-1);
+$info = openssl_x509_parse(base64_decode('%s'));
+var_dump(PHP_VERSION, $info['issuer']['emailAddress'], $info['validFrom_time_t']);
+
+EOT;
+ $script = '<'."?php\n".sprintf($script, $cert);
+
+ try {
+ $process = new PhpProcess($script);
+ $process->mustRun();
+ } catch (\Exception $e) {
+ // In the case of any exceptions just accept it is not possible to
+ // determine the safety of openssl_x509_parse and bail out.
+ return self::$useOpensslParse = false;
+ }
+
+ $output = preg_split('{\r?\n}', trim($process->getOutput()));
+ $errorOutput = trim($process->getErrorOutput());
+
+ if (
+ count($output) === 3
+ && $output[0] === sprintf('string(%d) "%s"', strlen(PHP_VERSION), PHP_VERSION)
+ && $output[1] === 'string(27) "stefan.esser@sektioneins.de"'
+ && $output[2] === 'int(-1)'
+ && preg_match('{openssl_x509_parse\(\): illegal (?:ASN1 data type for|length in) timestamp in - on line \d+}', $errorOutput)
+ ) {
+ // This PHP has the fix backported probably by a distro security team.
+ return self::$useOpensslParse = true;
+ }
+
+ return self::$useOpensslParse = false;
+ }
+
+ /**
+ * Resets the static caches
+ */
+ public static function reset()
+ {
+ self::$caFileValidity = array();
+ self::$caPath = null;
+ self::$useOpensslParse = null;
+ }
+}
"jasig"
]
},
+ {
+ "name": "composer/ca-bundle",
+ "version": "1.1.4",
+ "version_normalized": "1.1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/ca-bundle.git",
+ "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/558f321c52faeb4828c03e7dc0cfe39a09e09a2d",
+ "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "php": "^5.3.2 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
+ "psr/log": "^1.0",
+ "symfony/process": "^2.5 || ^3.0 || ^4.0"
+ },
+ "time": "2019-01-28T09:30:10+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Composer\\CaBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+ "keywords": [
+ "cabundle",
+ "cacert",
+ "certificate",
+ "ssl",
+ "tls"
+ ]
+ },
{
"name": "diogocomposer/xmpphp",
"version": "v3.0.0",
"xmpphp"
]
},
+ {
+ "name": "embed/embed",
+ "version": "v3.4.0",
+ "version_normalized": "3.4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/oscarotero/Embed.git",
+ "reference": "5594b253dee90888c14cdca43696183c98f078e9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/oscarotero/Embed/zipball/5594b253dee90888c14cdca43696183c98f078e9",
+ "reference": "5594b253dee90888c14cdca43696183c98f078e9",
+ "shasum": ""
+ },
+ "require": {
+ "composer/ca-bundle": "^1.0",
+ "ext-curl": "*",
+ "ext-mbstring": "*",
+ "php": "^5.6|^7.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.0",
+ "phpunit/phpunit": "^4.8|^5.7"
+ },
+ "time": "2019-06-23T11:12:03+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Embed\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oscar Otero",
+ "email": "oom@oscarotero.com",
+ "homepage": "http://oscarotero.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP library to retrieve page info using oembed, opengraph, etc",
+ "homepage": "https://github.com/oscarotero/Embed",
+ "keywords": [
+ "embed",
+ "embedly",
+ "oembed",
+ "opengraph",
+ "twitter cards"
+ ]
+ },
{
"name": "ezyang/htmlpurifier",
- "version": "v4.10.0",
- "version_normalized": "4.10.0.0",
+ "version": "v4.11.0",
+ "version_normalized": "4.11.0.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
- "reference": "d85d39da4576a6934b72480be6978fb10c860021"
+ "reference": "83ab08bc1af7d808a9e0fbf024f1c24bfd73c0a7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/d85d39da4576a6934b72480be6978fb10c860021",
- "reference": "d85d39da4576a6934b72480be6978fb10c860021",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/83ab08bc1af7d808a9e0fbf024f1c24bfd73c0a7",
+ "reference": "83ab08bc1af7d808a9e0fbf024f1c24bfd73c0a7",
"shasum": ""
},
"require": {
"php": ">=5.2"
},
"require-dev": {
- "simpletest/simpletest": "^1.1"
+ "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd"
},
- "time": "2018-02-23T01:58:20+00:00",
+ "time": "2019-07-14T18:58:38+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL"
+ "LGPL-2.1-or-later"
],
"authors": [
{
--- /dev/null
+The MIT License (MIT)
+
+Copyright (c) 2017 Oscar Otero Marzoa
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
--- /dev/null
+
+# Embed
+
+[![Build Status][ico-travis]][link-travis]
+[![Quality Score][ico-scrutinizer]][link-scrutinizer]
+[![Reference Status][ico-references]][link-references]
+[![Latest Version on Packagist][ico-version]][link-packagist]
+[![Total Downloads][ico-downloads]][link-packagist]
+[![Monthly Downloads][ico-m-downloads]][link-packagist]
+[![Software License][ico-license]](LICENSE)
+[![SensioLabs Insight][ico-sensiolabs]][link-sensiolabs]
+
+PHP library to get information from any web page (using oembed, opengraph, twitter-cards, scrapping the html, etc). It's compatible with any web service (youtube, vimeo, flickr, instagram, etc) and has adapters to some sites like (archive.org, github, facebook, etc).
+
+Requirements:
+
+* PHP 5.5+
+* Curl library installed
+
+>
+* If you need PHP 5.3 support, use the 1.x version
+* If you need PHP 5.4 support, use the 2.x version
+
+## Online demo
+
+http://oscarotero.com/embed3/demo
+
+## Installation
+
+This package is installable and autoloadable via Composer as [embed/embed](https://packagist.org/packages/embed/embed).
+
+```
+$ composer require embed/embed
+```
+
+If you cannot (or don't want to) use composer, just include the [PSR-4 autoload.php file](src/autoloader.php) in your code.
+
+## Usage
+
+```php
+use Embed\Embed;
+
+//Load any url:
+$info = Embed::create('https://www.youtube.com/watch?v=PP1xn5wHtxE');
+
+//Get content info
+
+$info->title; //The page title
+$info->description; //The page description
+$info->url; //The canonical url
+$info->type; //The page type (link, video, image, rich)
+$info->tags; //The page keywords (tags)
+
+$info->images; //List of all images found in the page
+$info->image; //The image choosen as main image
+$info->imageWidth; //The width of the main image
+$info->imageHeight; //The height of the main image
+
+$info->code; //The code to embed the image, video, etc
+$info->width; //The width of the embed code
+$info->height; //The height of the embed code
+$info->aspectRatio; //The aspect ratio (width/height)
+
+$info->authorName; //The resource author
+$info->authorUrl; //The author url
+
+$info->providerName; //The provider name of the page (Youtube, Twitter, Instagram, etc)
+$info->providerUrl; //The provider url
+$info->providerIcons; //All provider icons found in the page
+$info->providerIcon; //The icon choosen as main icon
+
+$info->publishedDate; //The published date of the resource
+$info->license; //The license url of the resource
+$info->linkedData; //The linked-data info (http://json-ld.org/)
+$info->feeds; //The RSS/Atom feeds
+```
+
+## The adapter
+
+The adapter is the class that get all information of the page from the providers and choose the best result for each value. For example, a page can provide multiple titles from opengraph, twitter cards, oembed, the `<title>` html element, etc, so the adapter get all this titles and choose the best one.
+
+Embed has an generic adapter called "Webpage" to use with any web but has also some specific adapters for sites like archive.org, facebook, google, github, spotify, etc, that provides information using their own apis, or need to fix any specific issue.
+
+The available options for the adapters are:
+
+Name | Type | Description
+-----|------|------------
+`min_image_width` | `int` | Minimal image width used to choose the main image
+`min_image_height` | `int` | Minimal image height used to choose the main image
+`choose_bigger_image` | `bool` | Choose the bigger image as the main image (instead the first found, that usually is the most relevant).
+`images_blacklist` | `string`|`array` | Images that you don't want to be used. Could be plain text or [Uri](https://github.com/oscarotero/Embed/blob/master/src/Http/Url.php) match pattern.
+`url_blacklist` | `string`|`array` | URLs that you don't want to be used. Could be plain text or [Uri](https://github.com/oscarotero/Embed/blob/master/src/Http/Url.php) match pattern.
+`follow_canonical` | `bool` | Whether to redirect to the canonical URL or not.
+`custom_adapters_namespace` | `string`|`array` | A namespace used to load custom adapters. This allows to override the behaviour of existing adapters or add support for more sites.
+
+## The providers
+
+The providers get the data from different sources. Each source has it's own provider. For example, there is a provider for opengraph, other for twitter cards, for oembed, html, etc. Some providers can be configured and are the following:
+
+### oembed
+
+Used to get data from oembed api if it's available:
+
+Name | Type | Description
+-----|------|------------
+`parameters` | `array` | Extra query parameters to send with the oembed request
+`embedly_key` | `string` | If it's defined, use embed.ly api as fallback oembed provider.
+`iframely_key` | `string` | If it's defined, use iframe.ly api as fallback oembed provider.
+
+### html
+
+Used to get data directly from the html code of the page:
+
+Name | Type | Description
+-----|------|------------
+`max_images` | `int` | Max number of images fetched from the html code (searching for the `<img>` elements). By default is -1 (no limit). Use 0 to no get images.
+`external_images` | `bool`|`array` | By default is `false`, this means that images located in other domains are not allowed. You can set `true` (allow all) or provide an array of url patterns.
+
+### google
+
+Used only for google maps to generate the embed code.
+
+Name | Type | Description
+-----|------|------------
+`key` | `string` | The key used [for the embed api](https://developers.google.com/maps/documentation/embed/)
+
+### soundcloud
+
+Used only for soundcloud pages, to get information using its api.
+
+Name | Type | Description
+-----|------|------------
+`key` | `string` | The key used to get info from soundcloud API.
+
+### facebook
+
+Used only for facebook events (not needed for posts, images, etc), to get information using its api.
+
+Name | Type | Description
+-----|------|------------
+`key` | `string` | The access token used to get info from facebook graph API.
+`events_fields` | `string` | Comma-separated list of fields to query for a facebook event. Please refer to [Facebook documentation](https://developers.facebook.com/docs/graph-api/reference/event) for the full list of available fields.
+`videos_fields` | `string` | Comma-separated list of fields to query for a facebook video. Please refer to [Facebook documentation](https://developers.facebook.com/docs/graph-api/reference/event) for the full list of available fields.
+
+## Example with all options:
+
+The options are passed as the second argument as you can see in the following example:
+
+```php
+$info = Embed::create($url, [
+ 'min_image_width' => 100,
+ 'min_image_height' => 100,
+ 'choose_bigger_image' => true,
+ 'images_blacklist' => 'example.com/*',
+ 'url_blacklist' => 'example.com/*',
+ 'follow_canonical' => true,
+
+ 'html' => [
+ 'max_images' => 10,
+ 'external_images' => true
+ ],
+
+ 'oembed' => [
+ 'parameters' => [],
+ 'embedly_key' => 'YOUR_KEY',
+ 'iframely_key' => 'YOUR_KEY',
+ ],
+
+ 'google' => [
+ 'key' => 'YOUR_KEY',
+ ],
+
+ 'soundcloud' => [
+ 'key' => 'YOUR_KEY',
+ ],
+
+ 'facebook' => [
+ 'key' => 'YOUR_KEY',
+ 'fields' => 'field1,field2,field3' // default : cover,description,end_time,id,name,owner,place,start_time,timezone
+ ],
+]);
+```
+
+## The dispatcher
+
+To dispatch the http request, Embed includes the interface `Embed\Http\DispatcherInterface`. By default the curl library is used but you can create your own dispatcher to use any other library like [guzzle](https://github.com/guzzle/guzzle):
+
+```php
+use Embed\Embed;
+use Embed\Http\DispatcherInteface;
+use Embed\Http\Url;
+use Embed\Http\Response;
+use Embed\Http\ImageResponse;
+
+class MyDispatcher implements DispatcherInterface
+{
+ public function dispatch(Url $url)
+ {
+ $result = function_to_execute_request($url);
+
+ return new Response($url, $result['url'], $result['status'], $result['type'], $result['content'], $result['headers']);
+ }
+
+ public function dispatchImages(array $urls)
+ {
+ $responses = [];
+
+ foreach ($urls as $url) {
+ $result = function_to_get_image_size($url);
+
+ if ($result) {
+ $responses[] = new ImageResponse($url, $result['url'], $result['status'], $result['type'], $result['size'], $result['headers']);
+ }
+ }
+
+ return $responses;
+ }
+}
+
+//Use the dispatcher passing as third argument
+$info = Embed::create('http://example.com', null, new MyDispatcher());
+```
+
+The default curl dispatcher accepts the same options that the [curl_setopt PHP function](http://php.net/manual/en/function.curl-setopt.php). You can edit the default values:
+
+```php
+use Embed\Embed;
+use Embed\Http\CurlDispatcher;
+
+$dispatcher = new CurlDispatcher([
+ CURLOPT_MAXREDIRS => 20,
+ CURLOPT_CONNECTTIMEOUT => 10,
+ CURLOPT_TIMEOUT => 10,
+ CURLOPT_SSL_VERIFYPEER => false,
+ CURLOPT_SSL_VERIFYHOST => false,
+ CURLOPT_ENCODING => '',
+ CURLOPT_AUTOREFERER => true,
+ CURLOPT_USERAGENT => 'Embed PHP Library',
+ CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
+]);
+
+$info = Embed::create('http://example.com', null, $dispatcher);
+```
+
+## Accessing to advanced data
+
+The adapter get the data from all providers and choose the best values. But you can get all available values accessing directly to each provider. There's also the possibility to inspect all http requests executed for debug purposes:
+
+```php
+use Embed\Embed;
+
+//Get the info
+$info = Embed::create('https://www.youtube.com/watch?v=PP1xn5wHtxE');
+
+//Get all providers
+$providers = $info->getProviders();
+
+//Get the oembed provider
+$oembed = $providers['oembed'];
+
+//Get the oembed title value:
+echo $oembed->getTitle();
+
+//Get any value returned by the oembed api
+echo $oembed->bag->get('author_name');
+
+//Get the main response object
+$response = $info->getResponse();
+
+//Get any http response header
+$lastModified = $response->getHeader('Last-Modifier');
+
+//Get the html body as DOMDocument
+$html = $response->getHtmlContent();
+
+//Get all http request executed (oembed endpoints, images, apis, etc...)
+$dispatcher = $adapter->getDispatcher();
+
+foreach ($dispatcher->getAllResponses() as $response) {
+ echo 'The request to '.$response->getStartingUrl();
+ echo ' is resolved to '.$response->getUrl();
+}
+```
+
+---
+
+If this library is useful for you, say thanks [buying me a beer :beer:](https://www.paypal.me/oscarotero)!
+
+[ico-version]: https://poser.pugx.org/embed/embed/v/stable
+[ico-travis]: https://travis-ci.org/oscarotero/Embed.svg?branch=master
+[ico-license]: https://poser.pugx.org/embed/embed/license
+[ico-scrutinizer]: https://scrutinizer-ci.com/g/oscarotero/Embed/badges/quality-score.png?s=79e37032db280b9795388124c030dcf4309343d1
+[ico-sensiolabs]: https://insight.sensiolabs.com/projects/f0beab9f-fe41-47db-8806-373f80c50f9e/big.png
+[ico-downloads]: https://poser.pugx.org/embed/embed/downloads
+[ico-m-downloads]: https://poser.pugx.org/embed/embed/d/monthly
+[ico-references]: https://www.versioneye.com/php/embed:embed/reference_badge.svg?style=flat
+
+[link-packagist]: https://packagist.org/packages/embed/embed
+[link-travis]: https://travis-ci.org/oscarotero/Embed
+[link-scrutinizer]: https://scrutinizer-ci.com/g/oscarotero/Embed/
+[link-sensiolabs]: https://insight.sensiolabs.com/projects/f0beab9f-fe41-47db-8806-373f80c50f9e
+[link-references]: https://www.versioneye.com/php/embed:embed/references
--- /dev/null
+{
+ "name": "embed/embed",
+ "type": "library",
+ "description": "PHP library to retrieve page info using oembed, opengraph, etc",
+ "keywords": [
+ "oembed",
+ "opengraph",
+ "twitter cards",
+ "embed",
+ "embedly"
+ ],
+ "homepage": "https://github.com/oscarotero/Embed",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Oscar Otero",
+ "email": "oom@oscarotero.com",
+ "homepage": "http://oscarotero.com",
+ "role": "Developer"
+ }
+ ],
+ "support": {
+ "email": "oom@oscarotero.com",
+ "issues": "https://github.com/oscarotero/Embed/issues"
+ },
+ "require": {
+ "php": "^5.6|^7.0",
+ "ext-curl": "*",
+ "ext-mbstring": "*",
+ "composer/ca-bundle": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8|^5.7",
+ "friendsofphp/php-cs-fixer": "^2.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Embed\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Embed\\Tests\\": "tests/"
+ }
+ },
+ "scripts": {
+ "demo": "php -S localhost:8888 demo/index.php",
+ "test": "phpunit",
+ "cs-fix": "php-cs-fixer fix ."
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit bootstrap="vendor/autoload.php"
+ backupGlobals="false"
+ backupStaticAttributes="false"
+ colors="true"
+ verbose="true"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ processIsolation="false"
+ stopOnFailure="false">
+ <testsuites>
+ <testsuite name="All tests">
+ <directory>tests</directory>
+ </testsuite>
+ </testsuites>
+ <groups>
+ <exclude>
+ <group>ignore</group>
+ </exclude>
+ </groups>
+</phpunit>
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Bag;
+use Embed\DataInterface;
+use Embed\Http\DispatcherInterface;
+use Embed\Http\ImageResponse;
+use Embed\Http\Response;
+use Embed\Http\Url;
+use Embed\Providers\Provider;
+use Embed\Utils;
+use Exception;
+
+/**
+ * Base class extended by all adapters.
+ *
+ * @property null|string $title
+ * @property null|string $description
+ * @property null|string $url
+ * @property null|string $type
+ * @property array $tags
+ * @property array $feeds
+ * @property array $images
+ * @property array $imagesUrls
+ * @property null|string $image
+ * @property null|int $imageWidth
+ * @property null|int $imageHeight
+ * @property null|string $code
+ * @property null|int $width
+ * @property null|int $height
+ * @property null|float $aspectRatio
+ * @property null|string $authorName
+ * @property null|string $authorUrl
+ * @property array $providerIcons
+ * @property array $providerIconsUrls
+ * @property null|string $providerIcon
+ * @property null|string $providerName
+ * @property null|string $providerUrl
+ * @property null|string $publishedTime
+ */
+abstract class Adapter implements DataInterface
+{
+ protected $config;
+ protected $dispatcher;
+ protected $response;
+ protected $providers = [];
+
+ /**
+ * Checks whether the response is valid to this Adapter.
+ *
+ * @param Response $response
+ *
+ * @return bool
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param Response $response
+ * @param array $config
+ * @param DispatcherInterface $dispatcher
+ */
+ public function __construct(Response $response, array $config, DispatcherInterface $dispatcher)
+ {
+ $this->response = $response;
+ $this->config = new Bag($config);
+ $this->dispatcher = $dispatcher;
+
+ $this->init();
+ }
+
+ /**
+ * Initialize the providers
+ */
+ abstract protected function init();
+
+ /**
+ * Magic method to execute methods to return paramaters
+ * For example, $source->sourceUrl executes $source->getSourceUrl().
+ *
+ * @param string $name The property name
+ *
+ * @return mixed
+ */
+ public function __get($name)
+ {
+ $method = 'get'.$name;
+
+ if (method_exists($this, $method)) {
+ return $this->$name = $this->$method();
+ }
+ return null;
+ }
+
+ /**
+ * Magic method to execute methods to check if parameters are empty
+ *
+ * @param string $name The property name
+ *
+ * @return bool
+ */
+ public function __isset($name)
+ {
+ $value = $this->$name;
+
+ return !empty($value);
+ }
+
+ /**
+ * Returns the dispatcher used.
+ *
+ * @return DispatcherInterface
+ */
+ public function getDispatcher()
+ {
+ return $this->dispatcher;
+ }
+
+ /**
+ * Returns the main response instance.
+ *
+ * @return Response
+ */
+ public function getResponse()
+ {
+ return $this->response;
+ }
+
+ /**
+ * Get a config value.
+ *
+ * @param string $name
+ * @param mixed $default
+ *
+ * @return string|null
+ */
+ public function getConfig($name, $default = null)
+ {
+ $value = $this->config->get($name);
+
+ return $value === null ? $default : $value;
+ }
+
+ /**
+ * Get all providers.
+ *
+ * @return Provider[]
+ */
+ public function getProviders()
+ {
+ return $this->providers;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ $default = $this->url;
+
+ return $this->getFirstFromProviders(function (Provider $provider) {
+ return $provider->getTitle();
+ }, $default);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->getFirstFromProviders(function (Provider $provider) {
+ return $provider->getDescription();
+ });
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ $code = $this->code;
+
+ if (empty($code)) {
+ return 'link';
+ }
+
+ if (strpos($code, '</video>')) {
+ return 'video';
+ }
+
+ //Get the most repeated type
+ $types = [];
+
+ foreach ($this->providers as $provider) {
+ $type = $provider->getType();
+
+ if ($type !== null) {
+ if (!isset($types[$type])) {
+ $types[$type] = 0;
+ }
+
+ ++$types[$type];
+ }
+ }
+
+ //If it has code, it's not a link
+ unset($types['link']);
+
+ return static::getBigger($types) ?: 'rich';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTags()
+ {
+ return $this->getAllFromProviders(function (Provider $provider) {
+ return $provider->getTags();
+ });
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getFeeds()
+ {
+ return $this->getAllFromProviders(function (Provider $provider) {
+ return $provider->getFeeds();
+ });
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ //Width and height deppends to the code
+ $this->width = null;
+ $this->height = null;
+
+ $codes = [];
+
+ foreach ($this->providers as $provider) {
+ $code = $provider->getCode();
+
+ if (!empty($code)) {
+ $codes[] = [
+ 'code' => $code,
+ 'width' => $provider->getWidth(),
+ 'height' => $provider->getHeight(),
+ ];
+ }
+ }
+
+ if (empty($codes)) {
+ return null;
+ }
+
+ //Use only html5 codes
+ $html5 = array_filter($codes, function (array $code) {
+ return strpos($code['code'], '</object>') === false && strpos($code['code'], '</embed>') === false;
+ });
+
+ //If it's not html5 codes, returns flash
+ if (empty($html5)) {
+ $code = current($codes);
+ } else {
+ $code = current($html5);
+ }
+
+ $this->width = is_numeric($code['width']) ? (int) $code['width'] : $code['width'];
+ $this->height = is_numeric($code['height']) ? (int) $code['height'] : $code['height'];
+
+ return $code['code'];
+ }
+
+ /**
+ * Returns the code as DOMNodeList elements
+ *
+ * @return \DOMNodeList|null
+ */
+ public function getHtml()
+ {
+ $code = $this->code;
+
+ if (empty($code)) {
+ return;
+ }
+
+ $errors = libxml_use_internal_errors(true);
+ $entities = libxml_disable_entity_loader(true);
+
+ $dom = new \DOMDocument();
+ $dom->loadHTML($code);
+
+ libxml_use_internal_errors($errors);
+ libxml_disable_entity_loader($entities);
+
+ return Utils::xpathQuery($dom, 'descendant-or-self::body/*', false);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ $default = (string) $this->getResponse()->getUrl();
+ $blacklist = $this->getConfig('url_blacklist');
+
+ //some sites returns the homepage as canonical
+ $homeUrl = $this->getResponse()->getUrl()->getAbsolute('/');
+
+ return $this->getFirstFromProviders(function (Provider $provider) use ($blacklist, $homeUrl) {
+ $url = $provider->getUrl();
+
+ try {
+ if ($homeUrl === $url || (!empty($blacklist) && Url::create($url)->match($blacklist))) {
+ return false;
+ }
+ } catch (Exception $error) {
+ return false;
+ }
+
+ return $url;
+ }, $default);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->getFirstFromProviders(function (Provider $provider) {
+ return $provider->getAuthorName();
+ });
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorUrl()
+ {
+ return $this->getFirstFromProviders(function (Provider $provider) {
+ return $provider->getAuthorUrl();
+ });
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderIconsUrls()
+ {
+ $urls = [
+ $this->getResponse()->getUrl()->getAbsolute('/favicon.ico'),
+ $this->getResponse()->getUrl()->getAbsolute('/favicon.png'),
+ ];
+
+ foreach ($this->providers as $provider) {
+ foreach ($provider->getProviderIconsUrls() as $url) {
+ if (!in_array($url, $urls, true)) {
+ $urls[] = $url;
+ }
+ }
+ }
+
+ return $urls;
+ }
+
+ /**
+ * Gets all icon provider urls found
+ * It returns also the width, height and mime-type.
+ *
+ * @return array
+ */
+ public function getProviderIcons()
+ {
+ return $this->dispatchImagesInfo($this->providerIconsUrls);
+ }
+
+ /**
+ * Gets the best icon provider
+ *
+ * @return string|null
+ */
+ public function getProviderIcon()
+ {
+ $icons = $this->providerIcons;
+
+ if (empty($icons)) {
+ return null;
+ }
+
+ $sizes = [];
+
+ foreach ($icons as $icon) {
+ $sizes[$icon['url']] = $icon['size'];
+ }
+
+ return static::getBigger($sizes);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderName()
+ {
+ $default = $this->getResponse()->getUrl()->getDomain();
+
+ return $this->getFirstFromProviders(function (Provider $provider) {
+ return $provider->getProviderName();
+ }, $default);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderUrl()
+ {
+ $url = $this->getResponse()->getUrl();
+ $default = $url->getScheme().'://'.$url->getDomain(true);
+
+ return $this->getFirstFromProviders(function (Provider $provider) {
+ return $provider->getProviderUrl();
+ }, $default);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ $urls = $this->getAllFromProviders(function (Provider $provider) {
+ return $provider->getImagesUrls();
+ });
+
+ $blacklist = $this->getConfig('images_blacklist');
+
+ if (!empty($blacklist)) {
+ $urls = array_filter($urls, function ($url) use ($blacklist) {
+ return !Url::create($url)->match($blacklist);
+ });
+ }
+
+ return array_values($urls);
+ }
+
+ /**
+ * Gets all images found in the webpage
+ * It returns also the width, height and mime-type.
+ *
+ * @return array
+ */
+ public function getImages()
+ {
+ return $this->dispatchImagesInfo($this->imagesUrls);
+ }
+
+ /**
+ * Gets the best image
+ *
+ * @return string|null
+ */
+ public function getImage()
+ {
+ $this->imageWidth = null;
+ $this->imageHeight = null;
+
+ $images = $this->images;
+ $bigger = (bool) $this->getConfig('choose_bigger_image');
+ $minWidth = $this->getConfig('min_image_width', 1);
+ $minHeight = $this->getConfig('min_image_height', 1);
+
+ $images = array_filter($images, function ($image) use ($minWidth, $minHeight) {
+ return $image['width'] >= $minWidth && $image['height'] >= $minHeight;
+ });
+
+ if (empty($images)) {
+ return null;
+ }
+
+ reset($images);
+ $image = current($images);
+
+ if ($bigger) {
+ $sizes = [];
+
+ foreach ($images as $img) {
+ $sizes[$img['url']] = $img['size'];
+ }
+
+ $biggest = static::getBigger($sizes);
+
+ foreach ($images as $img) {
+ if ($biggest == $img['url']) {
+ $image = $img;
+ break;
+ }
+ }
+ }
+
+ $this->imageWidth = $image['width'];
+ $this->imageHeight = $image['height'];
+
+ return $image['url'];
+ }
+
+ /**
+ * Gets the image width.
+ *
+ * @return int|null
+ */
+ public function getImageWidth()
+ {
+ $this->image = $this->getImage();
+
+ return $this->imageWidth;
+ }
+
+ /**
+ * Gets the image height.
+ *
+ * @return int|null
+ */
+ public function getImageHeight()
+ {
+ $this->image = $this->getImage();
+
+ return $this->imageHeight;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ $this->code = $this->getCode();
+
+ return $this->width;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ $this->code = $this->getCode();
+
+ return $this->height;
+ }
+
+ /**
+ * Gets the aspect ratio of the embedded widget
+ * (useful to make it responsive).
+ *
+ * @return float|null
+ */
+ public function getAspectRatio()
+ {
+ if ($this->width !== null
+ && (strpos($this->width, '%') === false)
+ && $this->height !== null && (strpos($this->height, '%') === false)) {
+ return round(($this->height / $this->width) * 100, 3);
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPublishedTime()
+ {
+ return $this->getFirstFromProviders(function (Provider $provider) {
+ return $provider->getPublishedTime();
+ });
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLicense()
+ {
+ return $this->getFirstFromProviders(function (Provider $provider) {
+ return $provider->getLicense();
+ });
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLinkedData()
+ {
+ return $this->getAllFromProviders(function (Provider $provider) {
+ return $provider->getLinkedData();
+ });
+ }
+
+ /**
+ * Get images info.
+ *
+ * @param array $urls
+ *
+ * @return array
+ */
+ private function dispatchImagesInfo($urls)
+ {
+ if (empty($urls)) {
+ return [];
+ }
+
+ $requests = [];
+
+ foreach ($urls as $url) {
+ $requests[] = Url::create($url);
+ }
+
+ return array_map(
+ function (ImageResponse $response) {
+ return [
+ 'url' => (string) $response->getUrl(),
+ 'width' => $response->getWidth(),
+ 'height' => $response->getHeight(),
+ 'size' => $response->getWidth() * $response->getHeight(),
+ 'mime' => $response->getContentType(),
+ ];
+ },
+ $this->getDispatcher()->dispatchImages($requests)
+ );
+ }
+
+ /**
+ * Returns the key of the bigger value in an array
+ *
+ * @param array $values
+ *
+ * @return string|null
+ */
+ protected static function getBigger(array $values)
+ {
+ $bigger = null;
+
+ foreach ($values as $value => $repeat) {
+ if ($bigger === null || $repeat > $values[$bigger]) {
+ $bigger = $value;
+ }
+ }
+
+ return $bigger;
+ }
+
+ /**
+ * Returns the first value of the providers
+ *
+ * @param callable $callable
+ * @param string|null $default
+ *
+ * @return string|null
+ */
+ protected function getFirstFromProviders(callable $callable, $default = null)
+ {
+ $values = array_filter(array_map($callable, $this->providers));
+
+ return empty($values) ? $default : current($values);
+ }
+
+ /**
+ * Returns the all values from the providers
+ *
+ * @param callable $callable
+ *
+ * @return array
+ */
+ protected function getAllFromProviders(callable $callable)
+ {
+ $values = array_filter(array_map($callable, $this->providers));
+ $all = [];
+
+ foreach ($values as $value) {
+ foreach ($value as $v) {
+ if (!in_array($v, $all, true)) {
+ $all[] = $v;
+ }
+ }
+ }
+
+ return $all;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+use Embed\Providers\Api;
+
+/**
+ * Adapter to provide information from archive.org API.
+ */
+class Archive extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'archive.org/details/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function init()
+ {
+ parent::init();
+
+ $this->providers = ['archive' => new Api\Archive($this)] + $this->providers;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ return Utils::iframe(str_replace('/details/', '/embed/', $this->url), $this->width, $this->height);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return 640;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return 480;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Utils;
+use Embed\Http\Response;
+
+/**
+ * Adapter to get the embed code from play.cadenaser.com.
+ */
+class Cadenaser extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'play.cadenaser.com/audio/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $url = $this->getResponse()->getUrl();
+
+ return Utils::iframe($url->withPath('/widget/'.$url->getPath()), $this->width, $this->height);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return 620;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return 100;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+
+/**
+ * Adapter to get the embed code from cartodb.
+ */
+class Carto extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ '*.carto.com/viz/*/public_map',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $this->width = null;
+ $this->height = 520;
+
+ $url = $this->getResponse()->getUrl()->withDirectoryPosition(2, 'embed_map');
+
+ return Utils::iframe($url, '100%', $this->height);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Http\Url;
+use Embed\Utils;
+
+/**
+ * Adapter provider more information from cnn.com.
+ */
+class Cnn extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ '*.cnn.com/videos/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $url = Url::create('https://fave.api.cnn.io/v1/fav/')
+ ->withQueryParameters([
+ 'video' => implode('/', $this->getResponse()->getUrl()->getSlicePath(1)),
+ 'customer' => 'cnn',
+ 'env' => 'prod'
+ ]);
+
+ $this->width = 416;
+ $this->height = 234;
+
+ return Utils::iframe($url, $this->width, $this->height);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+use Embed\Providers\Api;
+
+/**
+ * Adapter provider more information from some facebook pages.
+ */
+class Facebook extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'www.facebook.com/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function init()
+ {
+ parent::init();
+
+ $this->providers = ['facebook' => new Api\Facebook($this)] + $this->providers;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+use Embed\Providers;
+
+/**
+ * Adapter to provide information from raw files.
+ */
+class File extends Adapter
+{
+ private static $contentTypes = [
+ 'video/ogg' => ['video', 'videoHtml'],
+ 'video/quicktime' => ['video', 'videoHtml'],
+ 'application/ogg' => ['video', 'videoHtml'],
+ 'video/ogv' => ['video', 'videoHtml'],
+ 'video/webm' => ['video', 'videoHtml'],
+ 'video/mp4' => ['video', 'videoHtml'],
+ 'audio/ogg' => ['audio', 'audioHtml'],
+ 'audio/mp3' => ['audio', 'audioHtml'],
+ 'audio/mpeg' => ['audio', 'audioHtml'],
+ 'audio/webm' => ['audio', 'audioHtml'],
+ 'image/jpeg' => ['photo', 'imageHtml'],
+ 'image/jpg' => ['photo', 'imageHtml'],
+ 'image/gif' => ['photo', 'imageHtml'],
+ 'image/png' => ['photo', 'imageHtml'],
+ 'image/bmp' => ['photo', 'imageHtml'],
+ 'image/ico' => ['photo', 'imageHtml'],
+ 'image/webp' => ['photo', 'imageHtml'],
+ 'text/rtf' => ['rich', 'google'],
+ 'application/pdf' => ['rich', 'google'],
+ 'application/msword' => ['rich', 'google'],
+ 'application/vnd.ms-powerpoint' => ['rich', 'google'],
+ 'application/vnd.ms-excel' => ['rich', 'google'],
+ 'application/zip' => ['rich', 'google'],
+ 'application/postscript' => ['rich', 'google'],
+ 'application/octet-stream' => ['rich', 'google'],
+ ];
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && isset(self::$contentTypes[$response->getContentType()]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function init()
+ {
+ $this->providers = [
+ 'oembed' => new Providers\OEmbed($this),
+ ];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ return self::$contentTypes[$this->getResponse()->getContentType()][0];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ if (($code = parent::getcode())) {
+ return $code;
+ }
+
+ switch (self::$contentTypes[$this->getResponse()->getContentType()][1]) {
+ case 'videoHtml':
+ return Utils::videoHtml($this->image, $this->url, $this->imageWidth, $this->imageHeight);
+
+ case 'audioHtml':
+ return Utils::audioHtml($this->url);
+
+ case 'google':
+ return Utils::google($this->url);
+
+ case 'imageHtml':
+ return Utils::imageHtml($this->url, 'Remote file', $this->imageWidth, $this->imageHeight);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ if ($this->type === 'photo') {
+ return [$this->url];
+ }
+
+ return [];
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+
+/**
+ * Adapter provider more information from flickr.
+ */
+class Flickr extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'www.flickr.com/photos/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $code = parent::getCode();
+
+ if (empty($code)) {
+ $this->width = 640;
+ $this->height = 425;
+
+ $code = Utils::iframe($this->getResponse()->getUrl()->withAddedPath('player'), $this->width, $this->height);
+ }
+
+ return $code;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderName()
+ {
+ return 'Flickr';
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Providers\Api;
+
+/**
+ * Adapter to get the embed code from gist.github.com.
+ */
+class Github extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'gist.github.com/*/*',
+ 'github.com/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function init()
+ {
+ parent::init();
+
+ if ($this->getResponse()->getUrl()->getHost() === 'gist.github.com') {
+ $this->providers = ['gist' => new Api\Gist($this)] + $this->providers;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ //Open graph returns as canonical url the main repo url, instead the file
+ return (string) $this->getResponse()->getUrl();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $this->width = null;
+ $this->height = null;
+
+ $url = $this->getResponse()->getUrl();
+
+ if ($url->match('github.com/*/*/blob/*')) {
+ $username = $url->getDirectoryPosition(0);
+ $repo = $url->getDirectoryPosition(1);
+ $ref = $url->getDirectoryPosition(3);
+ $path_to_file = implode('/', $url->getSlicePath(4));
+
+ switch ($url->getExtension()) {
+ case 'geojson':
+ //https://help.github.com/articles/mapping-geojson-files-on-github/#embedding-your-map-elsewhere
+ return "<script src=\"https://embed.githubusercontent.com/view/geojson/{$username}/{$repo}/{$ref}/{$path_to_file}\"></script>";
+
+ case 'stl':
+ //https://help.github.com/articles/3d-file-viewer/#embedding-your-model-elsewhere
+ return "<script src=\"https://embed.githubusercontent.com/view/3d/{$username}/{$repo}/{$ref}/{$path_to_file}\"></script>";
+ }
+ }
+
+ return parent::getCode();
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+use Embed\Providers\Api;
+
+/**
+ * Adapter provider more information from google maps and google drive.
+ */
+class Google extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'maps.google.*',
+ 'www.google.*/maps*',
+ 'calendar.google.com/calendar/*',
+ 'drive.google.com/file/*/view',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function init()
+ {
+ parent::init();
+
+ if ($this->getResponse()->getUrl()->match('*/maps/*')) {
+ $this->providers = ['google' => new Api\GoogleMaps($this)] + $this->providers;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $this->width = null;
+ $this->height = null;
+
+ $url = $this->getResponse()->getUrl();
+
+ if ($url->getHost() === 'calendar.google.com') {
+ return Utils::iframe($url);
+ }
+
+ if (isset($this->providers['google'])) {
+ return $this->providers['google']->getCode();
+ }
+
+ return Utils::iframe($url
+ ->withDirectoryPosition(3, 'preview')
+ ->withQueryParameters([]));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ return [];
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+
+/**
+ * Adapter to get the embed code from howcast.com.
+ */
+class Howcast extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'www.howcast.com/videos/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $this->width = null;
+ $this->height = null;
+
+ if (!($dom = $this->getResponse()->getHtmlContent())) {
+ return;
+ }
+
+ // #embedModal textarea
+ $textarea = Utils::xpathQuery($dom, "descendant-or-self::*[@id = 'embedModal']/descendant-or-self::*/textarea");
+
+ if ($textarea) {
+ return $textarea->nodeValue;
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+
+/**
+ * Adapter to generate embed code from ideone.com.
+ */
+class Ideone extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'ideone.com/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $this->width = null;
+ $this->height = null;
+
+ $url = $this->getResponse()->getUrl();
+ $path = '/e.js'.$url->getPath();
+
+ return Utils::script($url->getAbsolute($path));
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Providers\Api;
+
+/**
+ * Adapter to provide information from imageshack.
+ */
+class Imageshack extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'imageshack.com/i/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function init()
+ {
+ parent::init();
+
+ $this->providers = ['imageshack' => new Api\Imageshack($this)] + $this->providers;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Utils;
+
+/**
+ * Adapter to fix some issues from jsfiddle.
+ */
+class Jsfiddle extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $this->width = null;
+ $this->height = null;
+
+ $url = $this->url;
+ $embed_url = $url.((substr($url, -1) === '/') ? 'embedded/' : '/embedded/');
+
+ return Utils::iframe($embed_url);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+
+/**
+ * Adapter to provide all information from lavozdegalicia.es that needs a special query parameter to generate a session cookie.
+ */
+class Lavozdegalicia extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'www.lavozdegalicia.es/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function init()
+ {
+ parent::init();
+
+ $url = $this->getResponse()->getStartingUrl();
+
+ $this->response = $this->getDispatcher()->dispatch($url->withQueryParameter('piano_d', '1'));
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Utils;
+use Embed\Http\Response;
+
+/**
+ * Adapter to get the embed code from line.do.
+ */
+class Line extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'line.do/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $url = $this->getResponse()->getUrl();
+ $id = $url->getDirectoryPosition(2);
+
+ return Utils::iframe($url->withPath("embed/{$id}/vertical"), $this->width, $this->height, 'border:1px solid #e7e7e7;');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return 640;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return 640;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+
+/**
+ * Adapter get embed code from 500px.com.
+ */
+class N500px extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ '500px.com/photo/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $url = $this->getResponse()->getUrl();
+
+ if (is_numeric($url->getDirectoryPosition(1))) {
+ return Utils::iframe($url->withDirectoryPosition(2, 'embed.html'), $this->width, $this->height);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ if (is_numeric($this->getResponse()->getUrl()->getDirectoryPosition(1))) {
+ return $this->imageWidth;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ if (is_numeric($this->getResponse()->getUrl()->getDirectoryPosition(1))) {
+ return $this->imageHeight;
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+
+/**
+ * Adapter to get more info from parleys.com.
+ */
+class Parleys extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'www.parleys.com/play/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $id = $this->getResponse()->getUrl()->getDirectoryPosition(1);
+
+ return '<div data-parleys-presentation="'.$id.'" style="width:'.$this->width.';height:'.$this->height.'px"><script type = "text/javascript" src="//parleys.com/js/parleys-share.js"></script></div>';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return '100%';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return 300;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ return 'video';
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+
+/**
+ * Adapter to generate embed code from pastebin.
+ */
+class Pastebin extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'pastebin.com/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $this->width = null;
+ $this->height = null;
+
+ $url = $this->getResponse()->getUrl();
+ $path = '/embed_js' . $url->getPath();
+
+ return Utils::script($this->getResponse()->getUrl()->getAbsolute($path));
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Utils;
+
+/**
+ * Adapter to generate embed code from pastie.org.
+ */
+class Pastie extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'pastie.org/pastes/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $this->width = null;
+ $this->height = null;
+
+ $path = '/'.$this->getResponse()->getUrl()->getDirectoryPosition(1).'.js';
+
+ return Utils::script($this->getResponse()->getUrl()->getAbsolute($path));
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+
+/**
+ * Adapter to get embed code from pinterest.com.
+ */
+class Pinterest extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'www.pinterest.com/pin/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ return '<a data-pin-do="embedPin" data-pin-lang="es" href="'
+ .$this->getResponse()->getUrl()
+ .'"></a>'
+ .'<script async defer src="//assets.pinterest.com/js/pinit.js"></script>';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return 236;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return 442;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+
+/**
+ * Adapter to generate embed code from SassMeister.
+ */
+class Sassmeister extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'sassmeister.com/gist/*',
+ 'www.sassmeister.com/gist/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $this->width = null;
+ $this->height = 480;
+ $id = $this->getResponse()->getUrl()->getDirectoryPosition(1);
+
+ return "<p class=\"sassmeister\" data-gist-id=\"{$id}\" data-height=\"480\" data-theme=\"tomorrow\">".
+ "<a href=\"http://sassmeister.com/gist/{$id}\">Play with this gist on SassMeister.</a>".
+ '</p>'.
+ '<script src="http://cdn.sassmeister.com/js/embed.js" async></script>';
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Utils;
+use Embed\Http\Response;
+
+/**
+ * Adapter to get the embed code from slides.com.
+ */
+class Slides extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'slides.com/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ return Utils::iframe($this->getResponse()->getUrl()->withAddedPath('embed'), $this->width, $this->height);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return 576;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return 420;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+
+/**
+ * Adapter to generate embed code from snipplr.com.
+ */
+class Snipplr extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ 'snipplr.com/view/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $this->width = null;
+ $this->height = null;
+
+ $id = $this->getResponse()->getUrl()->getDirectoryPosition(1);
+
+ return <<<CODE
+<div id="snipplr_embed_{$id}" class="snipplr_embed"><a target_"blank" href="https://snipplr.com/view/{$id}">View this snippet</a> on Snipplr</div><script type="text/javascript" src="https://snipplr.com/js/embed.js"></script><script type="text/javascript" src="https://snipplr.com/json/{$id}"></script>
+CODE;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Providers;
+
+/**
+ * Adapter to provide all information from any webpage.
+ */
+class Webpage extends Adapter
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function init()
+ {
+ $this->providers = [
+ 'oembed' => new Providers\OEmbed($this),
+ 'opengraph' => new Providers\OpenGraph($this),
+ 'linkpulse' => new Providers\Linkpulse($this),
+ 'twittercards' => new Providers\TwitterCards($this),
+ 'dcterms' => new Providers\Dcterms($this),
+ 'sailthru' => new Providers\Sailthru($this),
+ 'html' => new Providers\Html($this),
+ ];
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+use Embed\Providers\Api;
+
+/**
+ * Adapter to provide information from wikipedia.
+ */
+class Wikipedia extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid() && $response->getUrl()->match([
+ '*.wikipedia.org/wiki/*',
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function init()
+ {
+ parent::init();
+
+ $this->providers = ['wikipedia' => new Api\Wikipedia($this)] + $this->providers;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderName()
+ {
+ return 'Wikipedia';
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Adapters;
+
+use Embed\Http\Response;
+
+/**
+ * Adapter to provide information from youtube.
+ * Required when youtube returns a 429 status code.
+ */
+class Youtube extends Webpage
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function check(Response $response)
+ {
+ return $response->isValid([200, 429]) && $response->getUrl()->match([
+ '*.youtube.*',
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed;
+
+/**
+ * Class to store and access to data.
+ */
+class Bag
+{
+ private $parameters = [];
+
+ /**
+ * Set the initial parameters.
+ *
+ * @param array $parameters
+ */
+ public function __construct(array $parameters = [])
+ {
+ $this->set($parameters);
+ }
+
+ /**
+ * Save a value.
+ *
+ * @param string|array $name
+ * @param mixed $value
+ */
+ public function set($name, $value = null)
+ {
+ if (!is_array($name)) {
+ $name = [$name => $value];
+ }
+
+ foreach ($name as $name => $value) {
+ $name = self::normalizeName($name);
+ $value = self::normalizeValue($value);
+
+ $this->parameters[$name] = $value;
+ }
+ }
+
+ /**
+ * Adds a subvalue.
+ *
+ * @param string $name
+ * @param mixed $value
+ */
+ public function add($name, $value = null)
+ {
+ $name = self::normalizeName($name);
+ $value = self::normalizeValue($value);
+
+ if (!isset($this->parameters[$name])) {
+ $this->parameters[$name] = [];
+ } elseif (!is_array($this->parameters[$name])) {
+ $this->parameters[$name] = (array) $this->parameters[$name];
+ }
+
+ $this->parameters[$name][] = $value;
+ }
+
+ /**
+ * Get a value.
+ *
+ * @param string $name
+ * @param bool $isHtml
+ *
+ * @return string|null
+ */
+ public function get($name, $isHtml = false)
+ {
+ $name = self::normalizeName($name);
+
+ if (strpos($name, '[') !== false) {
+ $names = explode('[', str_replace(']', '', $name));
+ $key = array_shift($names);
+ $item = isset($this->parameters[$key]) ? $this->parameters[$key] : [];
+
+ foreach ($names as $key) {
+ if (!isset($item[$key])) {
+ return;
+ }
+
+ $item = $item[$key];
+ }
+
+ return $isHtml ? $item : self::toPlainValue($item);
+ }
+
+ if (isset($this->parameters[$name])) {
+ return $isHtml ? $this->parameters[$name] : self::toPlainValue($this->parameters[$name]);
+ }
+ }
+
+ /**
+ * Return all stored values keys.
+ *
+ * @return array
+ */
+ public function getKeys()
+ {
+ return array_keys($this->parameters);
+ }
+
+ /**
+ * Return the raw stored values.
+ *
+ * @return array
+ */
+ public function getAll()
+ {
+ return $this->parameters;
+ }
+
+ /**
+ * Check if a value exists and is not empty.
+ *
+ * @param string $name
+ *
+ * @return bool
+ */
+ public function has($name)
+ {
+ $name = self::normalizeName($name);
+
+ if (strpos($name, '[') !== false) {
+ $names = explode('[', str_replace(']', '', $name));
+ $key = array_shift($names);
+ $item = isset($this->parameters[$key]) ? $this->parameters[$key] : [];
+
+ foreach ($names as $key) {
+ if (!isset($item[$key])) {
+ return false;
+ }
+
+ $item = $item[$key];
+ }
+
+ return !empty($item);
+ }
+
+ return !empty($this->parameters[$name]);
+ }
+
+ /**
+ * Normalize a variable name.
+ *
+ * @param string $name
+ *
+ * @return string
+ */
+ private static function normalizeName($name)
+ {
+ return strtolower(trim($name));
+ }
+
+ /**
+ * Normalize a value.
+ * If it's a string, removes spaces and normalize some utf-8 chars.
+ *
+ * @param mixed $value
+ *
+ * @return mixed
+ */
+ private static function normalizeValue($value)
+ {
+ if (is_string($value)) {
+ $value = str_ireplace([' ', ' '], ' ', $value);
+ $value = trim($value);
+
+ return ($value === '') ? null : $value;
+ }
+
+ return $value;
+ }
+
+ /**
+ * Remove the html code and entities in a value
+ *
+ * @param mixed $value
+ *
+ * @return mixed
+ */
+ private static function toPlainValue($value)
+ {
+ if (is_string($value)) {
+ $value = strip_tags($value);
+ $value = html_entity_decode($value, ENT_QUOTES | ENT_XML1, 'UTF-8');
+ $value = trim($value);
+
+ return ($value === '') ? null : $value;
+ }
+
+ return $value;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed;
+
+/**
+ * Interface used by all adapters and providers.
+ */
+interface DataInterface
+{
+ /**
+ * Gets the title.
+ *
+ * @return string|null
+ */
+ public function getTitle();
+
+ /**
+ * Gets the description.
+ *
+ * @return string|null
+ */
+ public function getDescription();
+
+ /**
+ * Gets the type of the url
+ * The types are the same than the oEmbed types:
+ * video, photo, link, rich.
+ *
+ * @return string|null
+ */
+ public function getType();
+
+ /**
+ * Gets the tags of the url.
+ *
+ * @return array
+ */
+ public function getTags();
+
+ /**
+ * Gets the feeds urls.
+ *
+ * @return array
+ */
+ public function getFeeds();
+
+ /**
+ * Gets the embed code.
+ *
+ * @return string|null
+ */
+ public function getCode();
+
+ /**
+ * Gets the canonical url.
+ *
+ * @return string|null
+ */
+ public function getUrl();
+
+ /**
+ * Gets the author name.
+ *
+ * @return string|null
+ */
+ public function getAuthorName();
+
+ /**
+ * Gets the author url.
+ *
+ * @return string|null
+ */
+ public function getAuthorUrl();
+
+ /**
+ * Gets the urls of all icons of the provider
+ * Note: it doesn't check whether the image exists or not.
+ *
+ * @return array
+ */
+ public function getProviderIconsUrls();
+
+ /**
+ * Gets the provider name.
+ *
+ * @return string|null
+ */
+ public function getProviderName();
+
+ /**
+ * Gets the provider url (usually the home url of the link).
+ *
+ * @return string|null
+ */
+ public function getProviderUrl();
+
+ /**
+ * Gets the urls of all images found in the webpage
+ * Note: it doesn't check whether the image exists or not.
+ *
+ * @return array
+ */
+ public function getImagesUrls();
+
+ /**
+ * Gets the width of the embedded widget.
+ *
+ * @return int|null
+ */
+ public function getWidth();
+
+ /**
+ * Gets the height of the embedded widget.
+ *
+ * @return int|null
+ */
+ public function getHeight();
+
+ /**
+ * Gets the published time, if the webpage is an article.
+ *
+ * @return string|null
+ */
+ public function getPublishedTime();
+
+ /**
+ * Gets the license info.
+ *
+ * @return string|null
+ */
+ public function getLicense();
+
+ /**
+ * Returns all linked data found.
+ *
+ * @return array
+ */
+ public function getLinkedData();
+}
--- /dev/null
+<?php
+
+namespace Embed;
+
+use Embed\Adapters\Adapter;
+use Embed\Http\CurlDispatcher;
+use Embed\Http\DispatcherInterface;
+use Embed\Http\Url;
+
+abstract class Embed
+{
+ /**
+ * @var array
+ */
+ public static $default_config = [
+ 'custom_adapters_namespace' => null,
+ 'min_image_width' => 1,
+ 'min_image_height' => 1,
+ 'choose_bigger_image' => false,
+ 'images_blacklist' => [],
+ 'url_blacklist' => [
+ '?&ns_campaign=*',
+ '?&ns_source=*',
+ '?&utm_campaign=*',
+ '?&utm_medium=*',
+ '?&utm_source=*',
+ ],
+ 'follow_canonical' => true,
+
+ 'html' => [
+ 'max_images' => -1,
+ 'external_images' => false
+ ],
+
+ 'oembed' => [
+ 'parameters' => [],
+ 'embedly_key' => null,
+ 'iframely_key' => null,
+ ],
+
+ 'google' => [
+ 'key' => null,
+ ],
+
+ 'soundcloud' => [
+ 'key' => null,
+ ],
+
+ 'facebook' => [
+ 'key' => null,
+ 'events_fields' => 'id,cover,description,end_time,name,owner,place,start_time,timezone',
+ 'videos_fields' => 'id,description,embed_html',
+ ]
+ ];
+
+ /**
+ * Gets the info from an url.
+ *
+ * @param Url|string $url
+ * @param array|null $config
+ * @param DispatcherInterface|null $dispatcher
+ *
+ * @return Adapter
+ */
+ public static function create($url, array $config = null, DispatcherInterface $dispatcher = null)
+ {
+ if (!($url instanceof Url)) {
+ $url = Url::create($url);
+ }
+
+ if ($config === null) {
+ $config = self::$default_config;
+ } else {
+ $config += self::$default_config;
+ }
+
+ if ($dispatcher === null) {
+ $dispatcher = new CurlDispatcher();
+ }
+
+ $info = self::process($url, $config, $dispatcher);
+
+ if ($info->getConfig('follow_canonical') === false) {
+ return $info;
+ }
+
+ // Repeat the process if:
+ // - The canonical url is different
+ // - No embed code has found
+ $from = preg_replace('|^(\w+://)|', '', rtrim((string)$info->getResponse()->getUrl(), '/'));
+ $to = preg_replace('|^(\w+://)|', '', rtrim($info->url, '/'));
+
+ if ($from !== $to && empty($info->code)) {
+ //accept new result if valid
+ try {
+ return self::process(Url::create($info->url), $config, $dispatcher);
+ } catch (\Exception $e) {
+ return $info;
+ }
+ }
+
+ return $info;
+ }
+
+ /**
+ * Process the url.
+ *
+ * @param Url $url
+ * @param array $config
+ * @param DispatcherInterface $dispatcher
+ *
+ * @throws Exceptions\InvalidUrlException If the urls is not valid
+ *
+ * @return Adapter
+ */
+ private static function process(Url $url, array $config, DispatcherInterface $dispatcher)
+ {
+ $response = $dispatcher->dispatch($url);
+
+ //If is a file use File Adapter
+ $adapter = self::getClass('File', $config);
+
+ if ($adapter::check($response)) {
+ return new $adapter($response, $config, $dispatcher);
+ }
+
+ //Search the adapter using the domain
+ $adapter = self::getClass($response->getUrl()->getClassNameForDomain(), $config);
+
+ if (class_exists($adapter) && $adapter::check($response)) {
+ return new $adapter($response, $config, $dispatcher);
+ }
+
+ //Use the default webpage adapter
+ $adapter = self::getClass('Webpage', $config);
+
+ if ($adapter::check($response)) {
+ return new $adapter($response, $config, $dispatcher);
+ }
+
+ if ($response->getError() === null) {
+ $exception = new Exceptions\InvalidUrlException(sprintf("Invalid url '%s' (Status code %s)", (string) $url, $response->getStatusCode()));
+ } else {
+ $exception = new Exceptions\InvalidUrlException($response->getError());
+ }
+
+ $exception->setResponse($response);
+
+ throw $exception;
+ }
+
+ /**
+ * Returns a class name using the custom_adapters_namespace
+ *
+ * @param string $name
+ * @param array $config
+ *
+ * @return string
+ */
+ private static function getClass($name, array $config)
+ {
+ if (!empty($config['custom_adapters_namespace'])) {
+ $namespaces = (array) $config['custom_adapters_namespace'];
+
+ foreach ($namespaces as $namespace) {
+ $class = $namespace.$name;
+
+ if (class_exists($class)) {
+ return $class;
+ }
+ }
+ }
+
+ return 'Embed\\Adapters\\'.$name;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Exceptions;
+
+use Exception;
+
+class EmbedException extends Exception
+{
+}
--- /dev/null
+<?php
+
+namespace Embed\Exceptions;
+
+use Embed\Http\Response;
+
+class InvalidUrlException extends EmbedException
+{
+ /**
+ * @var Response|null
+ */
+ private $response;
+
+ /**
+ * Set the response related with this error
+ *
+ * @param Response
+ */
+ public function setResponse(Response $response)
+ {
+ $this->response = $response;
+ }
+
+ /**
+ * Get the response related with this error
+ *
+ * @return Response|null
+ */
+ public function getResponse()
+ {
+ return $this->response;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Http;
+
+/**
+ * Class to consume http responses.
+ */
+abstract class AbstractResponse
+{
+ protected $startingUrl;
+ protected $url;
+ protected $statusCode;
+ protected $contentType;
+ protected $headers;
+ protected $info;
+
+ public function __construct(Url $startingUrl, Url $url, $statusCode, $contentType, array $headers, array $info)
+ {
+ $this->startingUrl = $startingUrl;
+ $this->url = $url;
+ $this->statusCode = (int)$statusCode;
+ $this->contentType = $contentType;
+ $this->headers = $headers;
+ $this->info = $info;
+ }
+
+ /**
+ * Get the starting url.
+ *
+ * @return Url
+ */
+ public function getStartingUrl()
+ {
+ return $this->startingUrl;
+ }
+
+ /**
+ * Get the http code of the response, for example: 200.
+ *
+ * @return int
+ */
+ public function getStatusCode()
+ {
+ return $this->statusCode;
+ }
+
+ /**
+ * Get the content-type of the response, for example: text/html.
+ *
+ * @return string|null
+ */
+ public function getContentType()
+ {
+ return $this->contentType;
+ }
+
+ /**
+ * Returns the final url.
+ *
+ * @return Url
+ */
+ public function getUrl()
+ {
+ return $this->url;
+ }
+
+ /**
+ * Returns the http headers.
+ *
+ * @return array
+ */
+ public function getHeaders()
+ {
+ return $this->headers;
+ }
+
+ /**
+ * Returns extra http info.
+ *
+ * @return array
+ */
+ public function getInfo()
+ {
+ return $this->info;
+ }
+
+ /**
+ * Returns dispatch error.
+ *
+ * @return string|null
+ */
+ public function getError()
+ {
+ return empty($this->info['error']) ? null : $this->info['error'];
+ }
+
+ /**
+ * Get a header.
+ *
+ * @param string $name
+ *
+ * @return string|null
+ */
+ public function getHeader($name)
+ {
+ $name = strtolower($name);
+
+ return isset($this->headers[$name]) ? implode(',', $this->headers[$name]) : null;
+ }
+
+ /**
+ * Check if the response is valid or not.
+ *
+ * @param array $codes
+ *
+ * @return bool
+ */
+ public function isValid(array $codes = null)
+ {
+ if ($codes === null) {
+ return $this->statusCode === 200;
+ }
+
+ return in_array($this->statusCode, $codes);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Http;
+
+use Embed\Exceptions\EmbedException;
+use Composer\CaBundle\CaBundle;
+use stdClass;
+
+/**
+ * Curl dispatcher.
+ */
+class CurlDispatcher implements DispatcherInterface
+{
+ private $responses = [];
+ private static $acceptHeaders = [
+ 'jpg' => 'image/jpeg',
+ 'jpeg' => 'image/jpeg',
+ 'gif' => 'image/gif',
+ 'png' => 'image/png',
+ 'mp3' => 'audio/mpeg',
+ 'mp4' => 'video/mp4',
+ 'ogg' => 'audio/ogg',
+ 'ogv' => 'video/ogg',
+ 'webm' => 'video/webm',
+ ];
+
+ private $config = [
+ CURLOPT_HTTPHEADER => [],
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_CONNECTTIMEOUT => 10,
+ CURLOPT_TIMEOUT => 10,
+ CURLOPT_SSL_VERIFYHOST => 0,
+ CURLOPT_SSL_VERIFYPEER => false,
+ CURLOPT_ENCODING => '',
+ CURLOPT_AUTOREFERER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_USERAGENT => 'Embed PHP library',
+ CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
+ ];
+
+ /**
+ * Constructor.
+ *
+ * @param array $config
+ */
+ public function __construct(array $config = [])
+ {
+ $this->config = $config + $this->config;
+
+ if (!isset($this->config[CURLOPT_COOKIEJAR])) {
+ $cookies = str_replace('//', '/', sys_get_temp_dir().'/embed-cookies-'.uniqid().'.txt');
+
+ if (is_file($cookies)) {
+ if (!is_writable($cookies)) {
+ throw new EmbedException(sprintf('The temporary cookies file "%s" is not writable', $cookies));
+ }
+ } elseif (!is_writable(dirname($cookies))) {
+ throw new EmbedException(sprintf('The temporary folder "%s" is not writable', dirname($cookies)));
+ }
+
+ $this->config[CURLOPT_COOKIEJAR] = $cookies;
+ $this->config[CURLOPT_COOKIEFILE] = $cookies;
+ }
+ }
+
+ /**
+ * Return all responses for debug purposes
+ *
+ * @return AbstractResponse[]
+ */
+ public function getAllResponses()
+ {
+ return $this->responses;
+ }
+
+ /**
+ * Remove the cookies file on destruct the instance.
+ */
+ public function __destruct()
+ {
+ $cookies = $this->config[CURLOPT_COOKIEJAR];
+
+ if (is_file($cookies)) {
+ unlink($cookies);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function dispatch(Url $url)
+ {
+ $options = $this->config;
+
+ $extension = $url->getExtension();
+
+ if (!empty($extension) && isset(self::$acceptHeaders[$extension])) {
+ $options[CURLOPT_HTTPHEADER][] = 'Accept: '.self::$acceptHeaders[$extension];
+ } else {
+ $options[CURLOPT_HTTPHEADER][] = 'Accept: */*';
+ }
+
+ $response = $this->exec($url, $options);
+
+ //Some sites returns 403 with the default user-agent
+ if ($response->getStatusCode() === 403) {
+ $options[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36';
+
+ return $this->exec($url, $options);
+ }
+
+ //Other sites needs a certificate
+ if (
+ class_exists('Composer\\CaBundle\\CaBundle')
+ && $response->getStatusCode() === 0
+ && strpos($response->getError(), 'SSL') !== false
+ ) {
+ $options[CURLOPT_SSL_VERIFYHOST] = 2;
+ $options[CURLOPT_SSL_VERIFYPEER] = true;
+ $options[CURLOPT_CAINFO] = CaBundle::getSystemCaRootBundlePath();
+
+ return $this->exec($url, $options);
+ }
+
+ return $response;
+ }
+
+ /**
+ * Execute a curl request
+ *
+ * @param Url $url
+ * @param array $options
+ *
+ * @return Response
+ */
+ protected function exec(Url $url, array $options)
+ {
+ $connection = curl_init((string) $url);
+ curl_setopt_array($connection, $options);
+
+ $curl = new CurlResult($connection);
+
+ //Get only text responses
+ $curl->onHeader(function ($name, $value, $data) {
+ if ($name === 'content-type') {
+ $data->isBinary = !preg_match('/(text|html|json)/', strtolower($value));
+ }
+ });
+
+ $curl->onBody(function ($string, stdClass $data) {
+ return empty($data->isBinary);
+ });
+
+ curl_exec($connection);
+
+ $result = $curl->getResult();
+
+ curl_close($connection);
+
+ return $this->responses[] = new Response(
+ $url,
+ Url::create($result['url']),
+ $result['statusCode'],
+ $result['contentType'],
+ $result['content'],
+ $result['headers'],
+ $result['info']
+ );
+ }
+
+
+ /**
+ * {@inheritdoc}
+ */
+ public function dispatchImages(array $urls)
+ {
+ if (empty($urls)) {
+ return [];
+ }
+
+ $curl_multi = curl_multi_init();
+ $responses = [];
+ $connections = [];
+
+ foreach ($urls as $k => $url) {
+ if ($url->getScheme() === 'data') {
+ $response = ImageResponse::createFromBase64($url);
+
+ if ($response) {
+ $responses[$k] = $response;
+ }
+
+ continue;
+ }
+
+ $connection = curl_init((string) $url);
+
+ $options = $this->config;
+ $options[CURLOPT_HTTPHEADER] = ['Accept: image/*'];
+
+ curl_setopt_array($connection, $options);
+ curl_multi_add_handle($curl_multi, $connection);
+
+ $curl = new CurlResult($connection);
+
+ $curl->onBody(function ($body, stdClass $data) {
+ if (($info = @getimagesizefromstring($body))) {
+ $data->width = $info[0];
+ $data->height = $info[1];
+ $data->mime = $info['mime'];
+
+ return false;
+ }
+ });
+
+ $connections[$k] = $curl;
+ }
+
+ if (!empty($connections)) {
+ do {
+ $return = curl_multi_exec($curl_multi, $active);
+ } while ($return === CURLM_CALL_MULTI_PERFORM);
+
+ while ($active && $return === CURLM_OK) {
+ if (curl_multi_select($curl_multi) === -1) {
+ usleep(100);
+ }
+
+ do {
+ $return = curl_multi_exec($curl_multi, $active);
+ } while ($return === CURLM_CALL_MULTI_PERFORM);
+ }
+
+ foreach ($connections as $k => $connection) {
+ $resource = $connection->getResource();
+
+ curl_multi_remove_handle($curl_multi, $resource);
+ $result = $connection->getResult();
+
+ if (!empty($result['data']->mime)) {
+ $responses[$k] = $this->responses[] = new ImageResponse(
+ $urls[$k],
+ Url::create($result['url']),
+ $result['statusCode'],
+ $result['contentType'],
+ [$result['data']->width, $result['data']->height],
+ $result['headers'],
+ $result['info']
+ );
+ }
+ }
+ }
+
+ curl_multi_close($curl_multi);
+
+ ksort($responses, SORT_NUMERIC);
+
+ return array_values($responses);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Http;
+
+/**
+ * Class to dispatch urls using curl and get the result.
+ */
+class CurlResult
+{
+ protected $resource;
+ protected $body;
+ protected $headers = [];
+ protected $onHeader;
+ protected $onBody;
+ protected $data;
+
+ /**
+ * Creates a new response.
+ *
+ * @param resource $resource The curl resource
+ */
+ public function __construct($resource)
+ {
+ $this->resource = $resource;
+ $this->data = (object) [];
+
+ curl_setopt($this->resource, CURLOPT_HEADERFUNCTION, [$this, 'headerCallback']);
+ curl_setopt($this->resource, CURLOPT_WRITEFUNCTION, [$this, 'writeCallback']);
+ }
+
+ /**
+ * Returns the response result.
+ */
+ public function getResult()
+ {
+ $result = curl_getinfo($this->resource);
+
+ if (curl_errno($this->resource)) {
+ $result['error'] = curl_error($this->resource);
+ }
+
+ return [
+ 'url' => isset($result['url']) ? $result['url'] : null,
+ 'statusCode' => isset($result['http_code']) ? $result['http_code'] : null,
+ 'contentType' => isset($result['content_type']) ? $result['content_type'] : null,
+ 'info' => $result,
+ 'content' => $this->body,
+ 'headers' => $this->headers,
+ 'data' => $this->data,
+ ];
+ }
+
+ /**
+ * Returns the resource.
+ *
+ * @return resource
+ */
+ public function getResource()
+ {
+ return $this->resource;
+ }
+
+ /**
+ * Callback used on receive a header.
+ *
+ * @param callable $callback
+ */
+ public function onHeader(callable $callback)
+ {
+ $this->onHeader = $callback;
+ }
+
+ /**
+ * Callback used on receive a body string portion.
+ *
+ * @param callable $callback
+ */
+ public function onBody(callable $callback)
+ {
+ $this->onBody = $callback;
+ }
+
+ /**
+ * Callback used to collect the headers.
+ *
+ * @param resource $resource
+ * @param string $string
+ *
+ * @return int
+ */
+ public function headerCallback($resource, $string)
+ {
+ if (!strpos($string, ':')) {
+ return strlen($string);
+ }
+
+ list($name, $value) = array_map('trim', explode(':', $string, 2));
+
+ $name = strtolower($name);
+
+ if (!isset($this->headers[$name])) {
+ $this->headers[$name] = [];
+ }
+
+ $this->headers[$name][] = $value;
+
+ if ($this->onHeader === null || call_user_func($this->onHeader, $name, $value, $this->data) !== false) {
+ return strlen($string);
+ }
+
+ return -1;
+ }
+
+ /**
+ * Callback used to get the body content.
+ *
+ * @param resource $resource
+ * @param string $string
+ *
+ * @return int
+ */
+ public function writeCallback($resource, $string)
+ {
+ $this->body .= $string;
+
+ if ($this->onBody === null || call_user_func($this->onBody, $this->body, $this->data) !== false) {
+ return strlen($string);
+ }
+
+ //Cancel
+ $this->body = null;
+
+ return -1;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Http;
+
+/**
+ * Interface used to create http responses.
+ */
+interface DispatcherInterface
+{
+ /**
+ * Dispatch an url.
+ *
+ * @param Url $url
+ *
+ * @return Response
+ */
+ public function dispatch(Url $url);
+
+ /**
+ * Resolve multiple image urls at once.
+ *
+ * @param Url[] $urls
+ *
+ * @return ImageResponse[]
+ */
+ public function dispatchImages(array $urls);
+}
--- /dev/null
+<?php
+
+namespace Embed\Http;
+
+/**
+ * Class to consume http responses.
+ */
+class ImageResponse extends AbstractResponse
+{
+ protected $size;
+
+ /**
+ * Create a ImageResponse using a bas64 url.
+ *
+ * @param Url $url
+ *
+ * @return static|null
+ */
+ public static function createFromBase64(Url $url)
+ {
+ $pieces = explode(';', $url->getContent(), 2);
+
+ if ((count($pieces) !== 2) || (strpos($pieces[0], 'image/') === false) || (strpos($pieces[1], 'base64,') !== 0)) {
+ return false;
+ }
+
+ if (($info = @getimagesizefromstring(base64_decode(substr($pieces[1], 7)))) !== false) {
+ return new self(
+ $url,
+ $url,
+ 200,
+ $info['mime'],
+ [$info[0], $info[1]],
+ [],
+ []
+ );
+ }
+ }
+
+ public function __construct(Url $startingUrl, Url $url, $statusCode, $contentType, $size, array $headers, array $info)
+ {
+ parent::__construct($startingUrl, $url, $statusCode, $contentType, $headers, $info);
+ $this->size = $size;
+ }
+
+ /**
+ * Get the image width.
+ *
+ * @return int
+ */
+ public function getWidth()
+ {
+ return (int) $this->size[0];
+ }
+
+ /**
+ * Get the image height.
+ *
+ * @return int
+ */
+ public function getHeight()
+ {
+ return (int) $this->size[1];
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Http;
+
+/**
+ * Class to resolve some specific redirections.
+ */
+abstract class Redirects
+{
+ private static $patterns = [
+ 'google' => 'www.google.com/url*',
+ 'googleTranslator' => 'translate.google.com/translate',
+ 'hashBang' => '*#!*',
+ 'spotify' => 'play.spotify.com/*',
+ 'tumblr' => 't.umblr.com/redirect',
+ ];
+
+ /**
+ * Resolve the url redirection.
+ *
+ * @param Url $url
+ *
+ * @return Url
+ */
+ public static function resolve(Url $url)
+ {
+ foreach (self::$patterns as $method => $pattern) {
+ if ($url->match($pattern)) {
+ return self::$method($url);
+ }
+ }
+
+ return $url;
+ }
+
+ /**
+ * Resolve a google redirection url.
+ *
+ * @param Url $url
+ *
+ * @return Url
+ */
+ public static function google(Url $url)
+ {
+ if (($value = $url->getQueryParameter('url'))) {
+ return Url::create($value);
+ }
+
+ return $url;
+ }
+
+ /**
+ * Resolve a google translation url.
+ *
+ * @param Url $url
+ *
+ * @return Url
+ */
+ public static function googleTranslator(Url $url)
+ {
+ if (($value = $url->getQueryParameter('u'))) {
+ return Url::create($value);
+ }
+
+ return $url;
+ }
+
+ /**
+ * Resolve an url with hashbang.
+ *
+ * @param Url $url
+ *
+ * @return Url
+ */
+ public static function hashBang(Url $url)
+ {
+ if (($path = preg_replace('|^(/?!)|', '', $url->getFragment()))) {
+ return $url->withPath($url->getPath().$path);
+ }
+
+ return $url;
+ }
+
+ /**
+ * Redirect the player of spotify.
+ *
+ * @param Url $url
+ *
+ * @return Url
+ */
+ public static function spotify(Url $url)
+ {
+ return $url->withHost('open.spotify.com');
+ }
+
+ /**
+ * Redirect the tumblr url
+ *
+ * @param Url $url
+ *
+ * @return Url
+ */
+ public static function tumblr(Url $url)
+ {
+ if (($value = $url->getQueryParameter('z'))) {
+ return Url::create($value);
+ }
+
+ return $url;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Http;
+
+use Embed\Utils;
+use Exception;
+use DOMDocument;
+use SimpleXMLElement;
+
+/**
+ * Class to consume http responses.
+ */
+class Response extends AbstractResponse
+{
+ protected $content;
+ protected $xmlContent;
+ protected $jsonContent;
+ protected $htmlContent;
+
+ /**
+ * Response constructor.
+ *
+ * @param Url $startingUrl
+ * @param Url $url
+ * @param int $statusCode
+ * @param string|null $contentType
+ * @param string $content
+ * @param array $headers
+ * @param array $info
+ */
+ public function __construct(Url $startingUrl, Url $url, $statusCode, $contentType, $content, array $headers, array $info = [])
+ {
+ parent::__construct($startingUrl, $url, $statusCode, $contentType, $headers, $info);
+ $this->setContent($content);
+ }
+
+ /**
+ * Get the content.
+ *
+ * @return string|null
+ */
+ public function getContent()
+ {
+ return $this->content;
+ }
+
+ /**
+ * Get the content as HTML.
+ *
+ * @return DOMDocument|false
+ */
+ public function getHtmlContent()
+ {
+ if ($this->htmlContent === null) {
+ try {
+ if (empty($content = $this->content)) {
+ return $this->htmlContent = false;
+ }
+
+ $errors = libxml_use_internal_errors(true);
+ $entities = libxml_disable_entity_loader(true);
+
+ $this->htmlContent = new DOMDocument();
+
+ if (stripos($content, '<meta charset="utf') === false) {
+ $encodings = [
+ 'ASCII' => 'ascii',
+ 'UTF-8' => 'utf-8',
+ 'SJIS' => 'shift_jis',
+ 'Windows-1251' => 'windows-1251',
+ 'Windows-1252' => 'windows-1252',
+ 'Windows-1254' => 'windows-1254',
+ 'ISO-8859-16' => 'iso-8859-16',
+ 'ISO-8859-15' => 'iso-8859-15',
+ 'ISO-8859-14' => 'iso-8859-14',
+ 'ISO-8859-13' => 'iso-8859-13',
+ 'ISO-8859-10' => 'iso-8859-10',
+ 'ISO-8859-9' => 'iso-8859-9',
+ 'ISO-8859-8' => 'iso-8859-8',
+ 'ISO-8859-7' => 'iso-8859-7',
+ 'ISO-8859-6' => 'iso-8859-6',
+ 'ISO-8859-5' => 'iso-8859-5',
+ 'ISO-8859-4' => 'iso-8859-4',
+ 'ISO-8859-3' => 'iso-8859-3',
+ 'ISO-8859-2' => 'iso-8859-2',
+ 'ISO-8859-1' => 'iso-8859-1',
+ ];
+
+ $detected = mb_detect_encoding($content, implode(',', array_keys($encodings)), true);
+
+ if ($detected && !empty($encodings[$detected])) {
+ $content = mb_convert_encoding($content, 'HTML-ENTITIES', $detected);
+ $content = preg_replace(
+ '/<head[^>]*>/',
+ '<head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset='.$encodings[$detected].'">',
+ $content
+ );
+ }
+ }
+
+ $this->htmlContent->loadHTML(trim($content));
+
+ libxml_use_internal_errors($errors);
+ libxml_disable_entity_loader($entities);
+ } catch (Exception $exception) {
+ return $this->htmlContent = false;
+ }
+ }
+
+ return $this->htmlContent;
+ }
+
+ /**
+ * Get the content as an array from JSON.
+ *
+ * @return array|false
+ */
+ public function getJsonContent()
+ {
+ if ($this->jsonContent === null) {
+ try {
+ if (($content = $this->content) === '') {
+ return $this->jsonContent = false;
+ }
+
+ $this->jsonContent = json_decode($content, true);
+ } catch (\Exception $exception) {
+ return $this->jsonContent = false;
+ }
+ }
+
+ return $this->jsonContent;
+ }
+
+ /**
+ * Get the content as XML.
+ *
+ * @return SimpleXMLElement|false
+ */
+ public function getXMLContent()
+ {
+ if ($this->xmlContent === null) {
+ try {
+ if (($content = $this->content) === '') {
+ return $this->xmlContent = false;
+ }
+
+ $errors = libxml_use_internal_errors(true);
+ $this->xmlContent = new SimpleXMLElement($content);
+ libxml_use_internal_errors($errors);
+ } catch (Exception $exception) {
+ return $this->xmlContent = false;
+ }
+ }
+
+ return $this->xmlContent;
+ }
+
+ /**
+ * Set the response content.
+ *
+ * @param string $content
+ */
+ private function setContent($content)
+ {
+ $this->content = $content;
+
+ if (empty($this->contentType)) {
+ return;
+ }
+
+ //Remove charset from Content-Type
+ if (strpos($this->contentType, ';') !== false) {
+ list($mime, $charset) = array_map('trim', explode(';', $this->contentType));
+
+ $this->contentType = $mime;
+ $charset = str_replace(['"', "'"], '', substr(strstr($charset, '='), 1));
+ $this->content = Utils::toUtf8($content, trim($charset));
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Http;
+
+/**
+ * Class to split and manipulate urls.
+ */
+class Url
+{
+ private $info;
+ private $url;
+ private static $public_suffix_list;
+
+ /**
+ * Create a new Url instance.
+ *
+ * @param string $url
+ *
+ * @return Url
+ */
+ public static function create($url)
+ {
+ return Redirects::resolve(new static($url));
+ }
+
+ /**
+ * Constructor. Sets the url.
+ *
+ * @param string $url
+ */
+ private function __construct($url)
+ {
+ $this->parseUrl($url);
+ }
+
+ /**
+ * Returns the url.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if ($this->url === null) {
+ return $this->url = $this->buildUrl();
+ }
+
+ return $this->url;
+ }
+
+ /**
+ * Remove the built url on clone.
+ */
+ public function __clone()
+ {
+ $this->url = null;
+ }
+
+ /**
+ * Check if the url match with a specific pattern. The patterns only accepts * and ?
+ *
+ * @param string|array $patterns The pattern or an array with various patterns
+ *
+ * @return bool
+ */
+ public function match($patterns)
+ {
+ if (!is_array($patterns)) {
+ $patterns = [$patterns];
+ }
+
+ //Remove scheme and query
+ $long_url = preg_replace('|^(\w+://)|', '', (string) $this);
+ $short_url = preg_replace('|(\?.*)?$|', '', $long_url);
+
+ foreach ($patterns as $pattern) {
+ if ($pattern[0] === '?') { // ?hello=world => *?hello=world
+ $pattern = '*' . $pattern;
+ }
+
+ $pattern = str_replace('\\*', '.*', preg_quote($pattern, '|'));
+
+ if (strpos($pattern, '?') === false) {
+ $url = $short_url;
+ } else {
+ $pattern = str_replace('\\?&', '[\\?&]', $pattern);
+ $url = $long_url;
+ }
+
+ if (preg_match('|^'.$pattern.'$|i', $url)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Return the content of the url (for embedded images).
+ *
+ * @return string The content or null
+ */
+ public function getContent()
+ {
+ return isset($this->info['content']) ? $this->info['content'] : null;
+ }
+
+ /**
+ * Return the extension of the url (html, php, jpg, etc).
+ *
+ * @return string The scheme or null
+ */
+ public function getExtension()
+ {
+ return isset($this->info['extension']) ? $this->info['extension'] : null;
+ }
+
+ /**
+ * Returns a new instance with other relative url.
+ *
+ * @param string $url
+ *
+ * @return Url
+ */
+ public function createAbsolute($url)
+ {
+ return self::create($this->getAbsolute($url));
+ }
+
+ /**
+ * Returns a clone with other extension.
+ *
+ * @param string $extension
+ *
+ * @return Url
+ */
+ public function withExtension($extension)
+ {
+ $clone = clone $this;
+ $clone->info['extension'] = $extension;
+
+ if (empty($clone->info['file'])) {
+ $clone->info['file'] = array_pop($clone->info['path']);
+ }
+
+ return $clone;
+ }
+
+ /**
+ * Return the scheme of the url (for example http, https, ftp, etc).
+ *
+ * @return string The scheme or null
+ */
+ public function getScheme()
+ {
+ return isset($this->info['scheme']) ? $this->info['scheme'] : null;
+ }
+
+ /**
+ * Returns a clone with other scheme.
+ *
+ * @param string $scheme
+ *
+ * @return Url
+ */
+ public function withScheme($scheme)
+ {
+ $clone = clone $this;
+ $clone->info['scheme'] = $scheme;
+
+ return $clone;
+ }
+
+ /**
+ * Return the host of the url (for example: google.com).
+ *
+ * @return string The host or null
+ */
+ public function getHost()
+ {
+ return isset($this->info['host']) ? $this->info['host'] : null;
+ }
+
+ /**
+ * Returns a clone with other host.
+ *
+ * @param string $host
+ *
+ * @return Url
+ */
+ public function withHost($host)
+ {
+ $clone = clone $this;
+ $clone->info['host'] = $host;
+
+ return $clone;
+ }
+
+ /**
+ * Return the domain of the url (for example: google).
+ *
+ * @param bool $first_level True to return the first level domain (.com, .es, etc)
+ *
+ * @return string
+ */
+ public function getDomain($first_level = false)
+ {
+ $host = $this->getHost();
+
+ if (empty($host)) {
+ return '';
+ }
+
+ $host = array_reverse(explode('.', $host));
+
+ switch (count($host)) {
+ case 1:
+ return $host[0];
+
+ case 2:
+ return $first_level ? ($host[1].'.'.$host[0]) : $host[1];
+
+ default:
+ $tld = $host[1].'.'.$host[0];
+ $suffixes = self::getSuffixes();
+
+ if (in_array($tld, $suffixes, true)) {
+ return $first_level ? $host[2].'.'.$tld : $host[2];
+ }
+
+ return $first_level ? $host[1].'.'.$host[0] : $host[1];
+ }
+ }
+
+ /**
+ * Return a specific directory position in the path of the url.
+ *
+ * @param int $position The position of the directory (0 based index)
+ *
+ * @return string|null
+ */
+ public function getDirectoryPosition($position)
+ {
+ if ($position === count($this->info['path'])) {
+ return urldecode($this->info['file']);
+ }
+
+ return isset($this->info['path'][$position]) ? urldecode($this->info['path'][$position]) : null;
+ }
+
+ /**
+ * Returns a clone with other directory in a specific position.
+ *
+ * @param int|null $key The position of the subdirectory (0 based index)
+ * @param string $value The new value
+ *
+ * @return Url
+ */
+ public function withDirectoryPosition($key, $value)
+ {
+ $clone = clone $this;
+
+ $pos = $clone->info['path'];
+ $hasFile = isset($clone->info['file']);
+
+ if ($hasFile) {
+ $pos[] = $clone->info['file'];
+ }
+
+ $pos[$key] = $value;
+
+ if ($hasFile) {
+ $clone->info['file'] = array_pop($pos);
+ }
+
+ $clone->info['path'] = $pos;
+
+ return $clone;
+ }
+
+ /**
+ * Return all directories.
+ *
+ * @return string
+ */
+ public function getDirectories()
+ {
+ return !empty($this->info['path']) ? '/'.implode('/', $this->info['path']).'/' : '/';
+ }
+
+ /**
+ * Slice path.
+ *
+ * @param int $offset
+ * @param int|null $length
+ *
+ * @return array
+ */
+ public function getSlicePath($offset, $length = null)
+ {
+ $array = explode('/', $this->getPath());
+
+ if (empty($array[0])) {
+ array_shift($array);
+ }
+
+ return array_slice($array, $offset, $length);
+ }
+
+ /**
+ * Return the url path.
+ *
+ * @return string
+ */
+ public function getPath()
+ {
+ $path = !empty($this->info['path']) ? '/'.implode('/', array_map('self::urlEncode', $this->info['path'])).'/' : '/';
+
+ if (isset($this->info['file'])) {
+ $path .= self::urlEncode($this->info['file']);
+
+ if (isset($this->info['extension'])) {
+ $path .= '.'.$this->info['extension'];
+ }
+ }
+
+ return $path;
+ }
+
+ /**
+ * Returns a clone with other path.
+ *
+ * @param string $path
+ *
+ * @return Url
+ */
+ public function withPath($path)
+ {
+ $clone = clone $this;
+
+ $clone->setPath($path);
+
+ return $clone;
+ }
+
+ /**
+ * Returns a clone with path appended.
+ *
+ * @param string $path
+ *
+ * @return Url
+ */
+ public function withAddedPath($path)
+ {
+ $path = $this->getPath().'/'.$path;
+
+ return $this->withPath($path);
+ }
+
+ /**
+ * Check if the url has a query parameter.
+ *
+ * @param string $name
+ *
+ * @return bool
+ */
+ public function hasQueryParameter($name)
+ {
+ return isset($this->info['query'][$name]);
+ }
+
+ /**
+ * Returns all query parameters.
+ *
+ * @return array
+ */
+ public function getQueryParameters()
+ {
+ return $this->info['query'];
+ }
+
+ /**
+ * Returns a query parameter value.
+ *
+ * @param string $name
+ *
+ * @return string|null
+ */
+ public function getQueryParameter($name)
+ {
+ return isset($this->info['query'][$name]) ? $this->info['query'][$name] : null;
+ }
+
+ /**
+ * Returns a clone with a new query parameter.
+ *
+ * @param string $name The parameter name
+ * @param string $value The parameter value
+ *
+ * @return Url
+ */
+ public function withQueryParameter($name, $value)
+ {
+ $clone = clone $this;
+
+ $clone->info['query'][$name] = $value;
+
+ return $clone;
+ }
+
+ /**
+ * Returns a clone with new query parameters merged.
+ *
+ * @param array $parameters
+ *
+ * @return Url
+ */
+ public function withAddedQueryParameters(array $parameters)
+ {
+ $clone = clone $this;
+
+ $clone->info['query'] = empty($clone->info['query']) ? $parameters : array_replace($clone->info['query'], $parameters);
+
+ return $clone;
+ }
+
+ /**
+ * Returns a clone with new query parameters.
+ *
+ * @param array $parameters
+ *
+ * @return Url
+ */
+ public function withQueryParameters(array $parameters)
+ {
+ $clone = clone $this;
+
+ $clone->info['query'] = $parameters;
+
+ return $clone;
+ }
+
+ /**
+ * Return the url fragment.
+ *
+ * @return string
+ */
+ public function getFragment()
+ {
+ return isset($this->info['fragment']) ? $this->info['fragment'] : null;
+ }
+
+ /**
+ * Return ClassName for domain.
+ *
+ * Domains started with numbers will get N prepended to their class name.
+ *
+ * @return string
+ */
+ public function getClassNameForDomain()
+ {
+ $className = str_replace(array('-', ' '), '', ucwords(strtolower($this->getDomain())));
+
+ if (is_numeric(mb_substr($className, 0, 1))) {
+ $className = 'N'.$className;
+ }
+
+ return $className;
+ }
+
+ /**
+ * Build the url using the splitted data.
+ */
+ protected function buildUrl()
+ {
+ $url = '';
+
+ if (isset($this->info['content'])) {
+ return 'data:'.$this->info['content'];
+ }
+
+ if (isset($this->info['scheme'])) {
+ $url .= $this->info['scheme'].'://';
+ }
+
+ $user = isset($this->info['user']) ? $this->info['user'] : '';
+ $pass = isset($this->info['pass']) ? ':'.$this->info['pass'] : '';
+ if ($user || $pass) {
+ $url .= $user.$pass.'@';
+ }
+
+ if (isset($this->info['host'])) {
+ $url .= $this->info['host'];
+ }
+
+ if (isset($this->info['port'])) {
+ $url .= ':'.$this->info['port'];
+ }
+
+ $url .= $this->getPath();
+
+ if (!empty($this->info['query'])) {
+ $url .= '?'.rtrim(http_build_query($this->info['query']), '=');
+ }
+ if (isset($this->info['fragment'])) {
+ $url .= '#'.$this->info['fragment'];
+ }
+
+ return $url;
+ }
+
+ /**
+ * Parse an url and split into different pieces.
+ *
+ * @param string $url The url to parse
+ */
+ protected function parseUrl($url)
+ {
+ $this->info = self::parse($url);
+
+ if (isset($this->info['path'])) {
+ $this->setPath($this->info['path']);
+ }
+
+ if (empty($this->info['query'])) {
+ $this->info['query'] = [];
+
+ return;
+ }
+
+ // Fix dots and other characters used in query's variables names
+ // https://github.com/oscarotero/Embed/issues/101
+ $queryString = preg_replace_callback('/(^|(?<=&))[^=[&]+/', function ($key) {
+ return bin2hex(urldecode($key[0]));
+ }, $this->info['query']);
+
+ parse_str($queryString, $query);
+
+ $this->info['query'] = [];
+
+ foreach ((array) $query as $key => $value) {
+ $this->info['query'][hex2bin($key)] = $value;
+ }
+ }
+
+ /**
+ * Return an absolute url based in a relative.
+ *
+ * @return string
+ */
+ public function getAbsolute($url)
+ {
+ $url = trim($url);
+
+ if (empty($url)) {
+ return '';
+ }
+
+ if (preg_match('|^\w+:[^/]|', $url)) {
+ return $url;
+ }
+
+ if (preg_match('|^\w+://|', $url)) {
+ return self::validUrlOrEmpty($url);
+ }
+
+ if (strpos($url, '://') === 0) {
+ return self::validUrlOrEmpty($this->getScheme().$url);
+ }
+
+ if (strpos($url, '//') === 0) {
+ return self::validUrlOrEmpty($this->getScheme().":$url");
+ }
+
+ if ($url[0] === '/') {
+ return self::validUrlOrEmpty($this->getScheme().'://'.$this->getHost().$url);
+ }
+
+ return self::validUrlOrEmpty($this->getScheme().'://'.$this->getHost().$this->getDirectories().$url);
+ }
+
+ /**
+ * Parses and adds path and file value.
+ *
+ * @param string $path
+ */
+ private function setPath($path)
+ {
+ $this->info['path'] = $this->info['file'] = $this->info['extension'] = $this->info['content'] = null;
+
+ if ($this->getScheme() === 'data') {
+ $this->info['content'] = $path;
+
+ return;
+ }
+
+ $file = substr(strrchr($path, '/'), 1);
+
+ if (strlen($file)) {
+ $path = substr($path, 0, -strlen($file));
+
+ if (preg_match('/(.*)\.([\w]+)$/', $file, $match)) {
+ $this->info['file'] = rawurldecode($match[1]);
+ $this->info['extension'] = $match[2];
+ } else {
+ $this->info['file'] = rawurldecode($file);
+ }
+ }
+
+ $this->info['path'] = [];
+
+ foreach (explode('/', $path) as $dir) {
+ $dir = rawurldecode($dir);
+
+ if ($dir !== '') {
+ $this->info['path'][] = $dir;
+ }
+ }
+ }
+
+ private static function getSuffixes()
+ {
+ if (self::$public_suffix_list === null) {
+ self::$public_suffix_list = (@include __DIR__.'/../resources/public_suffix_list.php') ?: [];
+ }
+
+ return self::$public_suffix_list;
+ }
+
+ /**
+ * UTF-8 compatible parse_url
+ * http://php.net/manual/en/function.parse-url.php#114817
+ *
+ * @param string $url
+ *
+ * @return string
+ */
+ private static function parse($url)
+ {
+ $enc_url = preg_replace_callback(
+ '%[^:/@?&=#]+%usD',
+ function ($matches) {
+ return rawurlencode($matches[0]);
+ },
+ $url
+ );
+
+ $parts = parse_url($enc_url);
+
+ if ($parts === false) {
+ throw new \InvalidArgumentException('Malformed URL: ' . $url);
+ }
+
+ if (!empty($parts['scheme']) && !in_array($parts['scheme'], ['http', 'https', 'data'])) {
+ throw new \InvalidArgumentException(sprintf('Invalid URL scheme: "%s"', $parts['scheme']));
+ }
+
+ foreach ($parts as $name => $value) {
+ $parts[$name] = rawurldecode($value);
+ }
+ return $parts;
+ }
+
+ private static function urlEncode($path)
+ {
+ // : - used for files
+ // @, + and , - used for GoogleMaps adapter url (in view and streetview modes)
+ return str_replace(['%3A','%40','%2C', '%2B'], [':','@',',', '+'], rawurlencode($path));
+ }
+
+ private static function validUrlOrEmpty($url)
+ {
+ return parse_url($url) === false ? '' : $url;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\Api;
+
+use Embed\Adapters\Adapter;
+use Embed\Providers\Provider;
+
+/**
+ * Provider to use the API of archive.org.
+ */
+class Archive extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ $endPoint = $adapter->getResponse()->getUrl()->withQueryParameter('output', 'json');
+ $response = $adapter->getDispatcher()->dispatch($endPoint);
+
+ if (($json = $response->getJsonContent())) {
+ $this->bag->set($json);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ return $this->bag->get('metadata[title][0]');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('metadata[description][0]');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ switch ($this->bag->get('metadata[mediatype][0]')) {
+ case 'movies':
+ return 'video';
+
+ case 'audio':
+ return 'audio';
+
+ case 'texts':
+ return 'rich';
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderName()
+ {
+ return 'Internet Archive';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ return $this->normalizeUrl($this->bag->get('url'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ $this->bag->get('metadata[creator][0]');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ $images = (array) $this->bag->get('misc[image]');
+
+ foreach (array_keys((array) $this->bag->get('files')) as $url) {
+ $images[] = $url;
+ }
+
+ return $this->normalizeUrls($images);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\Api;
+
+use Embed\Adapters\Adapter;
+use Embed\Providers\Provider;
+use Embed\Http\Url;
+
+/**
+ * Provider to use the open graph API of facebook.
+ */
+class Facebook extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ if (($endPoint = $this->getEndPoint())) {
+ $response = $adapter->getDispatcher()->dispatch($endPoint);
+
+ if ($json = $response->getJsonContent()) {
+ $this->bag->set($json);
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ return $this->bag->get('name');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('description') ?: $this->bag->get('about');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderName()
+ {
+ return 'Facebook';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ return $this->normalizeUrl($this->bag->get('url'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('username') ?: $this->bag->get('owner[name]');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ $images = (array) $this->bag->get('cover[source]');
+
+ if (($id = $this->bag->get('id'))) {
+ $images[] = 'https://graph.facebook.com/'.$id.'/picture';
+ }
+
+ return $this->normalizeUrls($images);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPublishedTime()
+ {
+ return $this->bag->get('start_time');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ return $this->bag->get('embed_html', true);
+ }
+
+ /**
+ * Returns the Graph API Endpoint
+ *
+ * @return Url|null
+ */
+ private function getEndPoint()
+ {
+ $url = $this->adapter->getResponse()->getUrl();
+ $key = $this->adapter->getConfig('facebook[key]');
+
+ if (empty($key)) {
+ return;
+ }
+
+ if ($url->getDirectoryPosition(0) === 'events') {
+ return Url::create('https://graph.facebook.com/')
+ ->withAddedPath($url->getDirectoryPosition(1))
+ ->withQueryParameter('access_token', $key)
+ ->withQueryParameter('fields', $this->adapter->getConfig('facebook[events_fields]'));
+ }
+
+ if ($url->getDirectoryPosition(1) === 'videos') {
+ return Url::create('https://graph.facebook.com/')
+ ->withAddedPath($url->getDirectoryPosition(2))
+ ->withQueryParameter('access_token', $key)
+ ->withQueryParameter('fields', $this->adapter->getConfig('facebook[videos_fields]'));
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\Api;
+
+use Embed\Adapters\Adapter;
+use Embed\Providers\Provider;
+
+/**
+ * Provider to use the API of gist.github.com.
+ */
+class Gist extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ $endPoint = $adapter->getResponse()->getUrl()->withExtension('json');
+ $response = $adapter->getDispatcher()->dispatch($endPoint);
+
+ if (($json = $response->getJsonContent())) {
+ $this->bag->set($json);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('description');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ if ($this->getCode() !== null) {
+ return 'rich';
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('owner');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPublishedTime()
+ {
+ return $this->bag->get('created_at');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ if (($code = $this->bag->get('div', true)) && ($stylesheet = $this->normalizeUrl($this->bag->get('stylesheet')))) {
+ return '<link href="'.$stylesheet.'" rel="stylesheet">'.$code;
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\Api;
+
+use Embed\Adapters\Adapter;
+use Embed\Providers\Provider;
+use Embed\Http\Url;
+use Embed\Utils;
+
+/**
+ * Provider to use the API of google.com
+ */
+class GoogleMaps extends Provider
+{
+ protected $mode;
+ protected $config = [
+ 'key' => null,
+ ];
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ $mode = $adapter->getResponse()->getUrl()->getDirectoryPosition(1);
+
+ // Default is view (if mode is not mentioned in the url)
+ $this->mode = 'view';
+
+ switch ($mode) {
+ case 'place':
+ case 'dir':
+ case 'search':
+ $this->mode = $mode;
+ break;
+ }
+
+ // check streetview mode
+ // simple check,- starts with @, ends with t
+ if ((substr($mode, 0, 1) === '@') && (substr($mode, -1) === 't')) {
+ $this->mode = 'streetview';
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ $url = $this->adapter->getResponse()->getUrl();
+
+ if ($this->mode === 'place') {
+ return $url->getDirectoryPosition(2);
+ }
+
+ if ($this->mode === 'dir') {
+ return $url->getDirectoryPosition(2).' / '.$url->getDirectoryPosition(3);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderName()
+ {
+ return 'Google Maps';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $url = $this->adapter->getResponse()->getUrl();
+ $key = $this->adapter->getConfig('google[key]');
+
+ if (empty($key)) {
+ return;
+ }
+
+ switch ($this->mode) {
+ case 'view':
+ $pos = self::getPosition($this->mode, $url);
+
+ return Utils::iframe($url
+ ->withPath('maps/embed/v1/'.$this->mode)
+ ->withQueryParameters([
+ 'center' => $pos['coordinates'],
+ 'zoom' => $pos['zoom'],
+ 'key' => $key,
+ ]));
+
+ case 'streetview':
+ $pos = self::getPosition($this->mode, $url);
+
+ return Utils::iframe($url
+ ->withPath('maps/embed/v1/'.$this->mode)
+ ->withQueryParameters([
+ 'location' => $pos['coordinates'],
+ 'heading' => $pos['heading'],
+ 'pitch' => $pos['pitch'],
+ 'fov' => $pos['fov'],
+ 'key' => $key,
+ ]));
+
+ case 'place':
+ case 'search':
+ return Utils::iframe($url
+ ->withPath('maps/embed/v1/'.$this->mode)
+ ->withQueryParameters([
+ 'q' => $url->getDirectoryPosition(2),
+ 'key' => $key,
+ ]));
+
+ case 'dir':
+ return Utils::iframe($url
+ ->withPath('maps/embed/v1/directions')
+ ->withQueryParameters([
+ 'origin' => $url->getDirectoryPosition(2),
+ 'destination' => $url->getDirectoryPosition(3),
+ 'key' => $key,
+ ]));
+ }
+ }
+
+ /**
+ * Returns parsed position data from url.
+ *
+ * @param string $mode The url mode
+ * @param Url $url
+ *
+ * @return array
+ */
+ private static function getPosition($mode, Url $url)
+ {
+ // Set defaults
+ $position = [
+ 'coordinates' => '',
+ 'zoom' => '4',
+ 'heading' => '0',
+ 'pitch' => '0',
+ 'fov' => '90'
+ ];
+
+ if ($mode === 'view') {
+ $pos = explode(",", $url->getDirectoryPosition(1));
+ $position['coordinates'] = str_replace('@', '', $pos[0]).','.$pos[1];
+ $position['zoom'] = str_replace('z', "", $pos[2]);
+ }
+
+ if ($mode === 'streetview') {
+ $pos = explode(",", $url->getDirectoryPosition(1));
+ $position['coordinates'] = str_replace('@', '', $pos[0]).','.$pos[1];
+ $position['zoom'] = str_replace('a', '', $pos[2]); // seems not used by google (emulated by other params)
+ $position['heading'] = str_replace('h', '', $pos[4]);
+ $position['fov'] = str_replace('y', '', $pos[3]);
+ $pitch = str_replace('t', '', $pos[5]); // t is pitch but in 180% format
+ if (is_numeric($pitch)) {
+ $position['pitch'] = floatval($pitch) - 90;
+ }
+ }
+
+ return $position;
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\Api;
+
+use Embed\Http\Url;
+use Embed\Adapters\Adapter;
+use Embed\Providers\Provider;
+
+/**
+ * Provider to use the API of imageshack.com.
+ */
+class Imageshack extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ $id = $adapter->getResponse()->getUrl()->getDirectoryPosition(1);
+ $endPoint = Url::create('https://api.imageshack.com/v2/images/'.$id);
+ $response = $adapter->getDispatcher()->dispatch($endPoint);
+
+ if (($json = $response->getJsonContent()) && !empty($json['result'])) {
+ $this->bag->set($json['result']);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ return $this->bag->get('title');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('description');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ return 'photo';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPublishedTime()
+ {
+ return $this->bag->get('creation_date');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return $this->bag->get('width');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return $this->bag->get('height');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('owner[username]');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorUrl()
+ {
+ $username = $this->getAuthorName();
+
+ if (!empty($username)) {
+ return 'http://imageshack.com/user/'.$username;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ return $this->normalizeUrls($this->bag->get('direct_link'));
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\Api;
+
+use Embed\Http\Url;
+use Embed\Adapters\Adapter;
+use Embed\Providers\Provider;
+
+/**
+ * Provider to use the API of soundcloud.
+ */
+class Soundcloud extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ $key = $adapter->getConfig('soundcloud[key]');
+
+ if (!empty($key)) {
+ $endPoint = Url::create('http://api.soundcloud.com/resolve.json')
+ ->withQueryParameters([
+ 'client_id' => $key,
+ 'url' => (string) $adapter->getResponse()->getUrl(),
+ ]);
+
+ $response = $adapter->getDispatcher()->dispatch($endPoint);
+
+ if ($json = $response->getJsonContent()) {
+ $this->bag->set($json);
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ return $this->bag->get('title');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('description');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ return $this->normalizeUrl($this->bag->get('permalink_url'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ $images = [];
+
+ if (empty($this->bag->get('artwork_url')) && ($img = $this->bag->get('user[avatar_url]'))) {
+ $images[] = str_replace('-large.jpg', '-t500x500.jpg', $img);
+ }
+
+ return $this->normalizeUrls($images);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('user[username]');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorUrl()
+ {
+ return $this->normalizeUrl($this->bag->get('user[permalink_url]'));
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\Api;
+
+use Embed\Adapters\Adapter;
+use Embed\Providers\Provider;
+
+/**
+ * Provider to use the API of wikipedia.
+ */
+class Wikipedia extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ $titles = $adapter->getResponse()->getUrl()->getDirectoryPosition(1);
+
+ if (!empty($titles)) {
+ //extract images
+ $endPoint = $adapter->getResponse()->getUrl()
+ ->withPath('/w/api.php')
+ ->withQueryParameters([
+ 'action' => 'query',
+ 'format' => 'json',
+ 'continue' => '',
+ 'titles' => $titles,
+ 'prop' => 'images',
+ ]);
+
+ $response = $adapter->getDispatcher()->dispatch($endPoint);
+
+ if (($json = $response->getJsonContent())) {
+ $this->bag->set('images', $json);
+ }
+
+ //extract content
+ $endPoint = $endPoint
+ ->withQueryParameter('prop', 'extracts')
+ ->withQueryParameter('exchars', 1500);
+
+ $response = $adapter->getDispatcher()->dispatch($endPoint);
+
+ if (($json = $response->getJsonContent())) {
+ $this->bag->set('extracts', $json);
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ $pages = $this->bag->get('extracts[query][pages]');
+
+ if (!empty($pages)) {
+ $page = current($pages);
+
+ return strip_tags($page['title']);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ $pages = $this->bag->get('extracts[query][pages]');
+
+ if (!empty($pages)) {
+ return $this->bag->get('extracts[query][pages]['.key($pages).'][extract]');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ $images = [];
+
+ $pages = $this->bag->get('images[query][pages]');
+
+ if (!empty($pages)) {
+ $page = current($pages);
+
+ $imgs = [];
+
+ if (isset($page['images'])) {
+ foreach ($page['images'] as $image) {
+ switch (strrchr($image['title'], '.')) {
+ case '.png':
+ case '.jpg':
+ case '.gif':
+ case '.jpeg':
+ $imgs[] = $image['title'];
+ break;
+ }
+ }
+ }
+
+ //Get image urls
+ if (!empty($imgs)) {
+ $endPoint = $this->adapter->getResponse()->getUrl()
+ ->withPath('/w/api.php')
+ ->withQueryParameters([
+ 'action' => 'query',
+ 'prop' => 'imageinfo',
+ 'iiprop' => 'url',
+ 'format' => 'json',
+ 'continue' => '',
+ 'titles' => implode('|', $imgs),
+ ]);
+
+ $response = $this->adapter->getDispatcher()->dispatch($endPoint);
+ $json = $response->getJsonContent();
+
+ if (isset($json['query']['pages'])) {
+ foreach ($json['query']['pages'] as $page) {
+ if (isset($page['imageinfo'][0]['url'])) {
+ $images[] = $page['imageinfo'][0]['url'];
+ }
+ }
+ }
+ }
+ }
+
+ return $this->normalizeUrls($images);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers;
+
+use Embed\Adapters\Adapter;
+
+/**
+ * Provider to get the data from the Dublin Core data elements in the HTML
+ */
+class Dcterms extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ if (!($html = $adapter->getResponse()->getHtmlContent())) {
+ return;
+ }
+
+ foreach ($html->getElementsByTagName('meta') as $meta) {
+ $name = trim(strtolower($meta->getAttribute('name')));
+ $value = $meta->getAttribute('content');
+
+ if (empty($name) || empty($value)) {
+ continue;
+ }
+
+ foreach (['dc.', 'dc:', 'dcterms:'] as $prefix) {
+ if (stripos($name, $prefix) === 0) {
+ $name = substr($name, strlen($prefix));
+ $this->bag->set($name, $value);
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ return $this->bag->get('title');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('description');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('creator') ?: $this->bag->get('author');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPublishedTime()
+ {
+ foreach (['date', 'date.created', 'date.issued'] as $key) {
+ if ($found = $this->bag->get($key)) {
+ return $found;
+ }
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers;
+
+use Embed\Utils;
+use Embed\Adapters\Adapter;
+use Embed\Http\Url;
+use DOMDocument;
+use Exception;
+
+/**
+ * Provider to get the data from the HTML code
+ */
+class Html extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ if (!($html = $adapter->getResponse()->getHtmlContent())) {
+ return;
+ }
+
+ $this->extractLinks($html);
+ $this->extractMetas($html);
+ $this->extractImages($html);
+
+ //Title
+ $title = $html->getElementsByTagName('title');
+
+ if ($title->length) {
+ $this->bag->set('title', $title->item(0)->nodeValue);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ return $this->bag->get('title');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('description');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ return $this->bag->has('video_src') ? 'video' : null;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTags()
+ {
+ $keywords = $this->bag->get('keywords').','.$this->bag->get('news_keywords');
+
+ return array_filter(
+ array_map('trim', explode(',', $keywords)),
+ function ($value) {
+ return !empty($value) && substr($value, -3) !== '...';
+ }
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getFeeds()
+ {
+ return $this->normalizeUrls($this->bag->get('feeds'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $src = $this->normalizeUrl($this->bag->get('video_src'));
+
+ if ($src !== null) {
+ switch ($this->bag->get('video_type')) {
+ case 'application/x-shockwave-flash':
+ return Utils::flash($src, $this->getWidth(), $this->getHeight());
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ return $this->normalizeUrl($this->bag->get('canonical'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('author') ?: $this->bag->get('article:author') ?: $this->bag->get('contributors');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderIconsUrls()
+ {
+ return $this->normalizeUrls($this->bag->get('icons'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ $images = $this->normalizeUrls($this->bag->get('images'));
+
+ if (!empty($images)) {
+ $maxImages = $this->adapter->getConfig('html[max_images]', -1);
+
+ if ($maxImages > -1) {
+ return array_slice($images, 0, $maxImages);
+ }
+ }
+
+ return $images;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return ((int) $this->bag->get('video_width')) ?: null;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return ((int) $this->bag->get('video_height')) ?: null;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPublishedTime()
+ {
+ $keys = [
+ 'article:published_time',
+ 'created',
+ 'date',
+ 'datepublished',
+ 'datePublished',
+ 'newsrepublic:publish_date',
+ 'pagerender',
+ 'pub_date',
+ 'publication-date',
+ 'publish-date',
+ 'rc.datecreation',
+ 'timestamp',
+ 'article:modified_time',
+ 'eomportal-lastupdate',
+ 'shareaholic:article_published_time',
+ ];
+
+ foreach ($keys as $key) {
+ if ($found = $this->bag->get($key)) {
+ return $found;
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLicense()
+ {
+ return $this->bag->get('copyright');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLinkedData()
+ {
+ $data = [];
+
+ if (!($html = $this->adapter->getResponse()->getHtmlContent())) {
+ return $data;
+ }
+
+ foreach ($html->getElementsByTagName('script') as $script) {
+ if ($script->hasAttribute('type') && strtolower($script->getAttribute('type')) === 'application/ld+json') {
+ $value = trim($script->nodeValue);
+
+ if (empty($value)) {
+ continue;
+ }
+
+ try {
+ $data[] = json_decode($value);
+ } catch (Exception $exception) {
+ continue;
+ }
+ }
+ }
+
+ return $data;
+ }
+
+ /**
+ * Extract information from the <link> elements.
+ *
+ * @param DOMDocument $html
+ */
+ private function extractLinks(DOMDocument $html)
+ {
+ foreach ($html->getElementsByTagName('link') as $link) {
+ if ($link->hasAttribute('rel') && $link->hasAttribute('href')) {
+ $rel = trim(strtolower($link->getAttribute('rel')));
+ $href = $link->getAttribute('href');
+
+ if (empty($href)) {
+ continue;
+ }
+
+ switch ($rel) {
+ case 'favicon':
+ case 'favico':
+ case 'icon':
+ case 'shortcut icon':
+ case 'apple-touch-icon-precomposed':
+ case 'apple-touch-icon':
+ $this->bag->add('icons', $href);
+ break;
+
+ case 'image_src':
+ $this->bag->add('images', $href);
+ break;
+
+ case 'alternate':
+ switch ($link->getAttribute('type')) {
+ case 'application/atom+xml':
+ case 'application/json':
+ case 'application/rdf+xml':
+ case 'application/rss+xml':
+ case 'application/xml':
+ case 'text/xml':
+ $this->bag->add('feeds', $href);
+ break;
+ }
+ break;
+
+ default:
+ $this->bag->set($rel, $href);
+ }
+ }
+ }
+ }
+
+ /**
+ * Extract information from the <meta> elements.
+ *
+ * @param DOMDocument $html
+ */
+ private function extractMetas(DOMDocument $html)
+ {
+ foreach ($html->getElementsByTagName('meta') as $meta) {
+ $value = $meta->getAttribute('content');
+
+ if (empty($value)) {
+ continue;
+ }
+
+ if ($meta->hasAttribute('name')) {
+ $name = trim(strtolower($meta->getAttribute('name')));
+
+ switch ($name) {
+ case 'msapplication-tileimage':
+ $this->bag->add('icons', $value);
+ continue 2;
+
+ default:
+ $this->bag->set($name, $value);
+ continue 2;
+ }
+ }
+
+ if ($meta->hasAttribute('itemprop')) {
+ $this->bag->set($meta->getAttribute('itemprop'), $value);
+ }
+
+ if ($meta->hasAttribute('http-equiv')) {
+ $this->bag->set($meta->getAttribute('http-equiv'), $value);
+ }
+
+ if ($meta->hasAttribute('property')) {
+ $this->bag->set($meta->getAttribute('property'), $value);
+ }
+ }
+ }
+
+ /**
+ * Extract <img> elements.
+ *
+ * @param DOMDocument $html
+ */
+ private function extractImages(DOMDocument $html)
+ {
+ if ($this->adapter->getConfig('html[max_images]') === 0) {
+ return;
+ }
+
+ //Extract only from the main element
+ $main = self::getMainElement($html);
+
+ if (!$main) {
+ return;
+ }
+
+ $url = $this->adapter->getResponse()->getUrl();
+ $externalImages = $this->adapter->getConfig('html[external_images]');
+
+ foreach ($main->getElementsByTagName('img') as $img) {
+ if (!$img->hasAttribute('src')) {
+ continue;
+ }
+
+ try {
+ $src = $url->createAbsolute($img->getAttribute('src'));
+ } catch (Exception $exception) {
+ continue;
+ }
+
+ //Avoid external images
+ if (!self::imageIsValid($src, $url, $externalImages)) {
+ continue;
+ }
+
+ $parent = $img->parentNode;
+
+ //The image is in a link
+ while ($parent && isset($parent->tagName)) {
+ if ($parent->tagName === 'a') {
+ //The link is external
+ if ($parent->hasAttribute('href')) {
+ try {
+ $href = $url->createAbsolute($parent->getAttribute('href'));
+ } catch (Exception $exception) {
+ continue 2;
+ }
+
+ if (!self::imageIsValid($href, $url, $externalImages)) {
+ continue 2;
+ }
+ }
+
+ //The link has rel=nofollow
+ if ($parent->hasAttribute('rel') && (string) $parent->getAttribute('rel') === 'nofollow') {
+ continue 2;
+ }
+
+ break;
+ }
+
+ $parent = $parent->parentNode;
+ }
+
+ $this->bag->add('images', (string) $src);
+ }
+ }
+
+ /**
+ * Check whether a image url is valid or not.
+ *
+ * @param Url $url
+ * @param Url $baseUrl
+ * @param mixed $externalImages
+ *
+ * @return bool
+ */
+ private static function imageIsValid(Url $url, Url $baseUrl, $externalImages)
+ {
+ //base64 or same domain
+ if ($url->getContent() !== null || $url->getDomain() === $baseUrl->getDomain()) {
+ return true;
+ }
+
+ return is_bool($externalImages) ? $externalImages : $url->match($externalImages);
+ }
+
+ /**
+ * Returns the main element of the document.
+ *
+ * @param DOMDocument $html
+ *
+ * @return DOMElement
+ */
+ private static function getMainElement(DOMDocument $html)
+ {
+ // <main>
+ $content = $html->getElementsByTagName('main');
+
+ if ($content->length !== 0) {
+ return $content->item(0);
+ }
+
+ // Popular ids: #main, #content, #page
+ $content = $html->getElementById('main') ?: $html->getElementById('content') ?: $html->getElementById('page');
+
+ if ($content) {
+ return $content;
+ }
+
+ // Wordpress ids: #post-*
+ foreach ($html->getElementsByTagName('article') as $article) {
+ if ($article->hasAttribute('id') && (strpos($article->getAttribute('id'), 'post-') === 0)) {
+ return $article;
+ }
+ }
+
+ // Returns <body> or <html>
+ return $html->getElementsByTagName('body')->item(0) ?: $html->getElementsByTagName('html')->item(0);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers;
+
+use Embed\Adapters\Adapter;
+use Embed\Utils;
+
+/**
+ * Provider to get the data from the Linkpulse elements in the HTML
+ * http://docs.linkpulse.com/docs/opengraph/
+ */
+class Linkpulse extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ if (!($html = $adapter->getResponse()->getHtmlContent())) {
+ return;
+ }
+
+ foreach ($html->getElementsByTagName('meta') as $meta) {
+ $name = trim(strtolower($meta->getAttribute('property')));
+ $value = $meta->getAttribute('content');
+
+ if (empty($name)) {
+ $name = trim(strtolower($meta->getAttribute('name')));
+ }
+
+ if (empty($name) || empty($value)) {
+ continue;
+ }
+
+ if (strpos($name, 'lp:') === 0) {
+ $name = substr($name, 3);
+ } elseif (strpos($name, 'lp.article:') !== 0) {
+ continue;
+ }
+
+ $this->bag->set($name, $value);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ return $this->bag->get('title');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('description');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ $url = $this->normalizeUrl($this->bag->get('url'));
+
+ if ($url !== $this->adapter->getResponse()->getUrl()->getAbsolute('/')) {
+ return $url;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTags()
+ {
+ return (array) $this->bag->get('article.section') ?: [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('article.author');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ return $this->normalizeUrls((array) $this->bag->get('image'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPublishedTime()
+ {
+ return $this->bag->get('article.published_time')
+ ?: $this->bag->get('article.modified_time');
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers;
+
+use Embed\Adapters\Adapter;
+use Embed\Http\Response;
+use Embed\Http\Url;
+
+/**
+ * Provider to get the data using the oEmbed API
+ */
+class OEmbed extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ $endPoint = $this->getEndPoint();
+
+ if ($endPoint) {
+ $this->extractOembed($adapter->getDispatcher()->dispatch($endPoint));
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ return $this->bag->get('title');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('description');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ $type = $this->bag->get('type');
+
+ if (strpos($type, ':') !== false) {
+ $type = substr(strrchr($type, ':'), 1);
+ }
+
+ switch ($type) {
+ case 'video':
+ case 'photo':
+ case 'link':
+ case 'rich':
+ return $type;
+
+ case 'movie':
+ return 'video';
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTags()
+ {
+ if ($this->bag->has('meta[keywords]')) {
+ //it means we are using iframe.ly api
+ return array_map('trim', explode(',', $this->bag->get('meta[keywords]')));
+ }
+
+ return [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ return $this->bag->get('html', true);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ if ($this->getType() === 'photo') {
+ return $this->normalizeUrl($this->bag->get('web_page'));
+ }
+
+ return $this->normalizeUrl($this->bag->get('url') ?: $this->bag->get('web_page'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('author_name');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorUrl()
+ {
+ return $this->normalizeUrl($this->bag->get('author_url'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderName()
+ {
+ return $this->bag->get('provider_name');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderUrl()
+ {
+ return $this->normalizeUrl($this->bag->get('provider_url'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ $images = [];
+
+ if ($this->getType() === 'photo') {
+ $images[] = $this->bag->get('url');
+ }
+
+ foreach (['image', 'thumbnail', 'thumbnail_url'] as $type) {
+ if ($this->bag->has($type)) {
+ $ret = $this->bag->get($type);
+
+ if (is_array($ret)) {
+ $images = array_merge($images, $ret);
+ } else {
+ $images[] = $ret;
+ }
+ }
+ }
+
+ return $this->normalizeUrls($images);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return $this->bag->get('width');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return $this->bag->get('height');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLicense()
+ {
+ return $this->bag->get('license_url');
+ }
+
+ /**
+ * @return Url|null
+ */
+ private function getEndPoint()
+ {
+ //Search using the domain
+ $class = 'Embed\\Providers\\OEmbed\\'.$this->adapter->getResponse()->getUrl()->getClassNameForDomain();
+ $extraParameters = (array) $this->adapter->getConfig('oembed[parameters]');
+
+ if (class_exists($class)) {
+ $endPoint = $class::create($this->adapter);
+
+ if ($endPoint && ($url = $endPoint->getEndPoint())) {
+ return $url->withAddedQueryParameters($extraParameters);
+ }
+ }
+
+ //Search in the DOM
+ $endPoint = OEmbed\DOM::create($this->adapter);
+
+ if ($endPoint && ($url = $endPoint->getEndPoint())) {
+ return $url->withAddedQueryParameters($extraParameters);
+ }
+
+ //Try with embedly
+ $endPoint = OEmbed\Embedly::create($this->adapter);
+
+ if ($endPoint && ($url = $endPoint->getEndPoint())) {
+ return $url->withAddedQueryParameters($extraParameters);
+ }
+
+ //Try with iframely
+ $endPoint = OEmbed\Iframely::create($this->adapter);
+
+ if ($endPoint && ($url = $endPoint->getEndPoint())) {
+ return $url->withAddedQueryParameters($extraParameters);
+ }
+ }
+
+ /**
+ * Save the oembed data in the bag.
+ *
+ * @param Response $response
+ */
+ private function extractOembed(Response $response)
+ {
+ // extract from xml
+ if (($response->getUrl()->getExtension() === 'xml') || ($response->getUrl()->getQueryParameter('format') === 'xml')) {
+ if ($xml = $response->getXmlContent()) {
+ foreach ($xml as $element) {
+ $content = trim((string) $element);
+
+ if (stripos($content, '<![CDATA[') === 0) {
+ $content = substr($content, 9, -3);
+ }
+
+ $this->bag->set($element->getName(), $content);
+ }
+ }
+ // extract from json
+ } else {
+ if (($json = $response->getJsonContent()) && empty($json['Error'])) {
+ $this->bag->set($json);
+ }
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Amcharts extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'live.amcharts.com/*';
+ protected static $endPoint = 'https://live.amcharts.com/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Bambuser extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'bambuser.com/v/*';
+ protected static $endPoint = 'https://api.bambuser.com/oembed.json';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Adapters\Adapter;
+use Embed\Http\Response;
+use Embed\Http\Url;
+use DOMDocument;
+use Exception;
+
+/**
+ * Class to detect the oembed endPoint.
+ */
+class DOM implements EndPointInterface
+{
+ protected $response;
+
+ /**
+ * Create a instance of a OEmbedEndPoint.
+ *
+ * @param Adapter $adapter
+ *
+ * @return static
+ */
+ public static function create(Adapter $adapter)
+ {
+ return new static($adapter->getResponse());
+ }
+
+ /**
+ * Construct.
+ *
+ * @param Response $response
+ */
+ protected function __construct(Response $response)
+ {
+ $this->response = $response;
+ }
+
+ /**
+ * Returns the oembed endPoint.
+ *
+ * @return Url|null
+ */
+ public function getEndPoint()
+ {
+ $html = $this->response->getHtmlContent();
+
+ if ($html && ($url = self::getEndPointFromDom($html))) {
+ try {
+ $endPoint = $this->response->getUrl()->createAbsolute($url);
+ } catch (Exception $exception) {
+ return null;
+ }
+
+ if ($endPoint->getExtension() !== 'xml' && !$endPoint->hasQueryParameter('format')) {
+ return $endPoint->withQueryParameter('format', 'json');
+ }
+
+ return $endPoint;
+ }
+ }
+
+ /**
+ * Extract oembed information from the <link rel="alternate"> elements
+ * Note: Some sites use <meta rel="alternate"> instead.
+ *
+ * @param DOMDocument $html
+ *
+ * @return string|null
+ */
+ protected static function getEndPointFromDom(DOMDocument $html)
+ {
+ foreach (['link', 'meta'] as $tagName) {
+ foreach ($html->getElementsByTagName($tagName) as $link) {
+ $rel = trim(strtolower($link->getAttribute('rel')));
+ $href = $link->getAttribute('href');
+
+ if (empty($href)) {
+ continue;
+ }
+
+ if ($rel === 'alternate') {
+ switch (strtolower($link->getAttribute('type'))) {
+ case 'application/json+oembed':
+ case 'application/xml+oembed':
+ case 'text/json+oembed':
+ case 'text/xml+oembed':
+ return $href;
+ }
+ }
+ }
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Dailymotion extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = '*dailymotion.*';
+ protected static $endPoint = 'http://www.dailymotion.com/services/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Http\Url;
+
+class Deviantart extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = [
+ '*.deviantart.com/art/*',
+ 'www.deviantart.com/#/d*',
+ ];
+ protected static $endPoint = 'http://backend.deviantart.com/oembed';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ return Url::create(static::$endPoint)
+ ->withQueryParameters([
+ 'url' => (string) $this->response->getUrl(),
+ 'format' => 'json',
+ 'for' => 'embed',
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Dotsub extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'dotsub.com/view/*';
+ protected static $endPoint = 'http://dotsub.com/services/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Adapters\Adapter;
+use Embed\Http\Response;
+use Embed\Http\Url;
+
+class Embedly implements EndPointInterface
+{
+ private $response;
+ private $key;
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(Adapter $adapter)
+ {
+ $key = $adapter->getConfig('oembed[embedly_key]');
+
+ if (!empty($key)) {
+ return new static($adapter->getResponse(), $key);
+ }
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param Response $response
+ * @param string $key
+ */
+ protected function __construct(Response $response, $key)
+ {
+ $this->response = $response;
+ $this->key = $key;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ return Url::create('http://api.embed.ly/1/oembed')
+ ->withQueryParameters([
+ 'url' => (string) $this->response->getUrl(),
+ 'format' => 'json',
+ 'key' => $this->key,
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Adapters\Adapter;
+use Embed\Http\Response;
+use Embed\Http\Url;
+
+/**
+ * Abstract class extended by other classes.
+ */
+abstract class EndPoint
+{
+ protected $response;
+ protected static $pattern;
+ protected static $endPoint;
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(Adapter $adapter)
+ {
+ $response = $adapter->getResponse();
+
+ if ($response->getUrl()->match(static::$pattern)) {
+ return new static($response);
+ }
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param Response $response
+ */
+ protected function __construct(Response $response)
+ {
+ $this->response = $response;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ return Url::create(static::$endPoint)
+ ->withQueryParameters([
+ 'url' => (string) $this->response->getUrl(),
+ 'format' => 'json',
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Adapters\Adapter;
+use Embed\Http\Url;
+
+/**
+ * Interface for all oembed endPoint.
+ */
+interface EndPointInterface
+{
+ /**
+ * Check the response and create new instance.
+ *
+ * @param Adapter $adapter
+ *
+ * @return EndPointInterface|null
+ */
+ public static function create(Adapter $adapter);
+
+ /**
+ * Returns the oembed endPoint.
+ *
+ * @return Url|null
+ */
+ public function getEndPoint();
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Http\Url;
+
+class Facebook extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'www.facebook.com/*';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ if ($this->response->getUrl()->match(['*/videos/*', '/video.php'])) {
+ $endPoint = Url::create('https://www.facebook.com/plugins/video/oembed.json');
+ } else {
+ $endPoint = Url::create('https://www.facebook.com/plugins/post/oembed.json');
+ }
+
+ return $endPoint->withQueryParameters([
+ 'url' => (string) $this->response->getUrl(),
+ 'format' => 'json',
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Flickr extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'www.flickr.com/*';
+ protected static $endPoint = 'http://flickr.com/services/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Adapters\Adapter;
+use Embed\Http\Response;
+use Embed\Http\Url;
+
+class Iframely implements EndPointInterface
+{
+ private $response;
+ private $key;
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(Adapter $adapter)
+ {
+ $key = $adapter->getConfig('oembed[iframely_key]');
+
+ if (!empty($key)) {
+ return new static($adapter->getResponse(), $key);
+ }
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param Response $response
+ * @param string $key
+ */
+ protected function __construct(Response $response, $key)
+ {
+ $this->response = $response;
+ $this->key = $key;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ return Url::create('http://open.iframe.ly/api/oembed')
+ ->withQueryParameters([
+ 'url' => (string) $this->response->getUrl(),
+ 'format' => 'json',
+ 'api_key' => $this->key,
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Imgur extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = [
+ 'imgur.com/*',
+ 'i.imgur.com/*',
+ ];
+ protected static $endPoint = 'https://api.imgur.com/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Http\Url;
+
+class Infogram extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = [
+ 'infogr.am/*',
+ 'www.infogr.am/*',
+ ];
+ protected static $endPoint = 'https://infogr.am/oembed';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ $url = $this->response->getUrl()->withScheme('https');
+
+ return Url::create(static::$endPoint)
+ ->withQueryParameters([
+ 'url' => (string) $url,
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Http\Url;
+
+class Instagram extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = [
+ 'instagram.com/p/*',
+ 'www.instagram.com/p/*',
+ ];
+ protected static $endPoint = 'https://api.instagram.com/oembed';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ $url = $this->response->getUrl()->withScheme('http');
+
+ return Url::create(static::$endPoint)
+ ->withQueryParameters([
+ 'url' => (string) $url,
+ 'format' => 'json',
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Http\Url;
+
+class Jsbin extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'output.jsbin.com/*';
+ protected static $endPoint = 'http://jsbin.com/oembed';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ $url = $this->response->getUrl()->withDirectoryPosition(2, 'embed');
+
+ return Url::create(static::$endPoint)
+ ->withQueryParameters([
+ 'url' => (string) $url,
+ 'format' => 'json',
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Kickstarter extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'www.kickstarter.com/*';
+ protected static $endPoint = 'http://www.kickstarter.com/services/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Meetup extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'www.meetup.com/*';
+ protected static $endPoint = 'http://api.meetup.com/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Photobucket extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'photobucket.com/*';
+ protected static $endPoint = 'http://s51.photobucket.com/oembed/';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Poll extends Polldaddy
+{
+ protected static $pattern = 'poll.fm/*';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Polldaddy extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'polldaddy.com/poll/*';
+ protected static $endPoint = 'https://api.crowdsignal.com/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Reddit extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'www.reddit.com/*';
+ protected static $endPoint = 'https://www.reddit.com/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Http\Url;
+
+class Scribd extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = [
+ 'www.scribd.com/doc/*',
+ 'www.scribd.com/document/*',
+ ];
+ protected static $endPoint = 'http://www.scribd.com/services/oembed';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ $url = $this->response->getUrl()->withDirectoryPosition(0, 'doc');
+
+ return Url::create(static::$endPoint)
+ ->withQueryParameters([
+ 'url' => (string) $url,
+ 'format' => 'json',
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Shoudio extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'shoudio.com/*';
+ protected static $endPoint = 'http://shoudio.com/api/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Smugmug extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'www.smugmug.com/*';
+ protected static $endPoint = 'http://api.smugmug.com/services/oembed/';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Soundcloud extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'soundcloud.com/*';
+ protected static $endPoint = 'https://soundcloud.com/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Http\Url;
+
+class Spotify extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = '*.spotify.com/*';
+ protected static $endPoint = 'https://embed.spotify.com/oembed';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ return Url::create(static::$endPoint)
+ ->withQueryParameters([
+ 'url' => (string) $this->response->getUrl()->withQueryParameters([]),
+ 'format' => 'json'
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+use Embed\Adapters\Adapter;
+use Embed\Http\Response;
+use Embed\Http\Url;
+
+class Tumblr extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = [
+ '*.tumblr.com/post/*'
+ ];
+
+ protected static $endPoint = 'https://www.tumblr.com/oembed/1.0';
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(Adapter $adapter)
+ {
+ $response = $adapter->getResponse();
+
+ if ($response->getStartingUrl()->match(static::$pattern)) {
+ return new static($response);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEndPoint()
+ {
+ return Url::create(static::$endPoint)
+ ->withQueryParameters([
+ 'url' => (string) $this->response->getStartingUrl()
+ ]);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Twitch extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = '*.twitch.tv/*';
+ protected static $endPoint = 'https://api.twitch.tv/v5/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Twitter extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = ['*.twitter.com/*', 'twitter.com/*'];
+ protected static $endPoint = 'https://publish.twitter.com/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Ustream extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'www.ustream.tv/*';
+ protected static $endPoint = 'http://www.ustream.tv/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class WordPress extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = 'wordpress.tv/*';
+ protected static $endPoint = 'https://wordpress.tv/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers\OEmbed;
+
+class Youtube extends EndPoint implements EndPointInterface
+{
+ protected static $pattern = ['*youtube.*', '*youtu\.be.*'];
+ protected static $endPoint = 'http://www.youtube.com/oembed';
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers;
+
+use Embed\Adapters\Adapter;
+use Embed\Utils;
+
+/**
+ * Provider to get the data from the Open Graph elements in the HTML
+ */
+class OpenGraph extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ if (!($html = $adapter->getResponse()->getHtmlContent())) {
+ return;
+ }
+
+ foreach ($html->getElementsByTagName('meta') as $meta) {
+ $name = trim(strtolower($meta->getAttribute('property')));
+ $value = $meta->getAttribute('content');
+
+ if (empty($name)) {
+ $name = trim(strtolower($meta->getAttribute('name')));
+ }
+
+ if (empty($name) || empty($value)) {
+ continue;
+ }
+
+ if (strpos($name, 'og:') === 0) {
+ $name = substr($name, 3);
+ } elseif (
+ strpos($name, 'article:') !== 0
+ && strpos($name, 'image:') !== 0
+ && strpos($name, 'video:') !== 0
+ && strpos($name, 'book:') !== 0
+ && strpos($name, 'music:') !== 0
+ && strpos($name, 'profile:') !== 0
+ ) {
+ continue;
+ }
+
+
+ switch ($name) {
+ case 'image':
+ case 'image:url':
+ case 'image:secure_url':
+ $this->bag->add('images', $value);
+ break;
+
+ case 'article:tag':
+ case 'video:tag':
+ case 'book:tag':
+ $this->bag->add('tags', $value);
+ break;
+
+ default:
+ $this->bag->set($name, $value);
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ return $this->bag->get('title');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('description');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ $type = $this->bag->get('type');
+
+ if (strpos($type, ':') !== false) {
+ $type = substr(strrchr($type, ':'), 1);
+ }
+
+ switch ($type) {
+ case 'video':
+ case 'photo':
+ case 'link':
+ case 'rich':
+ return $type;
+
+ case 'article':
+ return 'link';
+ }
+
+ if ($this->bag->has('video')) {
+ return 'video';
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $names = ['video:secure_url', 'video:url', 'video'];
+
+ foreach ($names as $name) {
+ if ($this->bag->has($name)) {
+ $video = $this->normalizeUrl($this->bag->get($name));
+
+ if (!($videoPath = parse_url($video, PHP_URL_PATH)) || !($type = pathinfo($videoPath, PATHINFO_EXTENSION))) {
+ $type = $this->bag->get('video:type');
+ }
+
+ switch ($type) {
+ case 'swf':
+ case 'application/x-shockwave-flash':
+ return Utils::flash($video, $this->getWidth(), $this->getHeight());
+
+ case 'mp4':
+ case 'ogg':
+ case 'ogv':
+ case 'webm':
+ case 'application/mp4':
+ case 'video/mp4':
+ case 'video/ogg':
+ case 'video/ogv':
+ case 'video/webm':
+ $images = $this->getImagesUrls();
+
+ return Utils::videoHtml(current($images), $video, $this->getWidth(), $this->getHeight());
+
+ case 'text/html':
+ return Utils::iframe($video, $this->getWidth(), $this->getHeight());
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ return $this->normalizeUrl($this->bag->get('url'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTags()
+ {
+ return (array) $this->bag->get('tags') ?: [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('article:author') ?: $this->bag->get('book:author');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderName()
+ {
+ return $this->bag->get('site_name');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ return $this->normalizeUrls($this->bag->get('images'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return $this->bag->get('image:width') ?: $this->bag->get('video:width');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return $this->bag->get('image:height') ?: $this->bag->get('video:height');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPublishedTime()
+ {
+ return $this->bag->get('article:published_time')
+ ?: $this->bag->get('article:modified_time')
+ ?: $this->bag->get('video:release_date')
+ ?: $this->bag->get('music:release_date');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderUrl()
+ {
+ return $this->bag->get('website');
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers;
+
+use Embed\Adapters\Adapter;
+use Embed\DataInterface;
+use Embed\Bag;
+
+/**
+ * Abstract class used by all providers.
+ */
+abstract class Provider implements DataInterface
+{
+ protected $bag;
+ protected $adapter;
+
+ /**
+ * Constructor.
+ *
+ * @param Adapter $adapter
+ */
+ public function __construct(Adapter $adapter)
+ {
+ $this->bag = new Bag();
+ $this->adapter = $adapter;
+ }
+
+ /**
+ * Returns the bag containing all data.
+ *
+ * @return Bag
+ */
+ public function getBag()
+ {
+ return $this->bag;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTags()
+ {
+ return [];
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function getFeeds()
+ {
+ return [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorUrl()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderIconsUrls()
+ {
+ return [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderName()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getProviderUrl()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ return [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPublishedTime()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLicense()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLinkedData()
+ {
+ return [];
+ }
+
+ /**
+ * Returns the urls as absolute.
+ *
+ * @param mixed $urls
+ *
+ * @return array
+ */
+ protected function normalizeUrls($urls)
+ {
+ if (!is_array($urls)) {
+ return [];
+ }
+
+ return array_map([$this, 'normalizeUrl'], array_filter($urls));
+ }
+
+ /**
+ * Returns the url as absolute.
+ *
+ * @param string|null $url
+ *
+ * @return string|null
+ */
+ protected function normalizeUrl($url)
+ {
+ if (empty($url)) {
+ return;
+ }
+
+ return $this->adapter->getResponse()->getUrl()->getAbsolute($url);
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers;
+
+use Embed\Adapters\Adapter;
+
+/**
+ * Provider to get the data from the Sailthru data elements in the HTML
+ */
+class Sailthru extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ if (!($html = $adapter->getResponse()->getHtmlContent())) {
+ return;
+ }
+
+ foreach ($html->getElementsByTagName('meta') as $meta) {
+ $name = trim(strtolower($meta->getAttribute('name')));
+ $value = $meta->getAttribute('content');
+
+ if (empty($name) || empty($value)) {
+ continue;
+ }
+
+ if (strpos($name, 'sailthru.') === 0) {
+ $this->bag->set(substr($name, 9), $value);
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ $images = [];
+
+ foreach ($this->bag->getKeys() as $name) {
+ if (strpos($name, 'image') !== false) {
+ $images[] = $this->bag->get($name);
+ }
+ }
+
+ return $this->normalizeUrls($images);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('author');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPublishedTime()
+ {
+ return $this->bag->get('date');
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed\Providers;
+
+use Embed\Adapters\Adapter;
+use Embed\Utils;
+
+/**
+ * Provider to get the data from the Twitter Cards elements in the HTML
+ */
+class TwitterCards extends Provider
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(Adapter $adapter)
+ {
+ parent::__construct($adapter);
+
+ if (!($html = $adapter->getResponse()->getHtmlContent())) {
+ return;
+ }
+
+ foreach ($html->getElementsByTagName('meta') as $meta) {
+ $name = trim(strtolower($meta->getAttribute('name')));
+ $value = $meta->getAttribute('content') ?: $meta->getAttribute('value');
+
+ if (empty($name) || empty($value)) {
+ continue;
+ }
+
+ if (strpos($name, 'twitter:') === 0) {
+ $name = substr($name, 8);
+
+ if ($name === 'image' || $name === 'image:src') {
+ $this->bag->add('images', $value);
+ } else {
+ $this->bag->set($name, $value);
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTitle()
+ {
+ return $this->bag->get('title');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescription()
+ {
+ return $this->bag->get('description');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ $type = $this->bag->get('card');
+
+ if (strpos($type, ':') !== false) {
+ $type = substr(strrchr($type, ':'), 1);
+ }
+
+ switch ($type) {
+ case 'summary':
+ case 'summary_large_image':
+ case 'app':
+ return 'rich';
+ case 'player':
+ return 'video';
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCode()
+ {
+ $src = $this->normalizeUrl($this->bag->get('player'));
+
+ if ($src !== null) {
+ return Utils::iframe($src, $this->getWidth(), $this->getHeight());
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUrl()
+ {
+ return $this->normalizeUrl($this->bag->get('url'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorName()
+ {
+ return $this->bag->get('creator');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAuthorUrl()
+ {
+ $author = $this->getAuthorName();
+
+ if (!empty($author)) {
+ return 'https://twitter.com/'.ltrim($author, '@');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getImagesUrls()
+ {
+ return $this->normalizeUrls($this->bag->get('images'));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWidth()
+ {
+ return $this->bag->get('player:width');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHeight()
+ {
+ return $this->bag->get('player:height');
+ }
+}
--- /dev/null
+<?php
+
+namespace Embed;
+
+use DOMDocument;
+use DOMElement;
+use DOMNodeList;
+use DOMXPath;
+
+/**
+ * Some helpers methods used across the library.
+ */
+class Utils
+{
+ /**
+ * Creates a <video> element.
+ *
+ * @param string $poster Poster attribute
+ * @param string|array $sources Video sources
+ * @param int $width Width attribute
+ * @param int $height Height attribute
+ *
+ * @return string
+ */
+ public static function videoHtml($poster, $sources, $width = 0, $height = 0)
+ {
+ $code = self::element('video', [
+ 'poster' => ($poster ?: null),
+ 'width' => ($width ?: null),
+ 'height' => ($height ?: null),
+ 'controls' => true,
+ ]);
+
+ foreach ((array) $sources as $source) {
+ $code .= self::element('source', ['src' => $source]);
+ }
+
+ return $code.'</video>';
+ }
+
+ /**
+ * Creates an <audio> element.
+ *
+ * @param string|array $sources Audio sources
+ *
+ * @return string
+ */
+ public static function audioHtml($sources)
+ {
+ $code = '<audio controls>';
+
+ foreach ((array) $sources as $source) {
+ $code .= self::element('source', ['src' => $source]);
+ }
+
+ return $code.'</audio>';
+ }
+
+ /**
+ * Creates an <img> element.
+ *
+ * @param string $src Image source attribute
+ * @param string $alt Alt attribute
+ * @param int $width Width attribute
+ * @param int $height Height attribute
+ *
+ * @return string
+ */
+ public static function imageHtml($src, $alt = '', $width = 0, $height = 0)
+ {
+ return self::element('img', [
+ 'src' => $src,
+ 'alt' => $alt,
+ 'width' => ($width ?: null),
+ 'height' => ($height ?: null),
+ ]);
+ }
+
+ /**
+ * Creates an <iframe> element.
+ *
+ * @param string $src Iframe source attribute
+ * @param int $width Width attribute
+ * @param int $height Height attribute
+ * @param int $styles Extra css styles
+ *
+ * @return string
+ */
+ public static function iframe($src, $width = 0, $height = 0, $styles = '')
+ {
+ $width = $width ? (is_int($width) ? $width.'px' : $width) : '600px';
+ $height = $height ? (is_int($height) ? $height.'px' : $height) : '400px';
+
+ if (empty($styles)) {
+ $styles = 'border:none;overflow:hidden;';
+ }
+
+ $styles .= "width:{$width};height:{$height};";
+
+ return self::element('iframe', [
+ 'src' => $src,
+ 'frameborder' => 0,
+ 'allowTransparency' => 'true',
+ 'style' => $styles,
+ ]).'</iframe>';
+ }
+
+ /**
+ * Creates an <script> element.
+ *
+ * @param string $src The src attribute
+ *
+ * @return string
+ */
+ public static function script($src)
+ {
+ return self::element('script', [
+ 'src' => $src,
+ ]).'</script>';
+ }
+
+ /**
+ * Creates an <iframe> element with a google viewer.
+ *
+ * @param string $src The file loaded by the viewer (pdf, doc, etc)
+ *
+ * @return string
+ */
+ public static function google($src)
+ {
+ return self::iframe('https://docs.google.com/viewer?'.http_build_query([
+ 'url' => $src,
+ 'embedded' => 'true',
+ ]), 600, 600);
+ }
+
+ /**
+ * Creates a flash element.
+ *
+ * @param string $src The swf file source
+ * @param null|int $width Width attribute
+ * @param null|int $height Height attribute
+ *
+ * @return string
+ */
+ public static function flash($src, $width = null, $height = null)
+ {
+ $code = self::element('object', [
+ 'width' => $width ?: 600,
+ 'height' => $height ?: 400,
+ 'classid' => 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',
+ 'codebase' => 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0',
+ ]);
+
+ $code .= self::element('param', ['name' => 'movie', 'value' => $src]);
+ $code .= self::element('param', ['name' => 'allowFullScreen', 'value' => 'true']);
+ $code .= self::element('param', ['name' => 'allowScriptAccess', 'value' => 'always']);
+ $code .= self::element('embed', [
+ 'src' => $src,
+ 'width' => $width ?: 600,
+ 'height' => $height ?: 400,
+ 'type' => 'application/x-shockwave-flash',
+ 'allowFullScreen' => 'true',
+ 'allowScriptAccess' => 'always',
+ 'pluginspage' => 'http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash',
+ ]);
+
+ return $code.'</embed></object>';
+ }
+
+ /**
+ * Creates an html element.
+ *
+ * @param string $name Element name
+ * @param array $attrs Element attributes
+ *
+ * @return string
+ */
+ private static function element($name, array $attrs)
+ {
+ $str = "<$name";
+
+ foreach ($attrs as $name => $value) {
+ if ($value === null) {
+ continue;
+ } elseif ($value === true) {
+ $str .= " $name";
+ } elseif ($value !== false) {
+ $str .= ' '.$name.'="'.htmlspecialchars($value).'"';
+ }
+ }
+
+ return "$str>";
+ }
+
+ /**
+ * Convert a string to utf-8.
+ *
+ * @param string $content The content to convert
+ * @param string $charset The original charset
+ *
+ * @return string
+ */
+ public static function toUtf8($content, $charset)
+ {
+ $charset = strtoupper($charset);
+
+ if (empty($charset) || $charset === 'UTF-8') {
+ return $content;
+ }
+
+ $encodings = array_map('strtoupper', mb_list_encodings());
+
+ if (in_array($charset, $encodings, true)) {
+ return mb_convert_encoding($content, 'UTF-8', $charset);
+ }
+
+ if (function_exists('iconv')) {
+ return iconv($charset, 'UTF-8//TRANSLIT//IGNORE', $content);
+ }
+
+ return $content;
+ }
+
+ /**
+ * Search and return the first element matching with a xpath
+ *
+ * @param DOMDocument $document
+ * @param string $query
+ * @param bool $returnFirst
+ *
+ * @return DOMElement|DOMNodeList|null
+ */
+ public static function xpathQuery(DOMDocument $document, $query, $returnFirst = true)
+ {
+ $xpath = new DOMXPath($document);
+ $entries = $xpath->query($query);
+
+ if ($entries->length) {
+ return $returnFirst ? $entries->item(0) : $entries;
+ }
+ }
+}
--- /dev/null
+<?php
+
+spl_autoload_register(function ($class) {
+ if (strpos($class, 'Embed\\') !== 0) {
+ return;
+ }
+
+ $file = __DIR__.str_replace('\\', DIRECTORY_SEPARATOR, substr($class, strlen('Embed'))).'.php';
+
+ if (is_file($file)) {
+ require_once $file;
+ }
+});
--- /dev/null
+<?php
+
+return array(
+ 0 => 'ac',
+ 1 => 'com.ac',
+ 2 => 'edu.ac',
+ 3 => 'gov.ac',
+ 4 => 'net.ac',
+ 5 => 'mil.ac',
+ 6 => 'org.ac',
+ 7 => 'ad',
+ 8 => 'nom.ad',
+ 9 => 'ae',
+ 10 => 'co.ae',
+ 11 => 'net.ae',
+ 12 => 'org.ae',
+ 13 => 'sch.ae',
+ 14 => 'ac.ae',
+ 15 => 'gov.ae',
+ 16 => 'mil.ae',
+ 17 => 'aero',
+ 18 => 'accident-investigation.aero',
+ 19 => 'accident-prevention.aero',
+ 20 => 'aerobatic.aero',
+ 21 => 'aeroclub.aero',
+ 22 => 'aerodrome.aero',
+ 23 => 'agents.aero',
+ 24 => 'aircraft.aero',
+ 25 => 'airline.aero',
+ 26 => 'airport.aero',
+ 27 => 'air-surveillance.aero',
+ 28 => 'airtraffic.aero',
+ 29 => 'air-traffic-control.aero',
+ 30 => 'ambulance.aero',
+ 31 => 'amusement.aero',
+ 32 => 'association.aero',
+ 33 => 'author.aero',
+ 34 => 'ballooning.aero',
+ 35 => 'broker.aero',
+ 36 => 'caa.aero',
+ 37 => 'cargo.aero',
+ 38 => 'catering.aero',
+ 39 => 'certification.aero',
+ 40 => 'championship.aero',
+ 41 => 'charter.aero',
+ 42 => 'civilaviation.aero',
+ 43 => 'club.aero',
+ 44 => 'conference.aero',
+ 45 => 'consultant.aero',
+ 46 => 'consulting.aero',
+ 47 => 'control.aero',
+ 48 => 'council.aero',
+ 49 => 'crew.aero',
+ 50 => 'design.aero',
+ 51 => 'dgca.aero',
+ 52 => 'educator.aero',
+ 53 => 'emergency.aero',
+ 54 => 'engine.aero',
+ 55 => 'engineer.aero',
+ 56 => 'entertainment.aero',
+ 57 => 'equipment.aero',
+ 58 => 'exchange.aero',
+ 59 => 'express.aero',
+ 60 => 'federation.aero',
+ 61 => 'flight.aero',
+ 62 => 'freight.aero',
+ 63 => 'fuel.aero',
+ 64 => 'gliding.aero',
+ 65 => 'government.aero',
+ 66 => 'groundhandling.aero',
+ 67 => 'group.aero',
+ 68 => 'hanggliding.aero',
+ 69 => 'homebuilt.aero',
+ 70 => 'insurance.aero',
+ 71 => 'journal.aero',
+ 72 => 'journalist.aero',
+ 73 => 'leasing.aero',
+ 74 => 'logistics.aero',
+ 75 => 'magazine.aero',
+ 76 => 'maintenance.aero',
+ 77 => 'media.aero',
+ 78 => 'microlight.aero',
+ 79 => 'modelling.aero',
+ 80 => 'navigation.aero',
+ 81 => 'parachuting.aero',
+ 82 => 'paragliding.aero',
+ 83 => 'passenger-association.aero',
+ 84 => 'pilot.aero',
+ 85 => 'press.aero',
+ 86 => 'production.aero',
+ 87 => 'recreation.aero',
+ 88 => 'repbody.aero',
+ 89 => 'res.aero',
+ 90 => 'research.aero',
+ 91 => 'rotorcraft.aero',
+ 92 => 'safety.aero',
+ 93 => 'scientist.aero',
+ 94 => 'services.aero',
+ 95 => 'show.aero',
+ 96 => 'skydiving.aero',
+ 97 => 'software.aero',
+ 98 => 'student.aero',
+ 99 => 'trader.aero',
+ 100 => 'trading.aero',
+ 101 => 'trainer.aero',
+ 102 => 'union.aero',
+ 103 => 'workinggroup.aero',
+ 104 => 'works.aero',
+ 105 => 'af',
+ 106 => 'gov.af',
+ 107 => 'com.af',
+ 108 => 'org.af',
+ 109 => 'net.af',
+ 110 => 'edu.af',
+ 111 => 'ag',
+ 112 => 'com.ag',
+ 113 => 'org.ag',
+ 114 => 'net.ag',
+ 115 => 'co.ag',
+ 116 => 'nom.ag',
+ 117 => 'ai',
+ 118 => 'off.ai',
+ 119 => 'com.ai',
+ 120 => 'net.ai',
+ 121 => 'org.ai',
+ 122 => 'al',
+ 123 => 'com.al',
+ 124 => 'edu.al',
+ 125 => 'gov.al',
+ 126 => 'mil.al',
+ 127 => 'net.al',
+ 128 => 'org.al',
+ 129 => 'am',
+ 130 => 'ao',
+ 131 => 'ed.ao',
+ 132 => 'gv.ao',
+ 133 => 'og.ao',
+ 134 => 'co.ao',
+ 135 => 'pb.ao',
+ 136 => 'it.ao',
+ 137 => 'aq',
+ 138 => 'ar',
+ 139 => 'com.ar',
+ 140 => 'edu.ar',
+ 141 => 'gob.ar',
+ 142 => 'gov.ar',
+ 143 => 'int.ar',
+ 144 => 'mil.ar',
+ 145 => 'net.ar',
+ 146 => 'org.ar',
+ 147 => 'tur.ar',
+ 148 => 'arpa',
+ 149 => 'e164.arpa',
+ 150 => 'in-addr.arpa',
+ 151 => 'ip6.arpa',
+ 152 => 'iris.arpa',
+ 153 => 'uri.arpa',
+ 154 => 'urn.arpa',
+ 155 => 'as',
+ 156 => 'gov.as',
+ 157 => 'asia',
+ 158 => 'at',
+ 159 => 'ac.at',
+ 160 => 'co.at',
+ 161 => 'gv.at',
+ 162 => 'or.at',
+ 163 => 'au',
+ 164 => 'com.au',
+ 165 => 'net.au',
+ 166 => 'org.au',
+ 167 => 'edu.au',
+ 168 => 'gov.au',
+ 169 => 'asn.au',
+ 170 => 'id.au',
+ 171 => 'info.au',
+ 172 => 'conf.au',
+ 173 => 'oz.au',
+ 174 => 'act.au',
+ 175 => 'nsw.au',
+ 176 => 'nt.au',
+ 177 => 'qld.au',
+ 178 => 'sa.au',
+ 179 => 'tas.au',
+ 180 => 'vic.au',
+ 181 => 'wa.au',
+ 182 => 'act.edu.au',
+ 183 => 'nsw.edu.au',
+ 184 => 'nt.edu.au',
+ 185 => 'qld.edu.au',
+ 186 => 'sa.edu.au',
+ 187 => 'tas.edu.au',
+ 188 => 'vic.edu.au',
+ 189 => 'wa.edu.au',
+ 190 => 'qld.gov.au',
+ 191 => 'sa.gov.au',
+ 192 => 'tas.gov.au',
+ 193 => 'vic.gov.au',
+ 194 => 'wa.gov.au',
+ 195 => 'aw',
+ 196 => 'com.aw',
+ 197 => 'ax',
+ 198 => 'az',
+ 199 => 'com.az',
+ 200 => 'net.az',
+ 201 => 'int.az',
+ 202 => 'gov.az',
+ 203 => 'org.az',
+ 204 => 'edu.az',
+ 205 => 'info.az',
+ 206 => 'pp.az',
+ 207 => 'mil.az',
+ 208 => 'name.az',
+ 209 => 'pro.az',
+ 210 => 'biz.az',
+ 211 => 'ba',
+ 212 => 'org.ba',
+ 213 => 'net.ba',
+ 214 => 'edu.ba',
+ 215 => 'gov.ba',
+ 216 => 'mil.ba',
+ 217 => 'unsa.ba',
+ 218 => 'unbi.ba',
+ 219 => 'co.ba',
+ 220 => 'com.ba',
+ 221 => 'rs.ba',
+ 222 => 'bb',
+ 223 => 'biz.bb',
+ 224 => 'co.bb',
+ 225 => 'com.bb',
+ 226 => 'edu.bb',
+ 227 => 'gov.bb',
+ 228 => 'info.bb',
+ 229 => 'net.bb',
+ 230 => 'org.bb',
+ 231 => 'store.bb',
+ 232 => 'tv.bb',
+ 233 => '*.bd',
+ 234 => 'be',
+ 235 => 'ac.be',
+ 236 => 'bf',
+ 237 => 'gov.bf',
+ 238 => 'bg',
+ 239 => 'a.bg',
+ 240 => 'b.bg',
+ 241 => 'c.bg',
+ 242 => 'd.bg',
+ 243 => 'e.bg',
+ 244 => 'f.bg',
+ 245 => 'g.bg',
+ 246 => 'h.bg',
+ 247 => 'i.bg',
+ 248 => 'j.bg',
+ 249 => 'k.bg',
+ 250 => 'l.bg',
+ 251 => 'm.bg',
+ 252 => 'n.bg',
+ 253 => 'o.bg',
+ 254 => 'p.bg',
+ 255 => 'q.bg',
+ 256 => 'r.bg',
+ 257 => 's.bg',
+ 258 => 't.bg',
+ 259 => 'u.bg',
+ 260 => 'v.bg',
+ 261 => 'w.bg',
+ 262 => 'x.bg',
+ 263 => 'y.bg',
+ 264 => 'z.bg',
+ 265 => '0.bg',
+ 266 => '1.bg',
+ 267 => '2.bg',
+ 268 => '3.bg',
+ 269 => '4.bg',
+ 270 => '5.bg',
+ 271 => '6.bg',
+ 272 => '7.bg',
+ 273 => '8.bg',
+ 274 => '9.bg',
+ 275 => 'bh',
+ 276 => 'com.bh',
+ 277 => 'edu.bh',
+ 278 => 'net.bh',
+ 279 => 'org.bh',
+ 280 => 'gov.bh',
+ 281 => 'bi',
+ 282 => 'co.bi',
+ 283 => 'com.bi',
+ 284 => 'edu.bi',
+ 285 => 'or.bi',
+ 286 => 'org.bi',
+ 287 => 'biz',
+ 288 => 'bj',
+ 289 => 'asso.bj',
+ 290 => 'barreau.bj',
+ 291 => 'gouv.bj',
+ 292 => 'bm',
+ 293 => 'com.bm',
+ 294 => 'edu.bm',
+ 295 => 'gov.bm',
+ 296 => 'net.bm',
+ 297 => 'org.bm',
+ 298 => '*.bn',
+ 299 => 'bo',
+ 300 => 'com.bo',
+ 301 => 'edu.bo',
+ 302 => 'gov.bo',
+ 303 => 'gob.bo',
+ 304 => 'int.bo',
+ 305 => 'org.bo',
+ 306 => 'net.bo',
+ 307 => 'mil.bo',
+ 308 => 'tv.bo',
+ 309 => 'br',
+ 310 => 'adm.br',
+ 311 => 'adv.br',
+ 312 => 'agr.br',
+ 313 => 'am.br',
+ 314 => 'arq.br',
+ 315 => 'art.br',
+ 316 => 'ato.br',
+ 317 => 'b.br',
+ 318 => 'bio.br',
+ 319 => 'blog.br',
+ 320 => 'bmd.br',
+ 321 => 'cim.br',
+ 322 => 'cng.br',
+ 323 => 'cnt.br',
+ 324 => 'com.br',
+ 325 => 'coop.br',
+ 326 => 'ecn.br',
+ 327 => 'eco.br',
+ 328 => 'edu.br',
+ 329 => 'emp.br',
+ 330 => 'eng.br',
+ 331 => 'esp.br',
+ 332 => 'etc.br',
+ 333 => 'eti.br',
+ 334 => 'far.br',
+ 335 => 'flog.br',
+ 336 => 'fm.br',
+ 337 => 'fnd.br',
+ 338 => 'fot.br',
+ 339 => 'fst.br',
+ 340 => 'g12.br',
+ 341 => 'ggf.br',
+ 342 => 'gov.br',
+ 343 => 'imb.br',
+ 344 => 'ind.br',
+ 345 => 'inf.br',
+ 346 => 'jor.br',
+ 347 => 'jus.br',
+ 348 => 'leg.br',
+ 349 => 'lel.br',
+ 350 => 'mat.br',
+ 351 => 'med.br',
+ 352 => 'mil.br',
+ 353 => 'mp.br',
+ 354 => 'mus.br',
+ 355 => 'net.br',
+ 356 => '*.nom.br',
+ 357 => 'not.br',
+ 358 => 'ntr.br',
+ 359 => 'odo.br',
+ 360 => 'org.br',
+ 361 => 'ppg.br',
+ 362 => 'pro.br',
+ 363 => 'psc.br',
+ 364 => 'psi.br',
+ 365 => 'qsl.br',
+ 366 => 'radio.br',
+ 367 => 'rec.br',
+ 368 => 'slg.br',
+ 369 => 'srv.br',
+ 370 => 'taxi.br',
+ 371 => 'teo.br',
+ 372 => 'tmp.br',
+ 373 => 'trd.br',
+ 374 => 'tur.br',
+ 375 => 'tv.br',
+ 376 => 'vet.br',
+ 377 => 'vlog.br',
+ 378 => 'wiki.br',
+ 379 => 'zlg.br',
+ 380 => 'bs',
+ 381 => 'com.bs',
+ 382 => 'net.bs',
+ 383 => 'org.bs',
+ 384 => 'edu.bs',
+ 385 => 'gov.bs',
+ 386 => 'bt',
+ 387 => 'com.bt',
+ 388 => 'edu.bt',
+ 389 => 'gov.bt',
+ 390 => 'net.bt',
+ 391 => 'org.bt',
+ 392 => 'bv',
+ 393 => 'bw',
+ 394 => 'co.bw',
+ 395 => 'org.bw',
+ 396 => 'by',
+ 397 => 'gov.by',
+ 398 => 'mil.by',
+ 399 => 'com.by',
+ 400 => 'of.by',
+ 401 => 'bz',
+ 402 => 'com.bz',
+ 403 => 'net.bz',
+ 404 => 'org.bz',
+ 405 => 'edu.bz',
+ 406 => 'gov.bz',
+ 407 => 'ca',
+ 408 => 'ab.ca',
+ 409 => 'bc.ca',
+ 410 => 'mb.ca',
+ 411 => 'nb.ca',
+ 412 => 'nf.ca',
+ 413 => 'nl.ca',
+ 414 => 'ns.ca',
+ 415 => 'nt.ca',
+ 416 => 'nu.ca',
+ 417 => 'on.ca',
+ 418 => 'pe.ca',
+ 419 => 'qc.ca',
+ 420 => 'sk.ca',
+ 421 => 'yk.ca',
+ 422 => 'gc.ca',
+ 423 => 'cat',
+ 424 => 'cc',
+ 425 => 'cd',
+ 426 => 'gov.cd',
+ 427 => 'cf',
+ 428 => 'cg',
+ 429 => 'ch',
+ 430 => 'ci',
+ 431 => 'org.ci',
+ 432 => 'or.ci',
+ 433 => 'com.ci',
+ 434 => 'co.ci',
+ 435 => 'edu.ci',
+ 436 => 'ed.ci',
+ 437 => 'ac.ci',
+ 438 => 'net.ci',
+ 439 => 'go.ci',
+ 440 => 'asso.ci',
+ 441 => 'aéroport.ci',
+ 442 => 'int.ci',
+ 443 => 'presse.ci',
+ 444 => 'md.ci',
+ 445 => 'gouv.ci',
+ 446 => '*.ck',
+ 447 => '!www.ck',
+ 448 => 'cl',
+ 449 => 'gov.cl',
+ 450 => 'gob.cl',
+ 451 => 'co.cl',
+ 452 => 'mil.cl',
+ 453 => 'cm',
+ 454 => 'co.cm',
+ 455 => 'com.cm',
+ 456 => 'gov.cm',
+ 457 => 'net.cm',
+ 458 => 'cn',
+ 459 => 'ac.cn',
+ 460 => 'com.cn',
+ 461 => 'edu.cn',
+ 462 => 'gov.cn',
+ 463 => 'net.cn',
+ 464 => 'org.cn',
+ 465 => 'mil.cn',
+ 466 => '公司.cn',
+ 467 => '网络.cn',
+ 468 => '網絡.cn',
+ 469 => 'ah.cn',
+ 470 => 'bj.cn',
+ 471 => 'cq.cn',
+ 472 => 'fj.cn',
+ 473 => 'gd.cn',
+ 474 => 'gs.cn',
+ 475 => 'gz.cn',
+ 476 => 'gx.cn',
+ 477 => 'ha.cn',
+ 478 => 'hb.cn',
+ 479 => 'he.cn',
+ 480 => 'hi.cn',
+ 481 => 'hl.cn',
+ 482 => 'hn.cn',
+ 483 => 'jl.cn',
+ 484 => 'js.cn',
+ 485 => 'jx.cn',
+ 486 => 'ln.cn',
+ 487 => 'nm.cn',
+ 488 => 'nx.cn',
+ 489 => 'qh.cn',
+ 490 => 'sc.cn',
+ 491 => 'sd.cn',
+ 492 => 'sh.cn',
+ 493 => 'sn.cn',
+ 494 => 'sx.cn',
+ 495 => 'tj.cn',
+ 496 => 'xj.cn',
+ 497 => 'xz.cn',
+ 498 => 'yn.cn',
+ 499 => 'zj.cn',
+ 500 => 'hk.cn',
+ 501 => 'mo.cn',
+ 502 => 'tw.cn',
+ 503 => 'co',
+ 504 => 'arts.co',
+ 505 => 'com.co',
+ 506 => 'edu.co',
+ 507 => 'firm.co',
+ 508 => 'gov.co',
+ 509 => 'info.co',
+ 510 => 'int.co',
+ 511 => 'mil.co',
+ 512 => 'net.co',
+ 513 => 'nom.co',
+ 514 => 'org.co',
+ 515 => 'rec.co',
+ 516 => 'web.co',
+ 517 => 'com',
+ 518 => 'coop',
+ 519 => 'cr',
+ 520 => 'ac.cr',
+ 521 => 'co.cr',
+ 522 => 'ed.cr',
+ 523 => 'fi.cr',
+ 524 => 'go.cr',
+ 525 => 'or.cr',
+ 526 => 'sa.cr',
+ 527 => 'cu',
+ 528 => 'com.cu',
+ 529 => 'edu.cu',
+ 530 => 'org.cu',
+ 531 => 'net.cu',
+ 532 => 'gov.cu',
+ 533 => 'inf.cu',
+ 534 => 'cv',
+ 535 => 'cw',
+ 536 => 'com.cw',
+ 537 => 'edu.cw',
+ 538 => 'net.cw',
+ 539 => 'org.cw',
+ 540 => 'cx',
+ 541 => 'gov.cx',
+ 542 => 'ac.cy',
+ 543 => 'biz.cy',
+ 544 => 'com.cy',
+ 545 => 'ekloges.cy',
+ 546 => 'gov.cy',
+ 547 => 'ltd.cy',
+ 548 => 'name.cy',
+ 549 => 'net.cy',
+ 550 => 'org.cy',
+ 551 => 'parliament.cy',
+ 552 => 'press.cy',
+ 553 => 'pro.cy',
+ 554 => 'tm.cy',
+ 555 => 'cz',
+ 556 => 'de',
+ 557 => 'dj',
+ 558 => 'dk',
+ 559 => 'dm',
+ 560 => 'com.dm',
+ 561 => 'net.dm',
+ 562 => 'org.dm',
+ 563 => 'edu.dm',
+ 564 => 'gov.dm',
+ 565 => 'do',
+ 566 => 'art.do',
+ 567 => 'com.do',
+ 568 => 'edu.do',
+ 569 => 'gob.do',
+ 570 => 'gov.do',
+ 571 => 'mil.do',
+ 572 => 'net.do',
+ 573 => 'org.do',
+ 574 => 'sld.do',
+ 575 => 'web.do',
+ 576 => 'dz',
+ 577 => 'com.dz',
+ 578 => 'org.dz',
+ 579 => 'net.dz',
+ 580 => 'gov.dz',
+ 581 => 'edu.dz',
+ 582 => 'asso.dz',
+ 583 => 'pol.dz',
+ 584 => 'art.dz',
+ 585 => 'ec',
+ 586 => 'com.ec',
+ 587 => 'info.ec',
+ 588 => 'net.ec',
+ 589 => 'fin.ec',
+ 590 => 'k12.ec',
+ 591 => 'med.ec',
+ 592 => 'pro.ec',
+ 593 => 'org.ec',
+ 594 => 'edu.ec',
+ 595 => 'gov.ec',
+ 596 => 'gob.ec',
+ 597 => 'mil.ec',
+ 598 => 'edu',
+ 599 => 'ee',
+ 600 => 'edu.ee',
+ 601 => 'gov.ee',
+ 602 => 'riik.ee',
+ 603 => 'lib.ee',
+ 604 => 'med.ee',
+ 605 => 'com.ee',
+ 606 => 'pri.ee',
+ 607 => 'aip.ee',
+ 608 => 'org.ee',
+ 609 => 'fie.ee',
+ 610 => 'eg',
+ 611 => 'com.eg',
+ 612 => 'edu.eg',
+ 613 => 'eun.eg',
+ 614 => 'gov.eg',
+ 615 => 'mil.eg',
+ 616 => 'name.eg',
+ 617 => 'net.eg',
+ 618 => 'org.eg',
+ 619 => 'sci.eg',
+ 620 => '*.er',
+ 621 => 'es',
+ 622 => 'com.es',
+ 623 => 'nom.es',
+ 624 => 'org.es',
+ 625 => 'gob.es',
+ 626 => 'edu.es',
+ 627 => 'et',
+ 628 => 'com.et',
+ 629 => 'gov.et',
+ 630 => 'org.et',
+ 631 => 'edu.et',
+ 632 => 'biz.et',
+ 633 => 'name.et',
+ 634 => 'info.et',
+ 635 => 'net.et',
+ 636 => 'eu',
+ 637 => 'fi',
+ 638 => 'aland.fi',
+ 639 => '*.fj',
+ 640 => '*.fk',
+ 641 => 'fm',
+ 642 => 'fo',
+ 643 => 'fr',
+ 644 => 'com.fr',
+ 645 => 'asso.fr',
+ 646 => 'nom.fr',
+ 647 => 'prd.fr',
+ 648 => 'presse.fr',
+ 649 => 'tm.fr',
+ 650 => 'aeroport.fr',
+ 651 => 'assedic.fr',
+ 652 => 'avocat.fr',
+ 653 => 'avoues.fr',
+ 654 => 'cci.fr',
+ 655 => 'chambagri.fr',
+ 656 => 'chirurgiens-dentistes.fr',
+ 657 => 'experts-comptables.fr',
+ 658 => 'geometre-expert.fr',
+ 659 => 'gouv.fr',
+ 660 => 'greta.fr',
+ 661 => 'huissier-justice.fr',
+ 662 => 'medecin.fr',
+ 663 => 'notaires.fr',
+ 664 => 'pharmacien.fr',
+ 665 => 'port.fr',
+ 666 => 'veterinaire.fr',
+ 667 => 'ga',
+ 668 => 'gb',
+ 669 => 'gd',
+ 670 => 'ge',
+ 671 => 'com.ge',
+ 672 => 'edu.ge',
+ 673 => 'gov.ge',
+ 674 => 'org.ge',
+ 675 => 'mil.ge',
+ 676 => 'net.ge',
+ 677 => 'pvt.ge',
+ 678 => 'gf',
+ 679 => 'gg',
+ 680 => 'co.gg',
+ 681 => 'net.gg',
+ 682 => 'org.gg',
+ 683 => 'gh',
+ 684 => 'com.gh',
+ 685 => 'edu.gh',
+ 686 => 'gov.gh',
+ 687 => 'org.gh',
+ 688 => 'mil.gh',
+ 689 => 'gi',
+ 690 => 'com.gi',
+ 691 => 'ltd.gi',
+ 692 => 'gov.gi',
+ 693 => 'mod.gi',
+ 694 => 'edu.gi',
+ 695 => 'org.gi',
+ 696 => 'gl',
+ 697 => 'co.gl',
+ 698 => 'com.gl',
+ 699 => 'edu.gl',
+ 700 => 'net.gl',
+ 701 => 'org.gl',
+ 702 => 'gm',
+ 703 => 'gn',
+ 704 => 'ac.gn',
+ 705 => 'com.gn',
+ 706 => 'edu.gn',
+ 707 => 'gov.gn',
+ 708 => 'org.gn',
+ 709 => 'net.gn',
+ 710 => 'gov',
+ 711 => 'gp',
+ 712 => 'com.gp',
+ 713 => 'net.gp',
+ 714 => 'mobi.gp',
+ 715 => 'edu.gp',
+ 716 => 'org.gp',
+ 717 => 'asso.gp',
+ 718 => 'gq',
+ 719 => 'gr',
+ 720 => 'com.gr',
+ 721 => 'edu.gr',
+ 722 => 'net.gr',
+ 723 => 'org.gr',
+ 724 => 'gov.gr',
+ 725 => 'gs',
+ 726 => 'gt',
+ 727 => 'com.gt',
+ 728 => 'edu.gt',
+ 729 => 'gob.gt',
+ 730 => 'ind.gt',
+ 731 => 'mil.gt',
+ 732 => 'net.gt',
+ 733 => 'org.gt',
+ 734 => '*.gu',
+ 735 => 'gw',
+ 736 => 'gy',
+ 737 => 'co.gy',
+ 738 => 'com.gy',
+ 739 => 'edu.gy',
+ 740 => 'gov.gy',
+ 741 => 'net.gy',
+ 742 => 'org.gy',
+ 743 => 'hk',
+ 744 => 'com.hk',
+ 745 => 'edu.hk',
+ 746 => 'gov.hk',
+ 747 => 'idv.hk',
+ 748 => 'net.hk',
+ 749 => 'org.hk',
+ 750 => '公司.hk',
+ 751 => '教育.hk',
+ 752 => '敎育.hk',
+ 753 => '政府.hk',
+ 754 => '個人.hk',
+ 755 => '个人.hk',
+ 756 => '箇人.hk',
+ 757 => '網络.hk',
+ 758 => '网络.hk',
+ 759 => '组織.hk',
+ 760 => '網絡.hk',
+ 761 => '网絡.hk',
+ 762 => '组织.hk',
+ 763 => '組織.hk',
+ 764 => '組织.hk',
+ 765 => 'hm',
+ 766 => 'hn',
+ 767 => 'com.hn',
+ 768 => 'edu.hn',
+ 769 => 'org.hn',
+ 770 => 'net.hn',
+ 771 => 'mil.hn',
+ 772 => 'gob.hn',
+ 773 => 'hr',
+ 774 => 'iz.hr',
+ 775 => 'from.hr',
+ 776 => 'name.hr',
+ 777 => 'com.hr',
+ 778 => 'ht',
+ 779 => 'com.ht',
+ 780 => 'shop.ht',
+ 781 => 'firm.ht',
+ 782 => 'info.ht',
+ 783 => 'adult.ht',
+ 784 => 'net.ht',
+ 785 => 'pro.ht',
+ 786 => 'org.ht',
+ 787 => 'med.ht',
+ 788 => 'art.ht',
+ 789 => 'coop.ht',
+ 790 => 'pol.ht',
+ 791 => 'asso.ht',
+ 792 => 'edu.ht',
+ 793 => 'rel.ht',
+ 794 => 'gouv.ht',
+ 795 => 'perso.ht',
+ 796 => 'hu',
+ 797 => 'co.hu',
+ 798 => 'info.hu',
+ 799 => 'org.hu',
+ 800 => 'priv.hu',
+ 801 => 'sport.hu',
+ 802 => 'tm.hu',
+ 803 => '2000.hu',
+ 804 => 'agrar.hu',
+ 805 => 'bolt.hu',
+ 806 => 'casino.hu',
+ 807 => 'city.hu',
+ 808 => 'erotica.hu',
+ 809 => 'erotika.hu',
+ 810 => 'film.hu',
+ 811 => 'forum.hu',
+ 812 => 'games.hu',
+ 813 => 'hotel.hu',
+ 814 => 'ingatlan.hu',
+ 815 => 'jogasz.hu',
+ 816 => 'konyvelo.hu',
+ 817 => 'lakas.hu',
+ 818 => 'media.hu',
+ 819 => 'news.hu',
+ 820 => 'reklam.hu',
+ 821 => 'sex.hu',
+ 822 => 'shop.hu',
+ 823 => 'suli.hu',
+ 824 => 'szex.hu',
+ 825 => 'tozsde.hu',
+ 826 => 'utazas.hu',
+ 827 => 'video.hu',
+ 828 => 'id',
+ 829 => 'ac.id',
+ 830 => 'biz.id',
+ 831 => 'co.id',
+ 832 => 'desa.id',
+ 833 => 'go.id',
+ 834 => 'mil.id',
+ 835 => 'my.id',
+ 836 => 'net.id',
+ 837 => 'or.id',
+ 838 => 'sch.id',
+ 839 => 'web.id',
+ 840 => 'ie',
+ 841 => 'gov.ie',
+ 842 => 'il',
+ 843 => 'ac.il',
+ 844 => 'co.il',
+ 845 => 'gov.il',
+ 846 => 'idf.il',
+ 847 => 'k12.il',
+ 848 => 'muni.il',
+ 849 => 'net.il',
+ 850 => 'org.il',
+ 851 => 'im',
+ 852 => 'ac.im',
+ 853 => 'co.im',
+ 854 => 'com.im',
+ 855 => 'ltd.co.im',
+ 856 => 'net.im',
+ 857 => 'org.im',
+ 858 => 'plc.co.im',
+ 859 => 'tt.im',
+ 860 => 'tv.im',
+ 861 => 'in',
+ 862 => 'co.in',
+ 863 => 'firm.in',
+ 864 => 'net.in',
+ 865 => 'org.in',
+ 866 => 'gen.in',
+ 867 => 'ind.in',
+ 868 => 'nic.in',
+ 869 => 'ac.in',
+ 870 => 'edu.in',
+ 871 => 'res.in',
+ 872 => 'gov.in',
+ 873 => 'mil.in',
+ 874 => 'info',
+ 875 => 'int',
+ 876 => 'eu.int',
+ 877 => 'io',
+ 878 => 'com.io',
+ 879 => 'iq',
+ 880 => 'gov.iq',
+ 881 => 'edu.iq',
+ 882 => 'mil.iq',
+ 883 => 'com.iq',
+ 884 => 'org.iq',
+ 885 => 'net.iq',
+ 886 => 'ir',
+ 887 => 'ac.ir',
+ 888 => 'co.ir',
+ 889 => 'gov.ir',
+ 890 => 'id.ir',
+ 891 => 'net.ir',
+ 892 => 'org.ir',
+ 893 => 'sch.ir',
+ 894 => 'ایران.ir',
+ 895 => 'ايران.ir',
+ 896 => 'is',
+ 897 => 'net.is',
+ 898 => 'com.is',
+ 899 => 'edu.is',
+ 900 => 'gov.is',
+ 901 => 'org.is',
+ 902 => 'int.is',
+ 903 => 'it',
+ 904 => 'gov.it',
+ 905 => 'edu.it',
+ 906 => 'abr.it',
+ 907 => 'abruzzo.it',
+ 908 => 'aosta-valley.it',
+ 909 => 'aostavalley.it',
+ 910 => 'bas.it',
+ 911 => 'basilicata.it',
+ 912 => 'cal.it',
+ 913 => 'calabria.it',
+ 914 => 'cam.it',
+ 915 => 'campania.it',
+ 916 => 'emilia-romagna.it',
+ 917 => 'emiliaromagna.it',
+ 918 => 'emr.it',
+ 919 => 'friuli-v-giulia.it',
+ 920 => 'friuli-ve-giulia.it',
+ 921 => 'friuli-vegiulia.it',
+ 922 => 'friuli-venezia-giulia.it',
+ 923 => 'friuli-veneziagiulia.it',
+ 924 => 'friuli-vgiulia.it',
+ 925 => 'friuliv-giulia.it',
+ 926 => 'friulive-giulia.it',
+ 927 => 'friulivegiulia.it',
+ 928 => 'friulivenezia-giulia.it',
+ 929 => 'friuliveneziagiulia.it',
+ 930 => 'friulivgiulia.it',
+ 931 => 'fvg.it',
+ 932 => 'laz.it',
+ 933 => 'lazio.it',
+ 934 => 'lig.it',
+ 935 => 'liguria.it',
+ 936 => 'lom.it',
+ 937 => 'lombardia.it',
+ 938 => 'lombardy.it',
+ 939 => 'lucania.it',
+ 940 => 'mar.it',
+ 941 => 'marche.it',
+ 942 => 'mol.it',
+ 943 => 'molise.it',
+ 944 => 'piedmont.it',
+ 945 => 'piemonte.it',
+ 946 => 'pmn.it',
+ 947 => 'pug.it',
+ 948 => 'puglia.it',
+ 949 => 'sar.it',
+ 950 => 'sardegna.it',
+ 951 => 'sardinia.it',
+ 952 => 'sic.it',
+ 953 => 'sicilia.it',
+ 954 => 'sicily.it',
+ 955 => 'taa.it',
+ 956 => 'tos.it',
+ 957 => 'toscana.it',
+ 958 => 'trentino-a-adige.it',
+ 959 => 'trentino-aadige.it',
+ 960 => 'trentino-alto-adige.it',
+ 961 => 'trentino-altoadige.it',
+ 962 => 'trentino-s-tirol.it',
+ 963 => 'trentino-stirol.it',
+ 964 => 'trentino-sud-tirol.it',
+ 965 => 'trentino-sudtirol.it',
+ 966 => 'trentino-sued-tirol.it',
+ 967 => 'trentino-suedtirol.it',
+ 968 => 'trentinoa-adige.it',
+ 969 => 'trentinoaadige.it',
+ 970 => 'trentinoalto-adige.it',
+ 971 => 'trentinoaltoadige.it',
+ 972 => 'trentinos-tirol.it',
+ 973 => 'trentinostirol.it',
+ 974 => 'trentinosud-tirol.it',
+ 975 => 'trentinosudtirol.it',
+ 976 => 'trentinosued-tirol.it',
+ 977 => 'trentinosuedtirol.it',
+ 978 => 'tuscany.it',
+ 979 => 'umb.it',
+ 980 => 'umbria.it',
+ 981 => 'val-d-aosta.it',
+ 982 => 'val-daosta.it',
+ 983 => 'vald-aosta.it',
+ 984 => 'valdaosta.it',
+ 985 => 'valle-aosta.it',
+ 986 => 'valle-d-aosta.it',
+ 987 => 'valle-daosta.it',
+ 988 => 'valleaosta.it',
+ 989 => 'valled-aosta.it',
+ 990 => 'valledaosta.it',
+ 991 => 'vallee-aoste.it',
+ 992 => 'valleeaoste.it',
+ 993 => 'vao.it',
+ 994 => 'vda.it',
+ 995 => 'ven.it',
+ 996 => 'veneto.it',
+ 997 => 'ag.it',
+ 998 => 'agrigento.it',
+ 999 => 'al.it',
+ 1000 => 'alessandria.it',
+ 1001 => 'alto-adige.it',
+ 1002 => 'altoadige.it',
+ 1003 => 'an.it',
+ 1004 => 'ancona.it',
+ 1005 => 'andria-barletta-trani.it',
+ 1006 => 'andria-trani-barletta.it',
+ 1007 => 'andriabarlettatrani.it',
+ 1008 => 'andriatranibarletta.it',
+ 1009 => 'ao.it',
+ 1010 => 'aosta.it',
+ 1011 => 'aoste.it',
+ 1012 => 'ap.it',
+ 1013 => 'aq.it',
+ 1014 => 'aquila.it',
+ 1015 => 'ar.it',
+ 1016 => 'arezzo.it',
+ 1017 => 'ascoli-piceno.it',
+ 1018 => 'ascolipiceno.it',
+ 1019 => 'asti.it',
+ 1020 => 'at.it',
+ 1021 => 'av.it',
+ 1022 => 'avellino.it',
+ 1023 => 'ba.it',
+ 1024 => 'balsan.it',
+ 1025 => 'bari.it',
+ 1026 => 'barletta-trani-andria.it',
+ 1027 => 'barlettatraniandria.it',
+ 1028 => 'belluno.it',
+ 1029 => 'benevento.it',
+ 1030 => 'bergamo.it',
+ 1031 => 'bg.it',
+ 1032 => 'bi.it',
+ 1033 => 'biella.it',
+ 1034 => 'bl.it',
+ 1035 => 'bn.it',
+ 1036 => 'bo.it',
+ 1037 => 'bologna.it',
+ 1038 => 'bolzano.it',
+ 1039 => 'bozen.it',
+ 1040 => 'br.it',
+ 1041 => 'brescia.it',
+ 1042 => 'brindisi.it',
+ 1043 => 'bs.it',
+ 1044 => 'bt.it',
+ 1045 => 'bz.it',
+ 1046 => 'ca.it',
+ 1047 => 'cagliari.it',
+ 1048 => 'caltanissetta.it',
+ 1049 => 'campidano-medio.it',
+ 1050 => 'campidanomedio.it',
+ 1051 => 'campobasso.it',
+ 1052 => 'carbonia-iglesias.it',
+ 1053 => 'carboniaiglesias.it',
+ 1054 => 'carrara-massa.it',
+ 1055 => 'carraramassa.it',
+ 1056 => 'caserta.it',
+ 1057 => 'catania.it',
+ 1058 => 'catanzaro.it',
+ 1059 => 'cb.it',
+ 1060 => 'ce.it',
+ 1061 => 'cesena-forli.it',
+ 1062 => 'cesenaforli.it',
+ 1063 => 'ch.it',
+ 1064 => 'chieti.it',
+ 1065 => 'ci.it',
+ 1066 => 'cl.it',
+ 1067 => 'cn.it',
+ 1068 => 'co.it',
+ 1069 => 'como.it',
+ 1070 => 'cosenza.it',
+ 1071 => 'cr.it',
+ 1072 => 'cremona.it',
+ 1073 => 'crotone.it',
+ 1074 => 'cs.it',
+ 1075 => 'ct.it',
+ 1076 => 'cuneo.it',
+ 1077 => 'cz.it',
+ 1078 => 'dell-ogliastra.it',
+ 1079 => 'dellogliastra.it',
+ 1080 => 'en.it',
+ 1081 => 'enna.it',
+ 1082 => 'fc.it',
+ 1083 => 'fe.it',
+ 1084 => 'fermo.it',
+ 1085 => 'ferrara.it',
+ 1086 => 'fg.it',
+ 1087 => 'fi.it',
+ 1088 => 'firenze.it',
+ 1089 => 'florence.it',
+ 1090 => 'fm.it',
+ 1091 => 'foggia.it',
+ 1092 => 'forli-cesena.it',
+ 1093 => 'forlicesena.it',
+ 1094 => 'fr.it',
+ 1095 => 'frosinone.it',
+ 1096 => 'ge.it',
+ 1097 => 'genoa.it',
+ 1098 => 'genova.it',
+ 1099 => 'go.it',
+ 1100 => 'gorizia.it',
+ 1101 => 'gr.it',
+ 1102 => 'grosseto.it',
+ 1103 => 'iglesias-carbonia.it',
+ 1104 => 'iglesiascarbonia.it',
+ 1105 => 'im.it',
+ 1106 => 'imperia.it',
+ 1107 => 'is.it',
+ 1108 => 'isernia.it',
+ 1109 => 'kr.it',
+ 1110 => 'la-spezia.it',
+ 1111 => 'laquila.it',
+ 1112 => 'laspezia.it',
+ 1113 => 'latina.it',
+ 1114 => 'lc.it',
+ 1115 => 'le.it',
+ 1116 => 'lecce.it',
+ 1117 => 'lecco.it',
+ 1118 => 'li.it',
+ 1119 => 'livorno.it',
+ 1120 => 'lo.it',
+ 1121 => 'lodi.it',
+ 1122 => 'lt.it',
+ 1123 => 'lu.it',
+ 1124 => 'lucca.it',
+ 1125 => 'macerata.it',
+ 1126 => 'mantova.it',
+ 1127 => 'massa-carrara.it',
+ 1128 => 'massacarrara.it',
+ 1129 => 'matera.it',
+ 1130 => 'mb.it',
+ 1131 => 'mc.it',
+ 1132 => 'me.it',
+ 1133 => 'medio-campidano.it',
+ 1134 => 'mediocampidano.it',
+ 1135 => 'messina.it',
+ 1136 => 'mi.it',
+ 1137 => 'milan.it',
+ 1138 => 'milano.it',
+ 1139 => 'mn.it',
+ 1140 => 'mo.it',
+ 1141 => 'modena.it',
+ 1142 => 'monza-brianza.it',
+ 1143 => 'monza-e-della-brianza.it',
+ 1144 => 'monza.it',
+ 1145 => 'monzabrianza.it',
+ 1146 => 'monzaebrianza.it',
+ 1147 => 'monzaedellabrianza.it',
+ 1148 => 'ms.it',
+ 1149 => 'mt.it',
+ 1150 => 'na.it',
+ 1151 => 'naples.it',
+ 1152 => 'napoli.it',
+ 1153 => 'no.it',
+ 1154 => 'novara.it',
+ 1155 => 'nu.it',
+ 1156 => 'nuoro.it',
+ 1157 => 'og.it',
+ 1158 => 'ogliastra.it',
+ 1159 => 'olbia-tempio.it',
+ 1160 => 'olbiatempio.it',
+ 1161 => 'or.it',
+ 1162 => 'oristano.it',
+ 1163 => 'ot.it',
+ 1164 => 'pa.it',
+ 1165 => 'padova.it',
+ 1166 => 'padua.it',
+ 1167 => 'palermo.it',
+ 1168 => 'parma.it',
+ 1169 => 'pavia.it',
+ 1170 => 'pc.it',
+ 1171 => 'pd.it',
+ 1172 => 'pe.it',
+ 1173 => 'perugia.it',
+ 1174 => 'pesaro-urbino.it',
+ 1175 => 'pesarourbino.it',
+ 1176 => 'pescara.it',
+ 1177 => 'pg.it',
+ 1178 => 'pi.it',
+ 1179 => 'piacenza.it',
+ 1180 => 'pisa.it',
+ 1181 => 'pistoia.it',
+ 1182 => 'pn.it',
+ 1183 => 'po.it',
+ 1184 => 'pordenone.it',
+ 1185 => 'potenza.it',
+ 1186 => 'pr.it',
+ 1187 => 'prato.it',
+ 1188 => 'pt.it',
+ 1189 => 'pu.it',
+ 1190 => 'pv.it',
+ 1191 => 'pz.it',
+ 1192 => 'ra.it',
+ 1193 => 'ragusa.it',
+ 1194 => 'ravenna.it',
+ 1195 => 'rc.it',
+ 1196 => 're.it',
+ 1197 => 'reggio-calabria.it',
+ 1198 => 'reggio-emilia.it',
+ 1199 => 'reggiocalabria.it',
+ 1200 => 'reggioemilia.it',
+ 1201 => 'rg.it',
+ 1202 => 'ri.it',
+ 1203 => 'rieti.it',
+ 1204 => 'rimini.it',
+ 1205 => 'rm.it',
+ 1206 => 'rn.it',
+ 1207 => 'ro.it',
+ 1208 => 'roma.it',
+ 1209 => 'rome.it',
+ 1210 => 'rovigo.it',
+ 1211 => 'sa.it',
+ 1212 => 'salerno.it',
+ 1213 => 'sassari.it',
+ 1214 => 'savona.it',
+ 1215 => 'si.it',
+ 1216 => 'siena.it',
+ 1217 => 'siracusa.it',
+ 1218 => 'so.it',
+ 1219 => 'sondrio.it',
+ 1220 => 'sp.it',
+ 1221 => 'sr.it',
+ 1222 => 'ss.it',
+ 1223 => 'suedtirol.it',
+ 1224 => 'sv.it',
+ 1225 => 'ta.it',
+ 1226 => 'taranto.it',
+ 1227 => 'te.it',
+ 1228 => 'tempio-olbia.it',
+ 1229 => 'tempioolbia.it',
+ 1230 => 'teramo.it',
+ 1231 => 'terni.it',
+ 1232 => 'tn.it',
+ 1233 => 'to.it',
+ 1234 => 'torino.it',
+ 1235 => 'tp.it',
+ 1236 => 'tr.it',
+ 1237 => 'trani-andria-barletta.it',
+ 1238 => 'trani-barletta-andria.it',
+ 1239 => 'traniandriabarletta.it',
+ 1240 => 'tranibarlettaandria.it',
+ 1241 => 'trapani.it',
+ 1242 => 'trentino.it',
+ 1243 => 'trento.it',
+ 1244 => 'treviso.it',
+ 1245 => 'trieste.it',
+ 1246 => 'ts.it',
+ 1247 => 'turin.it',
+ 1248 => 'tv.it',
+ 1249 => 'ud.it',
+ 1250 => 'udine.it',
+ 1251 => 'urbino-pesaro.it',
+ 1252 => 'urbinopesaro.it',
+ 1253 => 'va.it',
+ 1254 => 'varese.it',
+ 1255 => 'vb.it',
+ 1256 => 'vc.it',
+ 1257 => 've.it',
+ 1258 => 'venezia.it',
+ 1259 => 'venice.it',
+ 1260 => 'verbania.it',
+ 1261 => 'vercelli.it',
+ 1262 => 'verona.it',
+ 1263 => 'vi.it',
+ 1264 => 'vibo-valentia.it',
+ 1265 => 'vibovalentia.it',
+ 1266 => 'vicenza.it',
+ 1267 => 'viterbo.it',
+ 1268 => 'vr.it',
+ 1269 => 'vs.it',
+ 1270 => 'vt.it',
+ 1271 => 'vv.it',
+ 1272 => 'je',
+ 1273 => 'co.je',
+ 1274 => 'net.je',
+ 1275 => 'org.je',
+ 1276 => '*.jm',
+ 1277 => 'jo',
+ 1278 => 'com.jo',
+ 1279 => 'org.jo',
+ 1280 => 'net.jo',
+ 1281 => 'edu.jo',
+ 1282 => 'sch.jo',
+ 1283 => 'gov.jo',
+ 1284 => 'mil.jo',
+ 1285 => 'name.jo',
+ 1286 => 'jobs',
+ 1287 => 'jp',
+ 1288 => 'ac.jp',
+ 1289 => 'ad.jp',
+ 1290 => 'co.jp',
+ 1291 => 'ed.jp',
+ 1292 => 'go.jp',
+ 1293 => 'gr.jp',
+ 1294 => 'lg.jp',
+ 1295 => 'ne.jp',
+ 1296 => 'or.jp',
+ 1297 => 'aichi.jp',
+ 1298 => 'akita.jp',
+ 1299 => 'aomori.jp',
+ 1300 => 'chiba.jp',
+ 1301 => 'ehime.jp',
+ 1302 => 'fukui.jp',
+ 1303 => 'fukuoka.jp',
+ 1304 => 'fukushima.jp',
+ 1305 => 'gifu.jp',
+ 1306 => 'gunma.jp',
+ 1307 => 'hiroshima.jp',
+ 1308 => 'hokkaido.jp',
+ 1309 => 'hyogo.jp',
+ 1310 => 'ibaraki.jp',
+ 1311 => 'ishikawa.jp',
+ 1312 => 'iwate.jp',
+ 1313 => 'kagawa.jp',
+ 1314 => 'kagoshima.jp',
+ 1315 => 'kanagawa.jp',
+ 1316 => 'kochi.jp',
+ 1317 => 'kumamoto.jp',
+ 1318 => 'kyoto.jp',
+ 1319 => 'mie.jp',
+ 1320 => 'miyagi.jp',
+ 1321 => 'miyazaki.jp',
+ 1322 => 'nagano.jp',
+ 1323 => 'nagasaki.jp',
+ 1324 => 'nara.jp',
+ 1325 => 'niigata.jp',
+ 1326 => 'oita.jp',
+ 1327 => 'okayama.jp',
+ 1328 => 'okinawa.jp',
+ 1329 => 'osaka.jp',
+ 1330 => 'saga.jp',
+ 1331 => 'saitama.jp',
+ 1332 => 'shiga.jp',
+ 1333 => 'shimane.jp',
+ 1334 => 'shizuoka.jp',
+ 1335 => 'tochigi.jp',
+ 1336 => 'tokushima.jp',
+ 1337 => 'tokyo.jp',
+ 1338 => 'tottori.jp',
+ 1339 => 'toyama.jp',
+ 1340 => 'wakayama.jp',
+ 1341 => 'yamagata.jp',
+ 1342 => 'yamaguchi.jp',
+ 1343 => 'yamanashi.jp',
+ 1344 => '栃木.jp',
+ 1345 => '愛知.jp',
+ 1346 => '愛媛.jp',
+ 1347 => '兵庫.jp',
+ 1348 => '熊本.jp',
+ 1349 => '茨城.jp',
+ 1350 => '北海道.jp',
+ 1351 => '千葉.jp',
+ 1352 => '和歌山.jp',
+ 1353 => '長崎.jp',
+ 1354 => '長野.jp',
+ 1355 => '新潟.jp',
+ 1356 => '青森.jp',
+ 1357 => '静岡.jp',
+ 1358 => '東京.jp',
+ 1359 => '石川.jp',
+ 1360 => '埼玉.jp',
+ 1361 => '三重.jp',
+ 1362 => '京都.jp',
+ 1363 => '佐賀.jp',
+ 1364 => '大分.jp',
+ 1365 => '大阪.jp',
+ 1366 => '奈良.jp',
+ 1367 => '宮城.jp',
+ 1368 => '宮崎.jp',
+ 1369 => '富山.jp',
+ 1370 => '山口.jp',
+ 1371 => '山形.jp',
+ 1372 => '山梨.jp',
+ 1373 => '岩手.jp',
+ 1374 => '岐阜.jp',
+ 1375 => '岡山.jp',
+ 1376 => '島根.jp',
+ 1377 => '広島.jp',
+ 1378 => '徳島.jp',
+ 1379 => '沖縄.jp',
+ 1380 => '滋賀.jp',
+ 1381 => '神奈川.jp',
+ 1382 => '福井.jp',
+ 1383 => '福岡.jp',
+ 1384 => '福島.jp',
+ 1385 => '秋田.jp',
+ 1386 => '群馬.jp',
+ 1387 => '香川.jp',
+ 1388 => '高知.jp',
+ 1389 => '鳥取.jp',
+ 1390 => '鹿児島.jp',
+ 1391 => '*.kawasaki.jp',
+ 1392 => '*.kitakyushu.jp',
+ 1393 => '*.kobe.jp',
+ 1394 => '*.nagoya.jp',
+ 1395 => '*.sapporo.jp',
+ 1396 => '*.sendai.jp',
+ 1397 => '*.yokohama.jp',
+ 1398 => '!city.kawasaki.jp',
+ 1399 => '!city.kitakyushu.jp',
+ 1400 => '!city.kobe.jp',
+ 1401 => '!city.nagoya.jp',
+ 1402 => '!city.sapporo.jp',
+ 1403 => '!city.sendai.jp',
+ 1404 => '!city.yokohama.jp',
+ 1405 => 'aisai.aichi.jp',
+ 1406 => 'ama.aichi.jp',
+ 1407 => 'anjo.aichi.jp',
+ 1408 => 'asuke.aichi.jp',
+ 1409 => 'chiryu.aichi.jp',
+ 1410 => 'chita.aichi.jp',
+ 1411 => 'fuso.aichi.jp',
+ 1412 => 'gamagori.aichi.jp',
+ 1413 => 'handa.aichi.jp',
+ 1414 => 'hazu.aichi.jp',
+ 1415 => 'hekinan.aichi.jp',
+ 1416 => 'higashiura.aichi.jp',
+ 1417 => 'ichinomiya.aichi.jp',
+ 1418 => 'inazawa.aichi.jp',
+ 1419 => 'inuyama.aichi.jp',
+ 1420 => 'isshiki.aichi.jp',
+ 1421 => 'iwakura.aichi.jp',
+ 1422 => 'kanie.aichi.jp',
+ 1423 => 'kariya.aichi.jp',
+ 1424 => 'kasugai.aichi.jp',
+ 1425 => 'kira.aichi.jp',
+ 1426 => 'kiyosu.aichi.jp',
+ 1427 => 'komaki.aichi.jp',
+ 1428 => 'konan.aichi.jp',
+ 1429 => 'kota.aichi.jp',
+ 1430 => 'mihama.aichi.jp',
+ 1431 => 'miyoshi.aichi.jp',
+ 1432 => 'nishio.aichi.jp',
+ 1433 => 'nisshin.aichi.jp',
+ 1434 => 'obu.aichi.jp',
+ 1435 => 'oguchi.aichi.jp',
+ 1436 => 'oharu.aichi.jp',
+ 1437 => 'okazaki.aichi.jp',
+ 1438 => 'owariasahi.aichi.jp',
+ 1439 => 'seto.aichi.jp',
+ 1440 => 'shikatsu.aichi.jp',
+ 1441 => 'shinshiro.aichi.jp',
+ 1442 => 'shitara.aichi.jp',
+ 1443 => 'tahara.aichi.jp',
+ 1444 => 'takahama.aichi.jp',
+ 1445 => 'tobishima.aichi.jp',
+ 1446 => 'toei.aichi.jp',
+ 1447 => 'togo.aichi.jp',
+ 1448 => 'tokai.aichi.jp',
+ 1449 => 'tokoname.aichi.jp',
+ 1450 => 'toyoake.aichi.jp',
+ 1451 => 'toyohashi.aichi.jp',
+ 1452 => 'toyokawa.aichi.jp',
+ 1453 => 'toyone.aichi.jp',
+ 1454 => 'toyota.aichi.jp',
+ 1455 => 'tsushima.aichi.jp',
+ 1456 => 'yatomi.aichi.jp',
+ 1457 => 'akita.akita.jp',
+ 1458 => 'daisen.akita.jp',
+ 1459 => 'fujisato.akita.jp',
+ 1460 => 'gojome.akita.jp',
+ 1461 => 'hachirogata.akita.jp',
+ 1462 => 'happou.akita.jp',
+ 1463 => 'higashinaruse.akita.jp',
+ 1464 => 'honjo.akita.jp',
+ 1465 => 'honjyo.akita.jp',
+ 1466 => 'ikawa.akita.jp',
+ 1467 => 'kamikoani.akita.jp',
+ 1468 => 'kamioka.akita.jp',
+ 1469 => 'katagami.akita.jp',
+ 1470 => 'kazuno.akita.jp',
+ 1471 => 'kitaakita.akita.jp',
+ 1472 => 'kosaka.akita.jp',
+ 1473 => 'kyowa.akita.jp',
+ 1474 => 'misato.akita.jp',
+ 1475 => 'mitane.akita.jp',
+ 1476 => 'moriyoshi.akita.jp',
+ 1477 => 'nikaho.akita.jp',
+ 1478 => 'noshiro.akita.jp',
+ 1479 => 'odate.akita.jp',
+ 1480 => 'oga.akita.jp',
+ 1481 => 'ogata.akita.jp',
+ 1482 => 'semboku.akita.jp',
+ 1483 => 'yokote.akita.jp',
+ 1484 => 'yurihonjo.akita.jp',
+ 1485 => 'aomori.aomori.jp',
+ 1486 => 'gonohe.aomori.jp',
+ 1487 => 'hachinohe.aomori.jp',
+ 1488 => 'hashikami.aomori.jp',
+ 1489 => 'hiranai.aomori.jp',
+ 1490 => 'hirosaki.aomori.jp',
+ 1491 => 'itayanagi.aomori.jp',
+ 1492 => 'kuroishi.aomori.jp',
+ 1493 => 'misawa.aomori.jp',
+ 1494 => 'mutsu.aomori.jp',
+ 1495 => 'nakadomari.aomori.jp',
+ 1496 => 'noheji.aomori.jp',
+ 1497 => 'oirase.aomori.jp',
+ 1498 => 'owani.aomori.jp',
+ 1499 => 'rokunohe.aomori.jp',
+ 1500 => 'sannohe.aomori.jp',
+ 1501 => 'shichinohe.aomori.jp',
+ 1502 => 'shingo.aomori.jp',
+ 1503 => 'takko.aomori.jp',
+ 1504 => 'towada.aomori.jp',
+ 1505 => 'tsugaru.aomori.jp',
+ 1506 => 'tsuruta.aomori.jp',
+ 1507 => 'abiko.chiba.jp',
+ 1508 => 'asahi.chiba.jp',
+ 1509 => 'chonan.chiba.jp',
+ 1510 => 'chosei.chiba.jp',
+ 1511 => 'choshi.chiba.jp',
+ 1512 => 'chuo.chiba.jp',
+ 1513 => 'funabashi.chiba.jp',
+ 1514 => 'futtsu.chiba.jp',
+ 1515 => 'hanamigawa.chiba.jp',
+ 1516 => 'ichihara.chiba.jp',
+ 1517 => 'ichikawa.chiba.jp',
+ 1518 => 'ichinomiya.chiba.jp',
+ 1519 => 'inzai.chiba.jp',
+ 1520 => 'isumi.chiba.jp',
+ 1521 => 'kamagaya.chiba.jp',
+ 1522 => 'kamogawa.chiba.jp',
+ 1523 => 'kashiwa.chiba.jp',
+ 1524 => 'katori.chiba.jp',
+ 1525 => 'katsuura.chiba.jp',
+ 1526 => 'kimitsu.chiba.jp',
+ 1527 => 'kisarazu.chiba.jp',
+ 1528 => 'kozaki.chiba.jp',
+ 1529 => 'kujukuri.chiba.jp',
+ 1530 => 'kyonan.chiba.jp',
+ 1531 => 'matsudo.chiba.jp',
+ 1532 => 'midori.chiba.jp',
+ 1533 => 'mihama.chiba.jp',
+ 1534 => 'minamiboso.chiba.jp',
+ 1535 => 'mobara.chiba.jp',
+ 1536 => 'mutsuzawa.chiba.jp',
+ 1537 => 'nagara.chiba.jp',
+ 1538 => 'nagareyama.chiba.jp',
+ 1539 => 'narashino.chiba.jp',
+ 1540 => 'narita.chiba.jp',
+ 1541 => 'noda.chiba.jp',
+ 1542 => 'oamishirasato.chiba.jp',
+ 1543 => 'omigawa.chiba.jp',
+ 1544 => 'onjuku.chiba.jp',
+ 1545 => 'otaki.chiba.jp',
+ 1546 => 'sakae.chiba.jp',
+ 1547 => 'sakura.chiba.jp',
+ 1548 => 'shimofusa.chiba.jp',
+ 1549 => 'shirako.chiba.jp',
+ 1550 => 'shiroi.chiba.jp',
+ 1551 => 'shisui.chiba.jp',
+ 1552 => 'sodegaura.chiba.jp',
+ 1553 => 'sosa.chiba.jp',
+ 1554 => 'tako.chiba.jp',
+ 1555 => 'tateyama.chiba.jp',
+ 1556 => 'togane.chiba.jp',
+ 1557 => 'tohnosho.chiba.jp',
+ 1558 => 'tomisato.chiba.jp',
+ 1559 => 'urayasu.chiba.jp',
+ 1560 => 'yachimata.chiba.jp',
+ 1561 => 'yachiyo.chiba.jp',
+ 1562 => 'yokaichiba.chiba.jp',
+ 1563 => 'yokoshibahikari.chiba.jp',
+ 1564 => 'yotsukaido.chiba.jp',
+ 1565 => 'ainan.ehime.jp',
+ 1566 => 'honai.ehime.jp',
+ 1567 => 'ikata.ehime.jp',
+ 1568 => 'imabari.ehime.jp',
+ 1569 => 'iyo.ehime.jp',
+ 1570 => 'kamijima.ehime.jp',
+ 1571 => 'kihoku.ehime.jp',
+ 1572 => 'kumakogen.ehime.jp',
+ 1573 => 'masaki.ehime.jp',
+ 1574 => 'matsuno.ehime.jp',
+ 1575 => 'matsuyama.ehime.jp',
+ 1576 => 'namikata.ehime.jp',
+ 1577 => 'niihama.ehime.jp',
+ 1578 => 'ozu.ehime.jp',
+ 1579 => 'saijo.ehime.jp',
+ 1580 => 'seiyo.ehime.jp',
+ 1581 => 'shikokuchuo.ehime.jp',
+ 1582 => 'tobe.ehime.jp',
+ 1583 => 'toon.ehime.jp',
+ 1584 => 'uchiko.ehime.jp',
+ 1585 => 'uwajima.ehime.jp',
+ 1586 => 'yawatahama.ehime.jp',
+ 1587 => 'echizen.fukui.jp',
+ 1588 => 'eiheiji.fukui.jp',
+ 1589 => 'fukui.fukui.jp',
+ 1590 => 'ikeda.fukui.jp',
+ 1591 => 'katsuyama.fukui.jp',
+ 1592 => 'mihama.fukui.jp',
+ 1593 => 'minamiechizen.fukui.jp',
+ 1594 => 'obama.fukui.jp',
+ 1595 => 'ohi.fukui.jp',
+ 1596 => 'ono.fukui.jp',
+ 1597 => 'sabae.fukui.jp',
+ 1598 => 'sakai.fukui.jp',
+ 1599 => 'takahama.fukui.jp',
+ 1600 => 'tsuruga.fukui.jp',
+ 1601 => 'wakasa.fukui.jp',
+ 1602 => 'ashiya.fukuoka.jp',
+ 1603 => 'buzen.fukuoka.jp',
+ 1604 => 'chikugo.fukuoka.jp',
+ 1605 => 'chikuho.fukuoka.jp',
+ 1606 => 'chikujo.fukuoka.jp',
+ 1607 => 'chikushino.fukuoka.jp',
+ 1608 => 'chikuzen.fukuoka.jp',
+ 1609 => 'chuo.fukuoka.jp',
+ 1610 => 'dazaifu.fukuoka.jp',
+ 1611 => 'fukuchi.fukuoka.jp',
+ 1612 => 'hakata.fukuoka.jp',
+ 1613 => 'higashi.fukuoka.jp',
+ 1614 => 'hirokawa.fukuoka.jp',
+ 1615 => 'hisayama.fukuoka.jp',
+ 1616 => 'iizuka.fukuoka.jp',
+ 1617 => 'inatsuki.fukuoka.jp',
+ 1618 => 'kaho.fukuoka.jp',
+ 1619 => 'kasuga.fukuoka.jp',
+ 1620 => 'kasuya.fukuoka.jp',
+ 1621 => 'kawara.fukuoka.jp',
+ 1622 => 'keisen.fukuoka.jp',
+ 1623 => 'koga.fukuoka.jp',
+ 1624 => 'kurate.fukuoka.jp',
+ 1625 => 'kurogi.fukuoka.jp',
+ 1626 => 'kurume.fukuoka.jp',
+ 1627 => 'minami.fukuoka.jp',
+ 1628 => 'miyako.fukuoka.jp',
+ 1629 => 'miyama.fukuoka.jp',
+ 1630 => 'miyawaka.fukuoka.jp',
+ 1631 => 'mizumaki.fukuoka.jp',
+ 1632 => 'munakata.fukuoka.jp',
+ 1633 => 'nakagawa.fukuoka.jp',
+ 1634 => 'nakama.fukuoka.jp',
+ 1635 => 'nishi.fukuoka.jp',
+ 1636 => 'nogata.fukuoka.jp',
+ 1637 => 'ogori.fukuoka.jp',
+ 1638 => 'okagaki.fukuoka.jp',
+ 1639 => 'okawa.fukuoka.jp',
+ 1640 => 'oki.fukuoka.jp',
+ 1641 => 'omuta.fukuoka.jp',
+ 1642 => 'onga.fukuoka.jp',
+ 1643 => 'onojo.fukuoka.jp',
+ 1644 => 'oto.fukuoka.jp',
+ 1645 => 'saigawa.fukuoka.jp',
+ 1646 => 'sasaguri.fukuoka.jp',
+ 1647 => 'shingu.fukuoka.jp',
+ 1648 => 'shinyoshitomi.fukuoka.jp',
+ 1649 => 'shonai.fukuoka.jp',
+ 1650 => 'soeda.fukuoka.jp',
+ 1651 => 'sue.fukuoka.jp',
+ 1652 => 'tachiarai.fukuoka.jp',
+ 1653 => 'tagawa.fukuoka.jp',
+ 1654 => 'takata.fukuoka.jp',
+ 1655 => 'toho.fukuoka.jp',
+ 1656 => 'toyotsu.fukuoka.jp',
+ 1657 => 'tsuiki.fukuoka.jp',
+ 1658 => 'ukiha.fukuoka.jp',
+ 1659 => 'umi.fukuoka.jp',
+ 1660 => 'usui.fukuoka.jp',
+ 1661 => 'yamada.fukuoka.jp',
+ 1662 => 'yame.fukuoka.jp',
+ 1663 => 'yanagawa.fukuoka.jp',
+ 1664 => 'yukuhashi.fukuoka.jp',
+ 1665 => 'aizubange.fukushima.jp',
+ 1666 => 'aizumisato.fukushima.jp',
+ 1667 => 'aizuwakamatsu.fukushima.jp',
+ 1668 => 'asakawa.fukushima.jp',
+ 1669 => 'bandai.fukushima.jp',
+ 1670 => 'date.fukushima.jp',
+ 1671 => 'fukushima.fukushima.jp',
+ 1672 => 'furudono.fukushima.jp',
+ 1673 => 'futaba.fukushima.jp',
+ 1674 => 'hanawa.fukushima.jp',
+ 1675 => 'higashi.fukushima.jp',
+ 1676 => 'hirata.fukushima.jp',
+ 1677 => 'hirono.fukushima.jp',
+ 1678 => 'iitate.fukushima.jp',
+ 1679 => 'inawashiro.fukushima.jp',
+ 1680 => 'ishikawa.fukushima.jp',
+ 1681 => 'iwaki.fukushima.jp',
+ 1682 => 'izumizaki.fukushima.jp',
+ 1683 => 'kagamiishi.fukushima.jp',
+ 1684 => 'kaneyama.fukushima.jp',
+ 1685 => 'kawamata.fukushima.jp',
+ 1686 => 'kitakata.fukushima.jp',
+ 1687 => 'kitashiobara.fukushima.jp',
+ 1688 => 'koori.fukushima.jp',
+ 1689 => 'koriyama.fukushima.jp',
+ 1690 => 'kunimi.fukushima.jp',
+ 1691 => 'miharu.fukushima.jp',
+ 1692 => 'mishima.fukushima.jp',
+ 1693 => 'namie.fukushima.jp',
+ 1694 => 'nango.fukushima.jp',
+ 1695 => 'nishiaizu.fukushima.jp',
+ 1696 => 'nishigo.fukushima.jp',
+ 1697 => 'okuma.fukushima.jp',
+ 1698 => 'omotego.fukushima.jp',
+ 1699 => 'ono.fukushima.jp',
+ 1700 => 'otama.fukushima.jp',
+ 1701 => 'samegawa.fukushima.jp',
+ 1702 => 'shimogo.fukushima.jp',
+ 1703 => 'shirakawa.fukushima.jp',
+ 1704 => 'showa.fukushima.jp',
+ 1705 => 'soma.fukushima.jp',
+ 1706 => 'sukagawa.fukushima.jp',
+ 1707 => 'taishin.fukushima.jp',
+ 1708 => 'tamakawa.fukushima.jp',
+ 1709 => 'tanagura.fukushima.jp',
+ 1710 => 'tenei.fukushima.jp',
+ 1711 => 'yabuki.fukushima.jp',
+ 1712 => 'yamato.fukushima.jp',
+ 1713 => 'yamatsuri.fukushima.jp',
+ 1714 => 'yanaizu.fukushima.jp',
+ 1715 => 'yugawa.fukushima.jp',
+ 1716 => 'anpachi.gifu.jp',
+ 1717 => 'ena.gifu.jp',
+ 1718 => 'gifu.gifu.jp',
+ 1719 => 'ginan.gifu.jp',
+ 1720 => 'godo.gifu.jp',
+ 1721 => 'gujo.gifu.jp',
+ 1722 => 'hashima.gifu.jp',
+ 1723 => 'hichiso.gifu.jp',
+ 1724 => 'hida.gifu.jp',
+ 1725 => 'higashishirakawa.gifu.jp',
+ 1726 => 'ibigawa.gifu.jp',
+ 1727 => 'ikeda.gifu.jp',
+ 1728 => 'kakamigahara.gifu.jp',
+ 1729 => 'kani.gifu.jp',
+ 1730 => 'kasahara.gifu.jp',
+ 1731 => 'kasamatsu.gifu.jp',
+ 1732 => 'kawaue.gifu.jp',
+ 1733 => 'kitagata.gifu.jp',
+ 1734 => 'mino.gifu.jp',
+ 1735 => 'minokamo.gifu.jp',
+ 1736 => 'mitake.gifu.jp',
+ 1737 => 'mizunami.gifu.jp',
+ 1738 => 'motosu.gifu.jp',
+ 1739 => 'nakatsugawa.gifu.jp',
+ 1740 => 'ogaki.gifu.jp',
+ 1741 => 'sakahogi.gifu.jp',
+ 1742 => 'seki.gifu.jp',
+ 1743 => 'sekigahara.gifu.jp',
+ 1744 => 'shirakawa.gifu.jp',
+ 1745 => 'tajimi.gifu.jp',
+ 1746 => 'takayama.gifu.jp',
+ 1747 => 'tarui.gifu.jp',
+ 1748 => 'toki.gifu.jp',
+ 1749 => 'tomika.gifu.jp',
+ 1750 => 'wanouchi.gifu.jp',
+ 1751 => 'yamagata.gifu.jp',
+ 1752 => 'yaotsu.gifu.jp',
+ 1753 => 'yoro.gifu.jp',
+ 1754 => 'annaka.gunma.jp',
+ 1755 => 'chiyoda.gunma.jp',
+ 1756 => 'fujioka.gunma.jp',
+ 1757 => 'higashiagatsuma.gunma.jp',
+ 1758 => 'isesaki.gunma.jp',
+ 1759 => 'itakura.gunma.jp',
+ 1760 => 'kanna.gunma.jp',
+ 1761 => 'kanra.gunma.jp',
+ 1762 => 'katashina.gunma.jp',
+ 1763 => 'kawaba.gunma.jp',
+ 1764 => 'kiryu.gunma.jp',
+ 1765 => 'kusatsu.gunma.jp',
+ 1766 => 'maebashi.gunma.jp',
+ 1767 => 'meiwa.gunma.jp',
+ 1768 => 'midori.gunma.jp',
+ 1769 => 'minakami.gunma.jp',
+ 1770 => 'naganohara.gunma.jp',
+ 1771 => 'nakanojo.gunma.jp',
+ 1772 => 'nanmoku.gunma.jp',
+ 1773 => 'numata.gunma.jp',
+ 1774 => 'oizumi.gunma.jp',
+ 1775 => 'ora.gunma.jp',
+ 1776 => 'ota.gunma.jp',
+ 1777 => 'shibukawa.gunma.jp',
+ 1778 => 'shimonita.gunma.jp',
+ 1779 => 'shinto.gunma.jp',
+ 1780 => 'showa.gunma.jp',
+ 1781 => 'takasaki.gunma.jp',
+ 1782 => 'takayama.gunma.jp',
+ 1783 => 'tamamura.gunma.jp',
+ 1784 => 'tatebayashi.gunma.jp',
+ 1785 => 'tomioka.gunma.jp',
+ 1786 => 'tsukiyono.gunma.jp',
+ 1787 => 'tsumagoi.gunma.jp',
+ 1788 => 'ueno.gunma.jp',
+ 1789 => 'yoshioka.gunma.jp',
+ 1790 => 'asaminami.hiroshima.jp',
+ 1791 => 'daiwa.hiroshima.jp',
+ 1792 => 'etajima.hiroshima.jp',
+ 1793 => 'fuchu.hiroshima.jp',
+ 1794 => 'fukuyama.hiroshima.jp',
+ 1795 => 'hatsukaichi.hiroshima.jp',
+ 1796 => 'higashihiroshima.hiroshima.jp',
+ 1797 => 'hongo.hiroshima.jp',
+ 1798 => 'jinsekikogen.hiroshima.jp',
+ 1799 => 'kaita.hiroshima.jp',
+ 1800 => 'kui.hiroshima.jp',
+ 1801 => 'kumano.hiroshima.jp',
+ 1802 => 'kure.hiroshima.jp',
+ 1803 => 'mihara.hiroshima.jp',
+ 1804 => 'miyoshi.hiroshima.jp',
+ 1805 => 'naka.hiroshima.jp',
+ 1806 => 'onomichi.hiroshima.jp',
+ 1807 => 'osakikamijima.hiroshima.jp',
+ 1808 => 'otake.hiroshima.jp',
+ 1809 => 'saka.hiroshima.jp',
+ 1810 => 'sera.hiroshima.jp',
+ 1811 => 'seranishi.hiroshima.jp',
+ 1812 => 'shinichi.hiroshima.jp',
+ 1813 => 'shobara.hiroshima.jp',
+ 1814 => 'takehara.hiroshima.jp',
+ 1815 => 'abashiri.hokkaido.jp',
+ 1816 => 'abira.hokkaido.jp',
+ 1817 => 'aibetsu.hokkaido.jp',
+ 1818 => 'akabira.hokkaido.jp',
+ 1819 => 'akkeshi.hokkaido.jp',
+ 1820 => 'asahikawa.hokkaido.jp',
+ 1821 => 'ashibetsu.hokkaido.jp',
+ 1822 => 'ashoro.hokkaido.jp',
+ 1823 => 'assabu.hokkaido.jp',
+ 1824 => 'atsuma.hokkaido.jp',
+ 1825 => 'bibai.hokkaido.jp',
+ 1826 => 'biei.hokkaido.jp',
+ 1827 => 'bifuka.hokkaido.jp',
+ 1828 => 'bihoro.hokkaido.jp',
+ 1829 => 'biratori.hokkaido.jp',
+ 1830 => 'chippubetsu.hokkaido.jp',
+ 1831 => 'chitose.hokkaido.jp',
+ 1832 => 'date.hokkaido.jp',
+ 1833 => 'ebetsu.hokkaido.jp',
+ 1834 => 'embetsu.hokkaido.jp',
+ 1835 => 'eniwa.hokkaido.jp',
+ 1836 => 'erimo.hokkaido.jp',
+ 1837 => 'esan.hokkaido.jp',
+ 1838 => 'esashi.hokkaido.jp',
+ 1839 => 'fukagawa.hokkaido.jp',
+ 1840 => 'fukushima.hokkaido.jp',
+ 1841 => 'furano.hokkaido.jp',
+ 1842 => 'furubira.hokkaido.jp',
+ 1843 => 'haboro.hokkaido.jp',
+ 1844 => 'hakodate.hokkaido.jp',
+ 1845 => 'hamatonbetsu.hokkaido.jp',
+ 1846 => 'hidaka.hokkaido.jp',
+ 1847 => 'higashikagura.hokkaido.jp',
+ 1848 => 'higashikawa.hokkaido.jp',
+ 1849 => 'hiroo.hokkaido.jp',
+ 1850 => 'hokuryu.hokkaido.jp',
+ 1851 => 'hokuto.hokkaido.jp',
+ 1852 => 'honbetsu.hokkaido.jp',
+ 1853 => 'horokanai.hokkaido.jp',
+ 1854 => 'horonobe.hokkaido.jp',
+ 1855 => 'ikeda.hokkaido.jp',
+ 1856 => 'imakane.hokkaido.jp',
+ 1857 => 'ishikari.hokkaido.jp',
+ 1858 => 'iwamizawa.hokkaido.jp',
+ 1859 => 'iwanai.hokkaido.jp',
+ 1860 => 'kamifurano.hokkaido.jp',
+ 1861 => 'kamikawa.hokkaido.jp',
+ 1862 => 'kamishihoro.hokkaido.jp',
+ 1863 => 'kamisunagawa.hokkaido.jp',
+ 1864 => 'kamoenai.hokkaido.jp',
+ 1865 => 'kayabe.hokkaido.jp',
+ 1866 => 'kembuchi.hokkaido.jp',
+ 1867 => 'kikonai.hokkaido.jp',
+ 1868 => 'kimobetsu.hokkaido.jp',
+ 1869 => 'kitahiroshima.hokkaido.jp',
+ 1870 => 'kitami.hokkaido.jp',
+ 1871 => 'kiyosato.hokkaido.jp',
+ 1872 => 'koshimizu.hokkaido.jp',
+ 1873 => 'kunneppu.hokkaido.jp',
+ 1874 => 'kuriyama.hokkaido.jp',
+ 1875 => 'kuromatsunai.hokkaido.jp',
+ 1876 => 'kushiro.hokkaido.jp',
+ 1877 => 'kutchan.hokkaido.jp',
+ 1878 => 'kyowa.hokkaido.jp',
+ 1879 => 'mashike.hokkaido.jp',
+ 1880 => 'matsumae.hokkaido.jp',
+ 1881 => 'mikasa.hokkaido.jp',
+ 1882 => 'minamifurano.hokkaido.jp',
+ 1883 => 'mombetsu.hokkaido.jp',
+ 1884 => 'moseushi.hokkaido.jp',
+ 1885 => 'mukawa.hokkaido.jp',
+ 1886 => 'muroran.hokkaido.jp',
+ 1887 => 'naie.hokkaido.jp',
+ 1888 => 'nakagawa.hokkaido.jp',
+ 1889 => 'nakasatsunai.hokkaido.jp',
+ 1890 => 'nakatombetsu.hokkaido.jp',
+ 1891 => 'nanae.hokkaido.jp',
+ 1892 => 'nanporo.hokkaido.jp',
+ 1893 => 'nayoro.hokkaido.jp',
+ 1894 => 'nemuro.hokkaido.jp',
+ 1895 => 'niikappu.hokkaido.jp',
+ 1896 => 'niki.hokkaido.jp',
+ 1897 => 'nishiokoppe.hokkaido.jp',
+ 1898 => 'noboribetsu.hokkaido.jp',
+ 1899 => 'numata.hokkaido.jp',
+ 1900 => 'obihiro.hokkaido.jp',
+ 1901 => 'obira.hokkaido.jp',
+ 1902 => 'oketo.hokkaido.jp',
+ 1903 => 'okoppe.hokkaido.jp',
+ 1904 => 'otaru.hokkaido.jp',
+ 1905 => 'otobe.hokkaido.jp',
+ 1906 => 'otofuke.hokkaido.jp',
+ 1907 => 'otoineppu.hokkaido.jp',
+ 1908 => 'oumu.hokkaido.jp',
+ 1909 => 'ozora.hokkaido.jp',
+ 1910 => 'pippu.hokkaido.jp',
+ 1911 => 'rankoshi.hokkaido.jp',
+ 1912 => 'rebun.hokkaido.jp',
+ 1913 => 'rikubetsu.hokkaido.jp',
+ 1914 => 'rishiri.hokkaido.jp',
+ 1915 => 'rishirifuji.hokkaido.jp',
+ 1916 => 'saroma.hokkaido.jp',
+ 1917 => 'sarufutsu.hokkaido.jp',
+ 1918 => 'shakotan.hokkaido.jp',
+ 1919 => 'shari.hokkaido.jp',
+ 1920 => 'shibecha.hokkaido.jp',
+ 1921 => 'shibetsu.hokkaido.jp',
+ 1922 => 'shikabe.hokkaido.jp',
+ 1923 => 'shikaoi.hokkaido.jp',
+ 1924 => 'shimamaki.hokkaido.jp',
+ 1925 => 'shimizu.hokkaido.jp',
+ 1926 => 'shimokawa.hokkaido.jp',
+ 1927 => 'shinshinotsu.hokkaido.jp',
+ 1928 => 'shintoku.hokkaido.jp',
+ 1929 => 'shiranuka.hokkaido.jp',
+ 1930 => 'shiraoi.hokkaido.jp',
+ 1931 => 'shiriuchi.hokkaido.jp',
+ 1932 => 'sobetsu.hokkaido.jp',
+ 1933 => 'sunagawa.hokkaido.jp',
+ 1934 => 'taiki.hokkaido.jp',
+ 1935 => 'takasu.hokkaido.jp',
+ 1936 => 'takikawa.hokkaido.jp',
+ 1937 => 'takinoue.hokkaido.jp',
+ 1938 => 'teshikaga.hokkaido.jp',
+ 1939 => 'tobetsu.hokkaido.jp',
+ 1940 => 'tohma.hokkaido.jp',
+ 1941 => 'tomakomai.hokkaido.jp',
+ 1942 => 'tomari.hokkaido.jp',
+ 1943 => 'toya.hokkaido.jp',
+ 1944 => 'toyako.hokkaido.jp',
+ 1945 => 'toyotomi.hokkaido.jp',
+ 1946 => 'toyoura.hokkaido.jp',
+ 1947 => 'tsubetsu.hokkaido.jp',
+ 1948 => 'tsukigata.hokkaido.jp',
+ 1949 => 'urakawa.hokkaido.jp',
+ 1950 => 'urausu.hokkaido.jp',
+ 1951 => 'uryu.hokkaido.jp',
+ 1952 => 'utashinai.hokkaido.jp',
+ 1953 => 'wakkanai.hokkaido.jp',
+ 1954 => 'wassamu.hokkaido.jp',
+ 1955 => 'yakumo.hokkaido.jp',
+ 1956 => 'yoichi.hokkaido.jp',
+ 1957 => 'aioi.hyogo.jp',
+ 1958 => 'akashi.hyogo.jp',
+ 1959 => 'ako.hyogo.jp',
+ 1960 => 'amagasaki.hyogo.jp',
+ 1961 => 'aogaki.hyogo.jp',
+ 1962 => 'asago.hyogo.jp',
+ 1963 => 'ashiya.hyogo.jp',
+ 1964 => 'awaji.hyogo.jp',
+ 1965 => 'fukusaki.hyogo.jp',
+ 1966 => 'goshiki.hyogo.jp',
+ 1967 => 'harima.hyogo.jp',
+ 1968 => 'himeji.hyogo.jp',
+ 1969 => 'ichikawa.hyogo.jp',
+ 1970 => 'inagawa.hyogo.jp',
+ 1971 => 'itami.hyogo.jp',
+ 1972 => 'kakogawa.hyogo.jp',
+ 1973 => 'kamigori.hyogo.jp',
+ 1974 => 'kamikawa.hyogo.jp',
+ 1975 => 'kasai.hyogo.jp',
+ 1976 => 'kasuga.hyogo.jp',
+ 1977 => 'kawanishi.hyogo.jp',
+ 1978 => 'miki.hyogo.jp',
+ 1979 => 'minamiawaji.hyogo.jp',
+ 1980 => 'nishinomiya.hyogo.jp',
+ 1981 => 'nishiwaki.hyogo.jp',
+ 1982 => 'ono.hyogo.jp',
+ 1983 => 'sanda.hyogo.jp',
+ 1984 => 'sannan.hyogo.jp',
+ 1985 => 'sasayama.hyogo.jp',
+ 1986 => 'sayo.hyogo.jp',
+ 1987 => 'shingu.hyogo.jp',
+ 1988 => 'shinonsen.hyogo.jp',
+ 1989 => 'shiso.hyogo.jp',
+ 1990 => 'sumoto.hyogo.jp',
+ 1991 => 'taishi.hyogo.jp',
+ 1992 => 'taka.hyogo.jp',
+ 1993 => 'takarazuka.hyogo.jp',
+ 1994 => 'takasago.hyogo.jp',
+ 1995 => 'takino.hyogo.jp',
+ 1996 => 'tamba.hyogo.jp',
+ 1997 => 'tatsuno.hyogo.jp',
+ 1998 => 'toyooka.hyogo.jp',
+ 1999 => 'yabu.hyogo.jp',
+ 2000 => 'yashiro.hyogo.jp',
+ 2001 => 'yoka.hyogo.jp',
+ 2002 => 'yokawa.hyogo.jp',
+ 2003 => 'ami.ibaraki.jp',
+ 2004 => 'asahi.ibaraki.jp',
+ 2005 => 'bando.ibaraki.jp',
+ 2006 => 'chikusei.ibaraki.jp',
+ 2007 => 'daigo.ibaraki.jp',
+ 2008 => 'fujishiro.ibaraki.jp',
+ 2009 => 'hitachi.ibaraki.jp',
+ 2010 => 'hitachinaka.ibaraki.jp',
+ 2011 => 'hitachiomiya.ibaraki.jp',
+ 2012 => 'hitachiota.ibaraki.jp',
+ 2013 => 'ibaraki.ibaraki.jp',
+ 2014 => 'ina.ibaraki.jp',
+ 2015 => 'inashiki.ibaraki.jp',
+ 2016 => 'itako.ibaraki.jp',
+ 2017 => 'iwama.ibaraki.jp',
+ 2018 => 'joso.ibaraki.jp',
+ 2019 => 'kamisu.ibaraki.jp',
+ 2020 => 'kasama.ibaraki.jp',
+ 2021 => 'kashima.ibaraki.jp',
+ 2022 => 'kasumigaura.ibaraki.jp',
+ 2023 => 'koga.ibaraki.jp',
+ 2024 => 'miho.ibaraki.jp',
+ 2025 => 'mito.ibaraki.jp',
+ 2026 => 'moriya.ibaraki.jp',
+ 2027 => 'naka.ibaraki.jp',
+ 2028 => 'namegata.ibaraki.jp',
+ 2029 => 'oarai.ibaraki.jp',
+ 2030 => 'ogawa.ibaraki.jp',
+ 2031 => 'omitama.ibaraki.jp',
+ 2032 => 'ryugasaki.ibaraki.jp',
+ 2033 => 'sakai.ibaraki.jp',
+ 2034 => 'sakuragawa.ibaraki.jp',
+ 2035 => 'shimodate.ibaraki.jp',
+ 2036 => 'shimotsuma.ibaraki.jp',
+ 2037 => 'shirosato.ibaraki.jp',
+ 2038 => 'sowa.ibaraki.jp',
+ 2039 => 'suifu.ibaraki.jp',
+ 2040 => 'takahagi.ibaraki.jp',
+ 2041 => 'tamatsukuri.ibaraki.jp',
+ 2042 => 'tokai.ibaraki.jp',
+ 2043 => 'tomobe.ibaraki.jp',
+ 2044 => 'tone.ibaraki.jp',
+ 2045 => 'toride.ibaraki.jp',
+ 2046 => 'tsuchiura.ibaraki.jp',
+ 2047 => 'tsukuba.ibaraki.jp',
+ 2048 => 'uchihara.ibaraki.jp',
+ 2049 => 'ushiku.ibaraki.jp',
+ 2050 => 'yachiyo.ibaraki.jp',
+ 2051 => 'yamagata.ibaraki.jp',
+ 2052 => 'yawara.ibaraki.jp',
+ 2053 => 'yuki.ibaraki.jp',
+ 2054 => 'anamizu.ishikawa.jp',
+ 2055 => 'hakui.ishikawa.jp',
+ 2056 => 'hakusan.ishikawa.jp',
+ 2057 => 'kaga.ishikawa.jp',
+ 2058 => 'kahoku.ishikawa.jp',
+ 2059 => 'kanazawa.ishikawa.jp',
+ 2060 => 'kawakita.ishikawa.jp',
+ 2061 => 'komatsu.ishikawa.jp',
+ 2062 => 'nakanoto.ishikawa.jp',
+ 2063 => 'nanao.ishikawa.jp',
+ 2064 => 'nomi.ishikawa.jp',
+ 2065 => 'nonoichi.ishikawa.jp',
+ 2066 => 'noto.ishikawa.jp',
+ 2067 => 'shika.ishikawa.jp',
+ 2068 => 'suzu.ishikawa.jp',
+ 2069 => 'tsubata.ishikawa.jp',
+ 2070 => 'tsurugi.ishikawa.jp',
+ 2071 => 'uchinada.ishikawa.jp',
+ 2072 => 'wajima.ishikawa.jp',
+ 2073 => 'fudai.iwate.jp',
+ 2074 => 'fujisawa.iwate.jp',
+ 2075 => 'hanamaki.iwate.jp',
+ 2076 => 'hiraizumi.iwate.jp',
+ 2077 => 'hirono.iwate.jp',
+ 2078 => 'ichinohe.iwate.jp',
+ 2079 => 'ichinoseki.iwate.jp',
+ 2080 => 'iwaizumi.iwate.jp',
+ 2081 => 'iwate.iwate.jp',
+ 2082 => 'joboji.iwate.jp',
+ 2083 => 'kamaishi.iwate.jp',
+ 2084 => 'kanegasaki.iwate.jp',
+ 2085 => 'karumai.iwate.jp',
+ 2086 => 'kawai.iwate.jp',
+ 2087 => 'kitakami.iwate.jp',
+ 2088 => 'kuji.iwate.jp',
+ 2089 => 'kunohe.iwate.jp',
+ 2090 => 'kuzumaki.iwate.jp',
+ 2091 => 'miyako.iwate.jp',
+ 2092 => 'mizusawa.iwate.jp',
+ 2093 => 'morioka.iwate.jp',
+ 2094 => 'ninohe.iwate.jp',
+ 2095 => 'noda.iwate.jp',
+ 2096 => 'ofunato.iwate.jp',
+ 2097 => 'oshu.iwate.jp',
+ 2098 => 'otsuchi.iwate.jp',
+ 2099 => 'rikuzentakata.iwate.jp',
+ 2100 => 'shiwa.iwate.jp',
+ 2101 => 'shizukuishi.iwate.jp',
+ 2102 => 'sumita.iwate.jp',
+ 2103 => 'tanohata.iwate.jp',
+ 2104 => 'tono.iwate.jp',
+ 2105 => 'yahaba.iwate.jp',
+ 2106 => 'yamada.iwate.jp',
+ 2107 => 'ayagawa.kagawa.jp',
+ 2108 => 'higashikagawa.kagawa.jp',
+ 2109 => 'kanonji.kagawa.jp',
+ 2110 => 'kotohira.kagawa.jp',
+ 2111 => 'manno.kagawa.jp',
+ 2112 => 'marugame.kagawa.jp',
+ 2113 => 'mitoyo.kagawa.jp',
+ 2114 => 'naoshima.kagawa.jp',
+ 2115 => 'sanuki.kagawa.jp',
+ 2116 => 'tadotsu.kagawa.jp',
+ 2117 => 'takamatsu.kagawa.jp',
+ 2118 => 'tonosho.kagawa.jp',
+ 2119 => 'uchinomi.kagawa.jp',
+ 2120 => 'utazu.kagawa.jp',
+ 2121 => 'zentsuji.kagawa.jp',
+ 2122 => 'akune.kagoshima.jp',
+ 2123 => 'amami.kagoshima.jp',
+ 2124 => 'hioki.kagoshima.jp',
+ 2125 => 'isa.kagoshima.jp',
+ 2126 => 'isen.kagoshima.jp',
+ 2127 => 'izumi.kagoshima.jp',
+ 2128 => 'kagoshima.kagoshima.jp',
+ 2129 => 'kanoya.kagoshima.jp',
+ 2130 => 'kawanabe.kagoshima.jp',
+ 2131 => 'kinko.kagoshima.jp',
+ 2132 => 'kouyama.kagoshima.jp',
+ 2133 => 'makurazaki.kagoshima.jp',
+ 2134 => 'matsumoto.kagoshima.jp',
+ 2135 => 'minamitane.kagoshima.jp',
+ 2136 => 'nakatane.kagoshima.jp',
+ 2137 => 'nishinoomote.kagoshima.jp',
+ 2138 => 'satsumasendai.kagoshima.jp',
+ 2139 => 'soo.kagoshima.jp',
+ 2140 => 'tarumizu.kagoshima.jp',
+ 2141 => 'yusui.kagoshima.jp',
+ 2142 => 'aikawa.kanagawa.jp',
+ 2143 => 'atsugi.kanagawa.jp',
+ 2144 => 'ayase.kanagawa.jp',
+ 2145 => 'chigasaki.kanagawa.jp',
+ 2146 => 'ebina.kanagawa.jp',
+ 2147 => 'fujisawa.kanagawa.jp',
+ 2148 => 'hadano.kanagawa.jp',
+ 2149 => 'hakone.kanagawa.jp',
+ 2150 => 'hiratsuka.kanagawa.jp',
+ 2151 => 'isehara.kanagawa.jp',
+ 2152 => 'kaisei.kanagawa.jp',
+ 2153 => 'kamakura.kanagawa.jp',
+ 2154 => 'kiyokawa.kanagawa.jp',
+ 2155 => 'matsuda.kanagawa.jp',
+ 2156 => 'minamiashigara.kanagawa.jp',
+ 2157 => 'miura.kanagawa.jp',
+ 2158 => 'nakai.kanagawa.jp',
+ 2159 => 'ninomiya.kanagawa.jp',
+ 2160 => 'odawara.kanagawa.jp',
+ 2161 => 'oi.kanagawa.jp',
+ 2162 => 'oiso.kanagawa.jp',
+ 2163 => 'sagamihara.kanagawa.jp',
+ 2164 => 'samukawa.kanagawa.jp',
+ 2165 => 'tsukui.kanagawa.jp',
+ 2166 => 'yamakita.kanagawa.jp',
+ 2167 => 'yamato.kanagawa.jp',
+ 2168 => 'yokosuka.kanagawa.jp',
+ 2169 => 'yugawara.kanagawa.jp',
+ 2170 => 'zama.kanagawa.jp',
+ 2171 => 'zushi.kanagawa.jp',
+ 2172 => 'aki.kochi.jp',
+ 2173 => 'geisei.kochi.jp',
+ 2174 => 'hidaka.kochi.jp',
+ 2175 => 'higashitsuno.kochi.jp',
+ 2176 => 'ino.kochi.jp',
+ 2177 => 'kagami.kochi.jp',
+ 2178 => 'kami.kochi.jp',
+ 2179 => 'kitagawa.kochi.jp',
+ 2180 => 'kochi.kochi.jp',
+ 2181 => 'mihara.kochi.jp',
+ 2182 => 'motoyama.kochi.jp',
+ 2183 => 'muroto.kochi.jp',
+ 2184 => 'nahari.kochi.jp',
+ 2185 => 'nakamura.kochi.jp',
+ 2186 => 'nankoku.kochi.jp',
+ 2187 => 'nishitosa.kochi.jp',
+ 2188 => 'niyodogawa.kochi.jp',
+ 2189 => 'ochi.kochi.jp',
+ 2190 => 'okawa.kochi.jp',
+ 2191 => 'otoyo.kochi.jp',
+ 2192 => 'otsuki.kochi.jp',
+ 2193 => 'sakawa.kochi.jp',
+ 2194 => 'sukumo.kochi.jp',
+ 2195 => 'susaki.kochi.jp',
+ 2196 => 'tosa.kochi.jp',
+ 2197 => 'tosashimizu.kochi.jp',
+ 2198 => 'toyo.kochi.jp',
+ 2199 => 'tsuno.kochi.jp',
+ 2200 => 'umaji.kochi.jp',
+ 2201 => 'yasuda.kochi.jp',
+ 2202 => 'yusuhara.kochi.jp',
+ 2203 => 'amakusa.kumamoto.jp',
+ 2204 => 'arao.kumamoto.jp',
+ 2205 => 'aso.kumamoto.jp',
+ 2206 => 'choyo.kumamoto.jp',
+ 2207 => 'gyokuto.kumamoto.jp',
+ 2208 => 'hitoyoshi.kumamoto.jp',
+ 2209 => 'kamiamakusa.kumamoto.jp',
+ 2210 => 'kashima.kumamoto.jp',
+ 2211 => 'kikuchi.kumamoto.jp',
+ 2212 => 'kosa.kumamoto.jp',
+ 2213 => 'kumamoto.kumamoto.jp',
+ 2214 => 'mashiki.kumamoto.jp',
+ 2215 => 'mifune.kumamoto.jp',
+ 2216 => 'minamata.kumamoto.jp',
+ 2217 => 'minamioguni.kumamoto.jp',
+ 2218 => 'nagasu.kumamoto.jp',
+ 2219 => 'nishihara.kumamoto.jp',
+ 2220 => 'oguni.kumamoto.jp',
+ 2221 => 'ozu.kumamoto.jp',
+ 2222 => 'sumoto.kumamoto.jp',
+ 2223 => 'takamori.kumamoto.jp',
+ 2224 => 'uki.kumamoto.jp',
+ 2225 => 'uto.kumamoto.jp',
+ 2226 => 'yamaga.kumamoto.jp',
+ 2227 => 'yamato.kumamoto.jp',
+ 2228 => 'yatsushiro.kumamoto.jp',
+ 2229 => 'ayabe.kyoto.jp',
+ 2230 => 'fukuchiyama.kyoto.jp',
+ 2231 => 'higashiyama.kyoto.jp',
+ 2232 => 'ide.kyoto.jp',
+ 2233 => 'ine.kyoto.jp',
+ 2234 => 'joyo.kyoto.jp',
+ 2235 => 'kameoka.kyoto.jp',
+ 2236 => 'kamo.kyoto.jp',
+ 2237 => 'kita.kyoto.jp',
+ 2238 => 'kizu.kyoto.jp',
+ 2239 => 'kumiyama.kyoto.jp',
+ 2240 => 'kyotamba.kyoto.jp',
+ 2241 => 'kyotanabe.kyoto.jp',
+ 2242 => 'kyotango.kyoto.jp',
+ 2243 => 'maizuru.kyoto.jp',
+ 2244 => 'minami.kyoto.jp',
+ 2245 => 'minamiyamashiro.kyoto.jp',
+ 2246 => 'miyazu.kyoto.jp',
+ 2247 => 'muko.kyoto.jp',
+ 2248 => 'nagaokakyo.kyoto.jp',
+ 2249 => 'nakagyo.kyoto.jp',
+ 2250 => 'nantan.kyoto.jp',
+ 2251 => 'oyamazaki.kyoto.jp',
+ 2252 => 'sakyo.kyoto.jp',
+ 2253 => 'seika.kyoto.jp',
+ 2254 => 'tanabe.kyoto.jp',
+ 2255 => 'uji.kyoto.jp',
+ 2256 => 'ujitawara.kyoto.jp',
+ 2257 => 'wazuka.kyoto.jp',
+ 2258 => 'yamashina.kyoto.jp',
+ 2259 => 'yawata.kyoto.jp',
+ 2260 => 'asahi.mie.jp',
+ 2261 => 'inabe.mie.jp',
+ 2262 => 'ise.mie.jp',
+ 2263 => 'kameyama.mie.jp',
+ 2264 => 'kawagoe.mie.jp',
+ 2265 => 'kiho.mie.jp',
+ 2266 => 'kisosaki.mie.jp',
+ 2267 => 'kiwa.mie.jp',
+ 2268 => 'komono.mie.jp',
+ 2269 => 'kumano.mie.jp',
+ 2270 => 'kuwana.mie.jp',
+ 2271 => 'matsusaka.mie.jp',
+ 2272 => 'meiwa.mie.jp',
+ 2273 => 'mihama.mie.jp',
+ 2274 => 'minamiise.mie.jp',
+ 2275 => 'misugi.mie.jp',
+ 2276 => 'miyama.mie.jp',
+ 2277 => 'nabari.mie.jp',
+ 2278 => 'shima.mie.jp',
+ 2279 => 'suzuka.mie.jp',
+ 2280 => 'tado.mie.jp',
+ 2281 => 'taiki.mie.jp',
+ 2282 => 'taki.mie.jp',
+ 2283 => 'tamaki.mie.jp',
+ 2284 => 'toba.mie.jp',
+ 2285 => 'tsu.mie.jp',
+ 2286 => 'udono.mie.jp',
+ 2287 => 'ureshino.mie.jp',
+ 2288 => 'watarai.mie.jp',
+ 2289 => 'yokkaichi.mie.jp',
+ 2290 => 'furukawa.miyagi.jp',
+ 2291 => 'higashimatsushima.miyagi.jp',
+ 2292 => 'ishinomaki.miyagi.jp',
+ 2293 => 'iwanuma.miyagi.jp',
+ 2294 => 'kakuda.miyagi.jp',
+ 2295 => 'kami.miyagi.jp',
+ 2296 => 'kawasaki.miyagi.jp',
+ 2297 => 'marumori.miyagi.jp',
+ 2298 => 'matsushima.miyagi.jp',
+ 2299 => 'minamisanriku.miyagi.jp',
+ 2300 => 'misato.miyagi.jp',
+ 2301 => 'murata.miyagi.jp',
+ 2302 => 'natori.miyagi.jp',
+ 2303 => 'ogawara.miyagi.jp',
+ 2304 => 'ohira.miyagi.jp',
+ 2305 => 'onagawa.miyagi.jp',
+ 2306 => 'osaki.miyagi.jp',
+ 2307 => 'rifu.miyagi.jp',
+ 2308 => 'semine.miyagi.jp',
+ 2309 => 'shibata.miyagi.jp',
+ 2310 => 'shichikashuku.miyagi.jp',
+ 2311 => 'shikama.miyagi.jp',
+ 2312 => 'shiogama.miyagi.jp',
+ 2313 => 'shiroishi.miyagi.jp',
+ 2314 => 'tagajo.miyagi.jp',
+ 2315 => 'taiwa.miyagi.jp',
+ 2316 => 'tome.miyagi.jp',
+ 2317 => 'tomiya.miyagi.jp',
+ 2318 => 'wakuya.miyagi.jp',
+ 2319 => 'watari.miyagi.jp',
+ 2320 => 'yamamoto.miyagi.jp',
+ 2321 => 'zao.miyagi.jp',
+ 2322 => 'aya.miyazaki.jp',
+ 2323 => 'ebino.miyazaki.jp',
+ 2324 => 'gokase.miyazaki.jp',
+ 2325 => 'hyuga.miyazaki.jp',
+ 2326 => 'kadogawa.miyazaki.jp',
+ 2327 => 'kawaminami.miyazaki.jp',
+ 2328 => 'kijo.miyazaki.jp',
+ 2329 => 'kitagawa.miyazaki.jp',
+ 2330 => 'kitakata.miyazaki.jp',
+ 2331 => 'kitaura.miyazaki.jp',
+ 2332 => 'kobayashi.miyazaki.jp',
+ 2333 => 'kunitomi.miyazaki.jp',
+ 2334 => 'kushima.miyazaki.jp',
+ 2335 => 'mimata.miyazaki.jp',
+ 2336 => 'miyakonojo.miyazaki.jp',
+ 2337 => 'miyazaki.miyazaki.jp',
+ 2338 => 'morotsuka.miyazaki.jp',
+ 2339 => 'nichinan.miyazaki.jp',
+ 2340 => 'nishimera.miyazaki.jp',
+ 2341 => 'nobeoka.miyazaki.jp',
+ 2342 => 'saito.miyazaki.jp',
+ 2343 => 'shiiba.miyazaki.jp',
+ 2344 => 'shintomi.miyazaki.jp',
+ 2345 => 'takaharu.miyazaki.jp',
+ 2346 => 'takanabe.miyazaki.jp',
+ 2347 => 'takazaki.miyazaki.jp',
+ 2348 => 'tsuno.miyazaki.jp',
+ 2349 => 'achi.nagano.jp',
+ 2350 => 'agematsu.nagano.jp',
+ 2351 => 'anan.nagano.jp',
+ 2352 => 'aoki.nagano.jp',
+ 2353 => 'asahi.nagano.jp',
+ 2354 => 'azumino.nagano.jp',
+ 2355 => 'chikuhoku.nagano.jp',
+ 2356 => 'chikuma.nagano.jp',
+ 2357 => 'chino.nagano.jp',
+ 2358 => 'fujimi.nagano.jp',
+ 2359 => 'hakuba.nagano.jp',
+ 2360 => 'hara.nagano.jp',
+ 2361 => 'hiraya.nagano.jp',
+ 2362 => 'iida.nagano.jp',
+ 2363 => 'iijima.nagano.jp',
+ 2364 => 'iiyama.nagano.jp',
+ 2365 => 'iizuna.nagano.jp',
+ 2366 => 'ikeda.nagano.jp',
+ 2367 => 'ikusaka.nagano.jp',
+ 2368 => 'ina.nagano.jp',
+ 2369 => 'karuizawa.nagano.jp',
+ 2370 => 'kawakami.nagano.jp',
+ 2371 => 'kiso.nagano.jp',
+ 2372 => 'kisofukushima.nagano.jp',
+ 2373 => 'kitaaiki.nagano.jp',
+ 2374 => 'komagane.nagano.jp',
+ 2375 => 'komoro.nagano.jp',
+ 2376 => 'matsukawa.nagano.jp',
+ 2377 => 'matsumoto.nagano.jp',
+ 2378 => 'miasa.nagano.jp',
+ 2379 => 'minamiaiki.nagano.jp',
+ 2380 => 'minamimaki.nagano.jp',
+ 2381 => 'minamiminowa.nagano.jp',
+ 2382 => 'minowa.nagano.jp',
+ 2383 => 'miyada.nagano.jp',
+ 2384 => 'miyota.nagano.jp',
+ 2385 => 'mochizuki.nagano.jp',
+ 2386 => 'nagano.nagano.jp',
+ 2387 => 'nagawa.nagano.jp',
+ 2388 => 'nagiso.nagano.jp',
+ 2389 => 'nakagawa.nagano.jp',
+ 2390 => 'nakano.nagano.jp',
+ 2391 => 'nozawaonsen.nagano.jp',
+ 2392 => 'obuse.nagano.jp',
+ 2393 => 'ogawa.nagano.jp',
+ 2394 => 'okaya.nagano.jp',
+ 2395 => 'omachi.nagano.jp',
+ 2396 => 'omi.nagano.jp',
+ 2397 => 'ookuwa.nagano.jp',
+ 2398 => 'ooshika.nagano.jp',
+ 2399 => 'otaki.nagano.jp',
+ 2400 => 'otari.nagano.jp',
+ 2401 => 'sakae.nagano.jp',
+ 2402 => 'sakaki.nagano.jp',
+ 2403 => 'saku.nagano.jp',
+ 2404 => 'sakuho.nagano.jp',
+ 2405 => 'shimosuwa.nagano.jp',
+ 2406 => 'shinanomachi.nagano.jp',
+ 2407 => 'shiojiri.nagano.jp',
+ 2408 => 'suwa.nagano.jp',
+ 2409 => 'suzaka.nagano.jp',
+ 2410 => 'takagi.nagano.jp',
+ 2411 => 'takamori.nagano.jp',
+ 2412 => 'takayama.nagano.jp',
+ 2413 => 'tateshina.nagano.jp',
+ 2414 => 'tatsuno.nagano.jp',
+ 2415 => 'togakushi.nagano.jp',
+ 2416 => 'togura.nagano.jp',
+ 2417 => 'tomi.nagano.jp',
+ 2418 => 'ueda.nagano.jp',
+ 2419 => 'wada.nagano.jp',
+ 2420 => 'yamagata.nagano.jp',
+ 2421 => 'yamanouchi.nagano.jp',
+ 2422 => 'yasaka.nagano.jp',
+ 2423 => 'yasuoka.nagano.jp',
+ 2424 => 'chijiwa.nagasaki.jp',
+ 2425 => 'futsu.nagasaki.jp',
+ 2426 => 'goto.nagasaki.jp',
+ 2427 => 'hasami.nagasaki.jp',
+ 2428 => 'hirado.nagasaki.jp',
+ 2429 => 'iki.nagasaki.jp',
+ 2430 => 'isahaya.nagasaki.jp',
+ 2431 => 'kawatana.nagasaki.jp',
+ 2432 => 'kuchinotsu.nagasaki.jp',
+ 2433 => 'matsuura.nagasaki.jp',
+ 2434 => 'nagasaki.nagasaki.jp',
+ 2435 => 'obama.nagasaki.jp',
+ 2436 => 'omura.nagasaki.jp',
+ 2437 => 'oseto.nagasaki.jp',
+ 2438 => 'saikai.nagasaki.jp',
+ 2439 => 'sasebo.nagasaki.jp',
+ 2440 => 'seihi.nagasaki.jp',
+ 2441 => 'shimabara.nagasaki.jp',
+ 2442 => 'shinkamigoto.nagasaki.jp',
+ 2443 => 'togitsu.nagasaki.jp',
+ 2444 => 'tsushima.nagasaki.jp',
+ 2445 => 'unzen.nagasaki.jp',
+ 2446 => 'ando.nara.jp',
+ 2447 => 'gose.nara.jp',
+ 2448 => 'heguri.nara.jp',
+ 2449 => 'higashiyoshino.nara.jp',
+ 2450 => 'ikaruga.nara.jp',
+ 2451 => 'ikoma.nara.jp',
+ 2452 => 'kamikitayama.nara.jp',
+ 2453 => 'kanmaki.nara.jp',
+ 2454 => 'kashiba.nara.jp',
+ 2455 => 'kashihara.nara.jp',
+ 2456 => 'katsuragi.nara.jp',
+ 2457 => 'kawai.nara.jp',
+ 2458 => 'kawakami.nara.jp',
+ 2459 => 'kawanishi.nara.jp',
+ 2460 => 'koryo.nara.jp',
+ 2461 => 'kurotaki.nara.jp',
+ 2462 => 'mitsue.nara.jp',
+ 2463 => 'miyake.nara.jp',
+ 2464 => 'nara.nara.jp',
+ 2465 => 'nosegawa.nara.jp',
+ 2466 => 'oji.nara.jp',
+ 2467 => 'ouda.nara.jp',
+ 2468 => 'oyodo.nara.jp',
+ 2469 => 'sakurai.nara.jp',
+ 2470 => 'sango.nara.jp',
+ 2471 => 'shimoichi.nara.jp',
+ 2472 => 'shimokitayama.nara.jp',
+ 2473 => 'shinjo.nara.jp',
+ 2474 => 'soni.nara.jp',
+ 2475 => 'takatori.nara.jp',
+ 2476 => 'tawaramoto.nara.jp',
+ 2477 => 'tenkawa.nara.jp',
+ 2478 => 'tenri.nara.jp',
+ 2479 => 'uda.nara.jp',
+ 2480 => 'yamatokoriyama.nara.jp',
+ 2481 => 'yamatotakada.nara.jp',
+ 2482 => 'yamazoe.nara.jp',
+ 2483 => 'yoshino.nara.jp',
+ 2484 => 'aga.niigata.jp',
+ 2485 => 'agano.niigata.jp',
+ 2486 => 'gosen.niigata.jp',
+ 2487 => 'itoigawa.niigata.jp',
+ 2488 => 'izumozaki.niigata.jp',
+ 2489 => 'joetsu.niigata.jp',
+ 2490 => 'kamo.niigata.jp',
+ 2491 => 'kariwa.niigata.jp',
+ 2492 => 'kashiwazaki.niigata.jp',
+ 2493 => 'minamiuonuma.niigata.jp',
+ 2494 => 'mitsuke.niigata.jp',
+ 2495 => 'muika.niigata.jp',
+ 2496 => 'murakami.niigata.jp',
+ 2497 => 'myoko.niigata.jp',
+ 2498 => 'nagaoka.niigata.jp',
+ 2499 => 'niigata.niigata.jp',
+ 2500 => 'ojiya.niigata.jp',
+ 2501 => 'omi.niigata.jp',
+ 2502 => 'sado.niigata.jp',
+ 2503 => 'sanjo.niigata.jp',
+ 2504 => 'seiro.niigata.jp',
+ 2505 => 'seirou.niigata.jp',
+ 2506 => 'sekikawa.niigata.jp',
+ 2507 => 'shibata.niigata.jp',
+ 2508 => 'tagami.niigata.jp',
+ 2509 => 'tainai.niigata.jp',
+ 2510 => 'tochio.niigata.jp',
+ 2511 => 'tokamachi.niigata.jp',
+ 2512 => 'tsubame.niigata.jp',
+ 2513 => 'tsunan.niigata.jp',
+ 2514 => 'uonuma.niigata.jp',
+ 2515 => 'yahiko.niigata.jp',
+ 2516 => 'yoita.niigata.jp',
+ 2517 => 'yuzawa.niigata.jp',
+ 2518 => 'beppu.oita.jp',
+ 2519 => 'bungoono.oita.jp',
+ 2520 => 'bungotakada.oita.jp',
+ 2521 => 'hasama.oita.jp',
+ 2522 => 'hiji.oita.jp',
+ 2523 => 'himeshima.oita.jp',
+ 2524 => 'hita.oita.jp',
+ 2525 => 'kamitsue.oita.jp',
+ 2526 => 'kokonoe.oita.jp',
+ 2527 => 'kuju.oita.jp',
+ 2528 => 'kunisaki.oita.jp',
+ 2529 => 'kusu.oita.jp',
+ 2530 => 'oita.oita.jp',
+ 2531 => 'saiki.oita.jp',
+ 2532 => 'taketa.oita.jp',
+ 2533 => 'tsukumi.oita.jp',
+ 2534 => 'usa.oita.jp',
+ 2535 => 'usuki.oita.jp',
+ 2536 => 'yufu.oita.jp',
+ 2537 => 'akaiwa.okayama.jp',
+ 2538 => 'asakuchi.okayama.jp',
+ 2539 => 'bizen.okayama.jp',
+ 2540 => 'hayashima.okayama.jp',
+ 2541 => 'ibara.okayama.jp',
+ 2542 => 'kagamino.okayama.jp',
+ 2543 => 'kasaoka.okayama.jp',
+ 2544 => 'kibichuo.okayama.jp',
+ 2545 => 'kumenan.okayama.jp',
+ 2546 => 'kurashiki.okayama.jp',
+ 2547 => 'maniwa.okayama.jp',
+ 2548 => 'misaki.okayama.jp',
+ 2549 => 'nagi.okayama.jp',
+ 2550 => 'niimi.okayama.jp',
+ 2551 => 'nishiawakura.okayama.jp',
+ 2552 => 'okayama.okayama.jp',
+ 2553 => 'satosho.okayama.jp',
+ 2554 => 'setouchi.okayama.jp',
+ 2555 => 'shinjo.okayama.jp',
+ 2556 => 'shoo.okayama.jp',
+ 2557 => 'soja.okayama.jp',
+ 2558 => 'takahashi.okayama.jp',
+ 2559 => 'tamano.okayama.jp',
+ 2560 => 'tsuyama.okayama.jp',
+ 2561 => 'wake.okayama.jp',
+ 2562 => 'yakage.okayama.jp',
+ 2563 => 'aguni.okinawa.jp',
+ 2564 => 'ginowan.okinawa.jp',
+ 2565 => 'ginoza.okinawa.jp',
+ 2566 => 'gushikami.okinawa.jp',
+ 2567 => 'haebaru.okinawa.jp',
+ 2568 => 'higashi.okinawa.jp',
+ 2569 => 'hirara.okinawa.jp',
+ 2570 => 'iheya.okinawa.jp',
+ 2571 => 'ishigaki.okinawa.jp',
+ 2572 => 'ishikawa.okinawa.jp',
+ 2573 => 'itoman.okinawa.jp',
+ 2574 => 'izena.okinawa.jp',
+ 2575 => 'kadena.okinawa.jp',
+ 2576 => 'kin.okinawa.jp',
+ 2577 => 'kitadaito.okinawa.jp',
+ 2578 => 'kitanakagusuku.okinawa.jp',
+ 2579 => 'kumejima.okinawa.jp',
+ 2580 => 'kunigami.okinawa.jp',
+ 2581 => 'minamidaito.okinawa.jp',
+ 2582 => 'motobu.okinawa.jp',
+ 2583 => 'nago.okinawa.jp',
+ 2584 => 'naha.okinawa.jp',
+ 2585 => 'nakagusuku.okinawa.jp',
+ 2586 => 'nakijin.okinawa.jp',
+ 2587 => 'nanjo.okinawa.jp',
+ 2588 => 'nishihara.okinawa.jp',
+ 2589 => 'ogimi.okinawa.jp',
+ 2590 => 'okinawa.okinawa.jp',
+ 2591 => 'onna.okinawa.jp',
+ 2592 => 'shimoji.okinawa.jp',
+ 2593 => 'taketomi.okinawa.jp',
+ 2594 => 'tarama.okinawa.jp',
+ 2595 => 'tokashiki.okinawa.jp',
+ 2596 => 'tomigusuku.okinawa.jp',
+ 2597 => 'tonaki.okinawa.jp',
+ 2598 => 'urasoe.okinawa.jp',
+ 2599 => 'uruma.okinawa.jp',
+ 2600 => 'yaese.okinawa.jp',
+ 2601 => 'yomitan.okinawa.jp',
+ 2602 => 'yonabaru.okinawa.jp',
+ 2603 => 'yonaguni.okinawa.jp',
+ 2604 => 'zamami.okinawa.jp',
+ 2605 => 'abeno.osaka.jp',
+ 2606 => 'chihayaakasaka.osaka.jp',
+ 2607 => 'chuo.osaka.jp',
+ 2608 => 'daito.osaka.jp',
+ 2609 => 'fujiidera.osaka.jp',
+ 2610 => 'habikino.osaka.jp',
+ 2611 => 'hannan.osaka.jp',
+ 2612 => 'higashiosaka.osaka.jp',
+ 2613 => 'higashisumiyoshi.osaka.jp',
+ 2614 => 'higashiyodogawa.osaka.jp',
+ 2615 => 'hirakata.osaka.jp',
+ 2616 => 'ibaraki.osaka.jp',
+ 2617 => 'ikeda.osaka.jp',
+ 2618 => 'izumi.osaka.jp',
+ 2619 => 'izumiotsu.osaka.jp',
+ 2620 => 'izumisano.osaka.jp',
+ 2621 => 'kadoma.osaka.jp',
+ 2622 => 'kaizuka.osaka.jp',
+ 2623 => 'kanan.osaka.jp',
+ 2624 => 'kashiwara.osaka.jp',
+ 2625 => 'katano.osaka.jp',
+ 2626 => 'kawachinagano.osaka.jp',
+ 2627 => 'kishiwada.osaka.jp',
+ 2628 => 'kita.osaka.jp',
+ 2629 => 'kumatori.osaka.jp',
+ 2630 => 'matsubara.osaka.jp',
+ 2631 => 'minato.osaka.jp',
+ 2632 => 'minoh.osaka.jp',
+ 2633 => 'misaki.osaka.jp',
+ 2634 => 'moriguchi.osaka.jp',
+ 2635 => 'neyagawa.osaka.jp',
+ 2636 => 'nishi.osaka.jp',
+ 2637 => 'nose.osaka.jp',
+ 2638 => 'osakasayama.osaka.jp',
+ 2639 => 'sakai.osaka.jp',
+ 2640 => 'sayama.osaka.jp',
+ 2641 => 'sennan.osaka.jp',
+ 2642 => 'settsu.osaka.jp',
+ 2643 => 'shijonawate.osaka.jp',
+ 2644 => 'shimamoto.osaka.jp',
+ 2645 => 'suita.osaka.jp',
+ 2646 => 'tadaoka.osaka.jp',
+ 2647 => 'taishi.osaka.jp',
+ 2648 => 'tajiri.osaka.jp',
+ 2649 => 'takaishi.osaka.jp',
+ 2650 => 'takatsuki.osaka.jp',
+ 2651 => 'tondabayashi.osaka.jp',
+ 2652 => 'toyonaka.osaka.jp',
+ 2653 => 'toyono.osaka.jp',
+ 2654 => 'yao.osaka.jp',
+ 2655 => 'ariake.saga.jp',
+ 2656 => 'arita.saga.jp',
+ 2657 => 'fukudomi.saga.jp',
+ 2658 => 'genkai.saga.jp',
+ 2659 => 'hamatama.saga.jp',
+ 2660 => 'hizen.saga.jp',
+ 2661 => 'imari.saga.jp',
+ 2662 => 'kamimine.saga.jp',
+ 2663 => 'kanzaki.saga.jp',
+ 2664 => 'karatsu.saga.jp',
+ 2665 => 'kashima.saga.jp',
+ 2666 => 'kitagata.saga.jp',
+ 2667 => 'kitahata.saga.jp',
+ 2668 => 'kiyama.saga.jp',
+ 2669 => 'kouhoku.saga.jp',
+ 2670 => 'kyuragi.saga.jp',
+ 2671 => 'nishiarita.saga.jp',
+ 2672 => 'ogi.saga.jp',
+ 2673 => 'omachi.saga.jp',
+ 2674 => 'ouchi.saga.jp',
+ 2675 => 'saga.saga.jp',
+ 2676 => 'shiroishi.saga.jp',
+ 2677 => 'taku.saga.jp',
+ 2678 => 'tara.saga.jp',
+ 2679 => 'tosu.saga.jp',
+ 2680 => 'yoshinogari.saga.jp',
+ 2681 => 'arakawa.saitama.jp',
+ 2682 => 'asaka.saitama.jp',
+ 2683 => 'chichibu.saitama.jp',
+ 2684 => 'fujimi.saitama.jp',
+ 2685 => 'fujimino.saitama.jp',
+ 2686 => 'fukaya.saitama.jp',
+ 2687 => 'hanno.saitama.jp',
+ 2688 => 'hanyu.saitama.jp',
+ 2689 => 'hasuda.saitama.jp',
+ 2690 => 'hatogaya.saitama.jp',
+ 2691 => 'hatoyama.saitama.jp',
+ 2692 => 'hidaka.saitama.jp',
+ 2693 => 'higashichichibu.saitama.jp',
+ 2694 => 'higashimatsuyama.saitama.jp',
+ 2695 => 'honjo.saitama.jp',
+ 2696 => 'ina.saitama.jp',
+ 2697 => 'iruma.saitama.jp',
+ 2698 => 'iwatsuki.saitama.jp',
+ 2699 => 'kamiizumi.saitama.jp',
+ 2700 => 'kamikawa.saitama.jp',
+ 2701 => 'kamisato.saitama.jp',
+ 2702 => 'kasukabe.saitama.jp',
+ 2703 => 'kawagoe.saitama.jp',
+ 2704 => 'kawaguchi.saitama.jp',
+ 2705 => 'kawajima.saitama.jp',
+ 2706 => 'kazo.saitama.jp',
+ 2707 => 'kitamoto.saitama.jp',
+ 2708 => 'koshigaya.saitama.jp',
+ 2709 => 'kounosu.saitama.jp',
+ 2710 => 'kuki.saitama.jp',
+ 2711 => 'kumagaya.saitama.jp',
+ 2712 => 'matsubushi.saitama.jp',
+ 2713 => 'minano.saitama.jp',
+ 2714 => 'misato.saitama.jp',
+ 2715 => 'miyashiro.saitama.jp',
+ 2716 => 'miyoshi.saitama.jp',
+ 2717 => 'moroyama.saitama.jp',
+ 2718 => 'nagatoro.saitama.jp',
+ 2719 => 'namegawa.saitama.jp',
+ 2720 => 'niiza.saitama.jp',
+ 2721 => 'ogano.saitama.jp',
+ 2722 => 'ogawa.saitama.jp',
+ 2723 => 'ogose.saitama.jp',
+ 2724 => 'okegawa.saitama.jp',
+ 2725 => 'omiya.saitama.jp',
+ 2726 => 'otaki.saitama.jp',
+ 2727 => 'ranzan.saitama.jp',
+ 2728 => 'ryokami.saitama.jp',
+ 2729 => 'saitama.saitama.jp',
+ 2730 => 'sakado.saitama.jp',
+ 2731 => 'satte.saitama.jp',
+ 2732 => 'sayama.saitama.jp',
+ 2733 => 'shiki.saitama.jp',
+ 2734 => 'shiraoka.saitama.jp',
+ 2735 => 'soka.saitama.jp',
+ 2736 => 'sugito.saitama.jp',
+ 2737 => 'toda.saitama.jp',
+ 2738 => 'tokigawa.saitama.jp',
+ 2739 => 'tokorozawa.saitama.jp',
+ 2740 => 'tsurugashima.saitama.jp',
+ 2741 => 'urawa.saitama.jp',
+ 2742 => 'warabi.saitama.jp',
+ 2743 => 'yashio.saitama.jp',
+ 2744 => 'yokoze.saitama.jp',
+ 2745 => 'yono.saitama.jp',
+ 2746 => 'yorii.saitama.jp',
+ 2747 => 'yoshida.saitama.jp',
+ 2748 => 'yoshikawa.saitama.jp',
+ 2749 => 'yoshimi.saitama.jp',
+ 2750 => 'aisho.shiga.jp',
+ 2751 => 'gamo.shiga.jp',
+ 2752 => 'higashiomi.shiga.jp',
+ 2753 => 'hikone.shiga.jp',
+ 2754 => 'koka.shiga.jp',
+ 2755 => 'konan.shiga.jp',
+ 2756 => 'kosei.shiga.jp',
+ 2757 => 'koto.shiga.jp',
+ 2758 => 'kusatsu.shiga.jp',
+ 2759 => 'maibara.shiga.jp',
+ 2760 => 'moriyama.shiga.jp',
+ 2761 => 'nagahama.shiga.jp',
+ 2762 => 'nishiazai.shiga.jp',
+ 2763 => 'notogawa.shiga.jp',
+ 2764 => 'omihachiman.shiga.jp',
+ 2765 => 'otsu.shiga.jp',
+ 2766 => 'ritto.shiga.jp',
+ 2767 => 'ryuoh.shiga.jp',
+ 2768 => 'takashima.shiga.jp',
+ 2769 => 'takatsuki.shiga.jp',
+ 2770 => 'torahime.shiga.jp',
+ 2771 => 'toyosato.shiga.jp',
+ 2772 => 'yasu.shiga.jp',
+ 2773 => 'akagi.shimane.jp',
+ 2774 => 'ama.shimane.jp',
+ 2775 => 'gotsu.shimane.jp',
+ 2776 => 'hamada.shimane.jp',
+ 2777 => 'higashiizumo.shimane.jp',
+ 2778 => 'hikawa.shimane.jp',
+ 2779 => 'hikimi.shimane.jp',
+ 2780 => 'izumo.shimane.jp',
+ 2781 => 'kakinoki.shimane.jp',
+ 2782 => 'masuda.shimane.jp',
+ 2783 => 'matsue.shimane.jp',
+ 2784 => 'misato.shimane.jp',
+ 2785 => 'nishinoshima.shimane.jp',
+ 2786 => 'ohda.shimane.jp',
+ 2787 => 'okinoshima.shimane.jp',
+ 2788 => 'okuizumo.shimane.jp',
+ 2789 => 'shimane.shimane.jp',
+ 2790 => 'tamayu.shimane.jp',
+ 2791 => 'tsuwano.shimane.jp',
+ 2792 => 'unnan.shimane.jp',
+ 2793 => 'yakumo.shimane.jp',
+ 2794 => 'yasugi.shimane.jp',
+ 2795 => 'yatsuka.shimane.jp',
+ 2796 => 'arai.shizuoka.jp',
+ 2797 => 'atami.shizuoka.jp',
+ 2798 => 'fuji.shizuoka.jp',
+ 2799 => 'fujieda.shizuoka.jp',
+ 2800 => 'fujikawa.shizuoka.jp',
+ 2801 => 'fujinomiya.shizuoka.jp',
+ 2802 => 'fukuroi.shizuoka.jp',
+ 2803 => 'gotemba.shizuoka.jp',
+ 2804 => 'haibara.shizuoka.jp',
+ 2805 => 'hamamatsu.shizuoka.jp',
+ 2806 => 'higashiizu.shizuoka.jp',
+ 2807 => 'ito.shizuoka.jp',
+ 2808 => 'iwata.shizuoka.jp',
+ 2809 => 'izu.shizuoka.jp',
+ 2810 => 'izunokuni.shizuoka.jp',
+ 2811 => 'kakegawa.shizuoka.jp',
+ 2812 => 'kannami.shizuoka.jp',
+ 2813 => 'kawanehon.shizuoka.jp',
+ 2814 => 'kawazu.shizuoka.jp',
+ 2815 => 'kikugawa.shizuoka.jp',
+ 2816 => 'kosai.shizuoka.jp',
+ 2817 => 'makinohara.shizuoka.jp',
+ 2818 => 'matsuzaki.shizuoka.jp',
+ 2819 => 'minamiizu.shizuoka.jp',
+ 2820 => 'mishima.shizuoka.jp',
+ 2821 => 'morimachi.shizuoka.jp',
+ 2822 => 'nishiizu.shizuoka.jp',
+ 2823 => 'numazu.shizuoka.jp',
+ 2824 => 'omaezaki.shizuoka.jp',
+ 2825 => 'shimada.shizuoka.jp',
+ 2826 => 'shimizu.shizuoka.jp',
+ 2827 => 'shimoda.shizuoka.jp',
+ 2828 => 'shizuoka.shizuoka.jp',
+ 2829 => 'susono.shizuoka.jp',
+ 2830 => 'yaizu.shizuoka.jp',
+ 2831 => 'yoshida.shizuoka.jp',
+ 2832 => 'ashikaga.tochigi.jp',
+ 2833 => 'bato.tochigi.jp',
+ 2834 => 'haga.tochigi.jp',
+ 2835 => 'ichikai.tochigi.jp',
+ 2836 => 'iwafune.tochigi.jp',
+ 2837 => 'kaminokawa.tochigi.jp',
+ 2838 => 'kanuma.tochigi.jp',
+ 2839 => 'karasuyama.tochigi.jp',
+ 2840 => 'kuroiso.tochigi.jp',
+ 2841 => 'mashiko.tochigi.jp',
+ 2842 => 'mibu.tochigi.jp',
+ 2843 => 'moka.tochigi.jp',
+ 2844 => 'motegi.tochigi.jp',
+ 2845 => 'nasu.tochigi.jp',
+ 2846 => 'nasushiobara.tochigi.jp',
+ 2847 => 'nikko.tochigi.jp',
+ 2848 => 'nishikata.tochigi.jp',
+ 2849 => 'nogi.tochigi.jp',
+ 2850 => 'ohira.tochigi.jp',
+ 2851 => 'ohtawara.tochigi.jp',
+ 2852 => 'oyama.tochigi.jp',
+ 2853 => 'sakura.tochigi.jp',
+ 2854 => 'sano.tochigi.jp',
+ 2855 => 'shimotsuke.tochigi.jp',
+ 2856 => 'shioya.tochigi.jp',
+ 2857 => 'takanezawa.tochigi.jp',
+ 2858 => 'tochigi.tochigi.jp',
+ 2859 => 'tsuga.tochigi.jp',
+ 2860 => 'ujiie.tochigi.jp',
+ 2861 => 'utsunomiya.tochigi.jp',
+ 2862 => 'yaita.tochigi.jp',
+ 2863 => 'aizumi.tokushima.jp',
+ 2864 => 'anan.tokushima.jp',
+ 2865 => 'ichiba.tokushima.jp',
+ 2866 => 'itano.tokushima.jp',
+ 2867 => 'kainan.tokushima.jp',
+ 2868 => 'komatsushima.tokushima.jp',
+ 2869 => 'matsushige.tokushima.jp',
+ 2870 => 'mima.tokushima.jp',
+ 2871 => 'minami.tokushima.jp',
+ 2872 => 'miyoshi.tokushima.jp',
+ 2873 => 'mugi.tokushima.jp',
+ 2874 => 'nakagawa.tokushima.jp',
+ 2875 => 'naruto.tokushima.jp',
+ 2876 => 'sanagochi.tokushima.jp',
+ 2877 => 'shishikui.tokushima.jp',
+ 2878 => 'tokushima.tokushima.jp',
+ 2879 => 'wajiki.tokushima.jp',
+ 2880 => 'adachi.tokyo.jp',
+ 2881 => 'akiruno.tokyo.jp',
+ 2882 => 'akishima.tokyo.jp',
+ 2883 => 'aogashima.tokyo.jp',
+ 2884 => 'arakawa.tokyo.jp',
+ 2885 => 'bunkyo.tokyo.jp',
+ 2886 => 'chiyoda.tokyo.jp',
+ 2887 => 'chofu.tokyo.jp',
+ 2888 => 'chuo.tokyo.jp',
+ 2889 => 'edogawa.tokyo.jp',
+ 2890 => 'fuchu.tokyo.jp',
+ 2891 => 'fussa.tokyo.jp',
+ 2892 => 'hachijo.tokyo.jp',
+ 2893 => 'hachioji.tokyo.jp',
+ 2894 => 'hamura.tokyo.jp',
+ 2895 => 'higashikurume.tokyo.jp',
+ 2896 => 'higashimurayama.tokyo.jp',
+ 2897 => 'higashiyamato.tokyo.jp',
+ 2898 => 'hino.tokyo.jp',
+ 2899 => 'hinode.tokyo.jp',
+ 2900 => 'hinohara.tokyo.jp',
+ 2901 => 'inagi.tokyo.jp',
+ 2902 => 'itabashi.tokyo.jp',
+ 2903 => 'katsushika.tokyo.jp',
+ 2904 => 'kita.tokyo.jp',
+ 2905 => 'kiyose.tokyo.jp',
+ 2906 => 'kodaira.tokyo.jp',
+ 2907 => 'koganei.tokyo.jp',
+ 2908 => 'kokubunji.tokyo.jp',
+ 2909 => 'komae.tokyo.jp',
+ 2910 => 'koto.tokyo.jp',
+ 2911 => 'kouzushima.tokyo.jp',
+ 2912 => 'kunitachi.tokyo.jp',
+ 2913 => 'machida.tokyo.jp',
+ 2914 => 'meguro.tokyo.jp',
+ 2915 => 'minato.tokyo.jp',
+ 2916 => 'mitaka.tokyo.jp',
+ 2917 => 'mizuho.tokyo.jp',
+ 2918 => 'musashimurayama.tokyo.jp',
+ 2919 => 'musashino.tokyo.jp',
+ 2920 => 'nakano.tokyo.jp',
+ 2921 => 'nerima.tokyo.jp',
+ 2922 => 'ogasawara.tokyo.jp',
+ 2923 => 'okutama.tokyo.jp',
+ 2924 => 'ome.tokyo.jp',
+ 2925 => 'oshima.tokyo.jp',
+ 2926 => 'ota.tokyo.jp',
+ 2927 => 'setagaya.tokyo.jp',
+ 2928 => 'shibuya.tokyo.jp',
+ 2929 => 'shinagawa.tokyo.jp',
+ 2930 => 'shinjuku.tokyo.jp',
+ 2931 => 'suginami.tokyo.jp',
+ 2932 => 'sumida.tokyo.jp',
+ 2933 => 'tachikawa.tokyo.jp',
+ 2934 => 'taito.tokyo.jp',
+ 2935 => 'tama.tokyo.jp',
+ 2936 => 'toshima.tokyo.jp',
+ 2937 => 'chizu.tottori.jp',
+ 2938 => 'hino.tottori.jp',
+ 2939 => 'kawahara.tottori.jp',
+ 2940 => 'koge.tottori.jp',
+ 2941 => 'kotoura.tottori.jp',
+ 2942 => 'misasa.tottori.jp',
+ 2943 => 'nanbu.tottori.jp',
+ 2944 => 'nichinan.tottori.jp',
+ 2945 => 'sakaiminato.tottori.jp',
+ 2946 => 'tottori.tottori.jp',
+ 2947 => 'wakasa.tottori.jp',
+ 2948 => 'yazu.tottori.jp',
+ 2949 => 'yonago.tottori.jp',
+ 2950 => 'asahi.toyama.jp',
+ 2951 => 'fuchu.toyama.jp',
+ 2952 => 'fukumitsu.toyama.jp',
+ 2953 => 'funahashi.toyama.jp',
+ 2954 => 'himi.toyama.jp',
+ 2955 => 'imizu.toyama.jp',
+ 2956 => 'inami.toyama.jp',
+ 2957 => 'johana.toyama.jp',
+ 2958 => 'kamiichi.toyama.jp',
+ 2959 => 'kurobe.toyama.jp',
+ 2960 => 'nakaniikawa.toyama.jp',
+ 2961 => 'namerikawa.toyama.jp',
+ 2962 => 'nanto.toyama.jp',
+ 2963 => 'nyuzen.toyama.jp',
+ 2964 => 'oyabe.toyama.jp',
+ 2965 => 'taira.toyama.jp',
+ 2966 => 'takaoka.toyama.jp',
+ 2967 => 'tateyama.toyama.jp',
+ 2968 => 'toga.toyama.jp',
+ 2969 => 'tonami.toyama.jp',
+ 2970 => 'toyama.toyama.jp',
+ 2971 => 'unazuki.toyama.jp',
+ 2972 => 'uozu.toyama.jp',
+ 2973 => 'yamada.toyama.jp',
+ 2974 => 'arida.wakayama.jp',
+ 2975 => 'aridagawa.wakayama.jp',
+ 2976 => 'gobo.wakayama.jp',
+ 2977 => 'hashimoto.wakayama.jp',
+ 2978 => 'hidaka.wakayama.jp',
+ 2979 => 'hirogawa.wakayama.jp',
+ 2980 => 'inami.wakayama.jp',
+ 2981 => 'iwade.wakayama.jp',
+ 2982 => 'kainan.wakayama.jp',
+ 2983 => 'kamitonda.wakayama.jp',
+ 2984 => 'katsuragi.wakayama.jp',
+ 2985 => 'kimino.wakayama.jp',
+ 2986 => 'kinokawa.wakayama.jp',
+ 2987 => 'kitayama.wakayama.jp',
+ 2988 => 'koya.wakayama.jp',
+ 2989 => 'koza.wakayama.jp',
+ 2990 => 'kozagawa.wakayama.jp',
+ 2991 => 'kudoyama.wakayama.jp',
+ 2992 => 'kushimoto.wakayama.jp',
+ 2993 => 'mihama.wakayama.jp',
+ 2994 => 'misato.wakayama.jp',
+ 2995 => 'nachikatsuura.wakayama.jp',
+ 2996 => 'shingu.wakayama.jp',
+ 2997 => 'shirahama.wakayama.jp',
+ 2998 => 'taiji.wakayama.jp',
+ 2999 => 'tanabe.wakayama.jp',
+ 3000 => 'wakayama.wakayama.jp',
+ 3001 => 'yuasa.wakayama.jp',
+ 3002 => 'yura.wakayama.jp',
+ 3003 => 'asahi.yamagata.jp',
+ 3004 => 'funagata.yamagata.jp',
+ 3005 => 'higashine.yamagata.jp',
+ 3006 => 'iide.yamagata.jp',
+ 3007 => 'kahoku.yamagata.jp',
+ 3008 => 'kaminoyama.yamagata.jp',
+ 3009 => 'kaneyama.yamagata.jp',
+ 3010 => 'kawanishi.yamagata.jp',
+ 3011 => 'mamurogawa.yamagata.jp',
+ 3012 => 'mikawa.yamagata.jp',
+ 3013 => 'murayama.yamagata.jp',
+ 3014 => 'nagai.yamagata.jp',
+ 3015 => 'nakayama.yamagata.jp',
+ 3016 => 'nanyo.yamagata.jp',
+ 3017 => 'nishikawa.yamagata.jp',
+ 3018 => 'obanazawa.yamagata.jp',
+ 3019 => 'oe.yamagata.jp',
+ 3020 => 'oguni.yamagata.jp',
+ 3021 => 'ohkura.yamagata.jp',
+ 3022 => 'oishida.yamagata.jp',
+ 3023 => 'sagae.yamagata.jp',
+ 3024 => 'sakata.yamagata.jp',
+ 3025 => 'sakegawa.yamagata.jp',
+ 3026 => 'shinjo.yamagata.jp',
+ 3027 => 'shirataka.yamagata.jp',
+ 3028 => 'shonai.yamagata.jp',
+ 3029 => 'takahata.yamagata.jp',
+ 3030 => 'tendo.yamagata.jp',
+ 3031 => 'tozawa.yamagata.jp',
+ 3032 => 'tsuruoka.yamagata.jp',
+ 3033 => 'yamagata.yamagata.jp',
+ 3034 => 'yamanobe.yamagata.jp',
+ 3035 => 'yonezawa.yamagata.jp',
+ 3036 => 'yuza.yamagata.jp',
+ 3037 => 'abu.yamaguchi.jp',
+ 3038 => 'hagi.yamaguchi.jp',
+ 3039 => 'hikari.yamaguchi.jp',
+ 3040 => 'hofu.yamaguchi.jp',
+ 3041 => 'iwakuni.yamaguchi.jp',
+ 3042 => 'kudamatsu.yamaguchi.jp',
+ 3043 => 'mitou.yamaguchi.jp',
+ 3044 => 'nagato.yamaguchi.jp',
+ 3045 => 'oshima.yamaguchi.jp',
+ 3046 => 'shimonoseki.yamaguchi.jp',
+ 3047 => 'shunan.yamaguchi.jp',
+ 3048 => 'tabuse.yamaguchi.jp',
+ 3049 => 'tokuyama.yamaguchi.jp',
+ 3050 => 'toyota.yamaguchi.jp',
+ 3051 => 'ube.yamaguchi.jp',
+ 3052 => 'yuu.yamaguchi.jp',
+ 3053 => 'chuo.yamanashi.jp',
+ 3054 => 'doshi.yamanashi.jp',
+ 3055 => 'fuefuki.yamanashi.jp',
+ 3056 => 'fujikawa.yamanashi.jp',
+ 3057 => 'fujikawaguchiko.yamanashi.jp',
+ 3058 => 'fujiyoshida.yamanashi.jp',
+ 3059 => 'hayakawa.yamanashi.jp',
+ 3060 => 'hokuto.yamanashi.jp',
+ 3061 => 'ichikawamisato.yamanashi.jp',
+ 3062 => 'kai.yamanashi.jp',
+ 3063 => 'kofu.yamanashi.jp',
+ 3064 => 'koshu.yamanashi.jp',
+ 3065 => 'kosuge.yamanashi.jp',
+ 3066 => 'minami-alps.yamanashi.jp',
+ 3067 => 'minobu.yamanashi.jp',
+ 3068 => 'nakamichi.yamanashi.jp',
+ 3069 => 'nanbu.yamanashi.jp',
+ 3070 => 'narusawa.yamanashi.jp',
+ 3071 => 'nirasaki.yamanashi.jp',
+ 3072 => 'nishikatsura.yamanashi.jp',
+ 3073 => 'oshino.yamanashi.jp',
+ 3074 => 'otsuki.yamanashi.jp',
+ 3075 => 'showa.yamanashi.jp',
+ 3076 => 'tabayama.yamanashi.jp',
+ 3077 => 'tsuru.yamanashi.jp',
+ 3078 => 'uenohara.yamanashi.jp',
+ 3079 => 'yamanakako.yamanashi.jp',
+ 3080 => 'yamanashi.yamanashi.jp',
+ 3081 => '*.ke',
+ 3082 => 'kg',
+ 3083 => 'org.kg',
+ 3084 => 'net.kg',
+ 3085 => 'com.kg',
+ 3086 => 'edu.kg',
+ 3087 => 'gov.kg',
+ 3088 => 'mil.kg',
+ 3089 => '*.kh',
+ 3090 => 'ki',
+ 3091 => 'edu.ki',
+ 3092 => 'biz.ki',
+ 3093 => 'net.ki',
+ 3094 => 'org.ki',
+ 3095 => 'gov.ki',
+ 3096 => 'info.ki',
+ 3097 => 'com.ki',
+ 3098 => 'km',
+ 3099 => 'org.km',
+ 3100 => 'nom.km',
+ 3101 => 'gov.km',
+ 3102 => 'prd.km',
+ 3103 => 'tm.km',
+ 3104 => 'edu.km',
+ 3105 => 'mil.km',
+ 3106 => 'ass.km',
+ 3107 => 'com.km',
+ 3108 => 'coop.km',
+ 3109 => 'asso.km',
+ 3110 => 'presse.km',
+ 3111 => 'medecin.km',
+ 3112 => 'notaires.km',
+ 3113 => 'pharmaciens.km',
+ 3114 => 'veterinaire.km',
+ 3115 => 'gouv.km',
+ 3116 => 'kn',
+ 3117 => 'net.kn',
+ 3118 => 'org.kn',
+ 3119 => 'edu.kn',
+ 3120 => 'gov.kn',
+ 3121 => 'kp',
+ 3122 => 'com.kp',
+ 3123 => 'edu.kp',
+ 3124 => 'gov.kp',
+ 3125 => 'org.kp',
+ 3126 => 'rep.kp',
+ 3127 => 'tra.kp',
+ 3128 => 'kr',
+ 3129 => 'ac.kr',
+ 3130 => 'co.kr',
+ 3131 => 'es.kr',
+ 3132 => 'go.kr',
+ 3133 => 'hs.kr',
+ 3134 => 'kg.kr',
+ 3135 => 'mil.kr',
+ 3136 => 'ms.kr',
+ 3137 => 'ne.kr',
+ 3138 => 'or.kr',
+ 3139 => 'pe.kr',
+ 3140 => 're.kr',
+ 3141 => 'sc.kr',
+ 3142 => 'busan.kr',
+ 3143 => 'chungbuk.kr',
+ 3144 => 'chungnam.kr',
+ 3145 => 'daegu.kr',
+ 3146 => 'daejeon.kr',
+ 3147 => 'gangwon.kr',
+ 3148 => 'gwangju.kr',
+ 3149 => 'gyeongbuk.kr',
+ 3150 => 'gyeonggi.kr',
+ 3151 => 'gyeongnam.kr',
+ 3152 => 'incheon.kr',
+ 3153 => 'jeju.kr',
+ 3154 => 'jeonbuk.kr',
+ 3155 => 'jeonnam.kr',
+ 3156 => 'seoul.kr',
+ 3157 => 'ulsan.kr',
+ 3158 => '*.kw',
+ 3159 => 'ky',
+ 3160 => 'edu.ky',
+ 3161 => 'gov.ky',
+ 3162 => 'com.ky',
+ 3163 => 'org.ky',
+ 3164 => 'net.ky',
+ 3165 => 'kz',
+ 3166 => 'org.kz',
+ 3167 => 'edu.kz',
+ 3168 => 'net.kz',
+ 3169 => 'gov.kz',
+ 3170 => 'mil.kz',
+ 3171 => 'com.kz',
+ 3172 => 'la',
+ 3173 => 'int.la',
+ 3174 => 'net.la',
+ 3175 => 'info.la',
+ 3176 => 'edu.la',
+ 3177 => 'gov.la',
+ 3178 => 'per.la',
+ 3179 => 'com.la',
+ 3180 => 'org.la',
+ 3181 => 'lb',
+ 3182 => 'com.lb',
+ 3183 => 'edu.lb',
+ 3184 => 'gov.lb',
+ 3185 => 'net.lb',
+ 3186 => 'org.lb',
+ 3187 => 'lc',
+ 3188 => 'com.lc',
+ 3189 => 'net.lc',
+ 3190 => 'co.lc',
+ 3191 => 'org.lc',
+ 3192 => 'edu.lc',
+ 3193 => 'gov.lc',
+ 3194 => 'li',
+ 3195 => 'lk',
+ 3196 => 'gov.lk',
+ 3197 => 'sch.lk',
+ 3198 => 'net.lk',
+ 3199 => 'int.lk',
+ 3200 => 'com.lk',
+ 3201 => 'org.lk',
+ 3202 => 'edu.lk',
+ 3203 => 'ngo.lk',
+ 3204 => 'soc.lk',
+ 3205 => 'web.lk',
+ 3206 => 'ltd.lk',
+ 3207 => 'assn.lk',
+ 3208 => 'grp.lk',
+ 3209 => 'hotel.lk',
+ 3210 => 'ac.lk',
+ 3211 => 'lr',
+ 3212 => 'com.lr',
+ 3213 => 'edu.lr',
+ 3214 => 'gov.lr',
+ 3215 => 'org.lr',
+ 3216 => 'net.lr',
+ 3217 => 'ls',
+ 3218 => 'co.ls',
+ 3219 => 'org.ls',
+ 3220 => 'lt',
+ 3221 => 'gov.lt',
+ 3222 => 'lu',
+ 3223 => 'lv',
+ 3224 => 'com.lv',
+ 3225 => 'edu.lv',
+ 3226 => 'gov.lv',
+ 3227 => 'org.lv',
+ 3228 => 'mil.lv',
+ 3229 => 'id.lv',
+ 3230 => 'net.lv',
+ 3231 => 'asn.lv',
+ 3232 => 'conf.lv',
+ 3233 => 'ly',
+ 3234 => 'com.ly',
+ 3235 => 'net.ly',
+ 3236 => 'gov.ly',
+ 3237 => 'plc.ly',
+ 3238 => 'edu.ly',
+ 3239 => 'sch.ly',
+ 3240 => 'med.ly',
+ 3241 => 'org.ly',
+ 3242 => 'id.ly',
+ 3243 => 'ma',
+ 3244 => 'co.ma',
+ 3245 => 'net.ma',
+ 3246 => 'gov.ma',
+ 3247 => 'org.ma',
+ 3248 => 'ac.ma',
+ 3249 => 'press.ma',
+ 3250 => 'mc',
+ 3251 => 'tm.mc',
+ 3252 => 'asso.mc',
+ 3253 => 'md',
+ 3254 => 'me',
+ 3255 => 'co.me',
+ 3256 => 'net.me',
+ 3257 => 'org.me',
+ 3258 => 'edu.me',
+ 3259 => 'ac.me',
+ 3260 => 'gov.me',
+ 3261 => 'its.me',
+ 3262 => 'priv.me',
+ 3263 => 'mg',
+ 3264 => 'org.mg',
+ 3265 => 'nom.mg',
+ 3266 => 'gov.mg',
+ 3267 => 'prd.mg',
+ 3268 => 'tm.mg',
+ 3269 => 'edu.mg',
+ 3270 => 'mil.mg',
+ 3271 => 'com.mg',
+ 3272 => 'co.mg',
+ 3273 => 'mh',
+ 3274 => 'mil',
+ 3275 => 'mk',
+ 3276 => 'com.mk',
+ 3277 => 'org.mk',
+ 3278 => 'net.mk',
+ 3279 => 'edu.mk',
+ 3280 => 'gov.mk',
+ 3281 => 'inf.mk',
+ 3282 => 'name.mk',
+ 3283 => 'ml',
+ 3284 => 'com.ml',
+ 3285 => 'edu.ml',
+ 3286 => 'gouv.ml',
+ 3287 => 'gov.ml',
+ 3288 => 'net.ml',
+ 3289 => 'org.ml',
+ 3290 => 'presse.ml',
+ 3291 => '*.mm',
+ 3292 => 'mn',
+ 3293 => 'gov.mn',
+ 3294 => 'edu.mn',
+ 3295 => 'org.mn',
+ 3296 => 'mo',
+ 3297 => 'com.mo',
+ 3298 => 'net.mo',
+ 3299 => 'org.mo',
+ 3300 => 'edu.mo',
+ 3301 => 'gov.mo',
+ 3302 => 'mobi',
+ 3303 => 'mp',
+ 3304 => 'mq',
+ 3305 => 'mr',
+ 3306 => 'gov.mr',
+ 3307 => 'ms',
+ 3308 => 'com.ms',
+ 3309 => 'edu.ms',
+ 3310 => 'gov.ms',
+ 3311 => 'net.ms',
+ 3312 => 'org.ms',
+ 3313 => 'mt',
+ 3314 => 'com.mt',
+ 3315 => 'edu.mt',
+ 3316 => 'net.mt',
+ 3317 => 'org.mt',
+ 3318 => 'mu',
+ 3319 => 'com.mu',
+ 3320 => 'net.mu',
+ 3321 => 'org.mu',
+ 3322 => 'gov.mu',
+ 3323 => 'ac.mu',
+ 3324 => 'co.mu',
+ 3325 => 'or.mu',
+ 3326 => 'museum',
+ 3327 => 'academy.museum',
+ 3328 => 'agriculture.museum',
+ 3329 => 'air.museum',
+ 3330 => 'airguard.museum',
+ 3331 => 'alabama.museum',
+ 3332 => 'alaska.museum',
+ 3333 => 'amber.museum',
+ 3334 => 'ambulance.museum',
+ 3335 => 'american.museum',
+ 3336 => 'americana.museum',
+ 3337 => 'americanantiques.museum',
+ 3338 => 'americanart.museum',
+ 3339 => 'amsterdam.museum',
+ 3340 => 'and.museum',
+ 3341 => 'annefrank.museum',
+ 3342 => 'anthro.museum',
+ 3343 => 'anthropology.museum',
+ 3344 => 'antiques.museum',
+ 3345 => 'aquarium.museum',
+ 3346 => 'arboretum.museum',
+ 3347 => 'archaeological.museum',
+ 3348 => 'archaeology.museum',
+ 3349 => 'architecture.museum',
+ 3350 => 'art.museum',
+ 3351 => 'artanddesign.museum',
+ 3352 => 'artcenter.museum',
+ 3353 => 'artdeco.museum',
+ 3354 => 'arteducation.museum',
+ 3355 => 'artgallery.museum',
+ 3356 => 'arts.museum',
+ 3357 => 'artsandcrafts.museum',
+ 3358 => 'asmatart.museum',
+ 3359 => 'assassination.museum',
+ 3360 => 'assisi.museum',
+ 3361 => 'association.museum',
+ 3362 => 'astronomy.museum',
+ 3363 => 'atlanta.museum',
+ 3364 => 'austin.museum',
+ 3365 => 'australia.museum',
+ 3366 => 'automotive.museum',
+ 3367 => 'aviation.museum',
+ 3368 => 'axis.museum',
+ 3369 => 'badajoz.museum',
+ 3370 => 'baghdad.museum',
+ 3371 => 'bahn.museum',
+ 3372 => 'bale.museum',
+ 3373 => 'baltimore.museum',
+ 3374 => 'barcelona.museum',
+ 3375 => 'baseball.museum',
+ 3376 => 'basel.museum',
+ 3377 => 'baths.museum',
+ 3378 => 'bauern.museum',
+ 3379 => 'beauxarts.museum',
+ 3380 => 'beeldengeluid.museum',
+ 3381 => 'bellevue.museum',
+ 3382 => 'bergbau.museum',
+ 3383 => 'berkeley.museum',
+ 3384 => 'berlin.museum',
+ 3385 => 'bern.museum',
+ 3386 => 'bible.museum',
+ 3387 => 'bilbao.museum',
+ 3388 => 'bill.museum',
+ 3389 => 'birdart.museum',
+ 3390 => 'birthplace.museum',
+ 3391 => 'bonn.museum',
+ 3392 => 'boston.museum',
+ 3393 => 'botanical.museum',
+ 3394 => 'botanicalgarden.museum',
+ 3395 => 'botanicgarden.museum',
+ 3396 => 'botany.museum',
+ 3397 => 'brandywinevalley.museum',
+ 3398 => 'brasil.museum',
+ 3399 => 'bristol.museum',
+ 3400 => 'british.museum',
+ 3401 => 'britishcolumbia.museum',
+ 3402 => 'broadcast.museum',
+ 3403 => 'brunel.museum',
+ 3404 => 'brussel.museum',
+ 3405 => 'brussels.museum',
+ 3406 => 'bruxelles.museum',
+ 3407 => 'building.museum',
+ 3408 => 'burghof.museum',
+ 3409 => 'bus.museum',
+ 3410 => 'bushey.museum',
+ 3411 => 'cadaques.museum',
+ 3412 => 'california.museum',
+ 3413 => 'cambridge.museum',
+ 3414 => 'can.museum',
+ 3415 => 'canada.museum',
+ 3416 => 'capebreton.museum',
+ 3417 => 'carrier.museum',
+ 3418 => 'cartoonart.museum',
+ 3419 => 'casadelamoneda.museum',
+ 3420 => 'castle.museum',
+ 3421 => 'castres.museum',
+ 3422 => 'celtic.museum',
+ 3423 => 'center.museum',
+ 3424 => 'chattanooga.museum',
+ 3425 => 'cheltenham.museum',
+ 3426 => 'chesapeakebay.museum',
+ 3427 => 'chicago.museum',
+ 3428 => 'children.museum',
+ 3429 => 'childrens.museum',
+ 3430 => 'childrensgarden.museum',
+ 3431 => 'chiropractic.museum',
+ 3432 => 'chocolate.museum',
+ 3433 => 'christiansburg.museum',
+ 3434 => 'cincinnati.museum',
+ 3435 => 'cinema.museum',
+ 3436 => 'circus.museum',
+ 3437 => 'civilisation.museum',
+ 3438 => 'civilization.museum',
+ 3439 => 'civilwar.museum',
+ 3440 => 'clinton.museum',
+ 3441 => 'clock.museum',
+ 3442 => 'coal.museum',
+ 3443 => 'coastaldefence.museum',
+ 3444 => 'cody.museum',
+ 3445 => 'coldwar.museum',
+ 3446 => 'collection.museum',
+ 3447 => 'colonialwilliamsburg.museum',
+ 3448 => 'coloradoplateau.museum',
+ 3449 => 'columbia.museum',
+ 3450 => 'columbus.museum',
+ 3451 => 'communication.museum',
+ 3452 => 'communications.museum',
+ 3453 => 'community.museum',
+ 3454 => 'computer.museum',
+ 3455 => 'computerhistory.museum',
+ 3456 => 'comunicações.museum',
+ 3457 => 'contemporary.museum',
+ 3458 => 'contemporaryart.museum',
+ 3459 => 'convent.museum',
+ 3460 => 'copenhagen.museum',
+ 3461 => 'corporation.museum',
+ 3462 => 'correios-e-telecomunicações.museum',
+ 3463 => 'corvette.museum',
+ 3464 => 'costume.museum',
+ 3465 => 'countryestate.museum',
+ 3466 => 'county.museum',
+ 3467 => 'crafts.museum',
+ 3468 => 'cranbrook.museum',
+ 3469 => 'creation.museum',
+ 3470 => 'cultural.museum',
+ 3471 => 'culturalcenter.museum',
+ 3472 => 'culture.museum',
+ 3473 => 'cyber.museum',
+ 3474 => 'cymru.museum',
+ 3475 => 'dali.museum',
+ 3476 => 'dallas.museum',
+ 3477 => 'database.museum',
+ 3478 => 'ddr.museum',
+ 3479 => 'decorativearts.museum',
+ 3480 => 'delaware.museum',
+ 3481 => 'delmenhorst.museum',
+ 3482 => 'denmark.museum',
+ 3483 => 'depot.museum',
+ 3484 => 'design.museum',
+ 3485 => 'detroit.museum',
+ 3486 => 'dinosaur.museum',
+ 3487 => 'discovery.museum',
+ 3488 => 'dolls.museum',
+ 3489 => 'donostia.museum',
+ 3490 => 'durham.museum',
+ 3491 => 'eastafrica.museum',
+ 3492 => 'eastcoast.museum',
+ 3493 => 'education.museum',
+ 3494 => 'educational.museum',
+ 3495 => 'egyptian.museum',
+ 3496 => 'eisenbahn.museum',
+ 3497 => 'elburg.museum',
+ 3498 => 'elvendrell.museum',
+ 3499 => 'embroidery.museum',
+ 3500 => 'encyclopedic.museum',
+ 3501 => 'england.museum',
+ 3502 => 'entomology.museum',
+ 3503 => 'environment.museum',
+ 3504 => 'environmentalconservation.museum',
+ 3505 => 'epilepsy.museum',
+ 3506 => 'essex.museum',
+ 3507 => 'estate.museum',
+ 3508 => 'ethnology.museum',
+ 3509 => 'exeter.museum',
+ 3510 => 'exhibition.museum',
+ 3511 => 'family.museum',
+ 3512 => 'farm.museum',
+ 3513 => 'farmequipment.museum',
+ 3514 => 'farmers.museum',
+ 3515 => 'farmstead.museum',
+ 3516 => 'field.museum',
+ 3517 => 'figueres.museum',
+ 3518 => 'filatelia.museum',
+ 3519 => 'film.museum',
+ 3520 => 'fineart.museum',
+ 3521 => 'finearts.museum',
+ 3522 => 'finland.museum',
+ 3523 => 'flanders.museum',
+ 3524 => 'florida.museum',
+ 3525 => 'force.museum',
+ 3526 => 'fortmissoula.museum',
+ 3527 => 'fortworth.museum',
+ 3528 => 'foundation.museum',
+ 3529 => 'francaise.museum',
+ 3530 => 'frankfurt.museum',
+ 3531 => 'franziskaner.museum',
+ 3532 => 'freemasonry.museum',
+ 3533 => 'freiburg.museum',
+ 3534 => 'fribourg.museum',
+ 3535 => 'frog.museum',
+ 3536 => 'fundacio.museum',
+ 3537 => 'furniture.museum',
+ 3538 => 'gallery.museum',
+ 3539 => 'garden.museum',
+ 3540 => 'gateway.museum',
+ 3541 => 'geelvinck.museum',
+ 3542 => 'gemological.museum',
+ 3543 => 'geology.museum',
+ 3544 => 'georgia.museum',
+ 3545 => 'giessen.museum',
+ 3546 => 'glas.museum',
+ 3547 => 'glass.museum',
+ 3548 => 'gorge.museum',
+ 3549 => 'grandrapids.museum',
+ 3550 => 'graz.museum',
+ 3551 => 'guernsey.museum',
+ 3552 => 'halloffame.museum',
+ 3553 => 'hamburg.museum',
+ 3554 => 'handson.museum',
+ 3555 => 'harvestcelebration.museum',
+ 3556 => 'hawaii.museum',
+ 3557 => 'health.museum',
+ 3558 => 'heimatunduhren.museum',
+ 3559 => 'hellas.museum',
+ 3560 => 'helsinki.museum',
+ 3561 => 'hembygdsforbund.museum',
+ 3562 => 'heritage.museum',
+ 3563 => 'histoire.museum',
+ 3564 => 'historical.museum',
+ 3565 => 'historicalsociety.museum',
+ 3566 => 'historichouses.museum',
+ 3567 => 'historisch.museum',
+ 3568 => 'historisches.museum',
+ 3569 => 'history.museum',
+ 3570 => 'historyofscience.museum',
+ 3571 => 'horology.museum',
+ 3572 => 'house.museum',
+ 3573 => 'humanities.museum',
+ 3574 => 'illustration.museum',
+ 3575 => 'imageandsound.museum',
+ 3576 => 'indian.museum',
+ 3577 => 'indiana.museum',
+ 3578 => 'indianapolis.museum',
+ 3579 => 'indianmarket.museum',
+ 3580 => 'intelligence.museum',
+ 3581 => 'interactive.museum',
+ 3582 => 'iraq.museum',
+ 3583 => 'iron.museum',
+ 3584 => 'isleofman.museum',
+ 3585 => 'jamison.museum',
+ 3586 => 'jefferson.museum',
+ 3587 => 'jerusalem.museum',
+ 3588 => 'jewelry.museum',
+ 3589 => 'jewish.museum',
+ 3590 => 'jewishart.museum',
+ 3591 => 'jfk.museum',
+ 3592 => 'journalism.museum',
+ 3593 => 'judaica.museum',
+ 3594 => 'judygarland.museum',
+ 3595 => 'juedisches.museum',
+ 3596 => 'juif.museum',
+ 3597 => 'karate.museum',
+ 3598 => 'karikatur.museum',
+ 3599 => 'kids.museum',
+ 3600 => 'koebenhavn.museum',
+ 3601 => 'koeln.museum',
+ 3602 => 'kunst.museum',
+ 3603 => 'kunstsammlung.museum',
+ 3604 => 'kunstunddesign.museum',
+ 3605 => 'labor.museum',
+ 3606 => 'labour.museum',
+ 3607 => 'lajolla.museum',
+ 3608 => 'lancashire.museum',
+ 3609 => 'landes.museum',
+ 3610 => 'lans.museum',
+ 3611 => 'läns.museum',
+ 3612 => 'larsson.museum',
+ 3613 => 'lewismiller.museum',
+ 3614 => 'lincoln.museum',
+ 3615 => 'linz.museum',
+ 3616 => 'living.museum',
+ 3617 => 'livinghistory.museum',
+ 3618 => 'localhistory.museum',
+ 3619 => 'london.museum',
+ 3620 => 'losangeles.museum',
+ 3621 => 'louvre.museum',
+ 3622 => 'loyalist.museum',
+ 3623 => 'lucerne.museum',
+ 3624 => 'luxembourg.museum',
+ 3625 => 'luzern.museum',
+ 3626 => 'mad.museum',
+ 3627 => 'madrid.museum',
+ 3628 => 'mallorca.museum',
+ 3629 => 'manchester.museum',
+ 3630 => 'mansion.museum',
+ 3631 => 'mansions.museum',
+ 3632 => 'manx.museum',
+ 3633 => 'marburg.museum',
+ 3634 => 'maritime.museum',
+ 3635 => 'maritimo.museum',
+ 3636 => 'maryland.museum',
+ 3637 => 'marylhurst.museum',
+ 3638 => 'media.museum',
+ 3639 => 'medical.museum',
+ 3640 => 'medizinhistorisches.museum',
+ 3641 => 'meeres.museum',
+ 3642 => 'memorial.museum',
+ 3643 => 'mesaverde.museum',
+ 3644 => 'michigan.museum',
+ 3645 => 'midatlantic.museum',
+ 3646 => 'military.museum',
+ 3647 => 'mill.museum',
+ 3648 => 'miners.museum',
+ 3649 => 'mining.museum',
+ 3650 => 'minnesota.museum',
+ 3651 => 'missile.museum',
+ 3652 => 'missoula.museum',
+ 3653 => 'modern.museum',
+ 3654 => 'moma.museum',
+ 3655 => 'money.museum',
+ 3656 => 'monmouth.museum',
+ 3657 => 'monticello.museum',
+ 3658 => 'montreal.museum',
+ 3659 => 'moscow.museum',
+ 3660 => 'motorcycle.museum',
+ 3661 => 'muenchen.museum',
+ 3662 => 'muenster.museum',
+ 3663 => 'mulhouse.museum',
+ 3664 => 'muncie.museum',
+ 3665 => 'museet.museum',
+ 3666 => 'museumcenter.museum',
+ 3667 => 'museumvereniging.museum',
+ 3668 => 'music.museum',
+ 3669 => 'national.museum',
+ 3670 => 'nationalfirearms.museum',
+ 3671 => 'nationalheritage.museum',
+ 3672 => 'nativeamerican.museum',
+ 3673 => 'naturalhistory.museum',
+ 3674 => 'naturalhistorymuseum.museum',
+ 3675 => 'naturalsciences.museum',
+ 3676 => 'nature.museum',
+ 3677 => 'naturhistorisches.museum',
+ 3678 => 'natuurwetenschappen.museum',
+ 3679 => 'naumburg.museum',
+ 3680 => 'naval.museum',
+ 3681 => 'nebraska.museum',
+ 3682 => 'neues.museum',
+ 3683 => 'newhampshire.museum',
+ 3684 => 'newjersey.museum',
+ 3685 => 'newmexico.museum',
+ 3686 => 'newport.museum',
+ 3687 => 'newspaper.museum',
+ 3688 => 'newyork.museum',
+ 3689 => 'niepce.museum',
+ 3690 => 'norfolk.museum',
+ 3691 => 'north.museum',
+ 3692 => 'nrw.museum',
+ 3693 => 'nuernberg.museum',
+ 3694 => 'nuremberg.museum',
+ 3695 => 'nyc.museum',
+ 3696 => 'nyny.museum',
+ 3697 => 'oceanographic.museum',
+ 3698 => 'oceanographique.museum',
+ 3699 => 'omaha.museum',
+ 3700 => 'online.museum',
+ 3701 => 'ontario.museum',
+ 3702 => 'openair.museum',
+ 3703 => 'oregon.museum',
+ 3704 => 'oregontrail.museum',
+ 3705 => 'otago.museum',
+ 3706 => 'oxford.museum',
+ 3707 => 'pacific.museum',
+ 3708 => 'paderborn.museum',
+ 3709 => 'palace.museum',
+ 3710 => 'paleo.museum',
+ 3711 => 'palmsprings.museum',
+ 3712 => 'panama.museum',
+ 3713 => 'paris.museum',
+ 3714 => 'pasadena.museum',
+ 3715 => 'pharmacy.museum',
+ 3716 => 'philadelphia.museum',
+ 3717 => 'philadelphiaarea.museum',
+ 3718 => 'philately.museum',
+ 3719 => 'phoenix.museum',
+ 3720 => 'photography.museum',
+ 3721 => 'pilots.museum',
+ 3722 => 'pittsburgh.museum',
+ 3723 => 'planetarium.museum',
+ 3724 => 'plantation.museum',
+ 3725 => 'plants.museum',
+ 3726 => 'plaza.museum',
+ 3727 => 'portal.museum',
+ 3728 => 'portland.museum',
+ 3729 => 'portlligat.museum',
+ 3730 => 'posts-and-telecommunications.museum',
+ 3731 => 'preservation.museum',
+ 3732 => 'presidio.museum',
+ 3733 => 'press.museum',
+ 3734 => 'project.museum',
+ 3735 => 'public.museum',
+ 3736 => 'pubol.museum',
+ 3737 => 'quebec.museum',
+ 3738 => 'railroad.museum',
+ 3739 => 'railway.museum',
+ 3740 => 'research.museum',
+ 3741 => 'resistance.museum',
+ 3742 => 'riodejaneiro.museum',
+ 3743 => 'rochester.museum',
+ 3744 => 'rockart.museum',
+ 3745 => 'roma.museum',
+ 3746 => 'russia.museum',
+ 3747 => 'saintlouis.museum',
+ 3748 => 'salem.museum',
+ 3749 => 'salvadordali.museum',
+ 3750 => 'salzburg.museum',
+ 3751 => 'sandiego.museum',
+ 3752 => 'sanfrancisco.museum',
+ 3753 => 'santabarbara.museum',
+ 3754 => 'santacruz.museum',
+ 3755 => 'santafe.museum',
+ 3756 => 'saskatchewan.museum',
+ 3757 => 'satx.museum',
+ 3758 => 'savannahga.museum',
+ 3759 => 'schlesisches.museum',
+ 3760 => 'schoenbrunn.museum',
+ 3761 => 'schokoladen.museum',
+ 3762 => 'school.museum',
+ 3763 => 'schweiz.museum',
+ 3764 => 'science.museum',
+ 3765 => 'scienceandhistory.museum',
+ 3766 => 'scienceandindustry.museum',
+ 3767 => 'sciencecenter.museum',
+ 3768 => 'sciencecenters.museum',
+ 3769 => 'science-fiction.museum',
+ 3770 => 'sciencehistory.museum',
+ 3771 => 'sciences.museum',
+ 3772 => 'sciencesnaturelles.museum',
+ 3773 => 'scotland.museum',
+ 3774 => 'seaport.museum',
+ 3775 => 'settlement.museum',
+ 3776 => 'settlers.museum',
+ 3777 => 'shell.museum',
+ 3778 => 'sherbrooke.museum',
+ 3779 => 'sibenik.museum',
+ 3780 => 'silk.museum',
+ 3781 => 'ski.museum',
+ 3782 => 'skole.museum',
+ 3783 => 'society.museum',
+ 3784 => 'sologne.museum',
+ 3785 => 'soundandvision.museum',
+ 3786 => 'southcarolina.museum',
+ 3787 => 'southwest.museum',
+ 3788 => 'space.museum',
+ 3789 => 'spy.museum',
+ 3790 => 'square.museum',
+ 3791 => 'stadt.museum',
+ 3792 => 'stalbans.museum',
+ 3793 => 'starnberg.museum',
+ 3794 => 'state.museum',
+ 3795 => 'stateofdelaware.museum',
+ 3796 => 'station.museum',
+ 3797 => 'steam.museum',
+ 3798 => 'steiermark.museum',
+ 3799 => 'stjohn.museum',
+ 3800 => 'stockholm.museum',
+ 3801 => 'stpetersburg.museum',
+ 3802 => 'stuttgart.museum',
+ 3803 => 'suisse.museum',
+ 3804 => 'surgeonshall.museum',
+ 3805 => 'surrey.museum',
+ 3806 => 'svizzera.museum',
+ 3807 => 'sweden.museum',
+ 3808 => 'sydney.museum',
+ 3809 => 'tank.museum',
+ 3810 => 'tcm.museum',
+ 3811 => 'technology.museum',
+ 3812 => 'telekommunikation.museum',
+ 3813 => 'television.museum',
+ 3814 => 'texas.museum',
+ 3815 => 'textile.museum',
+ 3816 => 'theater.museum',
+ 3817 => 'time.museum',
+ 3818 => 'timekeeping.museum',
+ 3819 => 'topology.museum',
+ 3820 => 'torino.museum',
+ 3821 => 'touch.museum',
+ 3822 => 'town.museum',
+ 3823 => 'transport.museum',
+ 3824 => 'tree.museum',
+ 3825 => 'trolley.museum',
+ 3826 => 'trust.museum',
+ 3827 => 'trustee.museum',
+ 3828 => 'uhren.museum',
+ 3829 => 'ulm.museum',
+ 3830 => 'undersea.museum',
+ 3831 => 'university.museum',
+ 3832 => 'usa.museum',
+ 3833 => 'usantiques.museum',
+ 3834 => 'usarts.museum',
+ 3835 => 'uscountryestate.museum',
+ 3836 => 'usculture.museum',
+ 3837 => 'usdecorativearts.museum',
+ 3838 => 'usgarden.museum',
+ 3839 => 'ushistory.museum',
+ 3840 => 'ushuaia.museum',
+ 3841 => 'uslivinghistory.museum',
+ 3842 => 'utah.museum',
+ 3843 => 'uvic.museum',
+ 3844 => 'valley.museum',
+ 3845 => 'vantaa.museum',
+ 3846 => 'versailles.museum',
+ 3847 => 'viking.museum',
+ 3848 => 'village.museum',
+ 3849 => 'virginia.museum',
+ 3850 => 'virtual.museum',
+ 3851 => 'virtuel.museum',
+ 3852 => 'vlaanderen.museum',
+ 3853 => 'volkenkunde.museum',
+ 3854 => 'wales.museum',
+ 3855 => 'wallonie.museum',
+ 3856 => 'war.museum',
+ 3857 => 'washingtondc.museum',
+ 3858 => 'watchandclock.museum',
+ 3859 => 'watch-and-clock.museum',
+ 3860 => 'western.museum',
+ 3861 => 'westfalen.museum',
+ 3862 => 'whaling.museum',
+ 3863 => 'wildlife.museum',
+ 3864 => 'williamsburg.museum',
+ 3865 => 'windmill.museum',
+ 3866 => 'workshop.museum',
+ 3867 => 'york.museum',
+ 3868 => 'yorkshire.museum',
+ 3869 => 'yosemite.museum',
+ 3870 => 'youth.museum',
+ 3871 => 'zoological.museum',
+ 3872 => 'zoology.museum',
+ 3873 => 'ירושלים.museum',
+ 3874 => 'иком.museum',
+ 3875 => 'mv',
+ 3876 => 'aero.mv',
+ 3877 => 'biz.mv',
+ 3878 => 'com.mv',
+ 3879 => 'coop.mv',
+ 3880 => 'edu.mv',
+ 3881 => 'gov.mv',
+ 3882 => 'info.mv',
+ 3883 => 'int.mv',
+ 3884 => 'mil.mv',
+ 3885 => 'museum.mv',
+ 3886 => 'name.mv',
+ 3887 => 'net.mv',
+ 3888 => 'org.mv',
+ 3889 => 'pro.mv',
+ 3890 => 'mw',
+ 3891 => 'ac.mw',
+ 3892 => 'biz.mw',
+ 3893 => 'co.mw',
+ 3894 => 'com.mw',
+ 3895 => 'coop.mw',
+ 3896 => 'edu.mw',
+ 3897 => 'gov.mw',
+ 3898 => 'int.mw',
+ 3899 => 'museum.mw',
+ 3900 => 'net.mw',
+ 3901 => 'org.mw',
+ 3902 => 'mx',
+ 3903 => 'com.mx',
+ 3904 => 'org.mx',
+ 3905 => 'gob.mx',
+ 3906 => 'edu.mx',
+ 3907 => 'net.mx',
+ 3908 => 'my',
+ 3909 => 'com.my',
+ 3910 => 'net.my',
+ 3911 => 'org.my',
+ 3912 => 'gov.my',
+ 3913 => 'edu.my',
+ 3914 => 'mil.my',
+ 3915 => 'name.my',
+ 3916 => '*.mz',
+ 3917 => '!teledata.mz',
+ 3918 => 'na',
+ 3919 => 'info.na',
+ 3920 => 'pro.na',
+ 3921 => 'name.na',
+ 3922 => 'school.na',
+ 3923 => 'or.na',
+ 3924 => 'dr.na',
+ 3925 => 'us.na',
+ 3926 => 'mx.na',
+ 3927 => 'ca.na',
+ 3928 => 'in.na',
+ 3929 => 'cc.na',
+ 3930 => 'tv.na',
+ 3931 => 'ws.na',
+ 3932 => 'mobi.na',
+ 3933 => 'co.na',
+ 3934 => 'com.na',
+ 3935 => 'org.na',
+ 3936 => 'name',
+ 3937 => 'nc',
+ 3938 => 'asso.nc',
+ 3939 => 'ne',
+ 3940 => 'net',
+ 3941 => 'nf',
+ 3942 => 'com.nf',
+ 3943 => 'net.nf',
+ 3944 => 'per.nf',
+ 3945 => 'rec.nf',
+ 3946 => 'web.nf',
+ 3947 => 'arts.nf',
+ 3948 => 'firm.nf',
+ 3949 => 'info.nf',
+ 3950 => 'other.nf',
+ 3951 => 'store.nf',
+ 3952 => 'ng',
+ 3953 => 'com.ng',
+ 3954 => 'edu.ng',
+ 3955 => 'gov.ng',
+ 3956 => 'i.ng',
+ 3957 => 'mil.ng',
+ 3958 => 'mobi.ng',
+ 3959 => 'name.ng',
+ 3960 => 'net.ng',
+ 3961 => 'org.ng',
+ 3962 => 'sch.ng',
+ 3963 => 'com.ni',
+ 3964 => 'gob.ni',
+ 3965 => 'edu.ni',
+ 3966 => 'org.ni',
+ 3967 => 'nom.ni',
+ 3968 => 'net.ni',
+ 3969 => 'mil.ni',
+ 3970 => 'co.ni',
+ 3971 => 'biz.ni',
+ 3972 => 'web.ni',
+ 3973 => 'int.ni',
+ 3974 => 'ac.ni',
+ 3975 => 'in.ni',
+ 3976 => 'info.ni',
+ 3977 => 'nl',
+ 3978 => 'bv.nl',
+ 3979 => 'no',
+ 3980 => 'fhs.no',
+ 3981 => 'vgs.no',
+ 3982 => 'fylkesbibl.no',
+ 3983 => 'folkebibl.no',
+ 3984 => 'museum.no',
+ 3985 => 'idrett.no',
+ 3986 => 'priv.no',
+ 3987 => 'mil.no',
+ 3988 => 'stat.no',
+ 3989 => 'dep.no',
+ 3990 => 'kommune.no',
+ 3991 => 'herad.no',
+ 3992 => 'aa.no',
+ 3993 => 'ah.no',
+ 3994 => 'bu.no',
+ 3995 => 'fm.no',
+ 3996 => 'hl.no',
+ 3997 => 'hm.no',
+ 3998 => 'jan-mayen.no',
+ 3999 => 'mr.no',
+ 4000 => 'nl.no',
+ 4001 => 'nt.no',
+ 4002 => 'of.no',
+ 4003 => 'ol.no',
+ 4004 => 'oslo.no',
+ 4005 => 'rl.no',
+ 4006 => 'sf.no',
+ 4007 => 'st.no',
+ 4008 => 'svalbard.no',
+ 4009 => 'tm.no',
+ 4010 => 'tr.no',
+ 4011 => 'va.no',
+ 4012 => 'vf.no',
+ 4013 => 'gs.aa.no',
+ 4014 => 'gs.ah.no',
+ 4015 => 'gs.bu.no',
+ 4016 => 'gs.fm.no',
+ 4017 => 'gs.hl.no',
+ 4018 => 'gs.hm.no',
+ 4019 => 'gs.jan-mayen.no',
+ 4020 => 'gs.mr.no',
+ 4021 => 'gs.nl.no',
+ 4022 => 'gs.nt.no',
+ 4023 => 'gs.of.no',
+ 4024 => 'gs.ol.no',
+ 4025 => 'gs.oslo.no',
+ 4026 => 'gs.rl.no',
+ 4027 => 'gs.sf.no',
+ 4028 => 'gs.st.no',
+ 4029 => 'gs.svalbard.no',
+ 4030 => 'gs.tm.no',
+ 4031 => 'gs.tr.no',
+ 4032 => 'gs.va.no',
+ 4033 => 'gs.vf.no',
+ 4034 => 'akrehamn.no',
+ 4035 => 'åkrehamn.no',
+ 4036 => 'algard.no',
+ 4037 => 'ålgård.no',
+ 4038 => 'arna.no',
+ 4039 => 'brumunddal.no',
+ 4040 => 'bryne.no',
+ 4041 => 'bronnoysund.no',
+ 4042 => 'brønnøysund.no',
+ 4043 => 'drobak.no',
+ 4044 => 'drøbak.no',
+ 4045 => 'egersund.no',
+ 4046 => 'fetsund.no',
+ 4047 => 'floro.no',
+ 4048 => 'florø.no',
+ 4049 => 'fredrikstad.no',
+ 4050 => 'hokksund.no',
+ 4051 => 'honefoss.no',
+ 4052 => 'hønefoss.no',
+ 4053 => 'jessheim.no',
+ 4054 => 'jorpeland.no',
+ 4055 => 'jørpeland.no',
+ 4056 => 'kirkenes.no',
+ 4057 => 'kopervik.no',
+ 4058 => 'krokstadelva.no',
+ 4059 => 'langevag.no',
+ 4060 => 'langevåg.no',
+ 4061 => 'leirvik.no',
+ 4062 => 'mjondalen.no',
+ 4063 => 'mjøndalen.no',
+ 4064 => 'mo-i-rana.no',
+ 4065 => 'mosjoen.no',
+ 4066 => 'mosjøen.no',
+ 4067 => 'nesoddtangen.no',
+ 4068 => 'orkanger.no',
+ 4069 => 'osoyro.no',
+ 4070 => 'osøyro.no',
+ 4071 => 'raholt.no',
+ 4072 => 'råholt.no',
+ 4073 => 'sandnessjoen.no',
+ 4074 => 'sandnessjøen.no',
+ 4075 => 'skedsmokorset.no',
+ 4076 => 'slattum.no',
+ 4077 => 'spjelkavik.no',
+ 4078 => 'stathelle.no',
+ 4079 => 'stavern.no',
+ 4080 => 'stjordalshalsen.no',
+ 4081 => 'stjørdalshalsen.no',
+ 4082 => 'tananger.no',
+ 4083 => 'tranby.no',
+ 4084 => 'vossevangen.no',
+ 4085 => 'afjord.no',
+ 4086 => 'åfjord.no',
+ 4087 => 'agdenes.no',
+ 4088 => 'al.no',
+ 4089 => 'ål.no',
+ 4090 => 'alesund.no',
+ 4091 => 'ålesund.no',
+ 4092 => 'alstahaug.no',
+ 4093 => 'alta.no',
+ 4094 => 'áltá.no',
+ 4095 => 'alaheadju.no',
+ 4096 => 'álaheadju.no',
+ 4097 => 'alvdal.no',
+ 4098 => 'amli.no',
+ 4099 => 'åmli.no',
+ 4100 => 'amot.no',
+ 4101 => 'åmot.no',
+ 4102 => 'andebu.no',
+ 4103 => 'andoy.no',
+ 4104 => 'andøy.no',
+ 4105 => 'andasuolo.no',
+ 4106 => 'ardal.no',
+ 4107 => 'årdal.no',
+ 4108 => 'aremark.no',
+ 4109 => 'arendal.no',
+ 4110 => 'ås.no',
+ 4111 => 'aseral.no',
+ 4112 => 'åseral.no',
+ 4113 => 'asker.no',
+ 4114 => 'askim.no',
+ 4115 => 'askvoll.no',
+ 4116 => 'askoy.no',
+ 4117 => 'askøy.no',
+ 4118 => 'asnes.no',
+ 4119 => 'åsnes.no',
+ 4120 => 'audnedaln.no',
+ 4121 => 'aukra.no',
+ 4122 => 'aure.no',
+ 4123 => 'aurland.no',
+ 4124 => 'aurskog-holand.no',
+ 4125 => 'aurskog-høland.no',
+ 4126 => 'austevoll.no',
+ 4127 => 'austrheim.no',
+ 4128 => 'averoy.no',
+ 4129 => 'averøy.no',
+ 4130 => 'balestrand.no',
+ 4131 => 'ballangen.no',
+ 4132 => 'balat.no',
+ 4133 => 'bálát.no',
+ 4134 => 'balsfjord.no',
+ 4135 => 'bahccavuotna.no',
+ 4136 => 'báhccavuotna.no',
+ 4137 => 'bamble.no',
+ 4138 => 'bardu.no',
+ 4139 => 'beardu.no',
+ 4140 => 'beiarn.no',
+ 4141 => 'bajddar.no',
+ 4142 => 'bájddar.no',
+ 4143 => 'baidar.no',
+ 4144 => 'báidár.no',
+ 4145 => 'berg.no',
+ 4146 => 'bergen.no',
+ 4147 => 'berlevag.no',
+ 4148 => 'berlevåg.no',
+ 4149 => 'bearalvahki.no',
+ 4150 => 'bearalváhki.no',
+ 4151 => 'bindal.no',
+ 4152 => 'birkenes.no',
+ 4153 => 'bjarkoy.no',
+ 4154 => 'bjarkøy.no',
+ 4155 => 'bjerkreim.no',
+ 4156 => 'bjugn.no',
+ 4157 => 'bodo.no',
+ 4158 => 'bodø.no',
+ 4159 => 'badaddja.no',
+ 4160 => 'bådåddjå.no',
+ 4161 => 'budejju.no',
+ 4162 => 'bokn.no',
+ 4163 => 'bremanger.no',
+ 4164 => 'bronnoy.no',
+ 4165 => 'brønnøy.no',
+ 4166 => 'bygland.no',
+ 4167 => 'bykle.no',
+ 4168 => 'barum.no',
+ 4169 => 'bærum.no',
+ 4170 => 'bo.telemark.no',
+ 4171 => 'bø.telemark.no',
+ 4172 => 'bo.nordland.no',
+ 4173 => 'bø.nordland.no',
+ 4174 => 'bievat.no',
+ 4175 => 'bievát.no',
+ 4176 => 'bomlo.no',
+ 4177 => 'bømlo.no',
+ 4178 => 'batsfjord.no',
+ 4179 => 'båtsfjord.no',
+ 4180 => 'bahcavuotna.no',
+ 4181 => 'báhcavuotna.no',
+ 4182 => 'dovre.no',
+ 4183 => 'drammen.no',
+ 4184 => 'drangedal.no',
+ 4185 => 'dyroy.no',
+ 4186 => 'dyrøy.no',
+ 4187 => 'donna.no',
+ 4188 => 'dønna.no',
+ 4189 => 'eid.no',
+ 4190 => 'eidfjord.no',
+ 4191 => 'eidsberg.no',
+ 4192 => 'eidskog.no',
+ 4193 => 'eidsvoll.no',
+ 4194 => 'eigersund.no',
+ 4195 => 'elverum.no',
+ 4196 => 'enebakk.no',
+ 4197 => 'engerdal.no',
+ 4198 => 'etne.no',
+ 4199 => 'etnedal.no',
+ 4200 => 'evenes.no',
+ 4201 => 'evenassi.no',
+ 4202 => 'evenášši.no',
+ 4203 => 'evje-og-hornnes.no',
+ 4204 => 'farsund.no',
+ 4205 => 'fauske.no',
+ 4206 => 'fuossko.no',
+ 4207 => 'fuoisku.no',
+ 4208 => 'fedje.no',
+ 4209 => 'fet.no',
+ 4210 => 'finnoy.no',
+ 4211 => 'finnøy.no',
+ 4212 => 'fitjar.no',
+ 4213 => 'fjaler.no',
+ 4214 => 'fjell.no',
+ 4215 => 'flakstad.no',
+ 4216 => 'flatanger.no',
+ 4217 => 'flekkefjord.no',
+ 4218 => 'flesberg.no',
+ 4219 => 'flora.no',
+ 4220 => 'fla.no',
+ 4221 => 'flå.no',
+ 4222 => 'folldal.no',
+ 4223 => 'forsand.no',
+ 4224 => 'fosnes.no',
+ 4225 => 'frei.no',
+ 4226 => 'frogn.no',
+ 4227 => 'froland.no',
+ 4228 => 'frosta.no',
+ 4229 => 'frana.no',
+ 4230 => 'fræna.no',
+ 4231 => 'froya.no',
+ 4232 => 'frøya.no',
+ 4233 => 'fusa.no',
+ 4234 => 'fyresdal.no',
+ 4235 => 'forde.no',
+ 4236 => 'førde.no',
+ 4237 => 'gamvik.no',
+ 4238 => 'gangaviika.no',
+ 4239 => 'gáŋgaviika.no',
+ 4240 => 'gaular.no',
+ 4241 => 'gausdal.no',
+ 4242 => 'gildeskal.no',
+ 4243 => 'gildeskål.no',
+ 4244 => 'giske.no',
+ 4245 => 'gjemnes.no',
+ 4246 => 'gjerdrum.no',
+ 4247 => 'gjerstad.no',
+ 4248 => 'gjesdal.no',
+ 4249 => 'gjovik.no',
+ 4250 => 'gjøvik.no',
+ 4251 => 'gloppen.no',
+ 4252 => 'gol.no',
+ 4253 => 'gran.no',
+ 4254 => 'grane.no',
+ 4255 => 'granvin.no',
+ 4256 => 'gratangen.no',
+ 4257 => 'grimstad.no',
+ 4258 => 'grong.no',
+ 4259 => 'kraanghke.no',
+ 4260 => 'kråanghke.no',
+ 4261 => 'grue.no',
+ 4262 => 'gulen.no',
+ 4263 => 'hadsel.no',
+ 4264 => 'halden.no',
+ 4265 => 'halsa.no',
+ 4266 => 'hamar.no',
+ 4267 => 'hamaroy.no',
+ 4268 => 'habmer.no',
+ 4269 => 'hábmer.no',
+ 4270 => 'hapmir.no',
+ 4271 => 'hápmir.no',
+ 4272 => 'hammerfest.no',
+ 4273 => 'hammarfeasta.no',
+ 4274 => 'hámmárfeasta.no',
+ 4275 => 'haram.no',
+ 4276 => 'hareid.no',
+ 4277 => 'harstad.no',
+ 4278 => 'hasvik.no',
+ 4279 => 'aknoluokta.no',
+ 4280 => 'ákŋoluokta.no',
+ 4281 => 'hattfjelldal.no',
+ 4282 => 'aarborte.no',
+ 4283 => 'haugesund.no',
+ 4284 => 'hemne.no',
+ 4285 => 'hemnes.no',
+ 4286 => 'hemsedal.no',
+ 4287 => 'heroy.more-og-romsdal.no',
+ 4288 => 'herøy.møre-og-romsdal.no',
+ 4289 => 'heroy.nordland.no',
+ 4290 => 'herøy.nordland.no',
+ 4291 => 'hitra.no',
+ 4292 => 'hjartdal.no',
+ 4293 => 'hjelmeland.no',
+ 4294 => 'hobol.no',
+ 4295 => 'hobøl.no',
+ 4296 => 'hof.no',
+ 4297 => 'hol.no',
+ 4298 => 'hole.no',
+ 4299 => 'holmestrand.no',
+ 4300 => 'holtalen.no',
+ 4301 => 'holtålen.no',
+ 4302 => 'hornindal.no',
+ 4303 => 'horten.no',
+ 4304 => 'hurdal.no',
+ 4305 => 'hurum.no',
+ 4306 => 'hvaler.no',
+ 4307 => 'hyllestad.no',
+ 4308 => 'hagebostad.no',
+ 4309 => 'hægebostad.no',
+ 4310 => 'hoyanger.no',
+ 4311 => 'høyanger.no',
+ 4312 => 'hoylandet.no',
+ 4313 => 'høylandet.no',
+ 4314 => 'ha.no',
+ 4315 => 'hå.no',
+ 4316 => 'ibestad.no',
+ 4317 => 'inderoy.no',
+ 4318 => 'inderøy.no',
+ 4319 => 'iveland.no',
+ 4320 => 'jevnaker.no',
+ 4321 => 'jondal.no',
+ 4322 => 'jolster.no',
+ 4323 => 'jølster.no',
+ 4324 => 'karasjok.no',
+ 4325 => 'karasjohka.no',
+ 4326 => 'kárášjohka.no',
+ 4327 => 'karlsoy.no',
+ 4328 => 'galsa.no',
+ 4329 => 'gálsá.no',
+ 4330 => 'karmoy.no',
+ 4331 => 'karmøy.no',
+ 4332 => 'kautokeino.no',
+ 4333 => 'guovdageaidnu.no',
+ 4334 => 'klepp.no',
+ 4335 => 'klabu.no',
+ 4336 => 'klæbu.no',
+ 4337 => 'kongsberg.no',
+ 4338 => 'kongsvinger.no',
+ 4339 => 'kragero.no',
+ 4340 => 'kragerø.no',
+ 4341 => 'kristiansand.no',
+ 4342 => 'kristiansund.no',
+ 4343 => 'krodsherad.no',
+ 4344 => 'krødsherad.no',
+ 4345 => 'kvalsund.no',
+ 4346 => 'rahkkeravju.no',
+ 4347 => 'ráhkkerávju.no',
+ 4348 => 'kvam.no',
+ 4349 => 'kvinesdal.no',
+ 4350 => 'kvinnherad.no',
+ 4351 => 'kviteseid.no',
+ 4352 => 'kvitsoy.no',
+ 4353 => 'kvitsøy.no',
+ 4354 => 'kvafjord.no',
+ 4355 => 'kvæfjord.no',
+ 4356 => 'giehtavuoatna.no',
+ 4357 => 'kvanangen.no',
+ 4358 => 'kvænangen.no',
+ 4359 => 'navuotna.no',
+ 4360 => 'návuotna.no',
+ 4361 => 'kafjord.no',
+ 4362 => 'kåfjord.no',
+ 4363 => 'gaivuotna.no',
+ 4364 => 'gáivuotna.no',
+ 4365 => 'larvik.no',
+ 4366 => 'lavangen.no',
+ 4367 => 'lavagis.no',
+ 4368 => 'loabat.no',
+ 4369 => 'loabát.no',
+ 4370 => 'lebesby.no',
+ 4371 => 'davvesiida.no',
+ 4372 => 'leikanger.no',
+ 4373 => 'leirfjord.no',
+ 4374 => 'leka.no',
+ 4375 => 'leksvik.no',
+ 4376 => 'lenvik.no',
+ 4377 => 'leangaviika.no',
+ 4378 => 'leaŋgaviika.no',
+ 4379 => 'lesja.no',
+ 4380 => 'levanger.no',
+ 4381 => 'lier.no',
+ 4382 => 'lierne.no',
+ 4383 => 'lillehammer.no',
+ 4384 => 'lillesand.no',
+ 4385 => 'lindesnes.no',
+ 4386 => 'lindas.no',
+ 4387 => 'lindås.no',
+ 4388 => 'lom.no',
+ 4389 => 'loppa.no',
+ 4390 => 'lahppi.no',
+ 4391 => 'láhppi.no',
+ 4392 => 'lund.no',
+ 4393 => 'lunner.no',
+ 4394 => 'luroy.no',
+ 4395 => 'lurøy.no',
+ 4396 => 'luster.no',
+ 4397 => 'lyngdal.no',
+ 4398 => 'lyngen.no',
+ 4399 => 'ivgu.no',
+ 4400 => 'lardal.no',
+ 4401 => 'lerdal.no',
+ 4402 => 'lærdal.no',
+ 4403 => 'lodingen.no',
+ 4404 => 'lødingen.no',
+ 4405 => 'lorenskog.no',
+ 4406 => 'lørenskog.no',
+ 4407 => 'loten.no',
+ 4408 => 'løten.no',
+ 4409 => 'malvik.no',
+ 4410 => 'masoy.no',
+ 4411 => 'måsøy.no',
+ 4412 => 'muosat.no',
+ 4413 => 'muosát.no',
+ 4414 => 'mandal.no',
+ 4415 => 'marker.no',
+ 4416 => 'marnardal.no',
+ 4417 => 'masfjorden.no',
+ 4418 => 'meland.no',
+ 4419 => 'meldal.no',
+ 4420 => 'melhus.no',
+ 4421 => 'meloy.no',
+ 4422 => 'meløy.no',
+ 4423 => 'meraker.no',
+ 4424 => 'meråker.no',
+ 4425 => 'moareke.no',
+ 4426 => 'moåreke.no',
+ 4427 => 'midsund.no',
+ 4428 => 'midtre-gauldal.no',
+ 4429 => 'modalen.no',
+ 4430 => 'modum.no',
+ 4431 => 'molde.no',
+ 4432 => 'moskenes.no',
+ 4433 => 'moss.no',
+ 4434 => 'mosvik.no',
+ 4435 => 'malselv.no',
+ 4436 => 'målselv.no',
+ 4437 => 'malatvuopmi.no',
+ 4438 => 'málatvuopmi.no',
+ 4439 => 'namdalseid.no',
+ 4440 => 'aejrie.no',
+ 4441 => 'namsos.no',
+ 4442 => 'namsskogan.no',
+ 4443 => 'naamesjevuemie.no',
+ 4444 => 'nååmesjevuemie.no',
+ 4445 => 'laakesvuemie.no',
+ 4446 => 'nannestad.no',
+ 4447 => 'narvik.no',
+ 4448 => 'narviika.no',
+ 4449 => 'naustdal.no',
+ 4450 => 'nedre-eiker.no',
+ 4451 => 'nes.akershus.no',
+ 4452 => 'nes.buskerud.no',
+ 4453 => 'nesna.no',
+ 4454 => 'nesodden.no',
+ 4455 => 'nesseby.no',
+ 4456 => 'unjarga.no',
+ 4457 => 'unjárga.no',
+ 4458 => 'nesset.no',
+ 4459 => 'nissedal.no',
+ 4460 => 'nittedal.no',
+ 4461 => 'nord-aurdal.no',
+ 4462 => 'nord-fron.no',
+ 4463 => 'nord-odal.no',
+ 4464 => 'norddal.no',
+ 4465 => 'nordkapp.no',
+ 4466 => 'davvenjarga.no',
+ 4467 => 'davvenjárga.no',
+ 4468 => 'nordre-land.no',
+ 4469 => 'nordreisa.no',
+ 4470 => 'raisa.no',
+ 4471 => 'ráisa.no',
+ 4472 => 'nore-og-uvdal.no',
+ 4473 => 'notodden.no',
+ 4474 => 'naroy.no',
+ 4475 => 'nærøy.no',
+ 4476 => 'notteroy.no',
+ 4477 => 'nøtterøy.no',
+ 4478 => 'odda.no',
+ 4479 => 'oksnes.no',
+ 4480 => 'øksnes.no',
+ 4481 => 'oppdal.no',
+ 4482 => 'oppegard.no',
+ 4483 => 'oppegård.no',
+ 4484 => 'orkdal.no',
+ 4485 => 'orland.no',
+ 4486 => 'ørland.no',
+ 4487 => 'orskog.no',
+ 4488 => 'ørskog.no',
+ 4489 => 'orsta.no',
+ 4490 => 'ørsta.no',
+ 4491 => 'os.hedmark.no',
+ 4492 => 'os.hordaland.no',
+ 4493 => 'osen.no',
+ 4494 => 'osteroy.no',
+ 4495 => 'osterøy.no',
+ 4496 => 'ostre-toten.no',
+ 4497 => 'østre-toten.no',
+ 4498 => 'overhalla.no',
+ 4499 => 'ovre-eiker.no',
+ 4500 => 'øvre-eiker.no',
+ 4501 => 'oyer.no',
+ 4502 => 'øyer.no',
+ 4503 => 'oygarden.no',
+ 4504 => 'øygarden.no',
+ 4505 => 'oystre-slidre.no',
+ 4506 => 'øystre-slidre.no',
+ 4507 => 'porsanger.no',
+ 4508 => 'porsangu.no',
+ 4509 => 'porsáŋgu.no',
+ 4510 => 'porsgrunn.no',
+ 4511 => 'radoy.no',
+ 4512 => 'radøy.no',
+ 4513 => 'rakkestad.no',
+ 4514 => 'rana.no',
+ 4515 => 'ruovat.no',
+ 4516 => 'randaberg.no',
+ 4517 => 'rauma.no',
+ 4518 => 'rendalen.no',
+ 4519 => 'rennebu.no',
+ 4520 => 'rennesoy.no',
+ 4521 => 'rennesøy.no',
+ 4522 => 'rindal.no',
+ 4523 => 'ringebu.no',
+ 4524 => 'ringerike.no',
+ 4525 => 'ringsaker.no',
+ 4526 => 'rissa.no',
+ 4527 => 'risor.no',
+ 4528 => 'risør.no',
+ 4529 => 'roan.no',
+ 4530 => 'rollag.no',
+ 4531 => 'rygge.no',
+ 4532 => 'ralingen.no',
+ 4533 => 'rælingen.no',
+ 4534 => 'rodoy.no',
+ 4535 => 'rødøy.no',
+ 4536 => 'romskog.no',
+ 4537 => 'rømskog.no',
+ 4538 => 'roros.no',
+ 4539 => 'røros.no',
+ 4540 => 'rost.no',
+ 4541 => 'røst.no',
+ 4542 => 'royken.no',
+ 4543 => 'røyken.no',
+ 4544 => 'royrvik.no',
+ 4545 => 'røyrvik.no',
+ 4546 => 'rade.no',
+ 4547 => 'råde.no',
+ 4548 => 'salangen.no',
+ 4549 => 'siellak.no',
+ 4550 => 'saltdal.no',
+ 4551 => 'salat.no',
+ 4552 => 'sálát.no',
+ 4553 => 'sálat.no',
+ 4554 => 'samnanger.no',
+ 4555 => 'sande.more-og-romsdal.no',
+ 4556 => 'sande.møre-og-romsdal.no',
+ 4557 => 'sande.vestfold.no',
+ 4558 => 'sandefjord.no',
+ 4559 => 'sandnes.no',
+ 4560 => 'sandoy.no',
+ 4561 => 'sandøy.no',
+ 4562 => 'sarpsborg.no',
+ 4563 => 'sauda.no',
+ 4564 => 'sauherad.no',
+ 4565 => 'sel.no',
+ 4566 => 'selbu.no',
+ 4567 => 'selje.no',
+ 4568 => 'seljord.no',
+ 4569 => 'sigdal.no',
+ 4570 => 'siljan.no',
+ 4571 => 'sirdal.no',
+ 4572 => 'skaun.no',
+ 4573 => 'skedsmo.no',
+ 4574 => 'ski.no',
+ 4575 => 'skien.no',
+ 4576 => 'skiptvet.no',
+ 4577 => 'skjervoy.no',
+ 4578 => 'skjervøy.no',
+ 4579 => 'skierva.no',
+ 4580 => 'skiervá.no',
+ 4581 => 'skjak.no',
+ 4582 => 'skjåk.no',
+ 4583 => 'skodje.no',
+ 4584 => 'skanland.no',
+ 4585 => 'skånland.no',
+ 4586 => 'skanit.no',
+ 4587 => 'skánit.no',
+ 4588 => 'smola.no',
+ 4589 => 'smøla.no',
+ 4590 => 'snillfjord.no',
+ 4591 => 'snasa.no',
+ 4592 => 'snåsa.no',
+ 4593 => 'snoasa.no',
+ 4594 => 'snaase.no',
+ 4595 => 'snåase.no',
+ 4596 => 'sogndal.no',
+ 4597 => 'sokndal.no',
+ 4598 => 'sola.no',
+ 4599 => 'solund.no',
+ 4600 => 'songdalen.no',
+ 4601 => 'sortland.no',
+ 4602 => 'spydeberg.no',
+ 4603 => 'stange.no',
+ 4604 => 'stavanger.no',
+ 4605 => 'steigen.no',
+ 4606 => 'steinkjer.no',
+ 4607 => 'stjordal.no',
+ 4608 => 'stjørdal.no',
+ 4609 => 'stokke.no',
+ 4610 => 'stor-elvdal.no',
+ 4611 => 'stord.no',
+ 4612 => 'stordal.no',
+ 4613 => 'storfjord.no',
+ 4614 => 'omasvuotna.no',
+ 4615 => 'strand.no',
+ 4616 => 'stranda.no',
+ 4617 => 'stryn.no',
+ 4618 => 'sula.no',
+ 4619 => 'suldal.no',
+ 4620 => 'sund.no',
+ 4621 => 'sunndal.no',
+ 4622 => 'surnadal.no',
+ 4623 => 'sveio.no',
+ 4624 => 'svelvik.no',
+ 4625 => 'sykkylven.no',
+ 4626 => 'sogne.no',
+ 4627 => 'søgne.no',
+ 4628 => 'somna.no',
+ 4629 => 'sømna.no',
+ 4630 => 'sondre-land.no',
+ 4631 => 'søndre-land.no',
+ 4632 => 'sor-aurdal.no',
+ 4633 => 'sør-aurdal.no',
+ 4634 => 'sor-fron.no',
+ 4635 => 'sør-fron.no',
+ 4636 => 'sor-odal.no',
+ 4637 => 'sør-odal.no',
+ 4638 => 'sor-varanger.no',
+ 4639 => 'sør-varanger.no',
+ 4640 => 'matta-varjjat.no',
+ 4641 => 'mátta-várjjat.no',
+ 4642 => 'sorfold.no',
+ 4643 => 'sørfold.no',
+ 4644 => 'sorreisa.no',
+ 4645 => 'sørreisa.no',
+ 4646 => 'sorum.no',
+ 4647 => 'sørum.no',
+ 4648 => 'tana.no',
+ 4649 => 'deatnu.no',
+ 4650 => 'time.no',
+ 4651 => 'tingvoll.no',
+ 4652 => 'tinn.no',
+ 4653 => 'tjeldsund.no',
+ 4654 => 'dielddanuorri.no',
+ 4655 => 'tjome.no',
+ 4656 => 'tjøme.no',
+ 4657 => 'tokke.no',
+ 4658 => 'tolga.no',
+ 4659 => 'torsken.no',
+ 4660 => 'tranoy.no',
+ 4661 => 'tranøy.no',
+ 4662 => 'tromso.no',
+ 4663 => 'tromsø.no',
+ 4664 => 'tromsa.no',
+ 4665 => 'romsa.no',
+ 4666 => 'trondheim.no',
+ 4667 => 'troandin.no',
+ 4668 => 'trysil.no',
+ 4669 => 'trana.no',
+ 4670 => 'træna.no',
+ 4671 => 'trogstad.no',
+ 4672 => 'trøgstad.no',
+ 4673 => 'tvedestrand.no',
+ 4674 => 'tydal.no',
+ 4675 => 'tynset.no',
+ 4676 => 'tysfjord.no',
+ 4677 => 'divtasvuodna.no',
+ 4678 => 'divttasvuotna.no',
+ 4679 => 'tysnes.no',
+ 4680 => 'tysvar.no',
+ 4681 => 'tysvær.no',
+ 4682 => 'tonsberg.no',
+ 4683 => 'tønsberg.no',
+ 4684 => 'ullensaker.no',
+ 4685 => 'ullensvang.no',
+ 4686 => 'ulvik.no',
+ 4687 => 'utsira.no',
+ 4688 => 'vadso.no',
+ 4689 => 'vadsø.no',
+ 4690 => 'cahcesuolo.no',
+ 4691 => 'čáhcesuolo.no',
+ 4692 => 'vaksdal.no',
+ 4693 => 'valle.no',
+ 4694 => 'vang.no',
+ 4695 => 'vanylven.no',
+ 4696 => 'vardo.no',
+ 4697 => 'vardø.no',
+ 4698 => 'varggat.no',
+ 4699 => 'várggát.no',
+ 4700 => 'vefsn.no',
+ 4701 => 'vaapste.no',
+ 4702 => 'vega.no',
+ 4703 => 'vegarshei.no',
+ 4704 => 'vegårshei.no',
+ 4705 => 'vennesla.no',
+ 4706 => 'verdal.no',
+ 4707 => 'verran.no',
+ 4708 => 'vestby.no',
+ 4709 => 'vestnes.no',
+ 4710 => 'vestre-slidre.no',
+ 4711 => 'vestre-toten.no',
+ 4712 => 'vestvagoy.no',
+ 4713 => 'vestvågøy.no',
+ 4714 => 'vevelstad.no',
+ 4715 => 'vik.no',
+ 4716 => 'vikna.no',
+ 4717 => 'vindafjord.no',
+ 4718 => 'volda.no',
+ 4719 => 'voss.no',
+ 4720 => 'varoy.no',
+ 4721 => 'værøy.no',
+ 4722 => 'vagan.no',
+ 4723 => 'vågan.no',
+ 4724 => 'voagat.no',
+ 4725 => 'vagsoy.no',
+ 4726 => 'vågsøy.no',
+ 4727 => 'vaga.no',
+ 4728 => 'vågå.no',
+ 4729 => 'valer.ostfold.no',
+ 4730 => 'våler.østfold.no',
+ 4731 => 'valer.hedmark.no',
+ 4732 => 'våler.hedmark.no',
+ 4733 => '*.np',
+ 4734 => 'nr',
+ 4735 => 'biz.nr',
+ 4736 => 'info.nr',
+ 4737 => 'gov.nr',
+ 4738 => 'edu.nr',
+ 4739 => 'org.nr',
+ 4740 => 'net.nr',
+ 4741 => 'com.nr',
+ 4742 => 'nu',
+ 4743 => 'nz',
+ 4744 => 'ac.nz',
+ 4745 => 'co.nz',
+ 4746 => 'cri.nz',
+ 4747 => 'geek.nz',
+ 4748 => 'gen.nz',
+ 4749 => 'govt.nz',
+ 4750 => 'health.nz',
+ 4751 => 'iwi.nz',
+ 4752 => 'kiwi.nz',
+ 4753 => 'maori.nz',
+ 4754 => 'mil.nz',
+ 4755 => 'māori.nz',
+ 4756 => 'net.nz',
+ 4757 => 'org.nz',
+ 4758 => 'parliament.nz',
+ 4759 => 'school.nz',
+ 4760 => 'om',
+ 4761 => 'co.om',
+ 4762 => 'com.om',
+ 4763 => 'edu.om',
+ 4764 => 'gov.om',
+ 4765 => 'med.om',
+ 4766 => 'museum.om',
+ 4767 => 'net.om',
+ 4768 => 'org.om',
+ 4769 => 'pro.om',
+ 4770 => 'org',
+ 4771 => 'pa',
+ 4772 => 'ac.pa',
+ 4773 => 'gob.pa',
+ 4774 => 'com.pa',
+ 4775 => 'org.pa',
+ 4776 => 'sld.pa',
+ 4777 => 'edu.pa',
+ 4778 => 'net.pa',
+ 4779 => 'ing.pa',
+ 4780 => 'abo.pa',
+ 4781 => 'med.pa',
+ 4782 => 'nom.pa',
+ 4783 => 'pe',
+ 4784 => 'edu.pe',
+ 4785 => 'gob.pe',
+ 4786 => 'nom.pe',
+ 4787 => 'mil.pe',
+ 4788 => 'org.pe',
+ 4789 => 'com.pe',
+ 4790 => 'net.pe',
+ 4791 => 'pf',
+ 4792 => 'com.pf',
+ 4793 => 'org.pf',
+ 4794 => 'edu.pf',
+ 4795 => '*.pg',
+ 4796 => 'ph',
+ 4797 => 'com.ph',
+ 4798 => 'net.ph',
+ 4799 => 'org.ph',
+ 4800 => 'gov.ph',
+ 4801 => 'edu.ph',
+ 4802 => 'ngo.ph',
+ 4803 => 'mil.ph',
+ 4804 => 'i.ph',
+ 4805 => 'pk',
+ 4806 => 'com.pk',
+ 4807 => 'net.pk',
+ 4808 => 'edu.pk',
+ 4809 => 'org.pk',
+ 4810 => 'fam.pk',
+ 4811 => 'biz.pk',
+ 4812 => 'web.pk',
+ 4813 => 'gov.pk',
+ 4814 => 'gob.pk',
+ 4815 => 'gok.pk',
+ 4816 => 'gon.pk',
+ 4817 => 'gop.pk',
+ 4818 => 'gos.pk',
+ 4819 => 'info.pk',
+ 4820 => 'pl',
+ 4821 => 'com.pl',
+ 4822 => 'net.pl',
+ 4823 => 'org.pl',
+ 4824 => 'aid.pl',
+ 4825 => 'agro.pl',
+ 4826 => 'atm.pl',
+ 4827 => 'auto.pl',
+ 4828 => 'biz.pl',
+ 4829 => 'edu.pl',
+ 4830 => 'gmina.pl',
+ 4831 => 'gsm.pl',
+ 4832 => 'info.pl',
+ 4833 => 'mail.pl',
+ 4834 => 'miasta.pl',
+ 4835 => 'media.pl',
+ 4836 => 'mil.pl',
+ 4837 => 'nieruchomosci.pl',
+ 4838 => 'nom.pl',
+ 4839 => 'pc.pl',
+ 4840 => 'powiat.pl',
+ 4841 => 'priv.pl',
+ 4842 => 'realestate.pl',
+ 4843 => 'rel.pl',
+ 4844 => 'sex.pl',
+ 4845 => 'shop.pl',
+ 4846 => 'sklep.pl',
+ 4847 => 'sos.pl',
+ 4848 => 'szkola.pl',
+ 4849 => 'targi.pl',
+ 4850 => 'tm.pl',
+ 4851 => 'tourism.pl',
+ 4852 => 'travel.pl',
+ 4853 => 'turystyka.pl',
+ 4854 => 'gov.pl',
+ 4855 => 'ap.gov.pl',
+ 4856 => 'ic.gov.pl',
+ 4857 => 'is.gov.pl',
+ 4858 => 'us.gov.pl',
+ 4859 => 'kmpsp.gov.pl',
+ 4860 => 'kppsp.gov.pl',
+ 4861 => 'kwpsp.gov.pl',
+ 4862 => 'psp.gov.pl',
+ 4863 => 'wskr.gov.pl',
+ 4864 => 'kwp.gov.pl',
+ 4865 => 'mw.gov.pl',
+ 4866 => 'ug.gov.pl',
+ 4867 => 'um.gov.pl',
+ 4868 => 'umig.gov.pl',
+ 4869 => 'ugim.gov.pl',
+ 4870 => 'upow.gov.pl',
+ 4871 => 'uw.gov.pl',
+ 4872 => 'starostwo.gov.pl',
+ 4873 => 'pa.gov.pl',
+ 4874 => 'po.gov.pl',
+ 4875 => 'psse.gov.pl',
+ 4876 => 'pup.gov.pl',
+ 4877 => 'rzgw.gov.pl',
+ 4878 => 'sa.gov.pl',
+ 4879 => 'so.gov.pl',
+ 4880 => 'sr.gov.pl',
+ 4881 => 'wsa.gov.pl',
+ 4882 => 'sko.gov.pl',
+ 4883 => 'uzs.gov.pl',
+ 4884 => 'wiih.gov.pl',
+ 4885 => 'winb.gov.pl',
+ 4886 => 'pinb.gov.pl',
+ 4887 => 'wios.gov.pl',
+ 4888 => 'witd.gov.pl',
+ 4889 => 'wzmiuw.gov.pl',
+ 4890 => 'piw.gov.pl',
+ 4891 => 'wiw.gov.pl',
+ 4892 => 'griw.gov.pl',
+ 4893 => 'wif.gov.pl',
+ 4894 => 'oum.gov.pl',
+ 4895 => 'sdn.gov.pl',
+ 4896 => 'zp.gov.pl',
+ 4897 => 'uppo.gov.pl',
+ 4898 => 'mup.gov.pl',
+ 4899 => 'wuoz.gov.pl',
+ 4900 => 'konsulat.gov.pl',
+ 4901 => 'oirm.gov.pl',
+ 4902 => 'augustow.pl',
+ 4903 => 'babia-gora.pl',
+ 4904 => 'bedzin.pl',
+ 4905 => 'beskidy.pl',
+ 4906 => 'bialowieza.pl',
+ 4907 => 'bialystok.pl',
+ 4908 => 'bielawa.pl',
+ 4909 => 'bieszczady.pl',
+ 4910 => 'boleslawiec.pl',
+ 4911 => 'bydgoszcz.pl',
+ 4912 => 'bytom.pl',
+ 4913 => 'cieszyn.pl',
+ 4914 => 'czeladz.pl',
+ 4915 => 'czest.pl',
+ 4916 => 'dlugoleka.pl',
+ 4917 => 'elblag.pl',
+ 4918 => 'elk.pl',
+ 4919 => 'glogow.pl',
+ 4920 => 'gniezno.pl',
+ 4921 => 'gorlice.pl',
+ 4922 => 'grajewo.pl',
+ 4923 => 'ilawa.pl',
+ 4924 => 'jaworzno.pl',
+ 4925 => 'jelenia-gora.pl',
+ 4926 => 'jgora.pl',
+ 4927 => 'kalisz.pl',
+ 4928 => 'kazimierz-dolny.pl',
+ 4929 => 'karpacz.pl',
+ 4930 => 'kartuzy.pl',
+ 4931 => 'kaszuby.pl',
+ 4932 => 'katowice.pl',
+ 4933 => 'kepno.pl',
+ 4934 => 'ketrzyn.pl',
+ 4935 => 'klodzko.pl',
+ 4936 => 'kobierzyce.pl',
+ 4937 => 'kolobrzeg.pl',
+ 4938 => 'konin.pl',
+ 4939 => 'konskowola.pl',
+ 4940 => 'kutno.pl',
+ 4941 => 'lapy.pl',
+ 4942 => 'lebork.pl',
+ 4943 => 'legnica.pl',
+ 4944 => 'lezajsk.pl',
+ 4945 => 'limanowa.pl',
+ 4946 => 'lomza.pl',
+ 4947 => 'lowicz.pl',
+ 4948 => 'lubin.pl',
+ 4949 => 'lukow.pl',
+ 4950 => 'malbork.pl',
+ 4951 => 'malopolska.pl',
+ 4952 => 'mazowsze.pl',
+ 4953 => 'mazury.pl',
+ 4954 => 'mielec.pl',
+ 4955 => 'mielno.pl',
+ 4956 => 'mragowo.pl',
+ 4957 => 'naklo.pl',
+ 4958 => 'nowaruda.pl',
+ 4959 => 'nysa.pl',
+ 4960 => 'olawa.pl',
+ 4961 => 'olecko.pl',
+ 4962 => 'olkusz.pl',
+ 4963 => 'olsztyn.pl',
+ 4964 => 'opoczno.pl',
+ 4965 => 'opole.pl',
+ 4966 => 'ostroda.pl',
+ 4967 => 'ostroleka.pl',
+ 4968 => 'ostrowiec.pl',
+ 4969 => 'ostrowwlkp.pl',
+ 4970 => 'pila.pl',
+ 4971 => 'pisz.pl',
+ 4972 => 'podhale.pl',
+ 4973 => 'podlasie.pl',
+ 4974 => 'polkowice.pl',
+ 4975 => 'pomorze.pl',
+ 4976 => 'pomorskie.pl',
+ 4977 => 'prochowice.pl',
+ 4978 => 'pruszkow.pl',
+ 4979 => 'przeworsk.pl',
+ 4980 => 'pulawy.pl',
+ 4981 => 'radom.pl',
+ 4982 => 'rawa-maz.pl',
+ 4983 => 'rybnik.pl',
+ 4984 => 'rzeszow.pl',
+ 4985 => 'sanok.pl',
+ 4986 => 'sejny.pl',
+ 4987 => 'slask.pl',
+ 4988 => 'slupsk.pl',
+ 4989 => 'sosnowiec.pl',
+ 4990 => 'stalowa-wola.pl',
+ 4991 => 'skoczow.pl',
+ 4992 => 'starachowice.pl',
+ 4993 => 'stargard.pl',
+ 4994 => 'suwalki.pl',
+ 4995 => 'swidnica.pl',
+ 4996 => 'swiebodzin.pl',
+ 4997 => 'swinoujscie.pl',
+ 4998 => 'szczecin.pl',
+ 4999 => 'szczytno.pl',
+ 5000 => 'tarnobrzeg.pl',
+ 5001 => 'tgory.pl',
+ 5002 => 'turek.pl',
+ 5003 => 'tychy.pl',
+ 5004 => 'ustka.pl',
+ 5005 => 'walbrzych.pl',
+ 5006 => 'warmia.pl',
+ 5007 => 'warszawa.pl',
+ 5008 => 'waw.pl',
+ 5009 => 'wegrow.pl',
+ 5010 => 'wielun.pl',
+ 5011 => 'wlocl.pl',
+ 5012 => 'wloclawek.pl',
+ 5013 => 'wodzislaw.pl',
+ 5014 => 'wolomin.pl',
+ 5015 => 'wroclaw.pl',
+ 5016 => 'zachpomor.pl',
+ 5017 => 'zagan.pl',
+ 5018 => 'zarow.pl',
+ 5019 => 'zgora.pl',
+ 5020 => 'zgorzelec.pl',
+ 5021 => 'pm',
+ 5022 => 'pn',
+ 5023 => 'gov.pn',
+ 5024 => 'co.pn',
+ 5025 => 'org.pn',
+ 5026 => 'edu.pn',
+ 5027 => 'net.pn',
+ 5028 => 'post',
+ 5029 => 'pr',
+ 5030 => 'com.pr',
+ 5031 => 'net.pr',
+ 5032 => 'org.pr',
+ 5033 => 'gov.pr',
+ 5034 => 'edu.pr',
+ 5035 => 'isla.pr',
+ 5036 => 'pro.pr',
+ 5037 => 'biz.pr',
+ 5038 => 'info.pr',
+ 5039 => 'name.pr',
+ 5040 => 'est.pr',
+ 5041 => 'prof.pr',
+ 5042 => 'ac.pr',
+ 5043 => 'pro',
+ 5044 => 'aaa.pro',
+ 5045 => 'aca.pro',
+ 5046 => 'acct.pro',
+ 5047 => 'avocat.pro',
+ 5048 => 'bar.pro',
+ 5049 => 'cpa.pro',
+ 5050 => 'eng.pro',
+ 5051 => 'jur.pro',
+ 5052 => 'law.pro',
+ 5053 => 'med.pro',
+ 5054 => 'recht.pro',
+ 5055 => 'ps',
+ 5056 => 'edu.ps',
+ 5057 => 'gov.ps',
+ 5058 => 'sec.ps',
+ 5059 => 'plo.ps',
+ 5060 => 'com.ps',
+ 5061 => 'org.ps',
+ 5062 => 'net.ps',
+ 5063 => 'pt',
+ 5064 => 'net.pt',
+ 5065 => 'gov.pt',
+ 5066 => 'org.pt',
+ 5067 => 'edu.pt',
+ 5068 => 'int.pt',
+ 5069 => 'publ.pt',
+ 5070 => 'com.pt',
+ 5071 => 'nome.pt',
+ 5072 => 'pw',
+ 5073 => 'co.pw',
+ 5074 => 'ne.pw',
+ 5075 => 'or.pw',
+ 5076 => 'ed.pw',
+ 5077 => 'go.pw',
+ 5078 => 'belau.pw',
+ 5079 => 'py',
+ 5080 => 'com.py',
+ 5081 => 'coop.py',
+ 5082 => 'edu.py',
+ 5083 => 'gov.py',
+ 5084 => 'mil.py',
+ 5085 => 'net.py',
+ 5086 => 'org.py',
+ 5087 => 'qa',
+ 5088 => 'com.qa',
+ 5089 => 'edu.qa',
+ 5090 => 'gov.qa',
+ 5091 => 'mil.qa',
+ 5092 => 'name.qa',
+ 5093 => 'net.qa',
+ 5094 => 'org.qa',
+ 5095 => 'sch.qa',
+ 5096 => 're',
+ 5097 => 'asso.re',
+ 5098 => 'com.re',
+ 5099 => 'nom.re',
+ 5100 => 'ro',
+ 5101 => 'arts.ro',
+ 5102 => 'com.ro',
+ 5103 => 'firm.ro',
+ 5104 => 'info.ro',
+ 5105 => 'nom.ro',
+ 5106 => 'nt.ro',
+ 5107 => 'org.ro',
+ 5108 => 'rec.ro',
+ 5109 => 'store.ro',
+ 5110 => 'tm.ro',
+ 5111 => 'www.ro',
+ 5112 => 'rs',
+ 5113 => 'ac.rs',
+ 5114 => 'co.rs',
+ 5115 => 'edu.rs',
+ 5116 => 'gov.rs',
+ 5117 => 'in.rs',
+ 5118 => 'org.rs',
+ 5119 => 'ru',
+ 5120 => 'ac.ru',
+ 5121 => 'com.ru',
+ 5122 => 'edu.ru',
+ 5123 => 'int.ru',
+ 5124 => 'net.ru',
+ 5125 => 'org.ru',
+ 5126 => 'pp.ru',
+ 5127 => 'adygeya.ru',
+ 5128 => 'altai.ru',
+ 5129 => 'amur.ru',
+ 5130 => 'arkhangelsk.ru',
+ 5131 => 'astrakhan.ru',
+ 5132 => 'bashkiria.ru',
+ 5133 => 'belgorod.ru',
+ 5134 => 'bir.ru',
+ 5135 => 'bryansk.ru',
+ 5136 => 'buryatia.ru',
+ 5137 => 'cbg.ru',
+ 5138 => 'chel.ru',
+ 5139 => 'chelyabinsk.ru',
+ 5140 => 'chita.ru',
+ 5141 => 'chukotka.ru',
+ 5142 => 'chuvashia.ru',
+ 5143 => 'dagestan.ru',
+ 5144 => 'dudinka.ru',
+ 5145 => 'e-burg.ru',
+ 5146 => 'grozny.ru',
+ 5147 => 'irkutsk.ru',
+ 5148 => 'ivanovo.ru',
+ 5149 => 'izhevsk.ru',
+ 5150 => 'jar.ru',
+ 5151 => 'joshkar-ola.ru',
+ 5152 => 'kalmykia.ru',
+ 5153 => 'kaluga.ru',
+ 5154 => 'kamchatka.ru',
+ 5155 => 'karelia.ru',
+ 5156 => 'kazan.ru',
+ 5157 => 'kchr.ru',
+ 5158 => 'kemerovo.ru',
+ 5159 => 'khabarovsk.ru',
+ 5160 => 'khakassia.ru',
+ 5161 => 'khv.ru',
+ 5162 => 'kirov.ru',
+ 5163 => 'koenig.ru',
+ 5164 => 'komi.ru',
+ 5165 => 'kostroma.ru',
+ 5166 => 'krasnoyarsk.ru',
+ 5167 => 'kuban.ru',
+ 5168 => 'kurgan.ru',
+ 5169 => 'kursk.ru',
+ 5170 => 'lipetsk.ru',
+ 5171 => 'magadan.ru',
+ 5172 => 'mari.ru',
+ 5173 => 'mari-el.ru',
+ 5174 => 'marine.ru',
+ 5175 => 'mordovia.ru',
+ 5176 => 'msk.ru',
+ 5177 => 'murmansk.ru',
+ 5178 => 'nalchik.ru',
+ 5179 => 'nnov.ru',
+ 5180 => 'nov.ru',
+ 5181 => 'novosibirsk.ru',
+ 5182 => 'nsk.ru',
+ 5183 => 'omsk.ru',
+ 5184 => 'orenburg.ru',
+ 5185 => 'oryol.ru',
+ 5186 => 'palana.ru',
+ 5187 => 'penza.ru',
+ 5188 => 'perm.ru',
+ 5189 => 'ptz.ru',
+ 5190 => 'rnd.ru',
+ 5191 => 'ryazan.ru',
+ 5192 => 'sakhalin.ru',
+ 5193 => 'samara.ru',
+ 5194 => 'saratov.ru',
+ 5195 => 'simbirsk.ru',
+ 5196 => 'smolensk.ru',
+ 5197 => 'spb.ru',
+ 5198 => 'stavropol.ru',
+ 5199 => 'stv.ru',
+ 5200 => 'surgut.ru',
+ 5201 => 'tambov.ru',
+ 5202 => 'tatarstan.ru',
+ 5203 => 'tom.ru',
+ 5204 => 'tomsk.ru',
+ 5205 => 'tsaritsyn.ru',
+ 5206 => 'tsk.ru',
+ 5207 => 'tula.ru',
+ 5208 => 'tuva.ru',
+ 5209 => 'tver.ru',
+ 5210 => 'tyumen.ru',
+ 5211 => 'udm.ru',
+ 5212 => 'udmurtia.ru',
+ 5213 => 'ulan-ude.ru',
+ 5214 => 'vladikavkaz.ru',
+ 5215 => 'vladimir.ru',
+ 5216 => 'vladivostok.ru',
+ 5217 => 'volgograd.ru',
+ 5218 => 'vologda.ru',
+ 5219 => 'voronezh.ru',
+ 5220 => 'vrn.ru',
+ 5221 => 'vyatka.ru',
+ 5222 => 'yakutia.ru',
+ 5223 => 'yamal.ru',
+ 5224 => 'yaroslavl.ru',
+ 5225 => 'yekaterinburg.ru',
+ 5226 => 'yuzhno-sakhalinsk.ru',
+ 5227 => 'amursk.ru',
+ 5228 => 'baikal.ru',
+ 5229 => 'cmw.ru',
+ 5230 => 'fareast.ru',
+ 5231 => 'jamal.ru',
+ 5232 => 'kms.ru',
+ 5233 => 'k-uralsk.ru',
+ 5234 => 'kustanai.ru',
+ 5235 => 'kuzbass.ru',
+ 5236 => 'mytis.ru',
+ 5237 => 'nakhodka.ru',
+ 5238 => 'nkz.ru',
+ 5239 => 'norilsk.ru',
+ 5240 => 'oskol.ru',
+ 5241 => 'pyatigorsk.ru',
+ 5242 => 'rubtsovsk.ru',
+ 5243 => 'snz.ru',
+ 5244 => 'syzran.ru',
+ 5245 => 'vdonsk.ru',
+ 5246 => 'zgrad.ru',
+ 5247 => 'gov.ru',
+ 5248 => 'mil.ru',
+ 5249 => 'test.ru',
+ 5250 => 'rw',
+ 5251 => 'gov.rw',
+ 5252 => 'net.rw',
+ 5253 => 'edu.rw',
+ 5254 => 'ac.rw',
+ 5255 => 'com.rw',
+ 5256 => 'co.rw',
+ 5257 => 'int.rw',
+ 5258 => 'mil.rw',
+ 5259 => 'gouv.rw',
+ 5260 => 'sa',
+ 5261 => 'com.sa',
+ 5262 => 'net.sa',
+ 5263 => 'org.sa',
+ 5264 => 'gov.sa',
+ 5265 => 'med.sa',
+ 5266 => 'pub.sa',
+ 5267 => 'edu.sa',
+ 5268 => 'sch.sa',
+ 5269 => 'sb',
+ 5270 => 'com.sb',
+ 5271 => 'edu.sb',
+ 5272 => 'gov.sb',
+ 5273 => 'net.sb',
+ 5274 => 'org.sb',
+ 5275 => 'sc',
+ 5276 => 'com.sc',
+ 5277 => 'gov.sc',
+ 5278 => 'net.sc',
+ 5279 => 'org.sc',
+ 5280 => 'edu.sc',
+ 5281 => 'sd',
+ 5282 => 'com.sd',
+ 5283 => 'net.sd',
+ 5284 => 'org.sd',
+ 5285 => 'edu.sd',
+ 5286 => 'med.sd',
+ 5287 => 'tv.sd',
+ 5288 => 'gov.sd',
+ 5289 => 'info.sd',
+ 5290 => 'se',
+ 5291 => 'a.se',
+ 5292 => 'ac.se',
+ 5293 => 'b.se',
+ 5294 => 'bd.se',
+ 5295 => 'brand.se',
+ 5296 => 'c.se',
+ 5297 => 'd.se',
+ 5298 => 'e.se',
+ 5299 => 'f.se',
+ 5300 => 'fh.se',
+ 5301 => 'fhsk.se',
+ 5302 => 'fhv.se',
+ 5303 => 'g.se',
+ 5304 => 'h.se',
+ 5305 => 'i.se',
+ 5306 => 'k.se',
+ 5307 => 'komforb.se',
+ 5308 => 'kommunalforbund.se',
+ 5309 => 'komvux.se',
+ 5310 => 'l.se',
+ 5311 => 'lanbib.se',
+ 5312 => 'm.se',
+ 5313 => 'n.se',
+ 5314 => 'naturbruksgymn.se',
+ 5315 => 'o.se',
+ 5316 => 'org.se',
+ 5317 => 'p.se',
+ 5318 => 'parti.se',
+ 5319 => 'pp.se',
+ 5320 => 'press.se',
+ 5321 => 'r.se',
+ 5322 => 's.se',
+ 5323 => 't.se',
+ 5324 => 'tm.se',
+ 5325 => 'u.se',
+ 5326 => 'w.se',
+ 5327 => 'x.se',
+ 5328 => 'y.se',
+ 5329 => 'z.se',
+ 5330 => 'sg',
+ 5331 => 'com.sg',
+ 5332 => 'net.sg',
+ 5333 => 'org.sg',
+ 5334 => 'gov.sg',
+ 5335 => 'edu.sg',
+ 5336 => 'per.sg',
+ 5337 => 'sh',
+ 5338 => 'com.sh',
+ 5339 => 'net.sh',
+ 5340 => 'gov.sh',
+ 5341 => 'org.sh',
+ 5342 => 'mil.sh',
+ 5343 => 'si',
+ 5344 => 'sj',
+ 5345 => 'sk',
+ 5346 => 'sl',
+ 5347 => 'com.sl',
+ 5348 => 'net.sl',
+ 5349 => 'edu.sl',
+ 5350 => 'gov.sl',
+ 5351 => 'org.sl',
+ 5352 => 'sm',
+ 5353 => 'sn',
+ 5354 => 'art.sn',
+ 5355 => 'com.sn',
+ 5356 => 'edu.sn',
+ 5357 => 'gouv.sn',
+ 5358 => 'org.sn',
+ 5359 => 'perso.sn',
+ 5360 => 'univ.sn',
+ 5361 => 'so',
+ 5362 => 'com.so',
+ 5363 => 'net.so',
+ 5364 => 'org.so',
+ 5365 => 'sr',
+ 5366 => 'st',
+ 5367 => 'co.st',
+ 5368 => 'com.st',
+ 5369 => 'consulado.st',
+ 5370 => 'edu.st',
+ 5371 => 'embaixada.st',
+ 5372 => 'gov.st',
+ 5373 => 'mil.st',
+ 5374 => 'net.st',
+ 5375 => 'org.st',
+ 5376 => 'principe.st',
+ 5377 => 'saotome.st',
+ 5378 => 'store.st',
+ 5379 => 'su',
+ 5380 => 'adygeya.su',
+ 5381 => 'arkhangelsk.su',
+ 5382 => 'balashov.su',
+ 5383 => 'bashkiria.su',
+ 5384 => 'bryansk.su',
+ 5385 => 'dagestan.su',
+ 5386 => 'grozny.su',
+ 5387 => 'ivanovo.su',
+ 5388 => 'kalmykia.su',
+ 5389 => 'kaluga.su',
+ 5390 => 'karelia.su',
+ 5391 => 'khakassia.su',
+ 5392 => 'krasnodar.su',
+ 5393 => 'kurgan.su',
+ 5394 => 'lenug.su',
+ 5395 => 'mordovia.su',
+ 5396 => 'msk.su',
+ 5397 => 'murmansk.su',
+ 5398 => 'nalchik.su',
+ 5399 => 'nov.su',
+ 5400 => 'obninsk.su',
+ 5401 => 'penza.su',
+ 5402 => 'pokrovsk.su',
+ 5403 => 'sochi.su',
+ 5404 => 'spb.su',
+ 5405 => 'togliatti.su',
+ 5406 => 'troitsk.su',
+ 5407 => 'tula.su',
+ 5408 => 'tuva.su',
+ 5409 => 'vladikavkaz.su',
+ 5410 => 'vladimir.su',
+ 5411 => 'vologda.su',
+ 5412 => 'sv',
+ 5413 => 'com.sv',
+ 5414 => 'edu.sv',
+ 5415 => 'gob.sv',
+ 5416 => 'org.sv',
+ 5417 => 'red.sv',
+ 5418 => 'sx',
+ 5419 => 'gov.sx',
+ 5420 => 'sy',
+ 5421 => 'edu.sy',
+ 5422 => 'gov.sy',
+ 5423 => 'net.sy',
+ 5424 => 'mil.sy',
+ 5425 => 'com.sy',
+ 5426 => 'org.sy',
+ 5427 => 'sz',
+ 5428 => 'co.sz',
+ 5429 => 'ac.sz',
+ 5430 => 'org.sz',
+ 5431 => 'tc',
+ 5432 => 'td',
+ 5433 => 'tel',
+ 5434 => 'tf',
+ 5435 => 'tg',
+ 5436 => 'th',
+ 5437 => 'ac.th',
+ 5438 => 'co.th',
+ 5439 => 'go.th',
+ 5440 => 'in.th',
+ 5441 => 'mi.th',
+ 5442 => 'net.th',
+ 5443 => 'or.th',
+ 5444 => 'tj',
+ 5445 => 'ac.tj',
+ 5446 => 'biz.tj',
+ 5447 => 'co.tj',
+ 5448 => 'com.tj',
+ 5449 => 'edu.tj',
+ 5450 => 'go.tj',
+ 5451 => 'gov.tj',
+ 5452 => 'int.tj',
+ 5453 => 'mil.tj',
+ 5454 => 'name.tj',
+ 5455 => 'net.tj',
+ 5456 => 'nic.tj',
+ 5457 => 'org.tj',
+ 5458 => 'test.tj',
+ 5459 => 'web.tj',
+ 5460 => 'tk',
+ 5461 => 'tl',
+ 5462 => 'gov.tl',
+ 5463 => 'tm',
+ 5464 => 'com.tm',
+ 5465 => 'co.tm',
+ 5466 => 'org.tm',
+ 5467 => 'net.tm',
+ 5468 => 'nom.tm',
+ 5469 => 'gov.tm',
+ 5470 => 'mil.tm',
+ 5471 => 'edu.tm',
+ 5472 => 'tn',
+ 5473 => 'com.tn',
+ 5474 => 'ens.tn',
+ 5475 => 'fin.tn',
+ 5476 => 'gov.tn',
+ 5477 => 'ind.tn',
+ 5478 => 'intl.tn',
+ 5479 => 'nat.tn',
+ 5480 => 'net.tn',
+ 5481 => 'org.tn',
+ 5482 => 'info.tn',
+ 5483 => 'perso.tn',
+ 5484 => 'tourism.tn',
+ 5485 => 'edunet.tn',
+ 5486 => 'rnrt.tn',
+ 5487 => 'rns.tn',
+ 5488 => 'rnu.tn',
+ 5489 => 'mincom.tn',
+ 5490 => 'agrinet.tn',
+ 5491 => 'defense.tn',
+ 5492 => 'turen.tn',
+ 5493 => 'to',
+ 5494 => 'com.to',
+ 5495 => 'gov.to',
+ 5496 => 'net.to',
+ 5497 => 'org.to',
+ 5498 => 'edu.to',
+ 5499 => 'mil.to',
+ 5500 => 'tr',
+ 5501 => 'com.tr',
+ 5502 => 'info.tr',
+ 5503 => 'biz.tr',
+ 5504 => 'net.tr',
+ 5505 => 'org.tr',
+ 5506 => 'web.tr',
+ 5507 => 'gen.tr',
+ 5508 => 'tv.tr',
+ 5509 => 'av.tr',
+ 5510 => 'dr.tr',
+ 5511 => 'bbs.tr',
+ 5512 => 'name.tr',
+ 5513 => 'tel.tr',
+ 5514 => 'gov.tr',
+ 5515 => 'bel.tr',
+ 5516 => 'pol.tr',
+ 5517 => 'mil.tr',
+ 5518 => 'k12.tr',
+ 5519 => 'edu.tr',
+ 5520 => 'kep.tr',
+ 5521 => 'nc.tr',
+ 5522 => 'gov.nc.tr',
+ 5523 => 'travel',
+ 5524 => 'tt',
+ 5525 => 'co.tt',
+ 5526 => 'com.tt',
+ 5527 => 'org.tt',
+ 5528 => 'net.tt',
+ 5529 => 'biz.tt',
+ 5530 => 'info.tt',
+ 5531 => 'pro.tt',
+ 5532 => 'int.tt',
+ 5533 => 'coop.tt',
+ 5534 => 'jobs.tt',
+ 5535 => 'mobi.tt',
+ 5536 => 'travel.tt',
+ 5537 => 'museum.tt',
+ 5538 => 'aero.tt',
+ 5539 => 'name.tt',
+ 5540 => 'gov.tt',
+ 5541 => 'edu.tt',
+ 5542 => 'tv',
+ 5543 => 'tw',
+ 5544 => 'edu.tw',
+ 5545 => 'gov.tw',
+ 5546 => 'mil.tw',
+ 5547 => 'com.tw',
+ 5548 => 'net.tw',
+ 5549 => 'org.tw',
+ 5550 => 'idv.tw',
+ 5551 => 'game.tw',
+ 5552 => 'ebiz.tw',
+ 5553 => 'club.tw',
+ 5554 => '網路.tw',
+ 5555 => '組織.tw',
+ 5556 => '商業.tw',
+ 5557 => 'tz',
+ 5558 => 'ac.tz',
+ 5559 => 'co.tz',
+ 5560 => 'go.tz',
+ 5561 => 'hotel.tz',
+ 5562 => 'info.tz',
+ 5563 => 'me.tz',
+ 5564 => 'mil.tz',
+ 5565 => 'mobi.tz',
+ 5566 => 'ne.tz',
+ 5567 => 'or.tz',
+ 5568 => 'sc.tz',
+ 5569 => 'tv.tz',
+ 5570 => 'ua',
+ 5571 => 'com.ua',
+ 5572 => 'edu.ua',
+ 5573 => 'gov.ua',
+ 5574 => 'in.ua',
+ 5575 => 'net.ua',
+ 5576 => 'org.ua',
+ 5577 => 'cherkassy.ua',
+ 5578 => 'cherkasy.ua',
+ 5579 => 'chernigov.ua',
+ 5580 => 'chernihiv.ua',
+ 5581 => 'chernivtsi.ua',
+ 5582 => 'chernovtsy.ua',
+ 5583 => 'ck.ua',
+ 5584 => 'cn.ua',
+ 5585 => 'cr.ua',
+ 5586 => 'crimea.ua',
+ 5587 => 'cv.ua',
+ 5588 => 'dn.ua',
+ 5589 => 'dnepropetrovsk.ua',
+ 5590 => 'dnipropetrovsk.ua',
+ 5591 => 'dominic.ua',
+ 5592 => 'donetsk.ua',
+ 5593 => 'dp.ua',
+ 5594 => 'if.ua',
+ 5595 => 'ivano-frankivsk.ua',
+ 5596 => 'kh.ua',
+ 5597 => 'kharkiv.ua',
+ 5598 => 'kharkov.ua',
+ 5599 => 'kherson.ua',
+ 5600 => 'khmelnitskiy.ua',
+ 5601 => 'khmelnytskyi.ua',
+ 5602 => 'kiev.ua',
+ 5603 => 'kirovograd.ua',
+ 5604 => 'km.ua',
+ 5605 => 'kr.ua',
+ 5606 => 'krym.ua',
+ 5607 => 'ks.ua',
+ 5608 => 'kv.ua',
+ 5609 => 'kyiv.ua',
+ 5610 => 'lg.ua',
+ 5611 => 'lt.ua',
+ 5612 => 'lugansk.ua',
+ 5613 => 'lutsk.ua',
+ 5614 => 'lv.ua',
+ 5615 => 'lviv.ua',
+ 5616 => 'mk.ua',
+ 5617 => 'mykolaiv.ua',
+ 5618 => 'nikolaev.ua',
+ 5619 => 'od.ua',
+ 5620 => 'odesa.ua',
+ 5621 => 'odessa.ua',
+ 5622 => 'pl.ua',
+ 5623 => 'poltava.ua',
+ 5624 => 'rivne.ua',
+ 5625 => 'rovno.ua',
+ 5626 => 'rv.ua',
+ 5627 => 'sb.ua',
+ 5628 => 'sebastopol.ua',
+ 5629 => 'sevastopol.ua',
+ 5630 => 'sm.ua',
+ 5631 => 'sumy.ua',
+ 5632 => 'te.ua',
+ 5633 => 'ternopil.ua',
+ 5634 => 'uz.ua',
+ 5635 => 'uzhgorod.ua',
+ 5636 => 'vinnica.ua',
+ 5637 => 'vinnytsia.ua',
+ 5638 => 'vn.ua',
+ 5639 => 'volyn.ua',
+ 5640 => 'yalta.ua',
+ 5641 => 'zaporizhzhe.ua',
+ 5642 => 'zaporizhzhia.ua',
+ 5643 => 'zhitomir.ua',
+ 5644 => 'zhytomyr.ua',
+ 5645 => 'zp.ua',
+ 5646 => 'zt.ua',
+ 5647 => 'ug',
+ 5648 => 'co.ug',
+ 5649 => 'or.ug',
+ 5650 => 'ac.ug',
+ 5651 => 'sc.ug',
+ 5652 => 'go.ug',
+ 5653 => 'ne.ug',
+ 5654 => 'com.ug',
+ 5655 => 'org.ug',
+ 5656 => 'uk',
+ 5657 => 'ac.uk',
+ 5658 => 'co.uk',
+ 5659 => 'gov.uk',
+ 5660 => 'ltd.uk',
+ 5661 => 'me.uk',
+ 5662 => 'net.uk',
+ 5663 => 'nhs.uk',
+ 5664 => 'org.uk',
+ 5665 => 'plc.uk',
+ 5666 => 'police.uk',
+ 5667 => '*.sch.uk',
+ 5668 => 'us',
+ 5669 => 'dni.us',
+ 5670 => 'fed.us',
+ 5671 => 'isa.us',
+ 5672 => 'kids.us',
+ 5673 => 'nsn.us',
+ 5674 => 'ak.us',
+ 5675 => 'al.us',
+ 5676 => 'ar.us',
+ 5677 => 'as.us',
+ 5678 => 'az.us',
+ 5679 => 'ca.us',
+ 5680 => 'co.us',
+ 5681 => 'ct.us',
+ 5682 => 'dc.us',
+ 5683 => 'de.us',
+ 5684 => 'fl.us',
+ 5685 => 'ga.us',
+ 5686 => 'gu.us',
+ 5687 => 'hi.us',
+ 5688 => 'ia.us',
+ 5689 => 'id.us',
+ 5690 => 'il.us',
+ 5691 => 'in.us',
+ 5692 => 'ks.us',
+ 5693 => 'ky.us',
+ 5694 => 'la.us',
+ 5695 => 'ma.us',
+ 5696 => 'md.us',
+ 5697 => 'me.us',
+ 5698 => 'mi.us',
+ 5699 => 'mn.us',
+ 5700 => 'mo.us',
+ 5701 => 'ms.us',
+ 5702 => 'mt.us',
+ 5703 => 'nc.us',
+ 5704 => 'nd.us',
+ 5705 => 'ne.us',
+ 5706 => 'nh.us',
+ 5707 => 'nj.us',
+ 5708 => 'nm.us',
+ 5709 => 'nv.us',
+ 5710 => 'ny.us',
+ 5711 => 'oh.us',
+ 5712 => 'ok.us',
+ 5713 => 'or.us',
+ 5714 => 'pa.us',
+ 5715 => 'pr.us',
+ 5716 => 'ri.us',
+ 5717 => 'sc.us',
+ 5718 => 'sd.us',
+ 5719 => 'tn.us',
+ 5720 => 'tx.us',
+ 5721 => 'ut.us',
+ 5722 => 'vi.us',
+ 5723 => 'vt.us',
+ 5724 => 'va.us',
+ 5725 => 'wa.us',
+ 5726 => 'wi.us',
+ 5727 => 'wv.us',
+ 5728 => 'wy.us',
+ 5729 => 'k12.ak.us',
+ 5730 => 'k12.al.us',
+ 5731 => 'k12.ar.us',
+ 5732 => 'k12.as.us',
+ 5733 => 'k12.az.us',
+ 5734 => 'k12.ca.us',
+ 5735 => 'k12.co.us',
+ 5736 => 'k12.ct.us',
+ 5737 => 'k12.dc.us',
+ 5738 => 'k12.de.us',
+ 5739 => 'k12.fl.us',
+ 5740 => 'k12.ga.us',
+ 5741 => 'k12.gu.us',
+ 5742 => 'k12.ia.us',
+ 5743 => 'k12.id.us',
+ 5744 => 'k12.il.us',
+ 5745 => 'k12.in.us',
+ 5746 => 'k12.ks.us',
+ 5747 => 'k12.ky.us',
+ 5748 => 'k12.la.us',
+ 5749 => 'k12.ma.us',
+ 5750 => 'k12.md.us',
+ 5751 => 'k12.me.us',
+ 5752 => 'k12.mi.us',
+ 5753 => 'k12.mn.us',
+ 5754 => 'k12.mo.us',
+ 5755 => 'k12.ms.us',
+ 5756 => 'k12.mt.us',
+ 5757 => 'k12.nc.us',
+ 5758 => 'k12.ne.us',
+ 5759 => 'k12.nh.us',
+ 5760 => 'k12.nj.us',
+ 5761 => 'k12.nm.us',
+ 5762 => 'k12.nv.us',
+ 5763 => 'k12.ny.us',
+ 5764 => 'k12.oh.us',
+ 5765 => 'k12.ok.us',
+ 5766 => 'k12.or.us',
+ 5767 => 'k12.pa.us',
+ 5768 => 'k12.pr.us',
+ 5769 => 'k12.ri.us',
+ 5770 => 'k12.sc.us',
+ 5771 => 'k12.tn.us',
+ 5772 => 'k12.tx.us',
+ 5773 => 'k12.ut.us',
+ 5774 => 'k12.vi.us',
+ 5775 => 'k12.vt.us',
+ 5776 => 'k12.va.us',
+ 5777 => 'k12.wa.us',
+ 5778 => 'k12.wi.us',
+ 5779 => 'k12.wy.us',
+ 5780 => 'cc.ak.us',
+ 5781 => 'cc.al.us',
+ 5782 => 'cc.ar.us',
+ 5783 => 'cc.as.us',
+ 5784 => 'cc.az.us',
+ 5785 => 'cc.ca.us',
+ 5786 => 'cc.co.us',
+ 5787 => 'cc.ct.us',
+ 5788 => 'cc.dc.us',
+ 5789 => 'cc.de.us',
+ 5790 => 'cc.fl.us',
+ 5791 => 'cc.ga.us',
+ 5792 => 'cc.gu.us',
+ 5793 => 'cc.hi.us',
+ 5794 => 'cc.ia.us',
+ 5795 => 'cc.id.us',
+ 5796 => 'cc.il.us',
+ 5797 => 'cc.in.us',
+ 5798 => 'cc.ks.us',
+ 5799 => 'cc.ky.us',
+ 5800 => 'cc.la.us',
+ 5801 => 'cc.ma.us',
+ 5802 => 'cc.md.us',
+ 5803 => 'cc.me.us',
+ 5804 => 'cc.mi.us',
+ 5805 => 'cc.mn.us',
+ 5806 => 'cc.mo.us',
+ 5807 => 'cc.ms.us',
+ 5808 => 'cc.mt.us',
+ 5809 => 'cc.nc.us',
+ 5810 => 'cc.nd.us',
+ 5811 => 'cc.ne.us',
+ 5812 => 'cc.nh.us',
+ 5813 => 'cc.nj.us',
+ 5814 => 'cc.nm.us',
+ 5815 => 'cc.nv.us',
+ 5816 => 'cc.ny.us',
+ 5817 => 'cc.oh.us',
+ 5818 => 'cc.ok.us',
+ 5819 => 'cc.or.us',
+ 5820 => 'cc.pa.us',
+ 5821 => 'cc.pr.us',
+ 5822 => 'cc.ri.us',
+ 5823 => 'cc.sc.us',
+ 5824 => 'cc.sd.us',
+ 5825 => 'cc.tn.us',
+ 5826 => 'cc.tx.us',
+ 5827 => 'cc.ut.us',
+ 5828 => 'cc.vi.us',
+ 5829 => 'cc.vt.us',
+ 5830 => 'cc.va.us',
+ 5831 => 'cc.wa.us',
+ 5832 => 'cc.wi.us',
+ 5833 => 'cc.wv.us',
+ 5834 => 'cc.wy.us',
+ 5835 => 'lib.ak.us',
+ 5836 => 'lib.al.us',
+ 5837 => 'lib.ar.us',
+ 5838 => 'lib.as.us',
+ 5839 => 'lib.az.us',
+ 5840 => 'lib.ca.us',
+ 5841 => 'lib.co.us',
+ 5842 => 'lib.ct.us',
+ 5843 => 'lib.dc.us',
+ 5844 => 'lib.de.us',
+ 5845 => 'lib.fl.us',
+ 5846 => 'lib.ga.us',
+ 5847 => 'lib.gu.us',
+ 5848 => 'lib.hi.us',
+ 5849 => 'lib.ia.us',
+ 5850 => 'lib.id.us',
+ 5851 => 'lib.il.us',
+ 5852 => 'lib.in.us',
+ 5853 => 'lib.ks.us',
+ 5854 => 'lib.ky.us',
+ 5855 => 'lib.la.us',
+ 5856 => 'lib.ma.us',
+ 5857 => 'lib.md.us',
+ 5858 => 'lib.me.us',
+ 5859 => 'lib.mi.us',
+ 5860 => 'lib.mn.us',
+ 5861 => 'lib.mo.us',
+ 5862 => 'lib.ms.us',
+ 5863 => 'lib.mt.us',
+ 5864 => 'lib.nc.us',
+ 5865 => 'lib.nd.us',
+ 5866 => 'lib.ne.us',
+ 5867 => 'lib.nh.us',
+ 5868 => 'lib.nj.us',
+ 5869 => 'lib.nm.us',
+ 5870 => 'lib.nv.us',
+ 5871 => 'lib.ny.us',
+ 5872 => 'lib.oh.us',
+ 5873 => 'lib.ok.us',
+ 5874 => 'lib.or.us',
+ 5875 => 'lib.pa.us',
+ 5876 => 'lib.pr.us',
+ 5877 => 'lib.ri.us',
+ 5878 => 'lib.sc.us',
+ 5879 => 'lib.sd.us',
+ 5880 => 'lib.tn.us',
+ 5881 => 'lib.tx.us',
+ 5882 => 'lib.ut.us',
+ 5883 => 'lib.vi.us',
+ 5884 => 'lib.vt.us',
+ 5885 => 'lib.va.us',
+ 5886 => 'lib.wa.us',
+ 5887 => 'lib.wi.us',
+ 5888 => 'lib.wy.us',
+ 5889 => 'pvt.k12.ma.us',
+ 5890 => 'chtr.k12.ma.us',
+ 5891 => 'paroch.k12.ma.us',
+ 5892 => 'uy',
+ 5893 => 'com.uy',
+ 5894 => 'edu.uy',
+ 5895 => 'gub.uy',
+ 5896 => 'mil.uy',
+ 5897 => 'net.uy',
+ 5898 => 'org.uy',
+ 5899 => 'uz',
+ 5900 => 'co.uz',
+ 5901 => 'com.uz',
+ 5902 => 'net.uz',
+ 5903 => 'org.uz',
+ 5904 => 'va',
+ 5905 => 'vc',
+ 5906 => 'com.vc',
+ 5907 => 'net.vc',
+ 5908 => 'org.vc',
+ 5909 => 'gov.vc',
+ 5910 => 'mil.vc',
+ 5911 => 'edu.vc',
+ 5912 => 've',
+ 5913 => 'arts.ve',
+ 5914 => 'co.ve',
+ 5915 => 'com.ve',
+ 5916 => 'e12.ve',
+ 5917 => 'edu.ve',
+ 5918 => 'firm.ve',
+ 5919 => 'gob.ve',
+ 5920 => 'gov.ve',
+ 5921 => 'info.ve',
+ 5922 => 'int.ve',
+ 5923 => 'mil.ve',
+ 5924 => 'net.ve',
+ 5925 => 'org.ve',
+ 5926 => 'rec.ve',
+ 5927 => 'store.ve',
+ 5928 => 'tec.ve',
+ 5929 => 'web.ve',
+ 5930 => 'vg',
+ 5931 => 'vi',
+ 5932 => 'co.vi',
+ 5933 => 'com.vi',
+ 5934 => 'k12.vi',
+ 5935 => 'net.vi',
+ 5936 => 'org.vi',
+ 5937 => 'vn',
+ 5938 => 'com.vn',
+ 5939 => 'net.vn',
+ 5940 => 'org.vn',
+ 5941 => 'edu.vn',
+ 5942 => 'gov.vn',
+ 5943 => 'int.vn',
+ 5944 => 'ac.vn',
+ 5945 => 'biz.vn',
+ 5946 => 'info.vn',
+ 5947 => 'name.vn',
+ 5948 => 'pro.vn',
+ 5949 => 'health.vn',
+ 5950 => 'vu',
+ 5951 => 'com.vu',
+ 5952 => 'edu.vu',
+ 5953 => 'net.vu',
+ 5954 => 'org.vu',
+ 5955 => 'wf',
+ 5956 => 'ws',
+ 5957 => 'com.ws',
+ 5958 => 'net.ws',
+ 5959 => 'org.ws',
+ 5960 => 'gov.ws',
+ 5961 => 'edu.ws',
+ 5962 => 'yt',
+ 5963 => 'امارات',
+ 5964 => 'հայ',
+ 5965 => 'বাংলা',
+ 5966 => 'бел',
+ 5967 => '中国',
+ 5968 => '中國',
+ 5969 => 'الجزائر',
+ 5970 => 'مصر',
+ 5971 => 'ею',
+ 5972 => 'გე',
+ 5973 => 'ελ',
+ 5974 => '香港',
+ 5975 => 'भारत',
+ 5976 => 'بھارت',
+ 5977 => 'భారత్',
+ 5978 => 'ભારત',
+ 5979 => 'ਭਾਰਤ',
+ 5980 => 'ভারত',
+ 5981 => 'இந்தியா',
+ 5982 => 'ایران',
+ 5983 => 'ايران',
+ 5984 => 'عراق',
+ 5985 => 'الاردن',
+ 5986 => '한국',
+ 5987 => 'қаз',
+ 5988 => 'ලංකා',
+ 5989 => 'இலங்கை',
+ 5990 => 'المغرب',
+ 5991 => 'мкд',
+ 5992 => 'мон',
+ 5993 => '澳門',
+ 5994 => '澳门',
+ 5995 => 'مليسيا',
+ 5996 => 'عمان',
+ 5997 => 'پاکستان',
+ 5998 => 'پاكستان',
+ 5999 => 'فلسطين',
+ 6000 => 'срб',
+ 6001 => 'пр.срб',
+ 6002 => 'орг.срб',
+ 6003 => 'обр.срб',
+ 6004 => 'од.срб',
+ 6005 => 'упр.срб',
+ 6006 => 'ак.срб',
+ 6007 => 'рф',
+ 6008 => 'قطر',
+ 6009 => 'السعودية',
+ 6010 => 'السعودیة',
+ 6011 => 'السعودیۃ',
+ 6012 => 'السعوديه',
+ 6013 => 'سودان',
+ 6014 => '新加坡',
+ 6015 => 'சிங்கப்பூர்',
+ 6016 => 'سورية',
+ 6017 => 'سوريا',
+ 6018 => 'ไทย',
+ 6019 => 'تونس',
+ 6020 => '台灣',
+ 6021 => '台湾',
+ 6022 => '臺灣',
+ 6023 => 'укр',
+ 6024 => 'اليمن',
+ 6025 => 'xxx',
+ 6026 => '*.ye',
+ 6027 => 'ac.za',
+ 6028 => 'agric.za',
+ 6029 => 'alt.za',
+ 6030 => 'co.za',
+ 6031 => 'edu.za',
+ 6032 => 'gov.za',
+ 6033 => 'grondar.za',
+ 6034 => 'law.za',
+ 6035 => 'mil.za',
+ 6036 => 'net.za',
+ 6037 => 'ngo.za',
+ 6038 => 'nis.za',
+ 6039 => 'nom.za',
+ 6040 => 'org.za',
+ 6041 => 'school.za',
+ 6042 => 'tm.za',
+ 6043 => 'web.za',
+ 6044 => 'zm',
+ 6045 => 'ac.zm',
+ 6046 => 'biz.zm',
+ 6047 => 'co.zm',
+ 6048 => 'com.zm',
+ 6049 => 'edu.zm',
+ 6050 => 'gov.zm',
+ 6051 => 'info.zm',
+ 6052 => 'mil.zm',
+ 6053 => 'net.zm',
+ 6054 => 'org.zm',
+ 6055 => 'sch.zm',
+ 6056 => '*.zw',
+ 6057 => 'aaa',
+ 6058 => 'aarp',
+ 6059 => 'abarth',
+ 6060 => 'abb',
+ 6061 => 'abbott',
+ 6062 => 'abbvie',
+ 6063 => 'abc',
+ 6064 => 'able',
+ 6065 => 'abogado',
+ 6066 => 'abudhabi',
+ 6067 => 'academy',
+ 6068 => 'accenture',
+ 6069 => 'accountant',
+ 6070 => 'accountants',
+ 6071 => 'aco',
+ 6072 => 'active',
+ 6073 => 'actor',
+ 6074 => 'adac',
+ 6075 => 'ads',
+ 6076 => 'adult',
+ 6077 => 'aeg',
+ 6078 => 'aetna',
+ 6079 => 'afamilycompany',
+ 6080 => 'afl',
+ 6081 => 'africa',
+ 6082 => 'africamagic',
+ 6083 => 'agakhan',
+ 6084 => 'agency',
+ 6085 => 'aig',
+ 6086 => 'aigo',
+ 6087 => 'airbus',
+ 6088 => 'airforce',
+ 6089 => 'airtel',
+ 6090 => 'akdn',
+ 6091 => 'alfaromeo',
+ 6092 => 'alibaba',
+ 6093 => 'alipay',
+ 6094 => 'allfinanz',
+ 6095 => 'allstate',
+ 6096 => 'ally',
+ 6097 => 'alsace',
+ 6098 => 'alstom',
+ 6099 => 'americanexpress',
+ 6100 => 'americanfamily',
+ 6101 => 'amex',
+ 6102 => 'amfam',
+ 6103 => 'amica',
+ 6104 => 'amsterdam',
+ 6105 => 'analytics',
+ 6106 => 'android',
+ 6107 => 'anquan',
+ 6108 => 'anz',
+ 6109 => 'aol',
+ 6110 => 'apartments',
+ 6111 => 'app',
+ 6112 => 'apple',
+ 6113 => 'aquarelle',
+ 6114 => 'arab',
+ 6115 => 'aramco',
+ 6116 => 'archi',
+ 6117 => 'army',
+ 6118 => 'art',
+ 6119 => 'arte',
+ 6120 => 'asda',
+ 6121 => 'associates',
+ 6122 => 'athleta',
+ 6123 => 'attorney',
+ 6124 => 'auction',
+ 6125 => 'audi',
+ 6126 => 'audible',
+ 6127 => 'audio',
+ 6128 => 'auspost',
+ 6129 => 'author',
+ 6130 => 'auto',
+ 6131 => 'autos',
+ 6132 => 'avianca',
+ 6133 => 'aws',
+ 6134 => 'axa',
+ 6135 => 'azure',
+ 6136 => 'baby',
+ 6137 => 'baidu',
+ 6138 => 'banamex',
+ 6139 => 'bananarepublic',
+ 6140 => 'band',
+ 6141 => 'bank',
+ 6142 => 'bar',
+ 6143 => 'barcelona',
+ 6144 => 'barclaycard',
+ 6145 => 'barclays',
+ 6146 => 'barefoot',
+ 6147 => 'bargains',
+ 6148 => 'baseball',
+ 6149 => 'basketball',
+ 6150 => 'bauhaus',
+ 6151 => 'bayern',
+ 6152 => 'bbc',
+ 6153 => 'bbt',
+ 6154 => 'bbva',
+ 6155 => 'bcg',
+ 6156 => 'bcn',
+ 6157 => 'beats',
+ 6158 => 'beauty',
+ 6159 => 'beer',
+ 6160 => 'bentley',
+ 6161 => 'berlin',
+ 6162 => 'best',
+ 6163 => 'bestbuy',
+ 6164 => 'bet',
+ 6165 => 'bharti',
+ 6166 => 'bible',
+ 6167 => 'bid',
+ 6168 => 'bike',
+ 6169 => 'bing',
+ 6170 => 'bingo',
+ 6171 => 'bio',
+ 6172 => 'black',
+ 6173 => 'blackfriday',
+ 6174 => 'blanco',
+ 6175 => 'blockbuster',
+ 6176 => 'blog',
+ 6177 => 'bloomberg',
+ 6178 => 'blue',
+ 6179 => 'bms',
+ 6180 => 'bmw',
+ 6181 => 'bnl',
+ 6182 => 'bnpparibas',
+ 6183 => 'boats',
+ 6184 => 'boehringer',
+ 6185 => 'bofa',
+ 6186 => 'bom',
+ 6187 => 'bond',
+ 6188 => 'boo',
+ 6189 => 'book',
+ 6190 => 'booking',
+ 6191 => 'boots',
+ 6192 => 'bosch',
+ 6193 => 'bostik',
+ 6194 => 'boston',
+ 6195 => 'bot',
+ 6196 => 'boutique',
+ 6197 => 'box',
+ 6198 => 'bradesco',
+ 6199 => 'bridgestone',
+ 6200 => 'broadway',
+ 6201 => 'broker',
+ 6202 => 'brother',
+ 6203 => 'brussels',
+ 6204 => 'budapest',
+ 6205 => 'bugatti',
+ 6206 => 'build',
+ 6207 => 'builders',
+ 6208 => 'business',
+ 6209 => 'buy',
+ 6210 => 'buzz',
+ 6211 => 'bzh',
+ 6212 => 'cab',
+ 6213 => 'cafe',
+ 6214 => 'cal',
+ 6215 => 'call',
+ 6216 => 'calvinklein',
+ 6217 => 'cam',
+ 6218 => 'camera',
+ 6219 => 'camp',
+ 6220 => 'cancerresearch',
+ 6221 => 'canon',
+ 6222 => 'capetown',
+ 6223 => 'capital',
+ 6224 => 'capitalone',
+ 6225 => 'car',
+ 6226 => 'caravan',
+ 6227 => 'cards',
+ 6228 => 'care',
+ 6229 => 'career',
+ 6230 => 'careers',
+ 6231 => 'cars',
+ 6232 => 'cartier',
+ 6233 => 'casa',
+ 6234 => 'case',
+ 6235 => 'caseih',
+ 6236 => 'cash',
+ 6237 => 'casino',
+ 6238 => 'catering',
+ 6239 => 'catholic',
+ 6240 => 'cba',
+ 6241 => 'cbn',
+ 6242 => 'cbre',
+ 6243 => 'cbs',
+ 6244 => 'ceb',
+ 6245 => 'center',
+ 6246 => 'ceo',
+ 6247 => 'cern',
+ 6248 => 'cfa',
+ 6249 => 'cfd',
+ 6250 => 'chanel',
+ 6251 => 'channel',
+ 6252 => 'chase',
+ 6253 => 'chat',
+ 6254 => 'cheap',
+ 6255 => 'chintai',
+ 6256 => 'chloe',
+ 6257 => 'christmas',
+ 6258 => 'chrome',
+ 6259 => 'chrysler',
+ 6260 => 'church',
+ 6261 => 'cipriani',
+ 6262 => 'circle',
+ 6263 => 'cisco',
+ 6264 => 'citadel',
+ 6265 => 'citi',
+ 6266 => 'citic',
+ 6267 => 'city',
+ 6268 => 'cityeats',
+ 6269 => 'claims',
+ 6270 => 'cleaning',
+ 6271 => 'click',
+ 6272 => 'clinic',
+ 6273 => 'clinique',
+ 6274 => 'clothing',
+ 6275 => 'cloud',
+ 6276 => 'club',
+ 6277 => 'clubmed',
+ 6278 => 'coach',
+ 6279 => 'codes',
+ 6280 => 'coffee',
+ 6281 => 'college',
+ 6282 => 'cologne',
+ 6283 => 'comcast',
+ 6284 => 'commbank',
+ 6285 => 'community',
+ 6286 => 'company',
+ 6287 => 'compare',
+ 6288 => 'computer',
+ 6289 => 'comsec',
+ 6290 => 'condos',
+ 6291 => 'construction',
+ 6292 => 'consulting',
+ 6293 => 'contact',
+ 6294 => 'contractors',
+ 6295 => 'cooking',
+ 6296 => 'cookingchannel',
+ 6297 => 'cool',
+ 6298 => 'corsica',
+ 6299 => 'country',
+ 6300 => 'coupon',
+ 6301 => 'coupons',
+ 6302 => 'courses',
+ 6303 => 'credit',
+ 6304 => 'creditcard',
+ 6305 => 'creditunion',
+ 6306 => 'cricket',
+ 6307 => 'crown',
+ 6308 => 'crs',
+ 6309 => 'cruise',
+ 6310 => 'cruises',
+ 6311 => 'csc',
+ 6312 => 'cuisinella',
+ 6313 => 'cymru',
+ 6314 => 'cyou',
+ 6315 => 'dabur',
+ 6316 => 'dad',
+ 6317 => 'dance',
+ 6318 => 'date',
+ 6319 => 'dating',
+ 6320 => 'datsun',
+ 6321 => 'day',
+ 6322 => 'dclk',
+ 6323 => 'dds',
+ 6324 => 'deal',
+ 6325 => 'dealer',
+ 6326 => 'deals',
+ 6327 => 'degree',
+ 6328 => 'delivery',
+ 6329 => 'dell',
+ 6330 => 'deloitte',
+ 6331 => 'delta',
+ 6332 => 'democrat',
+ 6333 => 'dental',
+ 6334 => 'dentist',
+ 6335 => 'desi',
+ 6336 => 'design',
+ 6337 => 'dev',
+ 6338 => 'dhl',
+ 6339 => 'diamonds',
+ 6340 => 'diet',
+ 6341 => 'digital',
+ 6342 => 'direct',
+ 6343 => 'directory',
+ 6344 => 'discount',
+ 6345 => 'discover',
+ 6346 => 'dish',
+ 6347 => 'diy',
+ 6348 => 'dnp',
+ 6349 => 'docs',
+ 6350 => 'dodge',
+ 6351 => 'dog',
+ 6352 => 'doha',
+ 6353 => 'domains',
+ 6354 => 'dot',
+ 6355 => 'download',
+ 6356 => 'drive',
+ 6357 => 'dstv',
+ 6358 => 'dtv',
+ 6359 => 'dubai',
+ 6360 => 'duck',
+ 6361 => 'dunlop',
+ 6362 => 'duns',
+ 6363 => 'dupont',
+ 6364 => 'durban',
+ 6365 => 'dvag',
+ 6366 => 'dwg',
+ 6367 => 'earth',
+ 6368 => 'eat',
+ 6369 => 'edeka',
+ 6370 => 'education',
+ 6371 => 'email',
+ 6372 => 'emerck',
+ 6373 => 'emerson',
+ 6374 => 'energy',
+ 6375 => 'engineer',
+ 6376 => 'engineering',
+ 6377 => 'enterprises',
+ 6378 => 'epost',
+ 6379 => 'epson',
+ 6380 => 'equipment',
+ 6381 => 'ericsson',
+ 6382 => 'erni',
+ 6383 => 'esq',
+ 6384 => 'estate',
+ 6385 => 'esurance',
+ 6386 => 'etisalat',
+ 6387 => 'eurovision',
+ 6388 => 'eus',
+ 6389 => 'events',
+ 6390 => 'everbank',
+ 6391 => 'exchange',
+ 6392 => 'expert',
+ 6393 => 'exposed',
+ 6394 => 'express',
+ 6395 => 'extraspace',
+ 6396 => 'fage',
+ 6397 => 'fail',
+ 6398 => 'fairwinds',
+ 6399 => 'faith',
+ 6400 => 'family',
+ 6401 => 'fan',
+ 6402 => 'fans',
+ 6403 => 'farm',
+ 6404 => 'farmers',
+ 6405 => 'fashion',
+ 6406 => 'fast',
+ 6407 => 'fedex',
+ 6408 => 'feedback',
+ 6409 => 'ferrari',
+ 6410 => 'ferrero',
+ 6411 => 'fiat',
+ 6412 => 'fidelity',
+ 6413 => 'fido',
+ 6414 => 'film',
+ 6415 => 'final',
+ 6416 => 'finance',
+ 6417 => 'financial',
+ 6418 => 'fire',
+ 6419 => 'firestone',
+ 6420 => 'firmdale',
+ 6421 => 'fish',
+ 6422 => 'fishing',
+ 6423 => 'fit',
+ 6424 => 'fitness',
+ 6425 => 'flickr',
+ 6426 => 'flights',
+ 6427 => 'flir',
+ 6428 => 'florist',
+ 6429 => 'flowers',
+ 6430 => 'flsmidth',
+ 6431 => 'fly',
+ 6432 => 'foo',
+ 6433 => 'food',
+ 6434 => 'foodnetwork',
+ 6435 => 'football',
+ 6436 => 'ford',
+ 6437 => 'forex',
+ 6438 => 'forsale',
+ 6439 => 'forum',
+ 6440 => 'foundation',
+ 6441 => 'fox',
+ 6442 => 'free',
+ 6443 => 'fresenius',
+ 6444 => 'frl',
+ 6445 => 'frogans',
+ 6446 => 'frontdoor',
+ 6447 => 'frontier',
+ 6448 => 'ftr',
+ 6449 => 'fujitsu',
+ 6450 => 'fujixerox',
+ 6451 => 'fun',
+ 6452 => 'fund',
+ 6453 => 'furniture',
+ 6454 => 'futbol',
+ 6455 => 'fyi',
+ 6456 => 'gal',
+ 6457 => 'gallery',
+ 6458 => 'gallo',
+ 6459 => 'gallup',
+ 6460 => 'game',
+ 6461 => 'games',
+ 6462 => 'gap',
+ 6463 => 'garden',
+ 6464 => 'gbiz',
+ 6465 => 'gdn',
+ 6466 => 'gea',
+ 6467 => 'gent',
+ 6468 => 'genting',
+ 6469 => 'george',
+ 6470 => 'ggee',
+ 6471 => 'gift',
+ 6472 => 'gifts',
+ 6473 => 'gives',
+ 6474 => 'giving',
+ 6475 => 'glade',
+ 6476 => 'glass',
+ 6477 => 'gle',
+ 6478 => 'global',
+ 6479 => 'globo',
+ 6480 => 'gmail',
+ 6481 => 'gmbh',
+ 6482 => 'gmo',
+ 6483 => 'gmx',
+ 6484 => 'godaddy',
+ 6485 => 'gold',
+ 6486 => 'goldpoint',
+ 6487 => 'golf',
+ 6488 => 'goo',
+ 6489 => 'goodhands',
+ 6490 => 'goodyear',
+ 6491 => 'goog',
+ 6492 => 'google',
+ 6493 => 'gop',
+ 6494 => 'got',
+ 6495 => 'gotv',
+ 6496 => 'grainger',
+ 6497 => 'graphics',
+ 6498 => 'gratis',
+ 6499 => 'green',
+ 6500 => 'gripe',
+ 6501 => 'group',
+ 6502 => 'guardian',
+ 6503 => 'gucci',
+ 6504 => 'guge',
+ 6505 => 'guide',
+ 6506 => 'guitars',
+ 6507 => 'guru',
+ 6508 => 'hair',
+ 6509 => 'hamburg',
+ 6510 => 'hangout',
+ 6511 => 'haus',
+ 6512 => 'hbo',
+ 6513 => 'hdfc',
+ 6514 => 'hdfcbank',
+ 6515 => 'health',
+ 6516 => 'healthcare',
+ 6517 => 'help',
+ 6518 => 'helsinki',
+ 6519 => 'here',
+ 6520 => 'hermes',
+ 6521 => 'hgtv',
+ 6522 => 'hiphop',
+ 6523 => 'hisamitsu',
+ 6524 => 'hitachi',
+ 6525 => 'hiv',
+ 6526 => 'hkt',
+ 6527 => 'hockey',
+ 6528 => 'holdings',
+ 6529 => 'holiday',
+ 6530 => 'homedepot',
+ 6531 => 'homegoods',
+ 6532 => 'homes',
+ 6533 => 'homesense',
+ 6534 => 'honda',
+ 6535 => 'honeywell',
+ 6536 => 'horse',
+ 6537 => 'host',
+ 6538 => 'hosting',
+ 6539 => 'hot',
+ 6540 => 'hoteles',
+ 6541 => 'hotels',
+ 6542 => 'hotmail',
+ 6543 => 'house',
+ 6544 => 'how',
+ 6545 => 'hsbc',
+ 6546 => 'htc',
+ 6547 => 'hughes',
+ 6548 => 'hyatt',
+ 6549 => 'hyundai',
+ 6550 => 'ibm',
+ 6551 => 'icbc',
+ 6552 => 'ice',
+ 6553 => 'icu',
+ 6554 => 'ieee',
+ 6555 => 'ifm',
+ 6556 => 'iinet',
+ 6557 => 'ikano',
+ 6558 => 'imamat',
+ 6559 => 'imdb',
+ 6560 => 'immo',
+ 6561 => 'immobilien',
+ 6562 => 'industries',
+ 6563 => 'infiniti',
+ 6564 => 'ing',
+ 6565 => 'ink',
+ 6566 => 'institute',
+ 6567 => 'insurance',
+ 6568 => 'insure',
+ 6569 => 'intel',
+ 6570 => 'international',
+ 6571 => 'intuit',
+ 6572 => 'investments',
+ 6573 => 'ipiranga',
+ 6574 => 'irish',
+ 6575 => 'iselect',
+ 6576 => 'ismaili',
+ 6577 => 'ist',
+ 6578 => 'istanbul',
+ 6579 => 'itau',
+ 6580 => 'itv',
+ 6581 => 'iveco',
+ 6582 => 'iwc',
+ 6583 => 'jaguar',
+ 6584 => 'java',
+ 6585 => 'jcb',
+ 6586 => 'jcp',
+ 6587 => 'jeep',
+ 6588 => 'jetzt',
+ 6589 => 'jewelry',
+ 6590 => 'jio',
+ 6591 => 'jlc',
+ 6592 => 'jll',
+ 6593 => 'jmp',
+ 6594 => 'jnj',
+ 6595 => 'joburg',
+ 6596 => 'jot',
+ 6597 => 'joy',
+ 6598 => 'jpmorgan',
+ 6599 => 'jprs',
+ 6600 => 'juegos',
+ 6601 => 'juniper',
+ 6602 => 'kaufen',
+ 6603 => 'kddi',
+ 6604 => 'kerryhotels',
+ 6605 => 'kerrylogistics',
+ 6606 => 'kerryproperties',
+ 6607 => 'kfh',
+ 6608 => 'kia',
+ 6609 => 'kim',
+ 6610 => 'kinder',
+ 6611 => 'kindle',
+ 6612 => 'kitchen',
+ 6613 => 'kiwi',
+ 6614 => 'koeln',
+ 6615 => 'komatsu',
+ 6616 => 'kosher',
+ 6617 => 'kpmg',
+ 6618 => 'kpn',
+ 6619 => 'krd',
+ 6620 => 'kred',
+ 6621 => 'kuokgroup',
+ 6622 => 'kyknet',
+ 6623 => 'kyoto',
+ 6624 => 'lacaixa',
+ 6625 => 'ladbrokes',
+ 6626 => 'lamborghini',
+ 6627 => 'lamer',
+ 6628 => 'lancaster',
+ 6629 => 'lancia',
+ 6630 => 'lancome',
+ 6631 => 'land',
+ 6632 => 'landrover',
+ 6633 => 'lanxess',
+ 6634 => 'lasalle',
+ 6635 => 'lat',
+ 6636 => 'latino',
+ 6637 => 'latrobe',
+ 6638 => 'law',
+ 6639 => 'lawyer',
+ 6640 => 'lds',
+ 6641 => 'lease',
+ 6642 => 'leclerc',
+ 6643 => 'lefrak',
+ 6644 => 'legal',
+ 6645 => 'lego',
+ 6646 => 'lexus',
+ 6647 => 'lgbt',
+ 6648 => 'liaison',
+ 6649 => 'lidl',
+ 6650 => 'life',
+ 6651 => 'lifeinsurance',
+ 6652 => 'lifestyle',
+ 6653 => 'lighting',
+ 6654 => 'like',
+ 6655 => 'lilly',
+ 6656 => 'limited',
+ 6657 => 'limo',
+ 6658 => 'lincoln',
+ 6659 => 'linde',
+ 6660 => 'link',
+ 6661 => 'lipsy',
+ 6662 => 'live',
+ 6663 => 'living',
+ 6664 => 'lixil',
+ 6665 => 'loan',
+ 6666 => 'loans',
+ 6667 => 'locker',
+ 6668 => 'locus',
+ 6669 => 'loft',
+ 6670 => 'lol',
+ 6671 => 'london',
+ 6672 => 'lotte',
+ 6673 => 'lotto',
+ 6674 => 'love',
+ 6675 => 'lpl',
+ 6676 => 'lplfinancial',
+ 6677 => 'ltd',
+ 6678 => 'ltda',
+ 6679 => 'lundbeck',
+ 6680 => 'lupin',
+ 6681 => 'luxe',
+ 6682 => 'luxury',
+ 6683 => 'macys',
+ 6684 => 'madrid',
+ 6685 => 'maif',
+ 6686 => 'maison',
+ 6687 => 'makeup',
+ 6688 => 'man',
+ 6689 => 'management',
+ 6690 => 'mango',
+ 6691 => 'market',
+ 6692 => 'marketing',
+ 6693 => 'markets',
+ 6694 => 'marriott',
+ 6695 => 'marshalls',
+ 6696 => 'maserati',
+ 6697 => 'mattel',
+ 6698 => 'mba',
+ 6699 => 'mcd',
+ 6700 => 'mcdonalds',
+ 6701 => 'mckinsey',
+ 6702 => 'med',
+ 6703 => 'media',
+ 6704 => 'meet',
+ 6705 => 'melbourne',
+ 6706 => 'meme',
+ 6707 => 'memorial',
+ 6708 => 'men',
+ 6709 => 'menu',
+ 6710 => 'meo',
+ 6711 => 'metlife',
+ 6712 => 'miami',
+ 6713 => 'microsoft',
+ 6714 => 'mini',
+ 6715 => 'mint',
+ 6716 => 'mit',
+ 6717 => 'mitsubishi',
+ 6718 => 'mlb',
+ 6719 => 'mls',
+ 6720 => 'mma',
+ 6721 => 'mnet',
+ 6722 => 'mobily',
+ 6723 => 'moda',
+ 6724 => 'moe',
+ 6725 => 'moi',
+ 6726 => 'mom',
+ 6727 => 'monash',
+ 6728 => 'money',
+ 6729 => 'monster',
+ 6730 => 'montblanc',
+ 6731 => 'mopar',
+ 6732 => 'mormon',
+ 6733 => 'mortgage',
+ 6734 => 'moscow',
+ 6735 => 'moto',
+ 6736 => 'motorcycles',
+ 6737 => 'mov',
+ 6738 => 'movie',
+ 6739 => 'movistar',
+ 6740 => 'msd',
+ 6741 => 'mtn',
+ 6742 => 'mtpc',
+ 6743 => 'mtr',
+ 6744 => 'multichoice',
+ 6745 => 'mutual',
+ 6746 => 'mutuelle',
+ 6747 => 'mzansimagic',
+ 6748 => 'nab',
+ 6749 => 'nadex',
+ 6750 => 'nagoya',
+ 6751 => 'naspers',
+ 6752 => 'nationwide',
+ 6753 => 'natura',
+ 6754 => 'navy',
+ 6755 => 'nba',
+ 6756 => 'nec',
+ 6757 => 'netbank',
+ 6758 => 'netflix',
+ 6759 => 'network',
+ 6760 => 'neustar',
+ 6761 => 'new',
+ 6762 => 'newholland',
+ 6763 => 'news',
+ 6764 => 'next',
+ 6765 => 'nextdirect',
+ 6766 => 'nexus',
+ 6767 => 'nfl',
+ 6768 => 'ngo',
+ 6769 => 'nhk',
+ 6770 => 'nico',
+ 6771 => 'nike',
+ 6772 => 'nikon',
+ 6773 => 'ninja',
+ 6774 => 'nissan',
+ 6775 => 'nissay',
+ 6776 => 'nokia',
+ 6777 => 'northwesternmutual',
+ 6778 => 'norton',
+ 6779 => 'now',
+ 6780 => 'nowruz',
+ 6781 => 'nowtv',
+ 6782 => 'nra',
+ 6783 => 'nrw',
+ 6784 => 'ntt',
+ 6785 => 'nyc',
+ 6786 => 'obi',
+ 6787 => 'observer',
+ 6788 => 'off',
+ 6789 => 'office',
+ 6790 => 'okinawa',
+ 6791 => 'olayan',
+ 6792 => 'olayangroup',
+ 6793 => 'oldnavy',
+ 6794 => 'ollo',
+ 6795 => 'omega',
+ 6796 => 'one',
+ 6797 => 'ong',
+ 6798 => 'onl',
+ 6799 => 'online',
+ 6800 => 'onyourside',
+ 6801 => 'ooo',
+ 6802 => 'open',
+ 6803 => 'oracle',
+ 6804 => 'orange',
+ 6805 => 'organic',
+ 6806 => 'orientexpress',
+ 6807 => 'origins',
+ 6808 => 'osaka',
+ 6809 => 'otsuka',
+ 6810 => 'ott',
+ 6811 => 'ovh',
+ 6812 => 'page',
+ 6813 => 'pamperedchef',
+ 6814 => 'panasonic',
+ 6815 => 'panerai',
+ 6816 => 'paris',
+ 6817 => 'pars',
+ 6818 => 'partners',
+ 6819 => 'parts',
+ 6820 => 'party',
+ 6821 => 'passagens',
+ 6822 => 'pay',
+ 6823 => 'payu',
+ 6824 => 'pccw',
+ 6825 => 'pet',
+ 6826 => 'pfizer',
+ 6827 => 'pharmacy',
+ 6828 => 'philips',
+ 6829 => 'photo',
+ 6830 => 'photography',
+ 6831 => 'photos',
+ 6832 => 'physio',
+ 6833 => 'piaget',
+ 6834 => 'pics',
+ 6835 => 'pictet',
+ 6836 => 'pictures',
+ 6837 => 'pid',
+ 6838 => 'pin',
+ 6839 => 'ping',
+ 6840 => 'pink',
+ 6841 => 'pioneer',
+ 6842 => 'pizza',
+ 6843 => 'place',
+ 6844 => 'play',
+ 6845 => 'playstation',
+ 6846 => 'plumbing',
+ 6847 => 'plus',
+ 6848 => 'pnc',
+ 6849 => 'pohl',
+ 6850 => 'poker',
+ 6851 => 'politie',
+ 6852 => 'porn',
+ 6853 => 'pramerica',
+ 6854 => 'praxi',
+ 6855 => 'press',
+ 6856 => 'prime',
+ 6857 => 'prod',
+ 6858 => 'productions',
+ 6859 => 'prof',
+ 6860 => 'progressive',
+ 6861 => 'promo',
+ 6862 => 'properties',
+ 6863 => 'property',
+ 6864 => 'protection',
+ 6865 => 'pru',
+ 6866 => 'prudential',
+ 6867 => 'pub',
+ 6868 => 'pwc',
+ 6869 => 'qpon',
+ 6870 => 'quebec',
+ 6871 => 'quest',
+ 6872 => 'qvc',
+ 6873 => 'racing',
+ 6874 => 'raid',
+ 6875 => 'read',
+ 6876 => 'realestate',
+ 6877 => 'realtor',
+ 6878 => 'realty',
+ 6879 => 'recipes',
+ 6880 => 'red',
+ 6881 => 'redstone',
+ 6882 => 'redumbrella',
+ 6883 => 'rehab',
+ 6884 => 'reise',
+ 6885 => 'reisen',
+ 6886 => 'reit',
+ 6887 => 'reliance',
+ 6888 => 'ren',
+ 6889 => 'rent',
+ 6890 => 'rentals',
+ 6891 => 'repair',
+ 6892 => 'report',
+ 6893 => 'republican',
+ 6894 => 'rest',
+ 6895 => 'restaurant',
+ 6896 => 'review',
+ 6897 => 'reviews',
+ 6898 => 'rexroth',
+ 6899 => 'rich',
+ 6900 => 'richardli',
+ 6901 => 'ricoh',
+ 6902 => 'rightathome',
+ 6903 => 'ril',
+ 6904 => 'rio',
+ 6905 => 'rip',
+ 6906 => 'rmit',
+ 6907 => 'rocher',
+ 6908 => 'rocks',
+ 6909 => 'rodeo',
+ 6910 => 'rogers',
+ 6911 => 'room',
+ 6912 => 'rsvp',
+ 6913 => 'ruhr',
+ 6914 => 'run',
+ 6915 => 'rwe',
+ 6916 => 'ryukyu',
+ 6917 => 'saarland',
+ 6918 => 'safe',
+ 6919 => 'safety',
+ 6920 => 'sakura',
+ 6921 => 'sale',
+ 6922 => 'salon',
+ 6923 => 'samsclub',
+ 6924 => 'samsung',
+ 6925 => 'sandvik',
+ 6926 => 'sandvikcoromant',
+ 6927 => 'sanofi',
+ 6928 => 'sap',
+ 6929 => 'sapo',
+ 6930 => 'sarl',
+ 6931 => 'sas',
+ 6932 => 'save',
+ 6933 => 'saxo',
+ 6934 => 'sbi',
+ 6935 => 'sbs',
+ 6936 => 'sca',
+ 6937 => 'scb',
+ 6938 => 'schaeffler',
+ 6939 => 'schmidt',
+ 6940 => 'scholarships',
+ 6941 => 'school',
+ 6942 => 'schule',
+ 6943 => 'schwarz',
+ 6944 => 'science',
+ 6945 => 'scjohnson',
+ 6946 => 'scor',
+ 6947 => 'scot',
+ 6948 => 'seat',
+ 6949 => 'secure',
+ 6950 => 'security',
+ 6951 => 'seek',
+ 6952 => 'select',
+ 6953 => 'sener',
+ 6954 => 'services',
+ 6955 => 'ses',
+ 6956 => 'seven',
+ 6957 => 'sew',
+ 6958 => 'sex',
+ 6959 => 'sexy',
+ 6960 => 'sfr',
+ 6961 => 'shangrila',
+ 6962 => 'sharp',
+ 6963 => 'shaw',
+ 6964 => 'shell',
+ 6965 => 'shia',
+ 6966 => 'shiksha',
+ 6967 => 'shoes',
+ 6968 => 'shop',
+ 6969 => 'shopping',
+ 6970 => 'shouji',
+ 6971 => 'show',
+ 6972 => 'showtime',
+ 6973 => 'shriram',
+ 6974 => 'silk',
+ 6975 => 'sina',
+ 6976 => 'singles',
+ 6977 => 'site',
+ 6978 => 'ski',
+ 6979 => 'skin',
+ 6980 => 'sky',
+ 6981 => 'skype',
+ 6982 => 'sling',
+ 6983 => 'smart',
+ 6984 => 'smile',
+ 6985 => 'sncf',
+ 6986 => 'soccer',
+ 6987 => 'social',
+ 6988 => 'softbank',
+ 6989 => 'software',
+ 6990 => 'sohu',
+ 6991 => 'solar',
+ 6992 => 'solutions',
+ 6993 => 'song',
+ 6994 => 'sony',
+ 6995 => 'soy',
+ 6996 => 'space',
+ 6997 => 'spiegel',
+ 6998 => 'spot',
+ 6999 => 'spreadbetting',
+ 7000 => 'srl',
+ 7001 => 'srt',
+ 7002 => 'stada',
+ 7003 => 'staples',
+ 7004 => 'star',
+ 7005 => 'starhub',
+ 7006 => 'statebank',
+ 7007 => 'statefarm',
+ 7008 => 'statoil',
+ 7009 => 'stc',
+ 7010 => 'stcgroup',
+ 7011 => 'stockholm',
+ 7012 => 'storage',
+ 7013 => 'store',
+ 7014 => 'stream',
+ 7015 => 'studio',
+ 7016 => 'study',
+ 7017 => 'style',
+ 7018 => 'sucks',
+ 7019 => 'supersport',
+ 7020 => 'supplies',
+ 7021 => 'supply',
+ 7022 => 'support',
+ 7023 => 'surf',
+ 7024 => 'surgery',
+ 7025 => 'suzuki',
+ 7026 => 'swatch',
+ 7027 => 'swiftcover',
+ 7028 => 'swiss',
+ 7029 => 'sydney',
+ 7030 => 'symantec',
+ 7031 => 'systems',
+ 7032 => 'tab',
+ 7033 => 'taipei',
+ 7034 => 'talk',
+ 7035 => 'taobao',
+ 7036 => 'target',
+ 7037 => 'tatamotors',
+ 7038 => 'tatar',
+ 7039 => 'tattoo',
+ 7040 => 'tax',
+ 7041 => 'taxi',
+ 7042 => 'tci',
+ 7043 => 'tdk',
+ 7044 => 'team',
+ 7045 => 'tech',
+ 7046 => 'technology',
+ 7047 => 'telecity',
+ 7048 => 'telefonica',
+ 7049 => 'temasek',
+ 7050 => 'tennis',
+ 7051 => 'teva',
+ 7052 => 'thd',
+ 7053 => 'theater',
+ 7054 => 'theatre',
+ 7055 => 'theguardian',
+ 7056 => 'tiaa',
+ 7057 => 'tickets',
+ 7058 => 'tienda',
+ 7059 => 'tiffany',
+ 7060 => 'tips',
+ 7061 => 'tires',
+ 7062 => 'tirol',
+ 7063 => 'tjmaxx',
+ 7064 => 'tjx',
+ 7065 => 'tkmaxx',
+ 7066 => 'tmall',
+ 7067 => 'today',
+ 7068 => 'tokyo',
+ 7069 => 'tools',
+ 7070 => 'top',
+ 7071 => 'toray',
+ 7072 => 'toshiba',
+ 7073 => 'total',
+ 7074 => 'tours',
+ 7075 => 'town',
+ 7076 => 'toyota',
+ 7077 => 'toys',
+ 7078 => 'trade',
+ 7079 => 'trading',
+ 7080 => 'training',
+ 7081 => 'travelchannel',
+ 7082 => 'travelers',
+ 7083 => 'travelersinsurance',
+ 7084 => 'trust',
+ 7085 => 'trv',
+ 7086 => 'tube',
+ 7087 => 'tui',
+ 7088 => 'tunes',
+ 7089 => 'tushu',
+ 7090 => 'tvs',
+ 7091 => 'ubank',
+ 7092 => 'ubs',
+ 7093 => 'uconnect',
+ 7094 => 'unicom',
+ 7095 => 'university',
+ 7096 => 'uno',
+ 7097 => 'uol',
+ 7098 => 'ups',
+ 7099 => 'vacations',
+ 7100 => 'vana',
+ 7101 => 'vanguard',
+ 7102 => 'vegas',
+ 7103 => 'ventures',
+ 7104 => 'verisign',
+ 7105 => 'versicherung',
+ 7106 => 'vet',
+ 7107 => 'viajes',
+ 7108 => 'video',
+ 7109 => 'vig',
+ 7110 => 'viking',
+ 7111 => 'villas',
+ 7112 => 'vin',
+ 7113 => 'vip',
+ 7114 => 'virgin',
+ 7115 => 'visa',
+ 7116 => 'vision',
+ 7117 => 'vista',
+ 7118 => 'vistaprint',
+ 7119 => 'viva',
+ 7120 => 'vivo',
+ 7121 => 'vlaanderen',
+ 7122 => 'vodka',
+ 7123 => 'volkswagen',
+ 7124 => 'volvo',
+ 7125 => 'vote',
+ 7126 => 'voting',
+ 7127 => 'voto',
+ 7128 => 'voyage',
+ 7129 => 'vuelos',
+ 7130 => 'wales',
+ 7131 => 'walmart',
+ 7132 => 'walter',
+ 7133 => 'wang',
+ 7134 => 'wanggou',
+ 7135 => 'warman',
+ 7136 => 'watch',
+ 7137 => 'watches',
+ 7138 => 'weather',
+ 7139 => 'weatherchannel',
+ 7140 => 'webcam',
+ 7141 => 'weber',
+ 7142 => 'website',
+ 7143 => 'wed',
+ 7144 => 'wedding',
+ 7145 => 'weibo',
+ 7146 => 'weir',
+ 7147 => 'whoswho',
+ 7148 => 'wien',
+ 7149 => 'wiki',
+ 7150 => 'williamhill',
+ 7151 => 'win',
+ 7152 => 'windows',
+ 7153 => 'wine',
+ 7154 => 'winners',
+ 7155 => 'wme',
+ 7156 => 'wolterskluwer',
+ 7157 => 'woodside',
+ 7158 => 'work',
+ 7159 => 'works',
+ 7160 => 'world',
+ 7161 => 'wow',
+ 7162 => 'wtc',
+ 7163 => 'wtf',
+ 7164 => 'xbox',
+ 7165 => 'xerox',
+ 7166 => 'xfinity',
+ 7167 => 'xihuan',
+ 7168 => 'xin',
+ 7169 => 'कॉम',
+ 7170 => 'セール',
+ 7171 => '佛山',
+ 7172 => '慈善',
+ 7173 => '集团',
+ 7174 => '在线',
+ 7175 => '大众汽车',
+ 7176 => '点看',
+ 7177 => 'คอม',
+ 7178 => '八卦',
+ 7179 => 'موقع',
+ 7180 => '一号店',
+ 7181 => '公益',
+ 7182 => '公司',
+ 7183 => '香格里拉',
+ 7184 => '网站',
+ 7185 => '移动',
+ 7186 => '我爱你',
+ 7187 => 'москва',
+ 7188 => 'католик',
+ 7189 => 'онлайн',
+ 7190 => 'сайт',
+ 7191 => '联通',
+ 7192 => 'קום',
+ 7193 => '时尚',
+ 7194 => '微博',
+ 7195 => '淡马锡',
+ 7196 => 'ファッション',
+ 7197 => 'орг',
+ 7198 => 'नेट',
+ 7199 => 'ストア',
+ 7200 => '삼성',
+ 7201 => '商标',
+ 7202 => '商店',
+ 7203 => '商城',
+ 7204 => 'дети',
+ 7205 => 'ポイント',
+ 7206 => '新闻',
+ 7207 => '工行',
+ 7208 => '家電',
+ 7209 => 'كوم',
+ 7210 => '中文网',
+ 7211 => '中信',
+ 7212 => '娱乐',
+ 7213 => '谷歌',
+ 7214 => '電訊盈科',
+ 7215 => '购物',
+ 7216 => 'クラウド',
+ 7217 => '通販',
+ 7218 => '网店',
+ 7219 => 'संगठन',
+ 7220 => '餐厅',
+ 7221 => '网络',
+ 7222 => 'ком',
+ 7223 => '诺基亚',
+ 7224 => '食品',
+ 7225 => '飞利浦',
+ 7226 => '手表',
+ 7227 => '手机',
+ 7228 => 'ارامكو',
+ 7229 => 'العليان',
+ 7230 => 'اتصالات',
+ 7231 => 'بازار',
+ 7232 => 'موبايلي',
+ 7233 => 'ابوظبي',
+ 7234 => 'كاثوليك',
+ 7235 => 'همراه',
+ 7236 => '닷컴',
+ 7237 => '政府',
+ 7238 => 'شبكة',
+ 7239 => 'بيتك',
+ 7240 => 'عرب',
+ 7241 => '机构',
+ 7242 => '组织机构',
+ 7243 => '健康',
+ 7244 => 'рус',
+ 7245 => '珠宝',
+ 7246 => '大拿',
+ 7247 => 'みんな',
+ 7248 => 'グーグル',
+ 7249 => '世界',
+ 7250 => '書籍',
+ 7251 => '网址',
+ 7252 => '닷넷',
+ 7253 => 'コム',
+ 7254 => '天主教',
+ 7255 => '游戏',
+ 7256 => 'vermögensberater',
+ 7257 => 'vermögensberatung',
+ 7258 => '企业',
+ 7259 => '信息',
+ 7260 => '嘉里大酒店',
+ 7261 => '嘉里',
+ 7262 => '广东',
+ 7263 => '政务',
+ 7264 => 'xperia',
+ 7265 => 'xyz',
+ 7266 => 'yachts',
+ 7267 => 'yahoo',
+ 7268 => 'yamaxun',
+ 7269 => 'yandex',
+ 7270 => 'yodobashi',
+ 7271 => 'yoga',
+ 7272 => 'yokohama',
+ 7273 => 'you',
+ 7274 => 'youtube',
+ 7275 => 'yun',
+ 7276 => 'zappos',
+ 7277 => 'zara',
+ 7278 => 'zero',
+ 7279 => 'zip',
+ 7280 => 'zippo',
+ 7281 => 'zone',
+ 7282 => 'zuerich',
+ 7283 => '*.compute.estate',
+ 7284 => '*.alces.network',
+ 7285 => 'cloudfront.net',
+ 7286 => 'ap-northeast-1.compute.amazonaws.com',
+ 7287 => 'ap-northeast-2.compute.amazonaws.com',
+ 7288 => 'ap-southeast-1.compute.amazonaws.com',
+ 7289 => 'ap-southeast-2.compute.amazonaws.com',
+ 7290 => 'cn-north-1.compute.amazonaws.cn',
+ 7291 => 'compute-1.amazonaws.com',
+ 7292 => 'compute.amazonaws.cn',
+ 7293 => 'compute.amazonaws.com',
+ 7294 => 'eu-central-1.compute.amazonaws.com',
+ 7295 => 'eu-west-1.compute.amazonaws.com',
+ 7296 => 'sa-east-1.compute.amazonaws.com',
+ 7297 => 'us-east-1.amazonaws.com',
+ 7298 => 'us-gov-west-1.compute.amazonaws.com',
+ 7299 => 'us-west-1.compute.amazonaws.com',
+ 7300 => 'us-west-2.compute.amazonaws.com',
+ 7301 => 'z-1.compute-1.amazonaws.com',
+ 7302 => 'z-2.compute-1.amazonaws.com',
+ 7303 => 'elasticbeanstalk.com',
+ 7304 => 'elb.amazonaws.com',
+ 7305 => 's3.amazonaws.com',
+ 7306 => 's3-ap-northeast-1.amazonaws.com',
+ 7307 => 's3-ap-northeast-2.amazonaws.com',
+ 7308 => 's3-ap-southeast-1.amazonaws.com',
+ 7309 => 's3-ap-southeast-2.amazonaws.com',
+ 7310 => 's3-eu-central-1.amazonaws.com',
+ 7311 => 's3-eu-west-1.amazonaws.com',
+ 7312 => 's3-external-1.amazonaws.com',
+ 7313 => 's3-external-2.amazonaws.com',
+ 7314 => 's3-fips-us-gov-west-1.amazonaws.com',
+ 7315 => 's3-sa-east-1.amazonaws.com',
+ 7316 => 's3-us-gov-west-1.amazonaws.com',
+ 7317 => 's3-us-west-1.amazonaws.com',
+ 7318 => 's3-us-west-2.amazonaws.com',
+ 7319 => 's3.ap-northeast-2.amazonaws.com',
+ 7320 => 's3.cn-north-1.amazonaws.com.cn',
+ 7321 => 's3.eu-central-1.amazonaws.com',
+ 7322 => 'on-aptible.com',
+ 7323 => 'myfritz.net',
+ 7324 => 'betainabox.com',
+ 7325 => 'ae.org',
+ 7326 => 'ar.com',
+ 7327 => 'br.com',
+ 7328 => 'cn.com',
+ 7329 => 'com.de',
+ 7330 => 'com.se',
+ 7331 => 'de.com',
+ 7332 => 'eu.com',
+ 7333 => 'gb.com',
+ 7334 => 'gb.net',
+ 7335 => 'hu.com',
+ 7336 => 'hu.net',
+ 7337 => 'jp.net',
+ 7338 => 'jpn.com',
+ 7339 => 'kr.com',
+ 7340 => 'mex.com',
+ 7341 => 'no.com',
+ 7342 => 'qc.com',
+ 7343 => 'ru.com',
+ 7344 => 'sa.com',
+ 7345 => 'se.com',
+ 7346 => 'se.net',
+ 7347 => 'uk.com',
+ 7348 => 'uk.net',
+ 7349 => 'us.com',
+ 7350 => 'uy.com',
+ 7351 => 'za.bz',
+ 7352 => 'za.com',
+ 7353 => 'africa.com',
+ 7354 => 'gr.com',
+ 7355 => 'in.net',
+ 7356 => 'us.org',
+ 7357 => 'co.com',
+ 7358 => 'c.la',
+ 7359 => 'xenapponazure.com',
+ 7360 => 'cloudcontrolled.com',
+ 7361 => 'cloudcontrolapp.com',
+ 7362 => 'co.ca',
+ 7363 => 'co.cz',
+ 7364 => 'c.cdn77.org',
+ 7365 => 'cdn77-ssl.net',
+ 7366 => 'r.cdn77.net',
+ 7367 => 'rsc.cdn77.org',
+ 7368 => 'ssl.origin.cdn77-secure.org',
+ 7369 => 'co.nl',
+ 7370 => 'co.no',
+ 7371 => '*.platform.sh',
+ 7372 => 'cupcake.is',
+ 7373 => 'cyon.link',
+ 7374 => 'cyon.site',
+ 7375 => 'daplie.me',
+ 7376 => 'biz.dk',
+ 7377 => 'co.dk',
+ 7378 => 'firm.dk',
+ 7379 => 'reg.dk',
+ 7380 => 'store.dk',
+ 7381 => 'dedyn.io',
+ 7382 => 'dnshome.de',
+ 7383 => 'dreamhosters.com',
+ 7384 => 'mydrobo.com',
+ 7385 => 'duckdns.org',
+ 7386 => 'dy.fi',
+ 7387 => 'tunk.org',
+ 7388 => 'dyndns-at-home.com',
+ 7389 => 'dyndns-at-work.com',
+ 7390 => 'dyndns-blog.com',
+ 7391 => 'dyndns-free.com',
+ 7392 => 'dyndns-home.com',
+ 7393 => 'dyndns-ip.com',
+ 7394 => 'dyndns-mail.com',
+ 7395 => 'dyndns-office.com',
+ 7396 => 'dyndns-pics.com',
+ 7397 => 'dyndns-remote.com',
+ 7398 => 'dyndns-server.com',
+ 7399 => 'dyndns-web.com',
+ 7400 => 'dyndns-wiki.com',
+ 7401 => 'dyndns-work.com',
+ 7402 => 'dyndns.biz',
+ 7403 => 'dyndns.info',
+ 7404 => 'dyndns.org',
+ 7405 => 'dyndns.tv',
+ 7406 => 'at-band-camp.net',
+ 7407 => 'ath.cx',
+ 7408 => 'barrel-of-knowledge.info',
+ 7409 => 'barrell-of-knowledge.info',
+ 7410 => 'better-than.tv',
+ 7411 => 'blogdns.com',
+ 7412 => 'blogdns.net',
+ 7413 => 'blogdns.org',
+ 7414 => 'blogsite.org',
+ 7415 => 'boldlygoingnowhere.org',
+ 7416 => 'broke-it.net',
+ 7417 => 'buyshouses.net',
+ 7418 => 'cechire.com',
+ 7419 => 'dnsalias.com',
+ 7420 => 'dnsalias.net',
+ 7421 => 'dnsalias.org',
+ 7422 => 'dnsdojo.com',
+ 7423 => 'dnsdojo.net',
+ 7424 => 'dnsdojo.org',
+ 7425 => 'does-it.net',
+ 7426 => 'doesntexist.com',
+ 7427 => 'doesntexist.org',
+ 7428 => 'dontexist.com',
+ 7429 => 'dontexist.net',
+ 7430 => 'dontexist.org',
+ 7431 => 'doomdns.com',
+ 7432 => 'doomdns.org',
+ 7433 => 'dvrdns.org',
+ 7434 => 'dyn-o-saur.com',
+ 7435 => 'dynalias.com',
+ 7436 => 'dynalias.net',
+ 7437 => 'dynalias.org',
+ 7438 => 'dynathome.net',
+ 7439 => 'dyndns.ws',
+ 7440 => 'endofinternet.net',
+ 7441 => 'endofinternet.org',
+ 7442 => 'endoftheinternet.org',
+ 7443 => 'est-a-la-maison.com',
+ 7444 => 'est-a-la-masion.com',
+ 7445 => 'est-le-patron.com',
+ 7446 => 'est-mon-blogueur.com',
+ 7447 => 'for-better.biz',
+ 7448 => 'for-more.biz',
+ 7449 => 'for-our.info',
+ 7450 => 'for-some.biz',
+ 7451 => 'for-the.biz',
+ 7452 => 'forgot.her.name',
+ 7453 => 'forgot.his.name',
+ 7454 => 'from-ak.com',
+ 7455 => 'from-al.com',
+ 7456 => 'from-ar.com',
+ 7457 => 'from-az.net',
+ 7458 => 'from-ca.com',
+ 7459 => 'from-co.net',
+ 7460 => 'from-ct.com',
+ 7461 => 'from-dc.com',
+ 7462 => 'from-de.com',
+ 7463 => 'from-fl.com',
+ 7464 => 'from-ga.com',
+ 7465 => 'from-hi.com',
+ 7466 => 'from-ia.com',
+ 7467 => 'from-id.com',
+ 7468 => 'from-il.com',
+ 7469 => 'from-in.com',
+ 7470 => 'from-ks.com',
+ 7471 => 'from-ky.com',
+ 7472 => 'from-la.net',
+ 7473 => 'from-ma.com',
+ 7474 => 'from-md.com',
+ 7475 => 'from-me.org',
+ 7476 => 'from-mi.com',
+ 7477 => 'from-mn.com',
+ 7478 => 'from-mo.com',
+ 7479 => 'from-ms.com',
+ 7480 => 'from-mt.com',
+ 7481 => 'from-nc.com',
+ 7482 => 'from-nd.com',
+ 7483 => 'from-ne.com',
+ 7484 => 'from-nh.com',
+ 7485 => 'from-nj.com',
+ 7486 => 'from-nm.com',
+ 7487 => 'from-nv.com',
+ 7488 => 'from-ny.net',
+ 7489 => 'from-oh.com',
+ 7490 => 'from-ok.com',
+ 7491 => 'from-or.com',
+ 7492 => 'from-pa.com',
+ 7493 => 'from-pr.com',
+ 7494 => 'from-ri.com',
+ 7495 => 'from-sc.com',
+ 7496 => 'from-sd.com',
+ 7497 => 'from-tn.com',
+ 7498 => 'from-tx.com',
+ 7499 => 'from-ut.com',
+ 7500 => 'from-va.com',
+ 7501 => 'from-vt.com',
+ 7502 => 'from-wa.com',
+ 7503 => 'from-wi.com',
+ 7504 => 'from-wv.com',
+ 7505 => 'from-wy.com',
+ 7506 => 'ftpaccess.cc',
+ 7507 => 'fuettertdasnetz.de',
+ 7508 => 'game-host.org',
+ 7509 => 'game-server.cc',
+ 7510 => 'getmyip.com',
+ 7511 => 'gets-it.net',
+ 7512 => 'go.dyndns.org',
+ 7513 => 'gotdns.com',
+ 7514 => 'gotdns.org',
+ 7515 => 'groks-the.info',
+ 7516 => 'groks-this.info',
+ 7517 => 'ham-radio-op.net',
+ 7518 => 'here-for-more.info',
+ 7519 => 'hobby-site.com',
+ 7520 => 'hobby-site.org',
+ 7521 => 'home.dyndns.org',
+ 7522 => 'homedns.org',
+ 7523 => 'homeftp.net',
+ 7524 => 'homeftp.org',
+ 7525 => 'homeip.net',
+ 7526 => 'homelinux.com',
+ 7527 => 'homelinux.net',
+ 7528 => 'homelinux.org',
+ 7529 => 'homeunix.com',
+ 7530 => 'homeunix.net',
+ 7531 => 'homeunix.org',
+ 7532 => 'iamallama.com',
+ 7533 => 'in-the-band.net',
+ 7534 => 'is-a-anarchist.com',
+ 7535 => 'is-a-blogger.com',
+ 7536 => 'is-a-bookkeeper.com',
+ 7537 => 'is-a-bruinsfan.org',
+ 7538 => 'is-a-bulls-fan.com',
+ 7539 => 'is-a-candidate.org',
+ 7540 => 'is-a-caterer.com',
+ 7541 => 'is-a-celticsfan.org',
+ 7542 => 'is-a-chef.com',
+ 7543 => 'is-a-chef.net',
+ 7544 => 'is-a-chef.org',
+ 7545 => 'is-a-conservative.com',
+ 7546 => 'is-a-cpa.com',
+ 7547 => 'is-a-cubicle-slave.com',
+ 7548 => 'is-a-democrat.com',
+ 7549 => 'is-a-designer.com',
+ 7550 => 'is-a-doctor.com',
+ 7551 => 'is-a-financialadvisor.com',
+ 7552 => 'is-a-geek.com',
+ 7553 => 'is-a-geek.net',
+ 7554 => 'is-a-geek.org',
+ 7555 => 'is-a-green.com',
+ 7556 => 'is-a-guru.com',
+ 7557 => 'is-a-hard-worker.com',
+ 7558 => 'is-a-hunter.com',
+ 7559 => 'is-a-knight.org',
+ 7560 => 'is-a-landscaper.com',
+ 7561 => 'is-a-lawyer.com',
+ 7562 => 'is-a-liberal.com',
+ 7563 => 'is-a-libertarian.com',
+ 7564 => 'is-a-linux-user.org',
+ 7565 => 'is-a-llama.com',
+ 7566 => 'is-a-musician.com',
+ 7567 => 'is-a-nascarfan.com',
+ 7568 => 'is-a-nurse.com',
+ 7569 => 'is-a-painter.com',
+ 7570 => 'is-a-patsfan.org',
+ 7571 => 'is-a-personaltrainer.com',
+ 7572 => 'is-a-photographer.com',
+ 7573 => 'is-a-player.com',
+ 7574 => 'is-a-republican.com',
+ 7575 => 'is-a-rockstar.com',
+ 7576 => 'is-a-socialist.com',
+ 7577 => 'is-a-soxfan.org',
+ 7578 => 'is-a-student.com',
+ 7579 => 'is-a-teacher.com',
+ 7580 => 'is-a-techie.com',
+ 7581 => 'is-a-therapist.com',
+ 7582 => 'is-an-accountant.com',
+ 7583 => 'is-an-actor.com',
+ 7584 => 'is-an-actress.com',
+ 7585 => 'is-an-anarchist.com',
+ 7586 => 'is-an-artist.com',
+ 7587 => 'is-an-engineer.com',
+ 7588 => 'is-an-entertainer.com',
+ 7589 => 'is-by.us',
+ 7590 => 'is-certified.com',
+ 7591 => 'is-found.org',
+ 7592 => 'is-gone.com',
+ 7593 => 'is-into-anime.com',
+ 7594 => 'is-into-cars.com',
+ 7595 => 'is-into-cartoons.com',
+ 7596 => 'is-into-games.com',
+ 7597 => 'is-leet.com',
+ 7598 => 'is-lost.org',
+ 7599 => 'is-not-certified.com',
+ 7600 => 'is-saved.org',
+ 7601 => 'is-slick.com',
+ 7602 => 'is-uberleet.com',
+ 7603 => 'is-very-bad.org',
+ 7604 => 'is-very-evil.org',
+ 7605 => 'is-very-good.org',
+ 7606 => 'is-very-nice.org',
+ 7607 => 'is-very-sweet.org',
+ 7608 => 'is-with-theband.com',
+ 7609 => 'isa-geek.com',
+ 7610 => 'isa-geek.net',
+ 7611 => 'isa-geek.org',
+ 7612 => 'isa-hockeynut.com',
+ 7613 => 'issmarterthanyou.com',
+ 7614 => 'isteingeek.de',
+ 7615 => 'istmein.de',
+ 7616 => 'kicks-ass.net',
+ 7617 => 'kicks-ass.org',
+ 7618 => 'knowsitall.info',
+ 7619 => 'land-4-sale.us',
+ 7620 => 'lebtimnetz.de',
+ 7621 => 'leitungsen.de',
+ 7622 => 'likes-pie.com',
+ 7623 => 'likescandy.com',
+ 7624 => 'merseine.nu',
+ 7625 => 'mine.nu',
+ 7626 => 'misconfused.org',
+ 7627 => 'mypets.ws',
+ 7628 => 'myphotos.cc',
+ 7629 => 'neat-url.com',
+ 7630 => 'office-on-the.net',
+ 7631 => 'on-the-web.tv',
+ 7632 => 'podzone.net',
+ 7633 => 'podzone.org',
+ 7634 => 'readmyblog.org',
+ 7635 => 'saves-the-whales.com',
+ 7636 => 'scrapper-site.net',
+ 7637 => 'scrapping.cc',
+ 7638 => 'selfip.biz',
+ 7639 => 'selfip.com',
+ 7640 => 'selfip.info',
+ 7641 => 'selfip.net',
+ 7642 => 'selfip.org',
+ 7643 => 'sells-for-less.com',
+ 7644 => 'sells-for-u.com',
+ 7645 => 'sells-it.net',
+ 7646 => 'sellsyourhome.org',
+ 7647 => 'servebbs.com',
+ 7648 => 'servebbs.net',
+ 7649 => 'servebbs.org',
+ 7650 => 'serveftp.net',
+ 7651 => 'serveftp.org',
+ 7652 => 'servegame.org',
+ 7653 => 'shacknet.nu',
+ 7654 => 'simple-url.com',
+ 7655 => 'space-to-rent.com',
+ 7656 => 'stuff-4-sale.org',
+ 7657 => 'stuff-4-sale.us',
+ 7658 => 'teaches-yoga.com',
+ 7659 => 'thruhere.net',
+ 7660 => 'traeumtgerade.de',
+ 7661 => 'webhop.biz',
+ 7662 => 'webhop.info',
+ 7663 => 'webhop.net',
+ 7664 => 'webhop.org',
+ 7665 => 'worse-than.tv',
+ 7666 => 'writesthisblog.com',
+ 7667 => 'dynv6.net',
+ 7668 => 'e4.cz',
+ 7669 => 'eu.org',
+ 7670 => 'al.eu.org',
+ 7671 => 'asso.eu.org',
+ 7672 => 'at.eu.org',
+ 7673 => 'au.eu.org',
+ 7674 => 'be.eu.org',
+ 7675 => 'bg.eu.org',
+ 7676 => 'ca.eu.org',
+ 7677 => 'cd.eu.org',
+ 7678 => 'ch.eu.org',
+ 7679 => 'cn.eu.org',
+ 7680 => 'cy.eu.org',
+ 7681 => 'cz.eu.org',
+ 7682 => 'de.eu.org',
+ 7683 => 'dk.eu.org',
+ 7684 => 'edu.eu.org',
+ 7685 => 'ee.eu.org',
+ 7686 => 'es.eu.org',
+ 7687 => 'fi.eu.org',
+ 7688 => 'fr.eu.org',
+ 7689 => 'gr.eu.org',
+ 7690 => 'hr.eu.org',
+ 7691 => 'hu.eu.org',
+ 7692 => 'ie.eu.org',
+ 7693 => 'il.eu.org',
+ 7694 => 'in.eu.org',
+ 7695 => 'int.eu.org',
+ 7696 => 'is.eu.org',
+ 7697 => 'it.eu.org',
+ 7698 => 'jp.eu.org',
+ 7699 => 'kr.eu.org',
+ 7700 => 'lt.eu.org',
+ 7701 => 'lu.eu.org',
+ 7702 => 'lv.eu.org',
+ 7703 => 'mc.eu.org',
+ 7704 => 'me.eu.org',
+ 7705 => 'mk.eu.org',
+ 7706 => 'mt.eu.org',
+ 7707 => 'my.eu.org',
+ 7708 => 'net.eu.org',
+ 7709 => 'ng.eu.org',
+ 7710 => 'nl.eu.org',
+ 7711 => 'no.eu.org',
+ 7712 => 'nz.eu.org',
+ 7713 => 'paris.eu.org',
+ 7714 => 'pl.eu.org',
+ 7715 => 'pt.eu.org',
+ 7716 => 'q-a.eu.org',
+ 7717 => 'ro.eu.org',
+ 7718 => 'ru.eu.org',
+ 7719 => 'se.eu.org',
+ 7720 => 'si.eu.org',
+ 7721 => 'sk.eu.org',
+ 7722 => 'tr.eu.org',
+ 7723 => 'uk.eu.org',
+ 7724 => 'us.eu.org',
+ 7725 => 'apps.fbsbx.com',
+ 7726 => 'a.ssl.fastly.net',
+ 7727 => 'b.ssl.fastly.net',
+ 7728 => 'global.ssl.fastly.net',
+ 7729 => 'a.prod.fastly.net',
+ 7730 => 'global.prod.fastly.net',
+ 7731 => 'firebaseapp.com',
+ 7732 => 'flynnhub.com',
+ 7733 => 'freebox-os.com',
+ 7734 => 'freeboxos.com',
+ 7735 => 'fbx-os.fr',
+ 7736 => 'fbxos.fr',
+ 7737 => 'freebox-os.fr',
+ 7738 => 'freeboxos.fr',
+ 7739 => 'service.gov.uk',
+ 7740 => 'github.io',
+ 7741 => 'githubusercontent.com',
+ 7742 => 'githubcloud.com',
+ 7743 => '*.api.githubcloud.com',
+ 7744 => '*.ext.githubcloud.com',
+ 7745 => 'gist.githubcloud.com',
+ 7746 => '*.githubcloudusercontent.com',
+ 7747 => 'ro.com',
+ 7748 => 'goip.de',
+ 7749 => '*.0emm.com',
+ 7750 => 'appspot.com',
+ 7751 => 'blogspot.ae',
+ 7752 => 'blogspot.al',
+ 7753 => 'blogspot.am',
+ 7754 => 'blogspot.ba',
+ 7755 => 'blogspot.be',
+ 7756 => 'blogspot.bg',
+ 7757 => 'blogspot.bj',
+ 7758 => 'blogspot.ca',
+ 7759 => 'blogspot.cf',
+ 7760 => 'blogspot.ch',
+ 7761 => 'blogspot.cl',
+ 7762 => 'blogspot.co.at',
+ 7763 => 'blogspot.co.id',
+ 7764 => 'blogspot.co.il',
+ 7765 => 'blogspot.co.ke',
+ 7766 => 'blogspot.co.nz',
+ 7767 => 'blogspot.co.uk',
+ 7768 => 'blogspot.co.za',
+ 7769 => 'blogspot.com',
+ 7770 => 'blogspot.com.ar',
+ 7771 => 'blogspot.com.au',
+ 7772 => 'blogspot.com.br',
+ 7773 => 'blogspot.com.by',
+ 7774 => 'blogspot.com.co',
+ 7775 => 'blogspot.com.cy',
+ 7776 => 'blogspot.com.ee',
+ 7777 => 'blogspot.com.eg',
+ 7778 => 'blogspot.com.es',
+ 7779 => 'blogspot.com.mt',
+ 7780 => 'blogspot.com.ng',
+ 7781 => 'blogspot.com.tr',
+ 7782 => 'blogspot.com.uy',
+ 7783 => 'blogspot.cv',
+ 7784 => 'blogspot.cz',
+ 7785 => 'blogspot.de',
+ 7786 => 'blogspot.dk',
+ 7787 => 'blogspot.fi',
+ 7788 => 'blogspot.fr',
+ 7789 => 'blogspot.gr',
+ 7790 => 'blogspot.hk',
+ 7791 => 'blogspot.hr',
+ 7792 => 'blogspot.hu',
+ 7793 => 'blogspot.ie',
+ 7794 => 'blogspot.in',
+ 7795 => 'blogspot.is',
+ 7796 => 'blogspot.it',
+ 7797 => 'blogspot.jp',
+ 7798 => 'blogspot.kr',
+ 7799 => 'blogspot.li',
+ 7800 => 'blogspot.lt',
+ 7801 => 'blogspot.lu',
+ 7802 => 'blogspot.md',
+ 7803 => 'blogspot.mk',
+ 7804 => 'blogspot.mr',
+ 7805 => 'blogspot.mx',
+ 7806 => 'blogspot.my',
+ 7807 => 'blogspot.nl',
+ 7808 => 'blogspot.no',
+ 7809 => 'blogspot.pe',
+ 7810 => 'blogspot.pt',
+ 7811 => 'blogspot.qa',
+ 7812 => 'blogspot.re',
+ 7813 => 'blogspot.ro',
+ 7814 => 'blogspot.rs',
+ 7815 => 'blogspot.ru',
+ 7816 => 'blogspot.se',
+ 7817 => 'blogspot.sg',
+ 7818 => 'blogspot.si',
+ 7819 => 'blogspot.sk',
+ 7820 => 'blogspot.sn',
+ 7821 => 'blogspot.td',
+ 7822 => 'blogspot.tw',
+ 7823 => 'blogspot.ug',
+ 7824 => 'blogspot.vn',
+ 7825 => 'cloudfunctions.net',
+ 7826 => 'codespot.com',
+ 7827 => 'googleapis.com',
+ 7828 => 'googlecode.com',
+ 7829 => 'pagespeedmobilizer.com',
+ 7830 => 'withgoogle.com',
+ 7831 => 'withyoutube.com',
+ 7832 => 'hashbang.sh',
+ 7833 => 'herokuapp.com',
+ 7834 => 'herokussl.com',
+ 7835 => 'iki.fi',
+ 7836 => 'biz.at',
+ 7837 => 'info.at',
+ 7838 => 'co.pl',
+ 7839 => 'azurewebsites.net',
+ 7840 => 'azure-mobile.net',
+ 7841 => 'cloudapp.net',
+ 7842 => 'bmoattachments.org',
+ 7843 => '4u.com',
+ 7844 => 'ngrok.io',
+ 7845 => 'nfshost.com',
+ 7846 => 'nsupdate.info',
+ 7847 => 'nerdpol.ovh',
+ 7848 => 'blogsyte.com',
+ 7849 => 'brasilia.me',
+ 7850 => 'cable-modem.org',
+ 7851 => 'ciscofreak.com',
+ 7852 => 'collegefan.org',
+ 7853 => 'couchpotatofries.org',
+ 7854 => 'damnserver.com',
+ 7855 => 'ddns.me',
+ 7856 => 'ditchyourip.com',
+ 7857 => 'dnsfor.me',
+ 7858 => 'dnsiskinky.com',
+ 7859 => 'dvrcam.info',
+ 7860 => 'dynns.com',
+ 7861 => 'eating-organic.net',
+ 7862 => 'fantasyleague.cc',
+ 7863 => 'geekgalaxy.com',
+ 7864 => 'golffan.us',
+ 7865 => 'health-carereform.com',
+ 7866 => 'homesecuritymac.com',
+ 7867 => 'homesecuritypc.com',
+ 7868 => 'hopto.me',
+ 7869 => 'ilovecollege.info',
+ 7870 => 'loginto.me',
+ 7871 => 'mlbfan.org',
+ 7872 => 'mmafan.biz',
+ 7873 => 'myactivedirectory.com',
+ 7874 => 'mydissent.net',
+ 7875 => 'myeffect.net',
+ 7876 => 'mymediapc.net',
+ 7877 => 'mypsx.net',
+ 7878 => 'mysecuritycamera.com',
+ 7879 => 'mysecuritycamera.net',
+ 7880 => 'mysecuritycamera.org',
+ 7881 => 'net-freaks.com',
+ 7882 => 'nflfan.org',
+ 7883 => 'nhlfan.net',
+ 7884 => 'no-ip.ca',
+ 7885 => 'no-ip.co.uk',
+ 7886 => 'no-ip.net',
+ 7887 => 'noip.us',
+ 7888 => 'onthewifi.com',
+ 7889 => 'pgafan.net',
+ 7890 => 'point2this.com',
+ 7891 => 'pointto.us',
+ 7892 => 'privatizehealthinsurance.net',
+ 7893 => 'quicksytes.com',
+ 7894 => 'read-books.org',
+ 7895 => 'securitytactics.com',
+ 7896 => 'serveexchange.com',
+ 7897 => 'servehumour.com',
+ 7898 => 'servep2p.com',
+ 7899 => 'servesarcasm.com',
+ 7900 => 'stufftoread.com',
+ 7901 => 'ufcfan.org',
+ 7902 => 'unusualperson.com',
+ 7903 => 'workisboring.com',
+ 7904 => '3utilities.com',
+ 7905 => 'bounceme.net',
+ 7906 => 'ddns.net',
+ 7907 => 'ddnsking.com',
+ 7908 => 'gotdns.ch',
+ 7909 => 'hopto.org',
+ 7910 => 'myftp.biz',
+ 7911 => 'myftp.org',
+ 7912 => 'myvnc.com',
+ 7913 => 'no-ip.biz',
+ 7914 => 'no-ip.info',
+ 7915 => 'no-ip.org',
+ 7916 => 'noip.me',
+ 7917 => 'redirectme.net',
+ 7918 => 'servebeer.com',
+ 7919 => 'serveblog.net',
+ 7920 => 'servecounterstrike.com',
+ 7921 => 'serveftp.com',
+ 7922 => 'servegame.com',
+ 7923 => 'servehalflife.com',
+ 7924 => 'servehttp.com',
+ 7925 => 'serveirc.com',
+ 7926 => 'serveminecraft.net',
+ 7927 => 'servemp3.com',
+ 7928 => 'servepics.com',
+ 7929 => 'servequake.com',
+ 7930 => 'sytes.net',
+ 7931 => 'webhop.me',
+ 7932 => 'zapto.org',
+ 7933 => 'nyc.mn',
+ 7934 => 'nid.io',
+ 7935 => 'operaunite.com',
+ 7936 => 'outsystemscloud.com',
+ 7937 => 'ownprovider.com',
+ 7938 => 'oy.lc',
+ 7939 => 'pgfog.com',
+ 7940 => 'pagefrontapp.com',
+ 7941 => 'art.pl',
+ 7942 => 'gliwice.pl',
+ 7943 => 'krakow.pl',
+ 7944 => 'poznan.pl',
+ 7945 => 'wroc.pl',
+ 7946 => 'zakopane.pl',
+ 7947 => 'pantheonsite.io',
+ 7948 => 'gotpantheon.com',
+ 7949 => 'mypep.link',
+ 7950 => 'xen.prgmr.com',
+ 7951 => 'priv.at',
+ 7952 => 'chirurgiens-dentistes-en-france.fr',
+ 7953 => 'qa2.com',
+ 7954 => 'rackmaze.com',
+ 7955 => 'rackmaze.net',
+ 7956 => 'rhcloud.com',
+ 7957 => 'hzc.io',
+ 7958 => 'sandcats.io',
+ 7959 => 'biz.ua',
+ 7960 => 'co.ua',
+ 7961 => 'pp.ua',
+ 7962 => 'sinaapp.com',
+ 7963 => 'vipsinaapp.com',
+ 7964 => '1kapp.com',
+ 7965 => 'bounty-full.com',
+ 7966 => 'alpha.bounty-full.com',
+ 7967 => 'beta.bounty-full.com',
+ 7968 => 'spacekit.io',
+ 7969 => 'diskstation.me',
+ 7970 => 'dscloud.biz',
+ 7971 => 'dscloud.me',
+ 7972 => 'dscloud.mobi',
+ 7973 => 'dsmynas.com',
+ 7974 => 'dsmynas.net',
+ 7975 => 'dsmynas.org',
+ 7976 => 'familyds.com',
+ 7977 => 'familyds.net',
+ 7978 => 'familyds.org',
+ 7979 => 'i234.me',
+ 7980 => 'myds.me',
+ 7981 => 'synology.me',
+ 7982 => 'gda.pl',
+ 7983 => 'gdansk.pl',
+ 7984 => 'gdynia.pl',
+ 7985 => 'med.pl',
+ 7986 => 'sopot.pl',
+ 7987 => 'bloxcms.com',
+ 7988 => 'townnews-staging.com',
+ 7989 => 'hk.com',
+ 7990 => 'hk.org',
+ 7991 => 'ltd.hk',
+ 7992 => 'inc.hk',
+ 7993 => 'router.management',
+ 7994 => 'yolasite.com',
+ 7995 => 'za.net',
+ 7996 => 'za.org',
+);
---------------------------------------------------------------------------
1. Compatibility
-HTML Purifier is PHP 5 and PHP 7, and is actively tested from PHP 5.0.5
+HTML Purifier is PHP 5 and PHP 7, and is actively tested from PHP 5.3
and up. It has no core dependencies with other libraries.
These optional extensions can enhance the capabilities of HTML Purifier:
autoloader, but there are some cases where you will need to change
your own code to accomodate HTML Purifier. These are those cases:
- PHP VERSION IS LESS THAN 5.1.2, AND YOU'VE DEFINED __autoload
- Because spl_autoload_register() doesn't exist in early versions
- of PHP 5, HTML Purifier has no way of adding itself to the autoload
- stack. Modify your __autoload function to test
- HTMLPurifier_Bootstrap::autoload($class)
-
- For example, suppose your autoload function looks like this:
-
- function __autoload($class) {
- require str_replace('_', '/', $class) . '.php';
- return true;
- }
-
- A modified version with HTML Purifier would look like this:
-
- function __autoload($class) {
- if (HTMLPurifier_Bootstrap::autoload($class)) return true;
- require str_replace('_', '/', $class) . '.php';
- return true;
- }
-
- Note that there *is* some custom behavior in our autoloader; the
- original autoloader in our example would work for 99% of the time,
- but would fail when including language files.
-
AN __autoload FUNCTION IS DECLARED AFTER OUR AUTOLOADER IS REGISTERED
spl_autoload_register() has the curious behavior of disabling
the existing __autoload() handler. Users need to explicitly
spl_autoload_register('__autoload')
- Users should also be on guard if they use a version of PHP previous
- to 5.1.2 without an autoloader--HTML Purifier will define __autoload()
- for you, which can collide with an autoloader that was added by *you*
- later.
-
For better performance
----------------------
HTMLPurifier.autoload.php
Registers our autoload handler HTMLPurifier_Bootstrap::autoload($class).
- You can do these operations by yourself--in fact, you must modify your own
- autoload handler if you are using a version of PHP earlier than PHP 5.1.2
- (See "Autoload compatibility" above).
+ You can do these operations by yourself, if you like.
---------------------------------------------------------------------------
1. Compatibilité
-HTML Purifier fonctionne avec PHP 5. PHP 5.0.5 est la dernière version testée.
+HTML Purifier fonctionne avec PHP 5. PHP 5.3 est la dernière version testée.
Il ne dépend pas d'autres librairies.
Les extensions optionnelles sont iconv (généralement déjà installée) et tidy
. Internal change
==========================
+4.11.0, released 2019-07-14
+# SafeScripting now matches case-sensitively against its whitelist (previously it was
+ case-insensitive.) Thanks Dimitri Gritsajuk <gritsajuk.dimitri@gmail.com>
+ for reporting.
+! New directive %Core.AllowParseManyTags which allows parsing of many nested tags.
+ Thanks M. Suzuki <msuzuki1986@gmail.com> for contributing the patch.
+! purifyArray now supports multidimensional arrays. Thanks
+ Sandro Miguel Marques <sandromiguel@sandromiguel.com> for contributing this patch.
+! initial and inherit settings available for width, height, and the min-/max-
+ versions thereof. Thanks Michael Kliewe <info@phpgansta.de> for contributing
+ this patch.
+! More color names are supported. Thanks Daijobou for contributing.
+- Compatibility fixes for PHP 7.3, including new CI for PHP 7.3
+ (thank you Lukas Neumann <lksnmnn@gmail.com>) and removal of
+ reserved words in our constants (thanks Darko Hrgovic <darko@darkodev.com>
+- Compatibility fixes for HHVM. Thanks Mateusz Turcza for contributing
+ this fix.
+- HTML Purifier now never defines __autoload, fixing #196. Thanks
+ Michael Kliewe for reporting.
+- In some situations, Config.php would report an undefined index: class
+ error; this has been fixed. Thanks DiLong Fa for contributing
+ this fix.
+- We no longer produce <script /> tags; we always explicitly write
+ out the open and close tag. Thanks Dimitri Gritsajuk
+ <gritsajuk.dimitri@gmail.com> for contributing this fix.
+- Better compatibility when IDNA constants are not present. Thanks
+ Mateusz Turcza <xemlock@gmail.com> for contributing this fix.
+
4.10.0, released 2018-02-22
# PHP 5.3 is no longer officially supported by HTML Purifier
(we did not specifically break support, but we are no longer
If you're using Composer to manage dependencies, you can use
- $ composer require "ezyang/htmlpurifier":"dev-master"
+ $ composer require ezyang/htmlpurifier
-4.10.0
\ No newline at end of file
+4.11.0
\ No newline at end of file
-HTML Purifier 4.9.x is a maintenance release, collecting a year
-of accumulated bug fixes plus a few new features. New features
-include support for min/max-width/height CSS, and rgba/hsl/hsla
-in color specifications. Major bugfixes include improvements
-in the Serializer cache to avoid chmod'ing directories, better
-entity decoding (we won't accidentally encode entities that occur
-in URLs) and rel="noopener" on links with target attributes,
-to prevent them from overwriting the original frame.
-
-4.9.3 works around an infinite loop bug in PHP 7.1 with the opcode
-cache (and has one other, minor bugfix, avoiding using autoloading
-when testing for DOMDocument presence). If these bugs do not
-affect you, you do not need to upgrade.
+HTML Purifier 4.11.x is a maintenance release, collecting a year
+and a half of accumulated bug fixes. Most notable fixes are
+compatibility with PHP 7.3, and case-sensitive matching for
+the SafeScripting whitelist. There are a number small feature
+enhancements, including an expanded supported color list,
+initial and inherit support for {min-,max-,}{width,height}
+and multidimensional array support for purifyArray.
"type": "library",
"keywords": ["html"],
"homepage": "http://htmlpurifier.org/",
- "license": "LGPL",
+ "license": "LGPL-2.1-or-later",
"authors": [
{
"name": "Edward Z. Yang",
"php": ">=5.2"
},
"require-dev": {
- "simpletest/simpletest": "^1.1"
+ "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd"
},
"autoload": {
"psr-0": { "HTMLPurifier": "library/" },
* primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
* FILE, changes will be overwritten the next time the script is run.
*
- * @version 4.10.0
+ * @version 4.11.0
*
* @warning
* You must *not* include any other HTML Purifier files before this file,
*/
/*
- HTML Purifier 4.10.0 - Standards Compliant HTML Filtering
+ HTML Purifier 4.11.0 - Standards Compliant HTML Filtering
Copyright (C) 2006-2008 Edward Z. Yang
This library is free software; you can redistribute it and/or
* Version of HTML Purifier.
* @type string
*/
- public $version = '4.10.0';
+ public $version = '4.11.0';
/**
* Constant with version of HTML Purifier.
*/
- const VERSION = '4.10.0';
+ const VERSION = '4.11.0';
/**
* Global configuration object.
public function purifyArray($array_of_html, $config = null)
{
$context_array = array();
- foreach ($array_of_html as $key => $html) {
- $array_of_html[$key] = $this->purify($html, $config);
+ foreach($array_of_html as $key=>$value){
+ if (is_array($value)) {
+ $array[$key] = $this->purifyArray($value, $config);
+ } else {
+ $array[$key] = $this->purify($value, $config);
+ }
$context_array[$key] = $this->context;
}
$this->context = $context_array;
- return $array_of_html;
+ return $array;
}
/**
// PHP 5.3 and later support this functionality natively
if (function_exists('idn_to_ascii')) {
- $string = idn_to_ascii($string, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46);
+ if (defined('IDNA_NONTRANSITIONAL_TO_ASCII') && defined('INTL_IDNA_VARIANT_UTS46')) {
+ $string = idn_to_ascii($string, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46);
+ } else {
+ $string = idn_to_ascii($string);
+ }
// If we have Net_IDNA2 support, we can support IRIs by
// punycoding them. (This is the most portable thing to do,
array(
new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true),
- new HTMLPurifier_AttrDef_Enum(array('auto'))
+ new HTMLPurifier_AttrDef_Enum(array('auto', 'initial', 'inherit'))
+ )
+ );
+ $trusted_min_wh = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true),
+ new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit'))
+ )
+ );
+ $trusted_max_wh = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true),
+ new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit'))
)
);
$max = $config->get('CSS.MaxImgLength');
- $this->info['min-width'] =
- $this->info['max-width'] =
- $this->info['min-height'] =
- $this->info['max-height'] =
$this->info['width'] =
$this->info['height'] =
$max === null ?
// For everyone else:
$trusted_wh
);
+ $this->info['min-width'] =
+ $this->info['min-height'] =
+ $max === null ?
+ $trusted_min_wh :
+ new HTMLPurifier_AttrDef_Switch(
+ 'img',
+ // For img tags:
+ new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0', $max),
+ new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit'))
+ )
+ ),
+ // For everyone else:
+ $trusted_min_wh
+ );
+ $this->info['max-width'] =
+ $this->info['max-height'] =
+ $max === null ?
+ $trusted_max_wh :
+ new HTMLPurifier_AttrDef_Switch(
+ 'img',
+ // For img tags:
+ new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0', $max),
+ new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit'))
+ )
+ ),
+ // For everyone else:
+ $trusted_max_wh
+ );
$this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration();
* HTML Purifier's version
* @type string
*/
- public $version = '4.10.0';
+ public $version = '4.11.0';
/**
* Whether or not to automatically finalize
// zip(tail(trace), trace) -- but PHP is not Haskell har har
for ($i = 0, $c = count($trace); $i < $c - 1; $i++) {
// XXX this is not correct on some versions of HTML Purifier
- if ($trace[$i + 1]['class'] === 'HTMLPurifier_Config') {
+ if (isset($trace[$i + 1]['class']) && $trace[$i + 1]['class'] === 'HTMLPurifier_Config') {
continue;
}
$frame = $trace[$i];
* @param string $key Name of directive
* @param mixed $default Default value of directive
* @param string $type Allowed type of the directive. See
- * HTMLPurifier_DirectiveDef::$type for allowed values
+ * HTMLPurifier_VarParser::$types for allowed values
* @param bool $allow_null Whether or not to allow null values
*/
public function add($key, $default, $type, $allow_null)
<p>
When enabled, HTML Purifier will treat any elements that contain only
non-breaking spaces as well as regular whitespace as empty, and remove
- them when %AutoForamt.RemoveEmpty is enabled.
+ them when %AutoFormat.RemoveEmpty is enabled.
</p>
<p>
See %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions for a list of elements
--- /dev/null
+Core.AllowParseManyTags
+TYPE: bool
+DEFAULT: false
+VERSION: 4.10.1
+--DESCRIPTION--
+<p>
+ This directive allows parsing of many nested tags.
+ If you set true, relaxes any hardcoded limit from the parser.
+ However, in that case it may cause a Dos attack.
+ Be careful when enabling it.
+</p>
+--# vim: et sw=4 sts=4
VERSION: 2.0.0
--DEFAULT--
array (
- 'maroon' => '#800000',
- 'red' => '#FF0000',
- 'orange' => '#FFA500',
- 'yellow' => '#FFFF00',
- 'olive' => '#808000',
- 'purple' => '#800080',
+ 'aliceblue' => '#F0F8FF',
+ 'antiquewhite' => '#FAEBD7',
+ 'aqua' => '#00FFFF',
+ 'aquamarine' => '#7FFFD4',
+ 'azure' => '#F0FFFF',
+ 'beige' => '#F5F5DC',
+ 'bisque' => '#FFE4C4',
+ 'black' => '#000000',
+ 'blanchedalmond' => '#FFEBCD',
+ 'blue' => '#0000FF',
+ 'blueviolet' => '#8A2BE2',
+ 'brown' => '#A52A2A',
+ 'burlywood' => '#DEB887',
+ 'cadetblue' => '#5F9EA0',
+ 'chartreuse' => '#7FFF00',
+ 'chocolate' => '#D2691E',
+ 'coral' => '#FF7F50',
+ 'cornflowerblue' => '#6495ED',
+ 'cornsilk' => '#FFF8DC',
+ 'crimson' => '#DC143C',
+ 'cyan' => '#00FFFF',
+ 'darkblue' => '#00008B',
+ 'darkcyan' => '#008B8B',
+ 'darkgoldenrod' => '#B8860B',
+ 'darkgray' => '#A9A9A9',
+ 'darkgrey' => '#A9A9A9',
+ 'darkgreen' => '#006400',
+ 'darkkhaki' => '#BDB76B',
+ 'darkmagenta' => '#8B008B',
+ 'darkolivegreen' => '#556B2F',
+ 'darkorange' => '#FF8C00',
+ 'darkorchid' => '#9932CC',
+ 'darkred' => '#8B0000',
+ 'darksalmon' => '#E9967A',
+ 'darkseagreen' => '#8FBC8F',
+ 'darkslateblue' => '#483D8B',
+ 'darkslategray' => '#2F4F4F',
+ 'darkslategrey' => '#2F4F4F',
+ 'darkturquoise' => '#00CED1',
+ 'darkviolet' => '#9400D3',
+ 'deeppink' => '#FF1493',
+ 'deepskyblue' => '#00BFFF',
+ 'dimgray' => '#696969',
+ 'dimgrey' => '#696969',
+ 'dodgerblue' => '#1E90FF',
+ 'firebrick' => '#B22222',
+ 'floralwhite' => '#FFFAF0',
+ 'forestgreen' => '#228B22',
'fuchsia' => '#FF00FF',
- 'white' => '#FFFFFF',
- 'lime' => '#00FF00',
+ 'gainsboro' => '#DCDCDC',
+ 'ghostwhite' => '#F8F8FF',
+ 'gold' => '#FFD700',
+ 'goldenrod' => '#DAA520',
+ 'gray' => '#808080',
+ 'grey' => '#808080',
'green' => '#008000',
+ 'greenyellow' => '#ADFF2F',
+ 'honeydew' => '#F0FFF0',
+ 'hotpink' => '#FF69B4',
+ 'indianred' => '#CD5C5C',
+ 'indigo' => '#4B0082',
+ 'ivory' => '#FFFFF0',
+ 'khaki' => '#F0E68C',
+ 'lavender' => '#E6E6FA',
+ 'lavenderblush' => '#FFF0F5',
+ 'lawngreen' => '#7CFC00',
+ 'lemonchiffon' => '#FFFACD',
+ 'lightblue' => '#ADD8E6',
+ 'lightcoral' => '#F08080',
+ 'lightcyan' => '#E0FFFF',
+ 'lightgoldenrodyellow' => '#FAFAD2',
+ 'lightgray' => '#D3D3D3',
+ 'lightgrey' => '#D3D3D3',
+ 'lightgreen' => '#90EE90',
+ 'lightpink' => '#FFB6C1',
+ 'lightsalmon' => '#FFA07A',
+ 'lightseagreen' => '#20B2AA',
+ 'lightskyblue' => '#87CEFA',
+ 'lightslategray' => '#778899',
+ 'lightslategrey' => '#778899',
+ 'lightsteelblue' => '#B0C4DE',
+ 'lightyellow' => '#FFFFE0',
+ 'lime' => '#00FF00',
+ 'limegreen' => '#32CD32',
+ 'linen' => '#FAF0E6',
+ 'magenta' => '#FF00FF',
+ 'maroon' => '#800000',
+ 'mediumaquamarine' => '#66CDAA',
+ 'mediumblue' => '#0000CD',
+ 'mediumorchid' => '#BA55D3',
+ 'mediumpurple' => '#9370DB',
+ 'mediumseagreen' => '#3CB371',
+ 'mediumslateblue' => '#7B68EE',
+ 'mediumspringgreen' => '#00FA9A',
+ 'mediumturquoise' => '#48D1CC',
+ 'mediumvioletred' => '#C71585',
+ 'midnightblue' => '#191970',
+ 'mintcream' => '#F5FFFA',
+ 'mistyrose' => '#FFE4E1',
+ 'moccasin' => '#FFE4B5',
+ 'navajowhite' => '#FFDEAD',
'navy' => '#000080',
- 'blue' => '#0000FF',
- 'aqua' => '#00FFFF',
- 'teal' => '#008080',
- 'black' => '#000000',
+ 'oldlace' => '#FDF5E6',
+ 'olive' => '#808000',
+ 'olivedrab' => '#6B8E23',
+ 'orange' => '#FFA500',
+ 'orangered' => '#FF4500',
+ 'orchid' => '#DA70D6',
+ 'palegoldenrod' => '#EEE8AA',
+ 'palegreen' => '#98FB98',
+ 'paleturquoise' => '#AFEEEE',
+ 'palevioletred' => '#DB7093',
+ 'papayawhip' => '#FFEFD5',
+ 'peachpuff' => '#FFDAB9',
+ 'peru' => '#CD853F',
+ 'pink' => '#FFC0CB',
+ 'plum' => '#DDA0DD',
+ 'powderblue' => '#B0E0E6',
+ 'purple' => '#800080',
+ 'rebeccapurple' => '#663399',
+ 'red' => '#FF0000',
+ 'rosybrown' => '#BC8F8F',
+ 'royalblue' => '#4169E1',
+ 'saddlebrown' => '#8B4513',
+ 'salmon' => '#FA8072',
+ 'sandybrown' => '#F4A460',
+ 'seagreen' => '#2E8B57',
+ 'seashell' => '#FFF5EE',
+ 'sienna' => '#A0522D',
'silver' => '#C0C0C0',
- 'gray' => '#808080',
+ 'skyblue' => '#87CEEB',
+ 'slateblue' => '#6A5ACD',
+ 'slategray' => '#708090',
+ 'slategrey' => '#708090',
+ 'snow' => '#FFFAFA',
+ 'springgreen' => '#00FF7F',
+ 'steelblue' => '#4682B4',
+ 'tan' => '#D2B48C',
+ 'teal' => '#008080',
+ 'thistle' => '#D8BFD8',
+ 'tomato' => '#FF6347',
+ 'turquoise' => '#40E0D0',
+ 'violet' => '#EE82EE',
+ 'wheat' => '#F5DEB3',
+ 'white' => '#FFFFFF',
+ 'whitesmoke' => '#F5F5F5',
+ 'yellow' => '#FFFF00',
+ 'yellowgreen' => '#9ACD32'
)
--DESCRIPTION--
$entity = $matches[0];
$hex_part = @$matches[1];
$dec_part = @$matches[2];
- $named_part = empty($matches[3]) ? @$matches[4] : $matches[3];
+ $named_part = empty($matches[3]) ? (empty($matches[4]) ? "" : $matches[4]) : $matches[3];
if ($hex_part !== NULL && $hex_part !== "") {
return HTMLPurifier_Encoder::unichr(hexdec($hex_part));
} elseif ($dec_part !== NULL && $dec_part !== "") {
$script = $this->addElement(
'script',
'Inline',
- 'Empty',
+ 'Optional:', // Not `Empty` to not allow to autoclose the <script /> tag @see https://www.w3.org/TR/html4/interact/scripts.html
null,
array(
// While technically not required by the spec, we're forcing
// it to this value.
'type' => 'Enum#text/javascript',
- 'src*' => new HTMLPurifier_AttrDef_Enum(array_keys($allowed))
+ 'src*' => new HTMLPurifier_AttrDef_Enum(array_keys($allowed), /*case sensitive*/ true)
)
);
$script->attr_transform_pre[] =
'HTMLPurifier' => 'HTML Purifier X'
);
+$errorNames = array();
+
// vim: et sw=4 sts=4
'HTMLPurifier' => 'HTML Purifier XNone'
);
+$errorNames = array();
+
// vim: et sw=4 sts=4
$doc = new DOMDocument();
$doc->encoding = 'UTF-8'; // theoretically, the above has this covered
+ $options = 0;
+ if ($config->get('Core.AllowParseManyTags') && defined('LIBXML_PARSEHUGE')) {
+ $options |= LIBXML_PARSEHUGE;
+ }
+
set_error_handler(array($this, 'muteErrorHandler'));
- $doc->loadHTML($html);
+ $doc->loadHTML($html, $options);
restore_error_handler();
$body = $doc->getElementsByTagName('html')->item(0)-> // <html>
*/
protected function getTagName($node)
{
- if (property_exists($node, 'tagName')) {
+ if (isset($node->tagName)) {
return $node->tagName;
- } else if (property_exists($node, 'nodeName')) {
+ } else if (isset($node->nodeName)) {
return $node->nodeName;
- } else if (property_exists($node, 'localName')) {
+ } else if (isset($node->localName)) {
return $node->localName;
}
return null;
*/
protected function getData($node)
{
- if (property_exists($node, 'data')) {
+ if (isset($node->data)) {
return $node->data;
- } else if (property_exists($node, 'nodeValue')) {
+ } else if (isset($node->nodeValue)) {
return $node->nodeValue;
- } else if (property_exists($node, 'textContent')) {
+ } else if (isset($node->textContent)) {
return $node->textContent;
}
return null;
$this->compress = $compress;
// initialize sub-printers
$this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default();
- $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
+ $this->fields[HTMLPurifier_VarParser::C_BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
}
/**
$value = '';
}
}
- if ($type === HTMLPurifier_VarParser::MIXED) {
+ if ($type === HTMLPurifier_VarParser::C_MIXED) {
return 'Not supported';
$value = serialize($value);
}
class HTMLPurifier_VarParser
{
- const STRING = 1;
+ const C_STRING = 1;
const ISTRING = 2;
const TEXT = 3;
const ITEXT = 4;
- const INT = 5;
- const FLOAT = 6;
- const BOOL = 7;
+ const C_INT = 5;
+ const C_FLOAT = 6;
+ const C_BOOL = 7;
const LOOKUP = 8;
const ALIST = 9;
const HASH = 10;
- const MIXED = 11;
+ const C_MIXED = 11;
/**
* Lookup table of allowed types. Mainly for backwards compatibility, but
* also convenient for transforming string type names to the integer constants.
*/
public static $types = array(
- 'string' => self::STRING,
+ 'string' => self::C_STRING,
'istring' => self::ISTRING,
'text' => self::TEXT,
'itext' => self::ITEXT,
- 'int' => self::INT,
- 'float' => self::FLOAT,
- 'bool' => self::BOOL,
+ 'int' => self::C_INT,
+ 'float' => self::C_FLOAT,
+ 'bool' => self::C_BOOL,
'lookup' => self::LOOKUP,
'list' => self::ALIST,
'hash' => self::HASH,
- 'mixed' => self::MIXED
+ 'mixed' => self::C_MIXED
);
/**
* allowed value lists.
*/
public static $stringTypes = array(
- self::STRING => true,
+ self::C_STRING => true,
self::ISTRING => true,
self::TEXT => true,
self::ITEXT => true,
// These are basic checks, to make sure nothing horribly wrong
// happened in our implementations.
switch ($type) {
- case (self::STRING):
+ case (self::C_STRING):
case (self::ISTRING):
case (self::TEXT):
case (self::ITEXT):
$var = strtolower($var);
}
return $var;
- case (self::INT):
+ case (self::C_INT):
if (!is_int($var)) {
break;
}
return $var;
- case (self::FLOAT):
+ case (self::C_FLOAT):
if (!is_float($var)) {
break;
}
return $var;
- case (self::BOOL):
+ case (self::C_BOOL):
if (!is_bool($var)) {
break;
}
}
}
return $var;
- case (self::MIXED):
+ case (self::C_MIXED):
return $var;
default:
$this->errorInconsistent(get_class($this), $type);
// Note: if code "breaks" from the switch, it triggers a generic
// exception to be thrown. Specific errors can be specifically
// done here.
- case self::MIXED:
+ case self::C_MIXED:
case self::ISTRING:
- case self::STRING:
+ case self::C_STRING:
case self::TEXT:
case self::ITEXT:
return $var;
- case self::INT:
+ case self::C_INT:
if (is_string($var) && ctype_digit($var)) {
$var = (int)$var;
}
return $var;
- case self::FLOAT:
+ case self::C_FLOAT:
if ((is_string($var) && is_numeric($var)) || is_int($var)) {
$var = (float)$var;
}
return $var;
- case self::BOOL:
+ case self::C_BOOL:
if (is_int($var) && ($var === 0 || $var === 1)) {
$var = (bool)$var;
} elseif (is_string($var)) {
--- /dev/null
+<IfModule mod_authz_core.c>
+ Require all denied
+</IfModule>
+
+<IfModule !mod_authz_core.c>
+ Deny from all
+</ifModule>
--- /dev/null
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+require_once '../library/HTMLPurifier.auto.php';
+assertCli();
+
+if (version_compare(PHP_VERSION, '5.2.2', '<')) {
+ echo "This script requires PHP 5.2.2 or later, for tokenizer line numbers.";
+ exit(1);
+}
+
+/**
+ * @file
+ * Scans HTML Purifier source code for $config tokens and records the
+ * directive being used; configdoc can use this info later.
+ *
+ * Currently, this just dumps all the info onto the console. Eventually, it
+ * will create an XML file that our XSLT transform can use.
+ */
+
+$FS = new FSTools();
+chdir(dirname(__FILE__) . '/../library/');
+$raw_files = $FS->globr('.', '*.php');
+$files = array();
+foreach ($raw_files as $file) {
+ $file = substr($file, 2); // rm leading './'
+ if (strncmp('standalone/', $file, 11) === 0) continue; // rm generated files
+ if (substr_count($file, '.') > 1) continue; // rm meta files
+ $files[] = $file;
+}
+
+/**
+ * Moves the $i cursor to the next non-whitespace token
+ */
+function consumeWhitespace($tokens, &$i)
+{
+ do {$i++;} while (is_array($tokens[$i]) && $tokens[$i][0] === T_WHITESPACE);
+}
+
+/**
+ * Tests whether or not a token is a particular type. There are three run-cases:
+ * - ($token, $expect_token): tests if the token is $expect_token type;
+ * - ($token, $expect_value): tests if the token is the string $expect_value;
+ * - ($token, $expect_token, $expect_value): tests if token is $expect_token type, and
+ * its string representation is $expect_value
+ */
+function testToken($token, $value_or_token, $value = null)
+{
+ if (is_null($value)) {
+ if (is_int($value_or_token)) return is_array($token) && $token[0] === $value_or_token;
+ else return $token === $value_or_token;
+ } else {
+ return is_array($token) && $token[0] === $value_or_token && $token[1] === $value;
+ }
+}
+
+$counter = 0;
+$full_counter = 0;
+$tracker = array();
+
+foreach ($files as $file) {
+ $tokens = token_get_all(file_get_contents($file));
+ $file = str_replace('\\', '/', $file);
+ for ($i = 0, $c = count($tokens); $i < $c; $i++) {
+ $ok = false;
+ // Match $config
+ if (!$ok && testToken($tokens[$i], T_VARIABLE, '$config')) $ok = true;
+ // Match $this->config
+ while (!$ok && testToken($tokens[$i], T_VARIABLE, '$this')) {
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_OBJECT_OPERATOR)) break;
+ consumeWhitespace($tokens, $i);
+ if (testToken($tokens[$i], T_STRING, 'config')) $ok = true;
+ break;
+ }
+ if (!$ok) continue;
+
+ $ok = false;
+ for($i++; $i < $c; $i++) {
+ if ($tokens[$i] === ',' || $tokens[$i] === ')' || $tokens[$i] === ';') {
+ break;
+ }
+ if (is_string($tokens[$i])) continue;
+ if ($tokens[$i][0] === T_OBJECT_OPERATOR) {
+ $ok = true;
+ break;
+ }
+ }
+ if (!$ok) continue;
+
+ $line = $tokens[$i][2];
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_STRING, 'get')) continue;
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], '(')) continue;
+
+ $full_counter++;
+
+ $matched = false;
+ do {
+
+ // What we currently don't match are batch retrievals, and
+ // wildcard retrievals. This data might be useful in the future,
+ // which is why we have a do {} while loop that doesn't actually
+ // do anything.
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_CONSTANT_ENCAPSED_STRING)) continue;
+ $id = substr($tokens[$i][1], 1, -1);
+
+ $counter++;
+ $matched = true;
+
+ if (!isset($tracker[$id])) $tracker[$id] = array();
+ if (!isset($tracker[$id][$file])) $tracker[$id][$file] = array();
+ $tracker[$id][$file][] = $line;
+
+ } while (0);
+
+ //echo "$file:$line uses $namespace.$directive\n";
+ }
+}
+
+echo "\n$counter/$full_counter instances of \$config or \$this->config found in source code.\n";
+
+echo "Generating XML... ";
+
+$xw = new XMLWriter();
+$xw->openURI('../configdoc/usage.xml');
+$xw->setIndent(true);
+$xw->startDocument('1.0', 'UTF-8');
+$xw->startElement('usage');
+foreach ($tracker as $id => $files) {
+ $xw->startElement('directive');
+ $xw->writeAttribute('id', $id);
+ foreach ($files as $file => $lines) {
+ $xw->startElement('file');
+ $xw->writeAttribute('name', $file);
+ foreach ($lines as $line) {
+ $xw->writeElement('line', $line);
+ }
+ $xw->endElement();
+ }
+ $xw->endElement();
+}
+$xw->endElement();
+$xw->flush();
+
+echo "done!\n";
+
+// vim: et sw=4 sts=4
+++ /dev/null
-#!/usr/bin/php
-<?php
-
-chdir(dirname(__FILE__));
-require_once 'common.php';
-assertCli();
-
-/**
- * @file
- * Runs all generation/flush cache scripts to ensure that somewhat volatile
- * generated files are up-to-date.
- */
-
-function e($cmd)
-{
- echo "\$ $cmd\n";
- passthru($cmd, $status);
- echo "\n";
- if ($status) exit($status);
-}
-
-$php = empty($_SERVER['argv'][1]) ? 'php' : $_SERVER['argv'][1];
-
-e($php . ' generate-includes.php');
-e($php . ' generate-schema-cache.php');
-e($php . ' flush-definition-cache.php');
-e($php . ' generate-standalone.php');
-e($php . ' config-scanner.php');
-
-// vim: et sw=4 sts=4
--- /dev/null
+#!/bin/bash
+set -ex
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
+php "$DIR/generate-includes.php"
+php "$DIR/generate-schema-cache.php"
+php "$DIR/flush-definition-cache.php"
+php "$DIR/generate-standalone.php"
+php "$DIR/config-scanner.php"
+++ /dev/null
-#!/usr/bin/php
-<?php
-
-chdir(dirname(__FILE__));
-require_once 'common.php';
-assertCli();
-
-/**
- * @file
- * Converts all instances of $config->set and $config->get to the new
- * format, as described by docs/dev-config-bcbreaks.txt
- */
-
-$FS = new FSTools();
-chdir(dirname(__FILE__) . '/..');
-$raw_files = $FS->globr('.', '*.php');
-foreach ($raw_files as $file) {
- $file = substr($file, 2); // rm leading './'
- if (strpos($file, 'library/standalone/') === 0) continue;
- if (strpos($file, 'maintenance/update-config.php') === 0) continue;
- if (strpos($file, 'test-settings.php') === 0) continue;
- if (substr_count($file, '.') > 1) continue; // rm meta files
- // process the file
- $contents = file_get_contents($file);
- $contents = preg_replace(
- "#config->(set|get)\('(.+?)', '(.+?)'#",
- "config->\\1('\\2.\\3'",
- $contents
- );
- if ($contents === '') continue;
- file_put_contents($file, $contents);
-}
-
-// vim: et sw=4 sts=4
if (strtolower($GLOBALS['PHORUM']['DATA']['CHARSET']) !== 'utf-8') {
$config->set('Core.EscapeNonASCIICharacters', true);
}
+$config->set('Core.AllowParseManyTags', false);
// vim: et sw=4 sts=4
+++ /dev/null
-<?php
-
-// release script
-// PHP 5.0 only
-
-if (php_sapi_name() != 'cli') {
- echo 'Release script cannot be called from web-browser.';
- exit;
-}
-
-if (!isset($argv[1])) {
- echo
-'php release.php [version]
- HTML Purifier release script
-';
- exit;
-}
-
-$version = trim($argv[1]);
-
-// Bump version numbers:
-
-// ...in VERSION
-file_put_contents('VERSION', $version);
-
-// ...in NEWS
-if ($is_dev = (strpos($version, 'dev') === false)) {
- $date = date('Y-m-d');
- $news_c = str_replace(
- $l = "$version, unknown release date",
- "$version, released $date",
- file_get_contents('NEWS'),
- $c
- );
- if (!$c) {
- echo 'Could not update NEWS, missing ' . $l . PHP_EOL;
- exit;
- } elseif ($c > 1) {
- echo 'More than one release declaration in NEWS replaced' . PHP_EOL;
- exit;
- }
- file_put_contents('NEWS', $news_c);
-}
-
-// ...in Doxyfile
-$doxyfile_c = preg_replace(
- '/(?<=PROJECT_NUMBER {9}= )[^\s]+/m', // brittle
- $version,
- file_get_contents('Doxyfile'),
- 1, $c
-);
-if (!$c) {
- echo 'Could not update Doxyfile, missing PROJECT_NUMBER.' . PHP_EOL;
- exit;
-}
-file_put_contents('Doxyfile', $doxyfile_c);
-
-// ...in HTMLPurifier.php
-$htmlpurifier_c = file_get_contents('library/HTMLPurifier.php');
-$htmlpurifier_c = preg_replace(
- '/HTML Purifier .+? - /',
- "HTML Purifier $version - ",
- $htmlpurifier_c,
- 1, $c
-);
-if (!$c) {
- echo 'Could not update HTMLPurifier.php, missing HTML Purifier [version] header.' . PHP_EOL;
- exit;
-}
-$htmlpurifier_c = preg_replace(
- '/public \$version = \'.+?\';/',
- "public \$version = '$version';",
- $htmlpurifier_c,
- 1, $c
-);
-if (!$c) {
- echo 'Could not update HTMLPurifier.php, missing public $version.' . PHP_EOL;
- exit;
-}
-$htmlpurifier_c = preg_replace(
- '/const VERSION = \'.+?\';/',
- "const VERSION = '$version';",
- $htmlpurifier_c,
- 1, $c
-);
-if (!$c) {
- echo 'Could not update HTMLPurifier.php, missing const $version.' . PHP_EOL;
- exit;
-}
-file_put_contents('library/HTMLPurifier.php', $htmlpurifier_c);
-
-$config_c = file_get_contents('library/HTMLPurifier/Config.php');
-$config_c = preg_replace(
- '/public \$version = \'.+?\';/',
- "public \$version = '$version';",
- $config_c,
- 1, $c
-);
-if (!$c) {
- echo 'Could not update Config.php, missing public $version.' . PHP_EOL;
- exit;
-}
-file_put_contents('library/HTMLPurifier/Config.php', $config_c);
-
-passthru('php maintenance/flush.php');
-
-if ($is_dev) echo "Review changes, write something in WHATSNEW and FOCUS, and then commit with log 'Release $version.'" . PHP_EOL;
-else echo "Numbers updated to dev, no other modifications necessary!";
-
-// vim: et sw=4 sts=4
+++ /dev/null
-<?php
-
-// Tags releases
-
-if (php_sapi_name() != 'cli') {
- echo 'Release script cannot be called from web-browser.';
- exit;
-}
-
-require 'svn.php';
-
-$svn_info = my_svn_info('.');
-
-$version = trim(file_get_contents('VERSION'));
-
-$trunk_url = $svn_info['Repository Root'] . '/htmlpurifier/trunk';
-$trunk_tag_url = $svn_info['Repository Root'] . '/htmlpurifier/tags/' . $version;
-
-echo "Tagging trunk to tags/$version...";
-passthru("svn copy --message \"Tag $version release.\" $trunk_url $trunk_tag_url");
-
-// vim: et sw=4 sts=4
--- /dev/null
+<?php
+
+// release script
+// PHP 5.0 only
+
+if (php_sapi_name() != 'cli') {
+ echo 'Release script cannot be called from web-browser.';
+ exit;
+}
+
+if (!isset($argv[1])) {
+ echo
+'php release.php [version]
+ HTML Purifier release script
+';
+ exit;
+}
+
+$version = trim($argv[1]);
+
+// Bump version numbers:
+
+// ...in VERSION
+file_put_contents('VERSION', $version);
+
+// ...in NEWS
+if ($is_dev = (strpos($version, 'dev') === false)) {
+ $date = date('Y-m-d');
+ $news_c = str_replace(
+ $l = "$version, unknown release date",
+ "$version, released $date",
+ file_get_contents('NEWS'),
+ $c
+ );
+ if (!$c) {
+ echo 'Could not update NEWS, missing ' . $l . PHP_EOL;
+ exit;
+ } elseif ($c > 1) {
+ echo 'More than one release declaration in NEWS replaced' . PHP_EOL;
+ exit;
+ }
+ file_put_contents('NEWS', $news_c);
+}
+
+// ...in Doxyfile
+$doxyfile_c = preg_replace(
+ '/(?<=PROJECT_NUMBER {9}= )[^\s]+/m', // brittle
+ $version,
+ file_get_contents('Doxyfile'),
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update Doxyfile, missing PROJECT_NUMBER.' . PHP_EOL;
+ exit;
+}
+file_put_contents('Doxyfile', $doxyfile_c);
+
+// ...in HTMLPurifier.php
+$htmlpurifier_c = file_get_contents('library/HTMLPurifier.php');
+$htmlpurifier_c = preg_replace(
+ '/HTML Purifier .+? - /',
+ "HTML Purifier $version - ",
+ $htmlpurifier_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update HTMLPurifier.php, missing HTML Purifier [version] header.' . PHP_EOL;
+ exit;
+}
+$htmlpurifier_c = preg_replace(
+ '/public \$version = \'.+?\';/',
+ "public \$version = '$version';",
+ $htmlpurifier_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update HTMLPurifier.php, missing public $version.' . PHP_EOL;
+ exit;
+}
+$htmlpurifier_c = preg_replace(
+ '/const VERSION = \'.+?\';/',
+ "const VERSION = '$version';",
+ $htmlpurifier_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update HTMLPurifier.php, missing const $version.' . PHP_EOL;
+ exit;
+}
+file_put_contents('library/HTMLPurifier.php', $htmlpurifier_c);
+
+$config_c = file_get_contents('library/HTMLPurifier/Config.php');
+$config_c = preg_replace(
+ '/public \$version = \'.+?\';/',
+ "public \$version = '$version';",
+ $config_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update Config.php, missing public $version.' . PHP_EOL;
+ exit;
+}
+file_put_contents('library/HTMLPurifier/Config.php', $config_c);
+
+passthru('maintenance/flush.sh');
+
+if ($is_dev) echo "Review changes, write something in WHATSNEW and FOCUS, and then commit with log 'Release $version.'" . PHP_EOL;
+else echo "Numbers updated to dev, no other modifications necessary!";
+
+// vim: et sw=4 sts=4