summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Vosmaer <jacob@gitlab.com>2017-01-02 18:59:07 +0100
committerJacob Vosmaer <jacob@gitlab.com>2017-01-02 18:59:07 +0100
commitd03e022b8816fd4193ff7a0a34e35573e8114e7f (patch)
tree1896a5c90f0eb99ecaa5fc09304cee7174657943
parent3fe9cea03a6384fd8f57f10e172c134ed5c0552d (diff)
downloadgitlab-shell-http-excon.tar.gz
WIP Use excon for HTTP requestshttp-excon
-rwxr-xr-xbin/check4
-rw-r--r--lib/gitlab_excon.rb2
-rw-r--r--lib/gitlab_net.rb71
-rw-r--r--lib/httpunix.rb54
-rw-r--r--lib/vendor/excon/CONTRIBUTING.md23
-rw-r--r--lib/vendor/excon/CONTRIBUTORS.md140
-rw-r--r--lib/vendor/excon/Gemfile19
-rw-r--r--lib/vendor/excon/Gemfile.lock301
-rw-r--r--lib/vendor/excon/LICENSE.md20
-rw-r--r--lib/vendor/excon/README.md480
-rw-r--r--lib/vendor/excon/Rakefile161
-rw-r--r--lib/vendor/excon/benchmarks/class_vs_lambda.rb50
-rw-r--r--lib/vendor/excon/benchmarks/concat_vs_insert.rb21
-rw-r--r--lib/vendor/excon/benchmarks/concat_vs_interpolate.rb22
-rw-r--r--lib/vendor/excon/benchmarks/cr_lf.rb21
-rw-r--r--lib/vendor/excon/benchmarks/downcase-eq-eq_vs_casecmp.rb169
-rw-r--r--lib/vendor/excon/benchmarks/excon.rb69
-rw-r--r--lib/vendor/excon/benchmarks/excon_vs.rb165
-rw-r--r--lib/vendor/excon/benchmarks/for_vs_array_each.rb27
-rw-r--r--lib/vendor/excon/benchmarks/for_vs_hash_each.rb27
-rw-r--r--lib/vendor/excon/benchmarks/has_key-vs-lookup.rb177
-rw-r--r--lib/vendor/excon/benchmarks/headers_case_sensitivity.rb83
-rw-r--r--lib/vendor/excon/benchmarks/headers_split_vs_match.rb34
-rw-r--r--lib/vendor/excon/benchmarks/implicit_block-vs-explicit_block.rb98
-rw-r--r--lib/vendor/excon/benchmarks/merging.rb21
-rw-r--r--lib/vendor/excon/benchmarks/single_vs_double_quotes.rb21
-rw-r--r--lib/vendor/excon/benchmarks/string_ranged_index.rb87
-rw-r--r--lib/vendor/excon/benchmarks/strip_newline.rb115
-rw-r--r--lib/vendor/excon/benchmarks/vs_stdlib.rb82
-rw-r--r--lib/vendor/excon/changelog.txt999
-rw-r--r--lib/vendor/excon/data/cacert.pem4036
-rw-r--r--lib/vendor/excon/excon.gemspec201
-rw-r--r--lib/vendor/excon/lib/excon.rb244
-rw-r--r--lib/vendor/excon/lib/excon/connection.rb495
-rw-r--r--lib/vendor/excon/lib/excon/constants.rb146
-rw-r--r--lib/vendor/excon/lib/excon/error.rb215
-rw-r--r--lib/vendor/excon/lib/excon/extensions/uri.rb34
-rw-r--r--lib/vendor/excon/lib/excon/headers.rb84
-rw-r--r--lib/vendor/excon/lib/excon/middlewares/base.rb25
-rw-r--r--lib/vendor/excon/lib/excon/middlewares/capture_cookies.rb32
-rw-r--r--lib/vendor/excon/lib/excon/middlewares/decompress.rb37
-rw-r--r--lib/vendor/excon/lib/excon/middlewares/escape_path.rb12
-rw-r--r--lib/vendor/excon/lib/excon/middlewares/expects.rb19
-rw-r--r--lib/vendor/excon/lib/excon/middlewares/idempotent.rb34
-rw-r--r--lib/vendor/excon/lib/excon/middlewares/instrumentor.rb41
-rw-r--r--lib/vendor/excon/lib/excon/middlewares/mock.rb52
-rw-r--r--lib/vendor/excon/lib/excon/middlewares/redirect_follower.rb64
-rw-r--r--lib/vendor/excon/lib/excon/middlewares/response_parser.rb13
-rw-r--r--lib/vendor/excon/lib/excon/pretty_printer.rb46
-rw-r--r--lib/vendor/excon/lib/excon/response.rb231
-rw-r--r--lib/vendor/excon/lib/excon/socket.rb278
-rw-r--r--lib/vendor/excon/lib/excon/ssl_socket.rb172
-rw-r--r--lib/vendor/excon/lib/excon/standard_instrumentor.rb28
-rw-r--r--lib/vendor/excon/lib/excon/test/plugin/server/exec.rb23
-rw-r--r--lib/vendor/excon/lib/excon/test/plugin/server/puma.rb20
-rw-r--r--lib/vendor/excon/lib/excon/test/plugin/server/unicorn.rb35
-rw-r--r--lib/vendor/excon/lib/excon/test/plugin/server/webrick.rb23
-rw-r--r--lib/vendor/excon/lib/excon/test/server.rb106
-rw-r--r--lib/vendor/excon/lib/excon/unix_socket.rb41
-rw-r--r--lib/vendor/excon/lib/excon/utils.rb89
-rw-r--r--lib/vendor/excon/spec/excon/error_spec.rb137
-rw-r--r--lib/vendor/excon/spec/excon/test/server_spec.rb28
-rw-r--r--lib/vendor/excon/spec/excon_spec.rb7
-rw-r--r--lib/vendor/excon/spec/helpers/file_path_helpers.rb22
-rw-r--r--lib/vendor/excon/spec/requests/basic_spec.rb40
-rw-r--r--lib/vendor/excon/spec/requests/eof_requests_spec.rb36
-rw-r--r--lib/vendor/excon/spec/spec_helper.rb24
-rw-r--r--lib/vendor/excon/spec/support/shared_contexts/test_server_context.rb83
-rw-r--r--lib/vendor/excon/spec/support/shared_examples/shared_example_for_clients.rb207
-rw-r--r--lib/vendor/excon/spec/support/shared_examples/shared_example_for_streaming_clients.rb20
-rw-r--r--lib/vendor/excon/spec/support/shared_examples/shared_example_for_test_servers.rb16
-rw-r--r--lib/vendor/excon/tests/authorization_header_tests.rb29
-rw-r--r--lib/vendor/excon/tests/bad_tests.rb47
-rw-r--r--lib/vendor/excon/tests/basic_tests.rb349
-rw-r--r--lib/vendor/excon/tests/complete_responses.rb31
-rw-r--r--lib/vendor/excon/tests/data/127.0.0.1.cert.crt14
-rw-r--r--lib/vendor/excon/tests/data/127.0.0.1.cert.key15
-rw-r--r--lib/vendor/excon/tests/data/excon.cert.crt14
-rw-r--r--lib/vendor/excon/tests/data/excon.cert.key15
-rw-r--r--lib/vendor/excon/tests/data/xs1
-rw-r--r--lib/vendor/excon/tests/error_tests.rb145
-rw-r--r--lib/vendor/excon/tests/header_tests.rb119
-rw-r--r--lib/vendor/excon/tests/middlewares/canned_response_tests.rb34
-rw-r--r--lib/vendor/excon/tests/middlewares/capture_cookies_tests.rb34
-rw-r--r--lib/vendor/excon/tests/middlewares/decompress_tests.rb157
-rw-r--r--lib/vendor/excon/tests/middlewares/escape_path_tests.rb36
-rw-r--r--lib/vendor/excon/tests/middlewares/idempotent_tests.rb131
-rw-r--r--lib/vendor/excon/tests/middlewares/instrumentation_tests.rb315
-rw-r--r--lib/vendor/excon/tests/middlewares/mock_tests.rb304
-rw-r--r--lib/vendor/excon/tests/middlewares/redirect_follower_tests.rb80
-rw-r--r--lib/vendor/excon/tests/pipeline_tests.rb40
-rw-r--r--lib/vendor/excon/tests/proxy_tests.rb306
-rw-r--r--lib/vendor/excon/tests/query_string_tests.rb87
-rw-r--r--lib/vendor/excon/tests/rackups/basic.rb41
-rw-r--r--lib/vendor/excon/tests/rackups/basic.ru3
-rw-r--r--lib/vendor/excon/tests/rackups/basic_auth.ru14
-rw-r--r--lib/vendor/excon/tests/rackups/deflater.ru4
-rw-r--r--lib/vendor/excon/tests/rackups/proxy.ru18
-rw-r--r--lib/vendor/excon/tests/rackups/query_string.ru13
-rw-r--r--lib/vendor/excon/tests/rackups/redirecting.ru23
-rw-r--r--lib/vendor/excon/tests/rackups/redirecting_with_cookie.ru40
-rw-r--r--lib/vendor/excon/tests/rackups/request_headers.ru15
-rw-r--r--lib/vendor/excon/tests/rackups/request_methods.ru21
-rw-r--r--lib/vendor/excon/tests/rackups/response_header.ru18
-rw-r--r--lib/vendor/excon/tests/rackups/ssl.ru16
-rw-r--r--lib/vendor/excon/tests/rackups/ssl_mismatched_cn.ru15
-rw-r--r--lib/vendor/excon/tests/rackups/ssl_verify_peer.ru16
-rw-r--r--lib/vendor/excon/tests/rackups/streaming.ru30
-rw-r--r--lib/vendor/excon/tests/rackups/thread_safety.ru17
-rw-r--r--lib/vendor/excon/tests/rackups/timeout.ru14
-rw-r--r--lib/vendor/excon/tests/rackups/webrick_patch.rb34
-rw-r--r--lib/vendor/excon/tests/request_headers_tests.rb21
-rw-r--r--lib/vendor/excon/tests/request_method_tests.rb47
-rw-r--r--lib/vendor/excon/tests/request_tests.rb59
-rw-r--r--lib/vendor/excon/tests/response_tests.rb197
-rwxr-xr-xlib/vendor/excon/tests/servers/bad.rb20
-rwxr-xr-xlib/vendor/excon/tests/servers/eof.rb17
-rwxr-xr-xlib/vendor/excon/tests/servers/error.rb20
-rwxr-xr-xlib/vendor/excon/tests/servers/good.rb350
-rw-r--r--lib/vendor/excon/tests/test_helper.rb306
-rw-r--r--lib/vendor/excon/tests/thread_safety_tests.rb39
-rw-r--r--lib/vendor/excon/tests/timeout_tests.rb12
-rw-r--r--lib/vendor/excon/tests/utils_tests.rb81
-rw-r--r--spec/gitlab_net_spec.rb42
-rw-r--r--spec/httpunix_spec.rb72
-rw-r--r--spec/spec_helper.rb3
126 files changed, 14803 insertions, 197 deletions
diff --git a/bin/check b/bin/check
index 9585416..0803289 100755
--- a/bin/check
+++ b/bin/check
@@ -10,10 +10,10 @@ require_relative '../lib/gitlab_net'
print "Check GitLab API access: "
begin
resp = GitlabNet.new.check
- if resp.code == "200"
+ if resp.status == 200
print 'OK'
else
- abort "FAILED. code: #{resp.code}"
+ abort "FAILED. code: #{resp.status}"
end
rescue GitlabNet::ApiUnreachableError
abort "FAILED: Failed to connect to internal API"
diff --git a/lib/gitlab_excon.rb b/lib/gitlab_excon.rb
new file mode 100644
index 0000000..f8908e9
--- /dev/null
+++ b/lib/gitlab_excon.rb
@@ -0,0 +1,2 @@
+$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), 'vendor/excon/lib')))
+require 'excon'
diff --git a/lib/gitlab_net.rb b/lib/gitlab_net.rb
index 8488adc..bfc5f1d 100644
--- a/lib/gitlab_net.rb
+++ b/lib/gitlab_net.rb
@@ -7,7 +7,8 @@ require_relative 'gitlab_logger'
require_relative 'gitlab_access'
require_relative 'gitlab_redis'
require_relative 'gitlab_lfs_authentication'
-require_relative 'httpunix'
+require_relative 'gitlab_excon'
+
class GitlabNet
class ApiUnreachableError < StandardError; end
@@ -35,7 +36,7 @@ class GitlabNet
url = "#{host}/allowed"
resp = post(url, params)
- if resp.code == '200'
+ if resp.status == 200
GitAccessStatus.create_from_json(resp.body)
else
GitAccessStatus.new(false, 'API is not accessible', nil)
@@ -56,7 +57,7 @@ class GitlabNet
resp = post("#{host}/lfs_authenticate", params)
- if resp.code == '200'
+ if resp.status == 200
GitlabLfsAuthentication.build_from_json(resp.body)
end
end
@@ -79,7 +80,7 @@ class GitlabNet
def authorized_key(key)
resp = get("#{host}/authorized_keys?key=#{URI.escape(key, '+/=')}")
- JSON.parse(resp.body) if resp.code == "200"
+ JSON.parse(resp.body) if resp.code == 200
rescue
nil
end
@@ -88,7 +89,7 @@ class GitlabNet
key_id = key.gsub('key-', '')
resp = post("#{host}/two_factor_recovery_codes", key_id: key_id)
- JSON.parse(resp.body) if resp.code == '200'
+ JSON.parse(resp.body) if resp.status == 200
rescue
{}
end
@@ -131,48 +132,42 @@ class GitlabNet
"#{config.gitlab_url}/api/v3/internal"
end
- def http_client_for(uri, options={})
- if uri.is_a?(URI::HTTPUNIX)
- http = Net::HTTPUNIX.new(uri.hostname)
- else
- http = Net::HTTP.new(uri.host, uri.port)
- end
-
- http.read_timeout = options[:read_timeout] || read_timeout
-
- if uri.is_a?(URI::HTTPS)
- http.use_ssl = true
- http.cert_store = cert_store
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE if config.http_settings['self_signed_cert']
- end
-
- http
- end
-
- def http_request_for(method, uri, params = {})
- request_klass = method == :get ? Net::HTTP::Get : Net::HTTP::Post
- request = request_klass.new(uri.request_uri)
+ def http_client_for(url)
+ excon_options = {}
user = config.http_settings['user']
password = config.http_settings['password']
- request.basic_auth(user, password) if user && password
-
- request.set_form_data(params.merge(secret_token: secret_token))
+ if user && password
+ excon_options[:user] = user
+ excon_options[:password] = password
+ end
- request
+ uri = URI.parse(url)
+ if uri.scheme == 'http+unix'
+ excon_options[:socket] = URI.unescape(uri.host)
+ url.sub!('http+', '')
+ url.sub!(uri.host, '/')
+ else
+ excon_options[:ssl_verify_peer] = !config.http_settings['self_signed_cert']
+ excon_options[:ssl_cert_store] = cert_store
+ end
+ Excon.new(url, excon_options)
end
def request(method, url, params = {}, options={})
$logger.debug "Performing #{method.to_s.upcase} #{url}"
- uri = URI.parse(url)
-
- http = http_client_for(uri, options)
- request = http_request_for(method, uri, params)
+ http = http_client_for(url)
+ request_options = {
+ method: method,
+ read_timeout: options[:read_timeout] || read_timeout,
+ body: URI.encode_www_form(params.merge(secret_token: secret_token)),
+ headers: { "Content-Type" => "application/x-www-form-urlencoded" }
+ }
begin
start_time = Time.new
- response = http.start { http.request(request) }
+ response = http.request(request_options)
rescue => e
$logger.warn "Failed to connect to internal API <#{method.to_s.upcase} #{url}>: #{e.inspect}"
raise ApiUnreachableError
@@ -182,10 +177,10 @@ class GitlabNet
end
end
- if response.code == "200"
- $logger.debug "Received response #{response.code} => <#{response.body}>."
+ if response.status == 200
+ $logger.debug "Received response #{response.status} => <#{response.body}>."
else
- $logger.error "API call <#{method.to_s.upcase} #{url}> failed: #{response.code} => <#{response.body}>."
+ $logger.error "API call <#{method.to_s.upcase} #{url}> failed: #{response.status} => <#{response.body}>."
end
response
diff --git a/lib/httpunix.rb b/lib/httpunix.rb
deleted file mode 100644
index 12787ee..0000000
--- a/lib/httpunix.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-# support for http+unix://... connection scheme
-#
-# The URI scheme has the same structure as the similar one for python requests. See:
-# http://fixall.online/theres-no-need-to-reinvent-the-wheelhttpsgithubcommsabramorequests-unixsocketurl/241810/
-# https://github.com/msabramo/requests-unixsocket
-
-require 'uri'
-require 'net/http'
-
-module URI
- class HTTPUNIX < HTTP
- def hostname
- # decode %XX from path to file
- v = self.host
- URI.decode(v)
- end
-
- # port is not allowed in URI
- DEFAULT_PORT = nil
- def set_port(v)
- return v unless v
- raise InvalidURIError, "http+unix:// cannot contain port"
- end
- end
- @@schemes['HTTP+UNIX'] = HTTPUNIX
-end
-
-# Based on:
-# - http://stackoverflow.com/questions/15637226/ruby-1-9-3-simple-get-request-to-unicorn-through-socket
-# - Net::HTTP::connect
-module Net
- class HTTPUNIX < HTTP
- def initialize(socketpath, port=nil)
- super(socketpath, port)
- @port = nil # HTTP will set it to default - override back -> set DEFAULT_PORT
- end
-
- # override to prevent ":<port>" being appended to HTTP_HOST
- def addr_port
- address
- end
-
- def connect
- D "opening connection to #{address} ..."
- s = UNIXSocket.new(address)
- D "opened"
- @socket = BufferedIO.new(s)
- @socket.read_timeout = @read_timeout
- @socket.continue_timeout = @continue_timeout
- @socket.debug_output = @debug_output
- on_connect
- end
- end
-end
diff --git a/lib/vendor/excon/CONTRIBUTING.md b/lib/vendor/excon/CONTRIBUTING.md
new file mode 100644
index 0000000..4c3bd8e
--- /dev/null
+++ b/lib/vendor/excon/CONTRIBUTING.md
@@ -0,0 +1,23 @@
+## Getting Involved
+
+New contributors are always welcome, when it doubt please ask questions. We strive to be an open and welcoming community. Please be nice to one another.
+
+### Coding
+
+* Pick a task:
+ * Offer feedback on open [pull requests](https://github.com/excon/excon/pulls).
+ * Review open [issues](https://github.com/excon/excon/issues) for things to help on.
+ * [Create an issue](https://github.com/excon/excon/issues/new) to start a discussion on additions or features.
+* Fork the project, add your changes and tests to cover them in a topic branch.
+* Commit your changes and rebase against `excon/excon` to ensure everything is up to date.
+* [Submit a pull request](https://github.com/excon/excon/compare/).
+
+### Non-Coding
+
+* Work for [twitter](http://twitter.com)? I'd love to reclaim the unused [@excon](http://twitter.com/excon) account!
+* Offer feedback on open [issues](https://github.com/excon/excon/issues).
+* Write and help edit [documentation](https://github.com/excon/excon.github.com).
+* Translate [documentation](https://github.com/excon/excon.github.com) in to other languages.
+* Organize or volunteer at events.
+* [Donate](https://www.gittip.com/geemus/)!
+* Discuss other ideas for contribution with [geemus](mailto:geemus+excon@gmail.com).
diff --git a/lib/vendor/excon/CONTRIBUTORS.md b/lib/vendor/excon/CONTRIBUTORS.md
new file mode 100644
index 0000000..7f2b25b
--- /dev/null
+++ b/lib/vendor/excon/CONTRIBUTORS.md
@@ -0,0 +1,140 @@
+* Aaron Stone <aaron@serendipity.cx>
+* Adam Esterline <adam@esterlines.com>
+* Alexander Sandström <alexander@skovik.com>
+* Andrew Katz <andrew.katz@outright.com>
+* Andy Delcambre <adelcambre@gmail.com>
+* Anshul Khandelwal <anshul@anshulkhandelwal.com>
+* Ash Wilson <smashwilson@gmail.com>
+* Ben Burkert <ben@benburkert.com>
+* Benedikt Böhm <bb@xnull.de>
+* Bo Jeanes <me@bjeanes.com>
+* Brandur <brandur@mutelight.org>
+* Brian D. Burns <iosctr@gmail.com>
+* Brian Hartsock <brian.hartsock@gmail.com>
+* Bryan Paxton <starbelly@pobox.com>
+* Caio Chassot <dev@caiochassot.com>
+* Caius Durling <dev@caius.name>
+* Carl Hörberg <carl.hoerberg@gmail.com>
+* Carl Hörberg <carl.hoerberg@gmail.com>
+* Carlos Sanchez <csanchez@maestrodev.com>
+* Casper Thomsen <ct@clearhaus.com>
+* Chris Hanks <christopher.m.hanks@gmail.com>
+* Claudio Poli <masterkain@gmail.com>
+* Damien Mathieu <damien@heroku.com>
+* Dan Hensgen <dan@methodhead.com>
+* Dan Peterson <dpiddy@gmail.com>
+* Dan Prince <dprince@redhat.com>
+* Dane Harrigan <dane.harrigan@gmail.com>
+* Dave Myron <therealdave.myron@gmail.com>
+* Dave Newton <davelnewton@gmail.com>
+* David Biehl <dbiehl@ncmedical.com>
+* David Biehl <lazylodr@gmail.com>
+* Dimitrij Denissenko <dimitrij@blacksquaremedia.com>
+* Dominik Richter <dominik.richter@gmail.com>
+* Doug McInnes <doug@dougmcinnes.com>
+* Eugene Howe <eugene@xtreme-computers.net>
+* Evan Phoenix <evan@fallingsnow.net>
+* Fabian Wiesel <fabian.wiesel@sap.com>
+* Federico Ravasio <ravasio.federico@gmail.com>
+* Glenn Pratt <glennpratt@gmail.com>
+* Graeme Nelson <graeme.nelson@gmail.com>
+* Guillaume Balaine <igosuki@gmail.com>
+* Hakan Ensari <hakan.ensari@papercavalier.com>
+* Ian Neubert <ian@ianneubert.com>
+* Jacob Atzen <jacob@incremental.dk>
+* James Cox <james@imaj.es>
+* James Watling <watling.james@gmail.com>
+* Jean Mertz <jean@mertz.fm>
+* Jeremy Hinegardner <jeremy@copiousfreetime.org>
+* Jesse Kempf <jesse.kempf@opower.com>
+* Joe Rafaniello <jrafanie@redhat.com>
+* John Keiser <jkeiser@opscode.com>
+* John Leach <john@brightbox.co.uk>
+* Jonas Pfenniger <jonas@pfenniger.name>
+* Jonathan Dance <github@wuputah.com>
+* Jonathan Dance <jd@wuputah.com>
+* Jonathan Roes <jroes@jroes.net>
+* Joshua B. Smith <jbsmith@us.ibm.com>
+* Joshua Gross <joshua@surfeasy.com>
+* Joshua Mckinney <joshmckin@gmail.com>
+* Joshua Napoli <jnapoli@swipely-napoli.home>
+* Joshua Napoli <jnapoli@swipely-napoli.local>
+* Kelly Mahan <kmahan@kmahan.com>
+* Kensuke Nagae <kyanny@gmail.com>
+* Konstantin Shabanov <etehtsea@gmail.com>
+* Kyle Rames <kyle.rames@rackspace.com>
+* Lewis Marshall <lewis@lmars.net>
+* Lincoln Stoll <me@lstoll.net>
+* Louis Sobel <sobel@mit.edu>
+* Mahemoff <michael@mahemoff.com>
+* Mathias Meyer <meyer@paperplanes.de>
+* Matt Gauger <matt.gauger@gmail.com>
+* Matt Sanders <matt@modal.org>
+* Matt Sanders <matt@polycot.com>
+* Matt Snyder <snyder2112@me.com>
+* Matt Todd <chiology@gmail.com>
+* Max Lincoln <max@devopsy.com>
+* Michael Brodhead <mkb@engineyard.com>
+* Michael Hale <mike@hales.ws>
+* Michael Rowe <mrowe@mojain.com>
+* Michael Rykov <mrykov@gmail.com>
+* Mike Heffner <mikeh@fesnel.com>
+* Myron Marston <myron.marston@gmail.com>
+* Nathan Long <nathan.long@tma1.com>
+* Nathan Sutton <nate@zencoder.com>
+* Nick Osborn <nick.osborn@digital.cabinet-office.gov.uk>
+* Nicolas Sanguinetti <contacto@nicolassanguinetti.info>
+* Paul Gideon Dann <pdgiddie@gmail.com>
+* Pavel <pavel.evst@gmail.com>
+* Peter Meier <peter.meier@immerda.ch>
+* Peter Weldon <peter.weldon@null.net>
+* Peter Weldon <peter@lautus.net>
+* Phil Ross <phil.ross@gmail.com>
+* Richard Ramsden <richard@rramsden.ca>
+* Ruslan Korolev <rs3@fastmail.com>
+* Ruslan Korolev <rs41@gmx.com>
+* Ruslan Kyrychuk <ruslan.kyrychuk@gmail.com>
+* Ryan Bigg <radarlistener@fastmail.fm>
+* Ryan Mohr <ryan.mohr@gmail.com>
+* Sam Withrow <sam.withrow@curiousnation.org>
+* Scott Gonyea <me@aitrus.org>
+* Scott Gonyea <me@sgonyea.com>
+* Scott Walkinshaw <scott.walkinshaw@gmail.com>
+* Sean Cribbs <seancribbs@gmail.com>
+* Sergio Rubio <rubiojr@frameos.org>
+* Shai Rosenfeld <shaiguitar@gmail.com>
+* Stefan Merettig <stefan-merettig@nuriaproject.org>
+* Stephen Chu <github@stephenchu.com>
+* Swanand Pagnis <swanandp@users.noreply.github.com>
+* Terry Howe <terrylhowe@gmail.com>
+* Thom Mahoney & Josh Lane <tmahoney@engineyard.com>
+* Thom May <thom@digital-science.com>
+* Tim Carey-Smith <tim@spork.in>
+* Todd Lunter <tlunter@gmail.com>
+* Tom Maher <tmaher@heroku.com>
+* Tom Maher <tmaher@tursom.org>
+* Trym Skaar <trym@tryms.no>
+* Tuomas Silen <tuomas.silen@nodeta.fi>
+* Victor Costan <costan@gmail.com>
+* Viven <vivien.schilis@gmail.com>
+* Wesley Beary <geemus+github@gmail.com>
+* Wesley Beary <geemus@engineyard.com>
+* Wesley Beary <geemus@gmail.com>
+* Wesley Beary <wbeary@engineyard.com>
+* Wesley Beary <wesley@heroku.com>
+* Zach Anker <zanker@squareup.com>
+* chrisrhoden <carhoden@gmail.com>
+* dickeyxxx <jeff@dickeyxxx.com>
+* geemus (Wesley Beary) <wbeary@engineyard.com>
+* geemus <geemus@gmail.com>
+* ggoodale <ggoodale@gmail.com>
+* marios <marios@redhat.com>
+* mkb <mkb@black-ice.org>
+* phiggins <pete@peterhiggins.org>
+* rin_ne <rinrin.ne@gmail.com>
+* rinrinne <rinrin.ne@gmail.com>
+* rkyrychuk <ruslan.kyrychuk@gmail.com>
+* sshaw <skye.shaw@gmail.com>
+* starbelly <starbelly@pobox.com>
+* twrodriguez <tw.rodriguez@gmail.com>
+* zimbatm <zimbatm@zimbatm.com> \ No newline at end of file
diff --git a/lib/vendor/excon/Gemfile b/lib/vendor/excon/Gemfile
new file mode 100644
index 0000000..a28e027
--- /dev/null
+++ b/lib/vendor/excon/Gemfile
@@ -0,0 +1,19 @@
+source "http://rubygems.org"
+
+gemspec
+
+gem 'jruby-openssl', '~> 0.9', :platform => :jruby
+gem 'unicorn', :platforms => [:mri, :rbx], :groups => [:development, :test]
+gem 'rubysl', '~> 2.0', :platform => :rbx
+gem 'rack', '~> 1.6'
+
+# group :benchmark do
+# gem 'em-http-request'
+# gem 'httparty'
+# gem 'rest-client'
+# gem 'tach'
+# gem 'typhoeus'
+# gem 'sinatra'
+# gem 'streamly_ffi'
+# gem 'curb'
+# end
diff --git a/lib/vendor/excon/Gemfile.lock b/lib/vendor/excon/Gemfile.lock
new file mode 100644
index 0000000..80a6583
--- /dev/null
+++ b/lib/vendor/excon/Gemfile.lock
@@ -0,0 +1,301 @@
+PATH
+ remote: .
+ specs:
+ excon (0.54.0)
+
+GEM
+ remote: http://rubygems.org/
+ specs:
+ activesupport (3.2.6)
+ i18n (~> 0.6)
+ multi_json (~> 1.0)
+ backports (3.6.4)
+ chronic (0.6.7)
+ delorean (2.0.0)
+ chronic
+ diff-lcs (1.2.5)
+ eventmachine (1.0.4)
+ eventmachine (1.0.4-java)
+ ffi2-generators (0.1.1)
+ formatador (0.2.3)
+ i18n (0.6.0)
+ jruby-openssl (0.9.17-java)
+ json (1.8.2)
+ json (1.8.2-java)
+ kgio (2.9.2)
+ minitest (4.7.5)
+ multi_json (1.3.6)
+ open4 (1.3.0)
+ puma (3.6.0)
+ puma (3.6.0-java)
+ rack (1.6.0)
+ rack-protection (1.2.0)
+ rack
+ rack-test (0.6.3)
+ rack (>= 1.0)
+ raindrops (0.13.0)
+ rake (0.9.2.2)
+ rdoc (3.12)
+ json (~> 1.4)
+ rspec (3.5.0)
+ rspec-core (~> 3.5.0)
+ rspec-expectations (~> 3.5.0)
+ rspec-mocks (~> 3.5.0)
+ rspec-core (3.5.0)
+ rspec-support (~> 3.5.0)
+ rspec-expectations (3.5.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.5.0)
+ rspec-mocks (3.5.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.5.0)
+ rspec-support (3.5.0)
+ rubysl (2.0.14)
+ rubysl-abbrev (~> 2.0)
+ rubysl-base64 (~> 2.0)
+ rubysl-benchmark (~> 2.0)
+ rubysl-bigdecimal (~> 2.0)
+ rubysl-cgi (~> 2.0)
+ rubysl-cgi-session (~> 2.0)
+ rubysl-cmath (~> 2.0)
+ rubysl-complex (~> 2.0)
+ rubysl-continuation (~> 2.0)
+ rubysl-coverage (~> 2.0)
+ rubysl-csv (~> 2.0)
+ rubysl-curses (~> 2.0)
+ rubysl-date (~> 2.0)
+ rubysl-delegate (~> 2.0)
+ rubysl-digest (~> 2.0)
+ rubysl-drb (~> 2.0)
+ rubysl-e2mmap (~> 2.0)
+ rubysl-english (~> 2.0)
+ rubysl-enumerator (~> 2.0)
+ rubysl-erb (~> 2.0)
+ rubysl-etc (~> 2.0)
+ rubysl-expect (~> 2.0)
+ rubysl-fcntl (~> 2.0)
+ rubysl-fiber (~> 2.0)
+ rubysl-fileutils (~> 2.0)
+ rubysl-find (~> 2.0)
+ rubysl-forwardable (~> 2.0)
+ rubysl-getoptlong (~> 2.0)
+ rubysl-gserver (~> 2.0)
+ rubysl-io-console (~> 2.0)
+ rubysl-io-nonblock (~> 2.0)
+ rubysl-io-wait (~> 2.0)
+ rubysl-ipaddr (~> 2.0)
+ rubysl-irb (~> 2.0)
+ rubysl-logger (~> 2.0)
+ rubysl-mathn (~> 2.0)
+ rubysl-matrix (~> 2.0)
+ rubysl-mkmf (~> 2.0)
+ rubysl-monitor (~> 2.0)
+ rubysl-mutex_m (~> 2.0)
+ rubysl-net-ftp (~> 2.0)
+ rubysl-net-http (~> 2.0)
+ rubysl-net-imap (~> 2.0)
+ rubysl-net-pop (~> 2.0)
+ rubysl-net-protocol (~> 2.0)
+ rubysl-net-smtp (~> 2.0)
+ rubysl-net-telnet (~> 2.0)
+ rubysl-nkf (~> 2.0)
+ rubysl-observer (~> 2.0)
+ rubysl-open-uri (~> 2.0)
+ rubysl-open3 (~> 2.0)
+ rubysl-openssl (~> 2.0)
+ rubysl-optparse (~> 2.0)
+ rubysl-ostruct (~> 2.0)
+ rubysl-pathname (~> 2.0)
+ rubysl-prettyprint (~> 2.0)
+ rubysl-prime (~> 2.0)
+ rubysl-profile (~> 2.0)
+ rubysl-profiler (~> 2.0)
+ rubysl-pstore (~> 2.0)
+ rubysl-pty (~> 2.0)
+ rubysl-rational (~> 2.0)
+ rubysl-readline (~> 2.0)
+ rubysl-resolv (~> 2.0)
+ rubysl-rexml (~> 2.0)
+ rubysl-rinda (~> 2.0)
+ rubysl-rss (~> 2.0)
+ rubysl-scanf (~> 2.0)
+ rubysl-securerandom (~> 2.0)
+ rubysl-set (~> 2.0)
+ rubysl-shellwords (~> 2.0)
+ rubysl-singleton (~> 2.0)
+ rubysl-socket (~> 2.0)
+ rubysl-stringio (~> 2.0)
+ rubysl-strscan (~> 2.0)
+ rubysl-sync (~> 2.0)
+ rubysl-syslog (~> 2.0)
+ rubysl-tempfile (~> 2.0)
+ rubysl-test-unit (~> 2.0)
+ rubysl-thread (~> 2.0)
+ rubysl-thwait (~> 2.0)
+ rubysl-time (~> 2.0)
+ rubysl-timeout (~> 2.0)
+ rubysl-tmpdir (~> 2.0)
+ rubysl-tsort (~> 2.0)
+ rubysl-un (~> 2.0)
+ rubysl-uri (~> 2.0)
+ rubysl-weakref (~> 2.0)
+ rubysl-webrick (~> 2.0)
+ rubysl-xmlrpc (~> 2.0)
+ rubysl-yaml (~> 2.0)
+ rubysl-zlib (~> 2.0)
+ rubysl-abbrev (2.0.4)
+ rubysl-base64 (2.0.0)
+ rubysl-benchmark (2.0.1)
+ rubysl-bigdecimal (2.0.2)
+ rubysl-cgi (2.0.1)
+ rubysl-cgi-session (2.0.1)
+ rubysl-cmath (2.0.0)
+ rubysl-complex (2.0.0)
+ rubysl-continuation (2.0.0)
+ rubysl-coverage (2.0.3)
+ rubysl-csv (2.0.2)
+ rubysl-english (~> 2.0)
+ rubysl-curses (2.0.0)
+ rubysl-date (2.0.6)
+ rubysl-delegate (2.0.1)
+ rubysl-digest (2.0.3)
+ rubysl-drb (2.0.1)
+ rubysl-e2mmap (2.0.0)
+ rubysl-english (2.0.0)
+ rubysl-enumerator (2.0.0)
+ rubysl-erb (2.0.1)
+ rubysl-etc (2.0.3)
+ ffi2-generators (~> 0.1)
+ rubysl-expect (2.0.0)
+ rubysl-fcntl (2.0.4)
+ ffi2-generators (~> 0.1)
+ rubysl-fiber (2.0.0)
+ rubysl-fileutils (2.0.3)
+ rubysl-find (2.0.1)
+ rubysl-forwardable (2.0.1)
+ rubysl-getoptlong (2.0.0)
+ rubysl-gserver (2.0.0)
+ rubysl-socket (~> 2.0)
+ rubysl-thread (~> 2.0)
+ rubysl-io-console (2.0.0)
+ rubysl-io-nonblock (2.0.0)
+ rubysl-io-wait (2.0.0)
+ rubysl-ipaddr (2.0.0)
+ rubysl-irb (2.0.4)
+ rubysl-e2mmap (~> 2.0)
+ rubysl-mathn (~> 2.0)
+ rubysl-readline (~> 2.0)
+ rubysl-thread (~> 2.0)
+ rubysl-logger (2.0.0)
+ rubysl-mathn (2.0.0)
+ rubysl-matrix (2.1.0)
+ rubysl-e2mmap (~> 2.0)
+ rubysl-mkmf (2.0.1)
+ rubysl-fileutils (~> 2.0)
+ rubysl-shellwords (~> 2.0)
+ rubysl-monitor (2.0.0)
+ rubysl-mutex_m (2.0.0)
+ rubysl-net-ftp (2.0.1)
+ rubysl-net-http (2.0.4)
+ rubysl-cgi (~> 2.0)
+ rubysl-erb (~> 2.0)
+ rubysl-singleton (~> 2.0)
+ rubysl-net-imap (2.0.1)
+ rubysl-net-pop (2.0.1)
+ rubysl-net-protocol (2.0.1)
+ rubysl-net-smtp (2.0.1)
+ rubysl-net-telnet (2.0.0)
+ rubysl-nkf (2.0.1)
+ rubysl-observer (2.0.0)
+ rubysl-open-uri (2.0.0)
+ rubysl-open3 (2.0.0)
+ rubysl-openssl (2.0.4)
+ rubysl-optparse (2.0.1)
+ rubysl-shellwords (~> 2.0)
+ rubysl-ostruct (2.0.4)
+ rubysl-pathname (2.0.0)
+ rubysl-prettyprint (2.0.2)
+ rubysl-prime (2.0.0)
+ rubysl-profile (2.0.0)
+ rubysl-profiler (2.0.1)
+ rubysl-pstore (2.0.0)
+ rubysl-pty (2.0.2)
+ rubysl-rational (2.0.1)
+ rubysl-readline (2.0.2)
+ rubysl-resolv (2.0.0)
+ rubysl-rexml (2.0.2)
+ rubysl-rinda (2.0.0)
+ rubysl-rss (2.0.0)
+ rubysl-scanf (2.0.0)
+ rubysl-securerandom (2.0.0)
+ rubysl-set (2.0.1)
+ rubysl-shellwords (2.0.0)
+ rubysl-singleton (2.0.0)
+ rubysl-socket (2.0.1)
+ rubysl-stringio (2.0.0)
+ rubysl-strscan (2.0.0)
+ rubysl-sync (2.0.0)
+ rubysl-syslog (2.0.1)
+ ffi2-generators (~> 0.1)
+ rubysl-tempfile (2.0.1)
+ rubysl-test-unit (2.0.1)
+ minitest (~> 4.7)
+ rubysl-thread (2.0.2)
+ rubysl-thwait (2.0.0)
+ rubysl-time (2.0.3)
+ rubysl-timeout (2.0.0)
+ rubysl-tmpdir (2.0.0)
+ rubysl-tsort (2.0.1)
+ rubysl-un (2.0.0)
+ rubysl-fileutils (~> 2.0)
+ rubysl-optparse (~> 2.0)
+ rubysl-uri (2.0.0)
+ rubysl-weakref (2.0.0)
+ rubysl-webrick (2.0.0)
+ rubysl-xmlrpc (2.0.0)
+ rubysl-yaml (2.0.3)
+ rubysl-zlib (2.0.1)
+ shindo (0.3.4)
+ formatador (>= 0.1.1)
+ sinatra (1.3.2)
+ rack (~> 1.3, >= 1.3.6)
+ rack-protection (~> 1.2)
+ tilt (~> 1.3, >= 1.3.3)
+ sinatra-contrib (1.3.2)
+ backports (>= 2.0)
+ eventmachine
+ rack-protection
+ rack-test
+ sinatra (~> 1.3.0)
+ tilt (~> 1.3)
+ tilt (1.3.3)
+ unicorn (4.8.3)
+ kgio (~> 2.6)
+ rack
+ raindrops (~> 0.7)
+
+PLATFORMS
+ java
+ ruby
+
+DEPENDENCIES
+ activesupport
+ delorean
+ eventmachine (>= 1.0.4)
+ excon!
+ jruby-openssl (~> 0.9)
+ json (>= 1.8.2)
+ open4
+ puma
+ rack (~> 1.6)
+ rake
+ rdoc
+ rspec (>= 3.5.0)
+ rubysl (~> 2.0)
+ shindo
+ sinatra
+ sinatra-contrib
+ unicorn
+
+BUNDLED WITH
+ 1.13.1
diff --git a/lib/vendor/excon/LICENSE.md b/lib/vendor/excon/LICENSE.md
new file mode 100644
index 0000000..09a4adc
--- /dev/null
+++ b/lib/vendor/excon/LICENSE.md
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2009-2015 [CONTRIBUTORS.md](https://github.com/excon/excon/blob/master/CONTRIBUTORS.md)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/lib/vendor/excon/README.md b/lib/vendor/excon/README.md
new file mode 100644
index 0000000..7664993
--- /dev/null
+++ b/lib/vendor/excon/README.md
@@ -0,0 +1,480 @@
+# excon
+
+Usable, fast, simple Ruby HTTP 1.1
+
+Excon was designed to be simple, fast and performant. It works great as a general HTTP(s) client and is particularly well suited to usage in API clients.
+
+[![Build Status](https://secure.travis-ci.org/excon/excon.svg)](http://travis-ci.org/excon/excon)
+[![Dependency Status](https://gemnasium.com/geemus/excon.svg)](https://gemnasium.com/geemus/excon)
+[![Gem Version](https://badge.fury.io/rb/excon.svg)](http://badge.fury.io/rb/excon)
+[![Gittip](http://img.shields.io/gittip/geemus.svg)](https://www.gittip.com/geemus/)
+
+* [Getting Started](#getting-started)
+* [Options](#options)
+* [Chunked Requests](#chunked-requests)
+* [Pipelining Requests](#pipelining-requests)
+* [Streaming Responses](#streaming-responses)
+* [Proxy Support](#proxy-support)
+* [Reusable ports](#reusable-ports)
+* [Unix Socket Support](#unix-socket-support)
+* [Stubs](#stubs)
+* [Instrumentation](#instrumentation)
+* [HTTPS client certificate](#https-client-certificate)
+* [HTTPS/SSL Issues](#httpsssl-issues)
+* [Getting Help](#getting-help)
+* [Contributing](#contributing)
+* [Plugins and Middlewares](#plugins-and-middlewares)
+* [License](#license)
+
+## Getting Started
+
+Install the gem.
+
+```
+$ sudo gem install excon
+```
+
+Require with rubygems.
+
+```ruby
+require 'rubygems'
+require 'excon'
+```
+
+The easiest way to get started is by using one-off requests. Supported one-off request methods are `connect`, `delete`, `get`, `head`, `options`, `post`, `put`, and `trace`. Requests return a response object which has `body`, `headers`, `remote_ip` and `status` attributes.
+
+```ruby
+response = Excon.get('http://geemus.com')
+response.body # => "..."
+response.headers # => {...}
+response.remote_ip # => "..."
+response.status # => 200
+```
+
+For API clients or other ongoing usage, reuse a connection across multiple requests to share options and improve performance.
+
+```ruby
+connection = Excon.new('http://geemus.com')
+get_response = connection.get
+post_response = connection.post(:path => '/foo')
+delete_response = connection.delete(:path => '/bar')
+```
+
+By default, each connection is non-persistent. This means that each request made against a connection behaves like a
+one-off request. Each request will establish a socket connection to the server, then close the socket once the request
+is complete.
+
+To use a persistent connection, use the `:persistent` option:
+
+```ruby
+connection = Excon.new('http://geemus.com', :persistent => true)
+```
+
+The initial request will establish a socket connection to the server and leave the socket open. Subsequent requests
+will reuse that socket. You may call `Connection#reset` at any time to close the underlying socket, and the next request
+will establish a new socket connection.
+
+You may also control persistence on a per-request basis by setting the `:persistent` option for each request.
+
+```ruby
+connection = Excon.new('http://geemus.com') # non-persistent by default
+connection.get # socket established, then closed
+connection.get(:persistent => true) # socket established, left open
+connection.get(:persistent => true) # socket reused
+connection.get # socket reused, then closed
+
+connection = Excon.new('http://geemus.com', :persistent => true)
+connection.get # socket established, left open
+connection.get(:persistent => false) # socket reused, then closed
+connection.get(:persistent => false) # socket established, then closed
+connection.get # socket established, left open
+connection.get # socket reused
+```
+
+Note that sending a request with `:persistent => false` to close the socket will also send `Connection: close` to inform
+the server the connection is no longer needed. `Connection#reset` will simply close our end of the socket.
+
+
+## Options
+
+Both one-off and persistent connections support many other options. The final options for a request are built up by starting with `Excon.defaults`, then merging in options from the connection and finally merging in any request options. In this way you have plenty of options on where and how to set options and can easily setup connections or defaults to match common options for a particular endpoint.
+
+Here are a few common examples:
+
+```ruby
+# Output debug info, similar to ENV['EXCON_DEBUG']
+connection = Excon.new('http://geemus.com/', :debug_request => true, :debug_response => true)
+
+# Custom headers
+Excon.get('http://geemus.com', :headers => {'Authorization' => 'Basic 0123456789ABCDEF'})
+connection.get(:headers => {'Authorization' => 'Basic 0123456789ABCDEF'})
+
+# Changing query strings
+connection = Excon.new('http://geemus.com/')
+connection.get(:query => {:foo => 'bar'})
+
+# POST body encoded with application/x-www-form-urlencoded
+Excon.post('http://geemus.com',
+ :body => 'language=ruby&class=fog',
+ :headers => { "Content-Type" => "application/x-www-form-urlencoded" })
+
+# same again, but using URI to build the body of parameters
+Excon.post('http://geemus.com',
+ :body => URI.encode_www_form(:language => 'ruby', :class => 'fog'),
+ :headers => { "Content-Type" => "application/x-www-form-urlencoded" })
+
+# request takes a method option, accepting either a symbol or string
+connection.request(:method => :get)
+connection.request(:method => 'GET')
+
+# expect one or more status codes, or raise an error
+connection.request(:expects => [200, 201], :method => :get)
+
+# this request can be repeated safely, so retry on errors up to 3 times
+connection.request(:idempotent => true)
+
+# this request can be repeated safely, retry up to 6 times
+connection.request(:idempotent => true, :retry_limit => 6)
+
+# set longer read_timeout (default is 60 seconds)
+connection.request(:read_timeout => 360)
+
+# set longer write_timeout (default is 60 seconds)
+connection.request(:write_timeout => 360)
+
+# Enable the socket option TCP_NODELAY on the underlying socket.
+#
+# This can improve response time when sending frequent short
+# requests in time-sensitive scenarios.
+#
+connection = Excon.new('http://geemus.com/', :tcp_nodelay => true)
+
+# set longer connect_timeout (default is 60 seconds)
+connection = Excon.new('http://geemus.com/', :connect_timeout => 360)
+
+# opt-out of nonblocking operations for performance and/or as a workaround
+connection = Excon.new('http://geemus.com/', :nonblock => false)
+
+# use basic authentication by supplying credentials in the URL or as parameters
+connection = Excon.new('http://username:password@secure.geemus.com')
+connection = Excon.new('http://secure.geemus.com',
+ :user => 'username', :password => 'password')
+
+# use custom uri parser
+require 'addressable/uri'
+connection = Excon.new('http://geemus.com/', uri_parser: Addressable::URI)
+```
+
+Compared to web browsers and other http client libraries, e.g. curl, Excon is a bit more low-level and doesn't assume much by default. If you are seeing different results compared to other clients, the following options might help:
+
+```ruby
+# opt-in to omitting port from http:80 and https:443
+connection = Excon.new('http://geemus.com/', :omit_default_port => true)
+
+# accept gzip encoding
+connection = Excon.new('http://geemus.com/', :headers => { "Accept" => "gzip" })
+
+# turn off peer verification (less secure)
+Excon.defaults[:ssl_verify_peer] = false
+connection = Excon.new('https://...')
+```
+
+## Chunked Requests
+
+You can make `Transfer-Encoding: chunked` requests by passing a block that will deliver chunks, delivering an empty chunk to signal completion.
+
+```ruby
+file = File.open('data')
+
+chunker = lambda do
+ # Excon.defaults[:chunk_size] defaults to 1048576, ie 1MB
+ # to_s will convert the nil received after everything is read to the final empty chunk
+ file.read(Excon.defaults[:chunk_size]).to_s
+end
+
+Excon.post('http://geemus.com', :request_block => chunker)
+
+file.close
+```
+
+Iterating in this way allows you to have more granular control over writes and to write things where you can not calculate the overall length up front.
+
+## Pipelining Requests
+
+You can make use of HTTP pipelining to improve performance. Instead of the normal request/response cycle, pipelining sends a series of requests and then receives a series of responses. You can take advantage of this using the `requests` method, which takes an array of params where each is a hash like request would receive and returns an array of responses.
+
+```ruby
+connection = Excon.new('http://geemus.com/')
+connection.requests([{:method => :get}, {:method => :get}])
+```
+
+By default, each call to `requests` will use a separate persistent socket connection. To make multiple `requests` calls
+using a single persistent connection, set `:persistent => true` when establishing the connection.
+
+## Streaming Responses
+
+You can stream responses by passing a block that will receive each chunk.
+
+```ruby
+streamer = lambda do |chunk, remaining_bytes, total_bytes|
+ puts chunk
+ puts "Remaining: #{remaining_bytes.to_f / total_bytes}%"
+end
+
+Excon.get('http://geemus.com', :response_block => streamer)
+```
+
+Iterating over each chunk will allow you to do work on the response incrementally without buffering the entire response first. For very large responses this can lead to significant memory savings.
+
+## Proxy Support
+
+You can specify a proxy URL that Excon will use with both HTTP and HTTPS connections:
+
+```ruby
+connection = Excon.new('http://geemus.com', :proxy => 'http://my.proxy:3128')
+connection.request(:method => 'GET')
+
+Excon.get('http://geemus.com', :proxy => 'http://my.proxy:3128')
+```
+
+The proxy URL must be fully specified, including scheme (e.g. "http://") and port.
+
+Proxy support must be set when establishing a connection object and cannot be overridden in individual requests.
+
+NOTE: Excon will use the environment variables `http_proxy` and `https_proxy` if they are present. If these variables are set they will take precedence over a :proxy option specified in code. If "https_proxy" is not set, the value of "http_proxy" will be used for both HTTP and HTTPS connections.
+
+## Reusable ports
+
+For advanced cases where you'd like to reuse the local port assigned to the excon socket in another socket, use the `:reuseaddr` option.
+
+```ruby
+connection = Excon.new('http://geemus.com', :reuseaddr => true)
+connection.get
+
+s = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
+s.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
+if defined?(Socket::SO_REUSEPORT)
+ s.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true)
+end
+
+s.bind(Socket.pack_sockaddr_in(connection.local_port, connection.local_address))
+s.connect(Socket.pack_sockaddr_in(80, '1.2.3.4'))
+puts s.read
+s.close
+```
+
+## Unix Socket Support
+
+The Unix socket will work for one-off requests and multiuse connections. A Unix socket path must be provided separate from the resource path.
+
+```ruby
+connection = Excon.new('unix:///', :socket => '/tmp/unicorn.sock')
+connection.request(:method => :get, :path => '/ping')
+
+Excon.get('unix:///ping', :socket => '/tmp/unicorn.sock')
+```
+
+NOTE: Proxies will be ignored when using a Unix socket, since a Unix socket has to be local.
+
+## Stubs
+
+You can stub out requests for testing purposes by enabling mock mode on a connection.
+
+```ruby
+connection = Excon.new('http://example.com', :mock => true)
+```
+
+Or by enabling mock mode for a request.
+
+```ruby
+connection.request(:method => :get, :path => 'example', :mock => true)
+```
+
+Add stubs by providing the request attributes to match and response attributes to return. Response params can be specified as either a hash or block which will yield with the request params.
+
+```ruby
+Excon.stub({}, {:body => 'body', :status => 200})
+Excon.stub({}, lambda {|request_params| {:body => request_params[:body], :status => 200}})
+```
+
+Omitted attributes are assumed to match, so this stub will match *any* request and return an Excon::Response with a body of 'body' and status of 200. You can add whatever stubs you might like this way and they will be checked against in the order they were added, if none of them match then excon will raise an `Excon::Errors::StubNotFound` error to let you know.
+
+If you want to allow unstubbed requests without raising `StubNotFound`, set the `allow_unstubbed_requests` option either globally or per request.
+
+```ruby
+connection = Excon.new('http://example.com', :mock => true, :allow_unstubbed_requests => true)
+```
+
+To remove a previously defined stub, or all stubs:
+
+```ruby
+Excon.unstub({}) # remove first/oldest stub matching {}
+Excon.stubs.clear # remove all stubs
+```
+
+For example, if using RSpec for your test suite you can clear stubs after running each example:
+
+```ruby
+config.after(:each) do
+ Excon.stubs.clear
+end
+```
+
+You can also modify `Excon.defaults` to set a stub for all requests, so for a test suite you might do this:
+
+```ruby
+# Mock by default and stub any request as success
+config.before(:all) do
+ Excon.defaults[:mock] = true
+ Excon.stub({}, {:body => 'Fallback', :status => 200})
+ # Add your own stubs here or in specific tests...
+end
+```
+
+By default stubs are shared globally, to make stubs unique to each thread, use `Excon.defaults[:stubs] = :local`.
+
+## Instrumentation
+
+Excon calls can be timed using the [ActiveSupport::Notifications](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html) API.
+
+```ruby
+connection = Excon.new(
+ 'http://geemus.com',
+ :instrumentor => ActiveSupport::Notifications
+)
+```
+
+Excon will then instrument each request, retry, and error. The corresponding events are named `excon.request`, `excon.retry`, and `excon.error` respectively.
+
+```ruby
+ActiveSupport::Notifications.subscribe(/excon/) do |*args|
+ puts "Excon did stuff!"
+end
+```
+
+If you prefer to label each event with a namespace other than "excon", you may specify
+an alternate name in the constructor:
+
+```ruby
+connection = Excon.new(
+ 'http://geemus.com',
+ :instrumentor => ActiveSupport::Notifications,
+ :instrumentor_name => 'my_app'
+)
+```
+
+Note: Excon's ActiveSupport::Notifications implementation has the following event format: `<namespace>.<event>` which is the opposite of the Rails' implementation.
+
+ActiveSupport provides a [subscriber](http://api.rubyonrails.org/classes/ActiveSupport/Subscriber.html) interface which lets you attach a subscriber to a namespace. Due to the incompability above, you won't be able to attach a subscriber to the "excon" namespace out of the box.
+
+If you want this functionality, you can use a simple adapter such as this one:
+
+```ruby
+class ExconToRailsInstrumentor
+ def self.instrument(name, datum, &block)
+ namespace, *event = name.split(".")
+ rails_name = [event, namespace].flatten.join(".")
+ ActiveSupport::Notifications.instrument(rails_name, datum, &block)
+ end
+end
+```
+
+If you don't want to add ActiveSupport to your application, simply define a class which implements the same `#instrument` method like so:
+
+```ruby
+class SimpleInstrumentor
+ class << self
+ attr_accessor :events
+
+ def instrument(name, params = {}, &block)
+ puts "#{name} just happened."
+ yield if block_given?
+ end
+ end
+end
+```
+
+The #instrument method will be called for each HTTP request, response, retry, and error.
+
+For debugging purposes you can also use `Excon::StandardInstrumentor` to output all events to stderr. This can also be specified by setting the `EXCON_DEBUG` ENV var.
+
+See [the documentation for ActiveSupport::Notifications](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html) for more detail on using the subscription interface. See excon's [instrumentation_test.rb](https://github.com/excon/excon/blob/master/tests/middlewares/instrumentation_tests.rb) for more examples of instrumenting excon.
+
+## HTTPS client certificate
+
+You can supply a client side certificate if the server requires it for authentication:
+
+```ruby
+connection = Excon.new('https://example.com',
+ client_cert: 'mycert.pem',
+ client_key: 'mycert.key',
+ client_key_pass: 'my pass phrase')
+```
+
+`client_key_pass` is optional.
+
+If you already have loaded the certificate and key into memory, then pass it through like:
+
+```ruby
+client_cert_data = File.load 'mycert.pem'
+client_key_data = File.load 'mycert.key'
+
+connection = Excon.new('https://example.com',
+ client_cert_data: client_cert_data,
+ client_key_data: client_key_data)
+```
+
+This can be useful if your program has already loaded the assets through
+another mechanism (E.g. a remote API call to a secure K:V system like Vault).
+
+## HTTPS/SSL Issues
+
+By default excon will try to verify peer certificates when using HTTPS. Unfortunately on some operating systems the defaults will not work. This will likely manifest itself as something like `Excon::Errors::CertificateError: SSL_connect returned=1 ...`
+
+If you have the misfortune of running into this problem you have a couple options. If you have certificates but they aren't being auto-discovered, you can specify the path to your certificates:
+
+```ruby
+Excon.defaults[:ssl_ca_path] = '/path/to/certs'
+```
+
+Failing that, you can turn off peer verification (less secure):
+
+```ruby
+Excon.defaults[:ssl_verify_peer] = false
+```
+
+Either of these should allow you to work around the socket error and continue with your work.
+
+## Getting Help
+
+* Ask specific questions on [Stack Overflow](http://stackoverflow.com/questions/tagged/excon).
+* Report bugs and discuss potential features in [Github issues](https://github.com/excon/excon/issues).
+
+## Contributing
+
+Please refer to [CONTRIBUTING.md](https://github.com/excon/excon/blob/master/CONTRIBUTING.md).
+
+# Plugins and Middlewares
+
+Using Excon's [Middleware system][middleware], you can easily extend Excon's
+functionality with your own. The following plugins extend Excon in their own
+way:
+
+* [excon-addressable](https://github.com/JeanMertz/excon-addressable)
+
+ Set [addressable](https://github.com/sporkmonger/addressable) as the default
+ URI parser, and add support for [URI templating][templating].
+
+* [excon-hypermedia](https://github.com/JeanMertz/excon-hypermedia)
+
+ Teaches Excon to talk with [HyperMedia APIs][hypermedia]. Allowing you to use
+ all of Excon's functionality, while traversing APIs in an easy and
+ self-discovering way.
+
+## License
+
+Please refer to [LICENSE.md](https://github.com/excon/excon/blob/master/LICENSE.md).
+
+[middleware]: lib/excon/middlewares/base.rb
+[hypermedia]: https://en.wikipedia.org/wiki/HATEOAS
+[templating]: https://www.rfc-editor.org/rfc/rfc6570.txt
diff --git a/lib/vendor/excon/Rakefile b/lib/vendor/excon/Rakefile
new file mode 100644
index 0000000..08a520e
--- /dev/null
+++ b/lib/vendor/excon/Rakefile
@@ -0,0 +1,161 @@
+require 'rubygems'
+require 'rake'
+require 'date'
+include Rake::DSL
+#############################################################################
+#
+# Helper functions
+#
+#############################################################################
+
+def name
+ @name ||= Dir['*.gemspec'].first.split('.').first
+end
+
+def version
+ line = File.read("lib/#{name}/constants.rb")[/^\s*VERSION\s*=\s*.*/]
+ line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
+end
+
+def date
+ Date.today.to_s
+end
+
+def rubyforge_project
+ name
+end
+
+def gemspec_file
+ "#{name}.gemspec"
+end
+
+def gem_file
+ "#{name}-#{version}.gem"
+end
+
+def replace_header(head, header_name)
+ head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
+end
+
+#############################################################################
+#
+# Standard tasks
+#
+#############################################################################
+
+require 'shindo/rake'
+require "rspec/core/rake_task"
+
+RSpec::Core::RakeTask.new(:spec, :format) do |t, args|
+ format = args[:format] || 'doc'
+ t.rspec_opts = ["-c", "-f #{format}", "-r ./spec/spec_helper.rb"]
+ t.pattern = 'spec/**/*_spec.rb'
+end
+
+
+Shindo::Rake.new
+
+task :default => [ :tests, :test]
+task :test => :spec
+
+require 'rdoc/task'
+Rake::RDocTask.new do |rdoc|
+ rdoc.rdoc_dir = 'rdoc'
+ rdoc.title = "#{name} #{version}"
+ rdoc.rdoc_files.include('README*')
+ rdoc.rdoc_files.include('lib/**/*.rb')
+end
+
+desc "Open an irb session preloaded with this library"
+task :console do
+ sh "irb -rubygems -r ./lib/#{name}.rb"
+end
+
+#############################################################################
+#
+# Custom tasks (add your own tasks here)
+#
+#############################################################################
+
+
+
+#############################################################################
+#
+# Packaging tasks
+#
+#############################################################################
+
+task :release => [:update_certs, :build] do
+ unless `git branch` =~ /^\* master$/
+ puts "You must be on the master branch to release!"
+ exit!
+ end
+ sh "gem install pkg/#{name}-#{version}.gem"
+ sh "git commit --allow-empty -a -m 'Release #{version}'"
+ sh "git tag v#{version}"
+ sh "git push origin master"
+ sh "git push origin v#{version}"
+ sh "gem push pkg/#{name}-#{version}.gem"
+end
+
+task :build => :gemspec do
+ sh "mkdir -p pkg"
+ sh "gem build #{gemspec_file}"
+ sh "mv #{gem_file} pkg"
+end
+
+task :gemspec => :validate do
+ # read spec file and split out manifest section
+ spec = File.read(gemspec_file)
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
+
+ # replace name version and date
+ replace_header(head, :name)
+ replace_header(head, :version)
+ replace_header(head, :date)
+ #comment this out if your rubyforge_project has a different name
+ replace_header(head, :rubyforge_project)
+
+ # determine file list from git ls-files
+ files = `git ls-files`.
+ split("\n").
+ sort.
+ reject { |file| file =~ /^\./ }.
+ reject { |file| file =~ /^(rdoc|pkg)/ }.
+ map { |file| " #{file}" }.
+ join("\n")
+
+ # piece file back together and write
+ manifest = " s.files = %w[\n#{files}\n ]\n"
+ spec = [head, manifest, tail].join(" # = MANIFEST =\n")
+ File.open(gemspec_file, 'w') { |io| io.write(spec) }
+ puts "Updated #{gemspec_file}"
+end
+
+task :validate do
+ libfiles = Dir['lib/*'] - ["lib/#{name}.rb", "lib/#{name}"]
+ unless libfiles.empty?
+ puts "Directory `lib` should only contain a `#{name}.rb` file and `#{name}` dir."
+ exit!
+ end
+ unless Dir['VERSION*'].empty?
+ puts "A `VERSION` file at root level violates Gem best practices."
+ exit!
+ end
+end
+
+desc "update bundled certs"
+task :update_certs do
+ require File.join(File.dirname(__FILE__), 'lib', 'excon')
+ File.open(File.join(File.dirname(__FILE__), 'data', 'cacert.pem'), 'w') do |file|
+ data = Excon.get("https://curl.haxx.se/ca/cacert.pem").body
+ file.write(data)
+ end
+end
+
+desc "check ssl settings"
+task :hows_my_ssl do
+ require File.join(File.dirname(__FILE__), 'lib', 'excon')
+ data = Excon.get("https://www.howsmyssl.com/a/check").body
+ puts data
+end
diff --git a/lib/vendor/excon/benchmarks/class_vs_lambda.rb b/lib/vendor/excon/benchmarks/class_vs_lambda.rb
new file mode 100644
index 0000000..6f902ee
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/class_vs_lambda.rb
@@ -0,0 +1,50 @@
+require 'rubygems'
+require 'tach'
+
+class Concatenator
+ def initialize(string)
+ @string = string
+ end
+
+ def call(data)
+ @string << data
+ end
+end
+
+string = "0123456789ABCDEF"
+
+Tach.meter(100_000) do
+ tach('class') do
+ s = ""
+ obj = Concatenator.new(s)
+ 10.times { obj.call(string) }
+ end
+
+ tach('lambda') do
+ s = ""
+ obj = lambda {|data| s << data }
+ 10.times { obj.call(string) }
+ end
+end
+
+# ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-linux]
+#
+# +--------+----------+
+# | tach | total |
+# +--------+----------+
+# | class | 1.450284 |
+# +--------+----------+
+# | lambda | 2.506496 |
+# +--------+----------+
+
+# ruby 1.8.7 (2010-12-23 patchlevel 330) [x86_64-linux]
+#
+# +--------+----------+
+# | tach | total |
+# +--------+----------+
+# | class | 1.373917 |
+# +--------+----------+
+# | lambda | 2.589384 |
+# +--------+----------+
+
+
diff --git a/lib/vendor/excon/benchmarks/concat_vs_insert.rb b/lib/vendor/excon/benchmarks/concat_vs_insert.rb
new file mode 100644
index 0000000..237a973
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/concat_vs_insert.rb
@@ -0,0 +1,21 @@
+require 'rubygems'
+require 'tach'
+
+Tach.meter(1_000_000) do
+ tach('concat') do
+ path = 'path'
+ path = '/' << path
+ end
+ tach('insert') do
+ path = 'path'
+ path.insert(0, '/')
+ end
+end
+
+# +--------+----------+
+# | tach | total |
+# +--------+----------+
+# | insert | 0.974036 |
+# +--------+----------+
+# | concat | 0.998904 |
+# +--------+----------+ \ No newline at end of file
diff --git a/lib/vendor/excon/benchmarks/concat_vs_interpolate.rb b/lib/vendor/excon/benchmarks/concat_vs_interpolate.rb
new file mode 100644
index 0000000..8a24388
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/concat_vs_interpolate.rb
@@ -0,0 +1,22 @@
+require 'rubygems'
+require 'tach'
+
+key = 'Content-Length'
+value = '100'
+Tach.meter(1_000) do
+ tach('concat') do
+ temp = ''
+ temp << key << ': ' << value << "\r\n"
+ end
+ tach('interpolate') do
+ "#{key}: #{value}\r\n"
+ end
+end
+
+# +-------------+----------+
+# | tach | total |
+# +-------------+----------+
+# | interpolate | 0.000404 |
+# +-------------+----------+
+# | concat | 0.000564 |
+# +-------------+----------+
diff --git a/lib/vendor/excon/benchmarks/cr_lf.rb b/lib/vendor/excon/benchmarks/cr_lf.rb
new file mode 100644
index 0000000..77adc33
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/cr_lf.rb
@@ -0,0 +1,21 @@
+require 'rubygems'
+require 'tach'
+
+CR_LF = "\r\n"
+
+Tach.meter(1_000_000) do
+ tach('constant') do
+ '' << CR_LF
+ end
+ tach('string') do
+ '' << "\r\n"
+ end
+end
+
+# +----------+----------+
+# | tach | total |
+# +----------+----------+
+# | constant | 0.819885 |
+# +----------+----------+
+# | string | 0.893602 |
+# +----------+----------+ \ No newline at end of file
diff --git a/lib/vendor/excon/benchmarks/downcase-eq-eq_vs_casecmp.rb b/lib/vendor/excon/benchmarks/downcase-eq-eq_vs_casecmp.rb
new file mode 100644
index 0000000..b36e993
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/downcase-eq-eq_vs_casecmp.rb
@@ -0,0 +1,169 @@
+# Copied from my benchmark_hell repo: github.com/sgonyea/benchmark_hell
+
+require 'benchmark'
+
+iters = 1000000
+
+comp = "hello"
+hello = "HelLo"
+
+puts 'String#downcase == vs. String#casecmp'
+Benchmark.bmbm do |x|
+ x.report('String#downcase1') do
+ iters.times.each do
+ hello.downcase == comp
+ end
+ end
+
+ x.report('String#downcase2') do
+ iters.times.each do
+ "HelLo".downcase == "hello"
+ end
+ end
+
+ x.report('String#downcase3') do
+ iters.times.each do
+ var = "HelLo"
+ var.downcase!
+ var == "hello"
+ end
+ end
+
+ x.report('casecmp1') do
+ iters.times.each do
+ hello.casecmp(comp).zero?
+ end
+ end
+
+ x.report('casecmp1-1') do
+ iters.times.each do
+ hello.casecmp(comp) == 0
+ end
+ end
+
+ x.report('casecmp2') do
+ iters.times.each do
+ "HelLo".casecmp(comp).zero?
+ end
+ end
+
+ x.report('casecmp2-1') do
+ iters.times.each do
+ "HelLo".casecmp(comp) == 0
+ end
+ end
+end
+
+=begin
+rvm exec bash -c 'echo && echo $RUBY_VERSION && echo && ruby downcase-eq-eq_vs_casecmp.rb'
+
+jruby-1.5.6
+
+String#downcase == vs. String#casecmp
+Rehearsal ----------------------------------------------------
+String#downcase1 0.461000 0.000000 0.461000 ( 0.387000)
+String#downcase2 0.269000 0.000000 0.269000 ( 0.269000)
+String#downcase3 0.224000 0.000000 0.224000 ( 0.224000)
+casecmp1 0.157000 0.000000 0.157000 ( 0.157000)
+casecmp1-1 0.153000 0.000000 0.153000 ( 0.153000)
+casecmp2 0.163000 0.000000 0.163000 ( 0.163000)
+casecmp2-1 0.163000 0.000000 0.163000 ( 0.163000)
+------------------------------------------- total: 1.590000sec
+
+ user system total real
+String#downcase1 0.190000 0.000000 0.190000 ( 0.191000)
+String#downcase2 0.225000 0.000000 0.225000 ( 0.225000)
+String#downcase3 0.190000 0.000000 0.190000 ( 0.190000)
+casecmp1 0.125000 0.000000 0.125000 ( 0.125000)
+casecmp1-1 0.127000 0.000000 0.127000 ( 0.127000)
+casecmp2 0.144000 0.000000 0.144000 ( 0.144000)
+casecmp2-1 0.147000 0.000000 0.147000 ( 0.147000)
+
+macruby-0.7.1
+
+String#downcase == vs. String#casecmp
+Rehearsal ----------------------------------------------------
+String#downcase1 2.340000 0.040000 2.380000 ( 1.765141)
+String#downcase2 5.510000 0.100000 5.610000 ( 3.893249)
+String#downcase3 4.200000 0.080000 4.280000 ( 3.031621)
+casecmp1 0.270000 0.000000 0.270000 ( 0.267613)
+casecmp1-1 0.190000 0.000000 0.190000 ( 0.188848)
+casecmp2 1.450000 0.020000 1.470000 ( 1.027956)
+casecmp2-1 1.380000 0.030000 1.410000 ( 0.951474)
+------------------------------------------ total: 15.610000sec
+
+ user system total real
+String#downcase1 2.350000 0.040000 2.390000 ( 1.774292)
+String#downcase2 5.890000 0.120000 6.010000 ( 4.214038)
+String#downcase3 4.530000 0.090000 4.620000 ( 3.286059)
+casecmp1 0.270000 0.000000 0.270000 ( 0.271119)
+casecmp1-1 0.190000 0.000000 0.190000 ( 0.189462)
+casecmp2 1.540000 0.030000 1.570000 ( 1.104751)
+casecmp2-1 1.440000 0.030000 1.470000 ( 0.999689)
+
+rbx-head
+
+String#downcase == vs. String#casecmp
+Rehearsal ----------------------------------------------------
+String#downcase1 0.702746 0.005229 0.707975 ( 0.621969)
+String#downcase2 0.701429 0.001617 0.703046 ( 0.691833)
+String#downcase3 1.042835 0.002952 1.045787 ( 0.953992)
+casecmp1 0.654571 0.002239 0.656810 ( 0.480158)
+casecmp1-1 0.484706 0.001105 0.485811 ( 0.398601)
+casecmp2 0.564140 0.001579 0.565719 ( 0.545332)
+casecmp2-1 0.554889 0.001153 0.556042 ( 0.539569)
+------------------------------------------- total: 4.721190sec
+
+ user system total real
+String#downcase1 0.491199 0.001081 0.492280 ( 0.493727)
+String#downcase2 0.631059 0.001018 0.632077 ( 0.629885)
+String#downcase3 0.968867 0.002504 0.971371 ( 0.976734)
+casecmp1 0.364496 0.000434 0.364930 ( 0.365262)
+casecmp1-1 0.373140 0.000562 0.373702 ( 0.374136)
+casecmp2 0.487644 0.001057 0.488701 ( 0.490302)
+casecmp2-1 0.469868 0.001178 0.471046 ( 0.472220)
+
+ruby-1.8.7-p330
+
+String#downcase == vs. String#casecmp
+Rehearsal ----------------------------------------------------
+String#downcase1 0.780000 0.000000 0.780000 ( 0.783979)
+String#downcase2 0.950000 0.000000 0.950000 ( 0.954109)
+String#downcase3 0.960000 0.000000 0.960000 ( 0.960554)
+casecmp1 0.440000 0.000000 0.440000 ( 0.442546)
+casecmp1-1 0.490000 0.000000 0.490000 ( 0.487795)
+casecmp2 0.530000 0.000000 0.530000 ( 0.535819)
+casecmp2-1 0.570000 0.000000 0.570000 ( 0.574653)
+------------------------------------------- total: 4.720000sec
+
+ user system total real
+String#downcase1 0.780000 0.000000 0.780000 ( 0.780692)
+String#downcase2 0.980000 0.010000 0.990000 ( 0.982925)
+String#downcase3 0.960000 0.000000 0.960000 ( 0.961501)
+casecmp1 0.440000 0.000000 0.440000 ( 0.444528)
+casecmp1-1 0.490000 0.000000 0.490000 ( 0.487437)
+casecmp2 0.540000 0.000000 0.540000 ( 0.537686)
+casecmp2-1 0.570000 0.000000 0.570000 ( 0.574253)
+
+ruby-1.9.2-p136
+
+String#downcase == vs. String#casecmp
+Rehearsal ----------------------------------------------------
+String#downcase1 0.750000 0.000000 0.750000 ( 0.750523)
+String#downcase2 1.190000 0.000000 1.190000 ( 1.193346)
+String#downcase3 1.030000 0.010000 1.040000 ( 1.036435)
+casecmp1 0.640000 0.000000 0.640000 ( 0.640327)
+casecmp1-1 0.480000 0.000000 0.480000 ( 0.484709) # With all this crap running, some flukes pop out
+casecmp2 0.820000 0.000000 0.820000 ( 0.822223)
+casecmp2-1 0.660000 0.000000 0.660000 ( 0.664190)
+------------------------------------------- total: 5.580000sec
+
+ user system total real
+String#downcase1 0.760000 0.000000 0.760000 ( 0.759816)
+String#downcase2 1.150000 0.010000 1.160000 ( 1.150792)
+String#downcase3 1.000000 0.000000 1.000000 ( 1.005549)
+casecmp1 0.650000 0.000000 0.650000 ( 0.644021)
+casecmp1-1 0.490000 0.000000 0.490000 ( 0.494456)
+casecmp2 0.820000 0.000000 0.820000 ( 0.817689)
+casecmp2-1 0.680000 0.000000 0.680000 ( 0.685121)
+=end
diff --git a/lib/vendor/excon/benchmarks/excon.rb b/lib/vendor/excon/benchmarks/excon.rb
new file mode 100644
index 0000000..5196730
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/excon.rb
@@ -0,0 +1,69 @@
+require 'rubygems' if RUBY_VERSION < '1.9'
+require 'bundler'
+
+Bundler.require(:default)
+Bundler.require(:benchmark)
+
+require 'sinatra/base'
+
+require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'excon')
+
+module Excon
+ class Server < Sinatra::Base
+
+ def self.run
+ Rack::Handler::WEBrick.run(
+ Excon::Server.new,
+ :Port => 9292,
+ :AccessLog => [],
+ :Logger => WEBrick::Log.new(nil, WEBrick::Log::ERROR)
+ )
+ end
+
+ get '/data/:amount' do |amount|
+ 'x' * amount.to_i
+ end
+
+ end
+end
+
+def with_server(&block)
+ pid = Process.fork do
+ Excon::Server.run
+ end
+ loop do
+ sleep(1)
+ begin
+ Excon.get('http://localhost:9292/api/foo')
+ break
+ rescue
+ end
+ end
+ yield
+ensure
+ Process.kill(9, pid)
+end
+
+require 'tach'
+
+size = 10_000
+path = '/data/' << size.to_s
+url = 'http://localhost:9292' << path
+
+times = 1_000
+
+with_server do
+
+ Tach.meter(times) do
+
+ tach('Excon') do
+ Excon.get(url).body
+ end
+
+ excon = Excon.new(url)
+ tach('Excon (persistent)') do
+ excon.request(:method => 'get').body
+ end
+
+ end
+end
diff --git a/lib/vendor/excon/benchmarks/excon_vs.rb b/lib/vendor/excon/benchmarks/excon_vs.rb
new file mode 100644
index 0000000..7d16969
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/excon_vs.rb
@@ -0,0 +1,165 @@
+require 'rubygems' if RUBY_VERSION < '1.9'
+require 'bundler'
+
+Bundler.require(:default)
+Bundler.require(:benchmark)
+
+require 'sinatra/base'
+
+require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'excon')
+
+module Excon
+ class Server < Sinatra::Base
+
+ def self.run
+ Rack::Handler::WEBrick.run(
+ Excon::Server.new,
+ :Port => 9292,
+ :AccessLog => [],
+ :Logger => WEBrick::Log.new(nil, WEBrick::Log::ERROR)
+ )
+ end
+
+ get '/data/:amount' do |amount|
+ 'x' * amount.to_i
+ end
+
+ end
+end
+
+def with_server(&block)
+ pid = Process.fork do
+ Excon::Server.run
+ end
+ loop do
+ sleep(1)
+ begin
+ Excon.get('http://localhost:9292/api/foo')
+ break
+ rescue
+ end
+ end
+ yield
+ensure
+ Process.kill(9, pid)
+end
+
+require 'em-http-request'
+require 'httparty'
+require 'net/http'
+require 'open-uri'
+require 'rest_client'
+require 'tach'
+require 'typhoeus'
+
+size = 10_000
+path = '/data/' << size.to_s
+url = 'http://localhost:9292' << path
+
+times = 1_000
+
+with_server do
+
+ Tach.meter(times) do
+
+ tach('curb (persistent)') do |n|
+ curb = Curl::Easy.new
+
+ n.times do
+ curb.url = url
+ curb.http_get
+ curb.body_str
+ end
+ end
+
+ tach('em-http-request') do |n|
+ EventMachine.run {
+ count = 0
+
+ n.times do
+ http = EventMachine::HttpRequest.new(url).get
+
+ http.callback {
+ http.response
+ count += 1
+ EM.stop if count == n
+ }
+
+ http.errback {
+ http.response
+ count += 1
+ EM.stop if count == n
+ }
+ end
+ }
+ end
+
+ tach('Excon') do
+ Excon.get(url).body
+ end
+
+ excon = Excon.new(url)
+ tach('Excon (persistent)') do
+ excon.request(:method => 'get').body
+ end
+
+ tach('HTTParty') do
+ HTTParty.get(url).body
+ end
+
+ tach('Net::HTTP') do
+ # Net::HTTP.get('localhost', path, 9292)
+ Net::HTTP.start('localhost', 9292) {|http| http.get(path).body }
+ end
+
+ Net::HTTP.start('localhost', 9292) do |http|
+ tach('Net::HTTP (persistent)') do
+ http.get(path).body
+ end
+ end
+
+ tach('open-uri') do
+ open(url).read
+ end
+
+ tach('RestClient') do
+ RestClient.get(url)
+ end
+
+ streamly = StreamlyFFI::Connection.new
+ tach('StreamlyFFI (persistent)') do
+ streamly.get(url)
+ end
+
+ tach('Typhoeus') do
+ Typhoeus::Request.get(url).body
+ end
+
+ end
+end
+
+# +--------------------------+----------+
+# | tach | total |
+# +--------------------------+----------+
+# | Excon (persistent) | 1.529095 |
+# +--------------------------+----------+
+# | curb (persistent) | 1.740387 |
+# +--------------------------+----------+
+# | Typhoeus | 1.876236 |
+# +--------------------------+----------+
+# | Excon | 2.001858 |
+# +--------------------------+----------+
+# | StreamlyFFI (persistent) | 2.200701 |
+# +--------------------------+----------+
+# | Net::HTTP | 2.395704 |
+# +--------------------------+----------+
+# | Net::HTTP (persistent) | 2.418099 |
+# +--------------------------+----------+
+# | HTTParty | 2.659317 |
+# +--------------------------+----------+
+# | RestClient | 2.958159 |
+# +--------------------------+----------+
+# | open-uri | 2.987051 |
+# +--------------------------+----------+
+# | em-http-request | 4.123798 |
+# +--------------------------+----------+
diff --git a/lib/vendor/excon/benchmarks/for_vs_array_each.rb b/lib/vendor/excon/benchmarks/for_vs_array_each.rb
new file mode 100644
index 0000000..b88f449
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/for_vs_array_each.rb
@@ -0,0 +1,27 @@
+require 'rubygems'
+require 'tach'
+
+data = ["some", "var", "goes", "in", :here, 0]
+Tach.meter(1_000_000) do
+ tach('for') do
+ for element in data
+ element == nil
+ end
+ end
+ tach('each') do
+ data.each do |element|
+ element == nil
+ end
+ end
+end
+
+# ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
+#
+# +------+----------+
+# | tach | total |
+# +------+----------+
+# | for | 2.958672 |
+# +------+----------+
+# | each | 2.983550 |
+# +------+----------+
+#
diff --git a/lib/vendor/excon/benchmarks/for_vs_hash_each.rb b/lib/vendor/excon/benchmarks/for_vs_hash_each.rb
new file mode 100644
index 0000000..c4db5ef
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/for_vs_hash_each.rb
@@ -0,0 +1,27 @@
+require 'rubygems'
+require 'tach'
+
+data = {"some" => "var", "goes" => "in", :here => 0}
+Tach.meter(1_000_000) do
+ tach('for') do
+ for key, values in data
+ key == values
+ end
+ end
+ tach('each') do
+ data.each do |key, values|
+ key == values
+ end
+ end
+end
+
+# ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
+#
+# +------+----------+
+# | tach | total |
+# +------+----------+
+# | each | 2.748909 |
+# +------+----------+
+# | for | 2.949512 |
+# +------+----------+
+#
diff --git a/lib/vendor/excon/benchmarks/has_key-vs-lookup.rb b/lib/vendor/excon/benchmarks/has_key-vs-lookup.rb
new file mode 100644
index 0000000..b617c0c
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/has_key-vs-lookup.rb
@@ -0,0 +1,177 @@
+# Copied from my benchmark_hell repo: github.com/sgonyea/benchmark_hell
+
+require 'benchmark'
+
+iters = 1000000
+hash = {
+ 'some_key' => 'some_val',
+ 'nil_key' => nil
+}
+
+puts 'Hash#has_key vs. Hash#[]'
+Benchmark.bmbm do |x|
+ x.report('Hash#has_key') do
+ iters.times.each do
+ hash.has_key? 'some_key'
+ end
+ end
+
+ x.report('Hash#has_key (if statement)') do
+ iters.times.each do
+ if hash.has_key?('other_key')
+ "hooray!"
+ end
+ end
+ end
+
+ x.report('Hash#has_key (non-existant)') do
+ iters.times.each do
+ hash.has_key? 'other_key'
+ end
+ end
+
+ x.report('Hash#[]') do
+ iters.times.each do
+ hash['some_key']
+ end
+ end
+
+ x.report('Hash#[] (if statement)') do
+ iters.times.each do
+ if hash['some_key']
+ "hooray!"
+ end
+ end
+ end
+
+ x.report('Hash#[] (non-existant)') do
+ iters.times.each do
+ hash['other_key']
+ end
+ end
+
+ x.report('Hash#has_key (if statement) explicit nil check') do
+ iters.times.each do
+ if hash.has_key?('nil_key') && !hash['nil_key'].nil?
+ "hooray!"
+ end
+ end
+ end
+
+
+ x.report('Hash#has_key (if statement) implicit nil check') do
+ iters.times.each do
+ if hash.has_key?('nil_key') && hash['nil_key']
+ "hooray!"
+ end
+ end
+ end
+
+ x.report('Hash#[] (if statement with nil)') do
+ iters.times.each do
+ if hash['nil_key']
+ "hooray!"
+ end
+ end
+ end
+end
+
+=begin
+
+$ rvm exec bash -c 'echo $RUBY_VERSION && ruby has_key-vs-hash\[key\].rb'
+
+jruby-1.5.6
+Hash#has_key vs. Hash#[]
+Rehearsal ---------------------------------------------------------------
+Hash#has_key 0.410000 0.000000 0.410000 ( 0.341000)
+Hash#has_key (if statement) 0.145000 0.000000 0.145000 ( 0.145000)
+Hash#has_key (non-existant) 0.116000 0.000000 0.116000 ( 0.116000)
+Hash#[] 0.189000 0.000000 0.189000 ( 0.189000)
+Hash#[] (if statement) 0.176000 0.000000 0.176000 ( 0.176000)
+Hash#[] (non-existant) 0.302000 0.000000 0.302000 ( 0.302000)
+------------------------------------------------------ total: 1.338000sec
+
+ user system total real
+Hash#has_key 0.128000 0.000000 0.128000 ( 0.128000)
+Hash#has_key (if statement) 0.128000 0.000000 0.128000 ( 0.128000)
+Hash#has_key (non-existant) 0.153000 0.000000 0.153000 ( 0.153000)
+Hash#[] 0.206000 0.000000 0.206000 ( 0.206000)
+Hash#[] (if statement) 0.182000 0.000000 0.182000 ( 0.182000)
+Hash#[] (non-existant) 0.252000 0.000000 0.252000 ( 0.252000)
+
+macruby-0.7.1
+Hash#has_key vs. Hash#[]
+Rehearsal ---------------------------------------------------------------
+Hash#has_key 2.530000 0.050000 2.580000 ( 1.917643)
+Hash#has_key (if statement) 2.590000 0.050000 2.640000 ( 1.935221)
+Hash#has_key (non-existant) 2.580000 0.050000 2.630000 ( 1.964230)
+Hash#[] 2.240000 0.040000 2.280000 ( 1.640999)
+Hash#[] (if statement) 3.620000 0.070000 3.690000 ( 2.530248)
+Hash#[] (non-existant) 2.060000 0.040000 2.100000 ( 1.473487)
+----------------------------------------------------- total: 15.920000sec
+
+ user system total real
+Hash#has_key 2.230000 0.030000 2.260000 ( 1.661843)
+Hash#has_key (if statement) 2.180000 0.040000 2.220000 ( 1.605644)
+Hash#has_key (non-existant) 2.160000 0.040000 2.200000 ( 1.582561)
+Hash#[] 2.160000 0.030000 2.190000 ( 1.581448)
+Hash#[] (if statement) 3.440000 0.070000 3.510000 ( 2.393421)
+Hash#[] (non-existant) 2.330000 0.040000 2.370000 ( 1.699338)
+
+rbx-head
+Hash#has_key vs. Hash#[]
+Rehearsal ---------------------------------------------------------------
+Hash#has_key 0.660584 0.004932 0.665516 ( 0.508601)
+Hash#has_key (if statement) 0.261708 0.000532 0.262240 ( 0.263021)
+Hash#has_key (non-existant) 0.265908 0.000827 0.266735 ( 0.259509)
+Hash#[] 0.396607 0.001189 0.397796 ( 0.372997)
+Hash#[] (if statement) 0.553003 0.001589 0.554592 ( 0.543859)
+Hash#[] (non-existant) 0.323748 0.000884 0.324632 ( 0.319055)
+------------------------------------------------------ total: 2.471511sec
+
+ user system total real
+Hash#has_key 0.332239 0.000819 0.333058 ( 0.333809)
+Hash#has_key (if statement) 0.284344 0.000521 0.284865 ( 0.285330)
+Hash#has_key (non-existant) 0.339695 0.001301 0.340996 ( 0.324259)
+Hash#[] 0.298555 0.000368 0.298923 ( 0.299557)
+Hash#[] (if statement) 0.392755 0.000773 0.393528 ( 0.395473)
+Hash#[] (non-existant) 0.277721 0.000464 0.278185 ( 0.278540)
+
+ruby-1.8.7-p330
+Hash#has_key vs. Hash#[]
+Rehearsal ---------------------------------------------------------------
+Hash#has_key 0.450000 0.000000 0.450000 ( 0.450143)
+Hash#has_key (if statement) 0.440000 0.000000 0.440000 ( 0.448278)
+Hash#has_key (non-existant) 0.420000 0.000000 0.420000 ( 0.416959)
+Hash#[] 0.450000 0.000000 0.450000 ( 0.450727)
+Hash#[] (if statement) 0.550000 0.000000 0.550000 ( 0.555043)
+Hash#[] (non-existant) 0.530000 0.000000 0.530000 ( 0.527189)
+------------------------------------------------------ total: 2.840000sec
+
+ user system total real
+Hash#has_key 0.440000 0.000000 0.440000 ( 0.447746)
+Hash#has_key (if statement) 0.450000 0.000000 0.450000 ( 0.450331)
+Hash#has_key (non-existant) 0.420000 0.000000 0.420000 ( 0.419157)
+Hash#[] 0.450000 0.000000 0.450000 ( 0.454438)
+Hash#[] (if statement) 0.570000 0.000000 0.570000 ( 0.563948)
+Hash#[] (non-existant) 0.520000 0.000000 0.520000 ( 0.527866)
+
+ruby-1.9.2-p136
+Hash#has_key vs. Hash#[]
+Rehearsal ---------------------------------------------------------------
+Hash#has_key 0.690000 0.000000 0.690000 ( 0.691657)
+Hash#has_key (if statement) 0.630000 0.000000 0.630000 ( 0.638418)
+Hash#has_key (non-existant) 0.640000 0.000000 0.640000 ( 0.637510)
+Hash#[] 0.580000 0.000000 0.580000 ( 0.584500)
+Hash#[] (if statement) 0.840000 0.010000 0.850000 ( 0.837541)
+Hash#[] (non-existant) 0.810000 0.000000 0.810000 ( 0.811598)
+------------------------------------------------------ total: 4.200000sec
+
+ user system total real
+Hash#has_key 0.690000 0.000000 0.690000 ( 0.694192)
+Hash#has_key (if statement) 0.640000 0.000000 0.640000 ( 0.641729)
+Hash#has_key (non-existant) 0.630000 0.000000 0.630000 ( 0.634470)
+Hash#[] 0.580000 0.000000 0.580000 ( 0.587844)
+Hash#[] (if statement) 0.830000 0.000000 0.830000 ( 0.832323)
+Hash#[] (non-existant) 0.790000 0.010000 0.800000 ( 0.791689)
+=end
diff --git a/lib/vendor/excon/benchmarks/headers_case_sensitivity.rb b/lib/vendor/excon/benchmarks/headers_case_sensitivity.rb
new file mode 100644
index 0000000..85aa513
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/headers_case_sensitivity.rb
@@ -0,0 +1,83 @@
+require 'rubygems'
+require 'stringio'
+require 'tach'
+
+def all_match_socket
+ io = StringIO.new
+ io << "Connection: close\n"
+ io << "Content-Length: 000\n"
+ io << "Content-Type: text/html\n"
+ io << "Date: Xxx, 00 Xxx 0000 00:00:00 GMT\n"
+ io << "Server: xxx\n"
+ io << "Transfer-Encoding: chunked\n"
+ io << "\n\n"
+ io.rewind
+ io
+end
+
+Formatador.display_line('all_match')
+Formatador.indent do
+ Tach.meter(10_000) do
+ tach('compare on read') do
+ socket, headers = all_match_socket, {}
+ until ((data = socket.readline).chop!).empty?
+ key, value = data.split(': ')
+ headers[key] = value
+ (key.casecmp('Transfer-Encoding') == 0) && (value.casecmp('chunked') == 0)
+ (key.casecmp('Connection') == 0) && (value.casecmp('close') == 0)
+ (key.casecmp('Content-Length') == 0)
+ end
+ end
+
+ tach('original') do
+ socket, headers = all_match_socket, {}
+ until ((data = socket.readline).chop!).empty?
+ key, value = data.split(': ')
+ headers[key] = value
+ end
+ headers.has_key?('Transfer-Encoding') && headers['Transfer-Encoding'].casecmp('chunked') == 0
+ headers.has_key?('Connection') && headers['Connection'].casecmp('close') == 0
+ headers.has_key?('Content-Length')
+ end
+ end
+end
+
+def none_match_socket
+ io = StringIO.new
+ io << "Cache-Control: max-age=0\n"
+ io << "Content-Type: text/html\n"
+ io << "Date: Xxx, 00 Xxx 0000 00:00:00 GMT\n"
+ io << "Expires: Xxx, 00 Xxx 0000 00:00:00 GMT\n"
+ io << "Last-Modified: Xxx, 00 Xxx 0000 00:00:00 GMT\n"
+ io << "Server: xxx\n"
+ io << "\n\n"
+ io.rewind
+ io
+end
+
+Formatador.display_line('none_match')
+Formatador.indent do
+ Tach.meter(10_000) do
+ tach('compare on read') do
+ socket, headers = none_match_socket, {}
+ until ((data = socket.readline).chop!).empty?
+ key, value = data.split(': ')
+ headers[key] = value
+ (key.casecmp('Transfer-Encoding') == 0) && (value.casecmp('chunked') == 0)
+ (key.casecmp('Connection') == 0) && (value.casecmp('close') == 0)
+ (key.casecmp('Content-Length') == 0)
+ end
+ end
+
+ tach('original') do
+ socket, headers = none_match_socket, {}
+ until ((data = socket.readline).chop!).empty?
+ key, value = data.split(': ')
+ headers[key] = value
+ end
+ headers.has_key?('Transfer-Encoding') && headers['Transfer-Encoding'].casecmp('chunked') == 0
+ headers.has_key?('Connection') && headers['Connection'].casecmp('close') == 0
+ headers.has_key?('Content-Length')
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/vendor/excon/benchmarks/headers_split_vs_match.rb b/lib/vendor/excon/benchmarks/headers_split_vs_match.rb
new file mode 100644
index 0000000..276c366
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/headers_split_vs_match.rb
@@ -0,0 +1,34 @@
+require 'rubygems'
+require 'tach'
+
+data = "Content-Length: 100"
+Tach.meter(1_000_000) do
+ tach('regex') do
+ data.match(/(.*):\s(.*)/)
+ header = [$1, $2]
+ end
+ tach('split') do
+ header = data.split(': ', 2)
+ end
+ tach('split regex') do
+ header = data.split(/:\s*/, 2)
+ end
+end
+
+# +-------------+----------+
+# | tach | total |
+# +-------------+----------+
+# | split regex | 5.940233 |
+# +-------------+----------+
+# | split | 7.327549 |
+# +-------------+----------+
+# | regex | 8.736390 |
+# +-------------+----------+
+
+# +-------+----------+----------+
+# | tach | average | total |
+# +-------+----------+----------+
+# | regex | 4.680451 | 4.680451 |
+# +-------+----------+----------+
+# | split | 4.393218 | 4.393218 |
+# +-------+----------+----------+
diff --git a/lib/vendor/excon/benchmarks/implicit_block-vs-explicit_block.rb b/lib/vendor/excon/benchmarks/implicit_block-vs-explicit_block.rb
new file mode 100644
index 0000000..7337b4e
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/implicit_block-vs-explicit_block.rb
@@ -0,0 +1,98 @@
+# Copied from my benchmark_hell repo: github.com/sgonyea/benchmark_hell
+
+require 'benchmark'
+
+iters = 1000000
+
+def do_explicit(&block)
+ var = "hello"
+ block.call(var)
+end
+
+def do_implicit
+ var = "hello"
+ yield(var)
+end
+
+puts 'explicit block vs implicit'
+Benchmark.bmbm do |x|
+ x.report('explicit') do
+ iters.times.each do
+ do_explicit {|var|
+ var << "goodbye"
+ }
+ end
+ end
+
+ x.report('implicit') do
+ iters.times.each do
+ do_implicit {|var|
+ var << "goodbye"
+ }
+ end
+ end
+end
+
+=begin
+rvm exec bash -c 'echo && echo $RUBY_VERSION && echo && ruby implicit_block-vs-explicit_block.rb'
+
+jruby-1.5.6
+
+explicit block vs implicit
+Rehearsal --------------------------------------------
+explicit 1.163000 0.000000 1.163000 ( 1.106000)
+implicit 0.499000 0.000000 0.499000 ( 0.499000)
+----------------------------------- total: 1.662000sec
+
+ user system total real
+explicit 0.730000 0.000000 0.730000 ( 0.730000)
+implicit 0.453000 0.000000 0.453000 ( 0.453000)
+
+macruby-0.7.1
+
+explicit block vs implicit
+Rehearsal --------------------------------------------
+explicit 5.070000 0.130000 5.200000 ( 3.546388)
+implicit 3.140000 0.050000 3.190000 ( 2.255986)
+----------------------------------- total: 8.390000sec
+
+ user system total real
+explicit 5.340000 0.140000 5.480000 ( 3.774963)
+implicit 3.170000 0.060000 3.230000 ( 2.279951)
+
+rbx-head
+
+explicit block vs implicit
+Rehearsal --------------------------------------------
+explicit 1.270136 0.006507 1.276643 ( 1.181588)
+implicit 0.839831 0.002203 0.842034 ( 0.820849)
+----------------------------------- total: 2.118677sec
+
+ user system total real
+explicit 0.960593 0.001526 0.962119 ( 0.966404)
+implicit 0.700361 0.001126 0.701487 ( 0.703591)
+
+ruby-1.8.7-p330
+
+explicit block vs implicit
+Rehearsal --------------------------------------------
+explicit 3.970000 0.000000 3.970000 ( 3.985157)
+implicit 1.560000 0.000000 1.560000 ( 1.567599)
+----------------------------------- total: 5.530000sec
+
+ user system total real
+explicit 3.990000 0.010000 4.000000 ( 4.002637)
+implicit 1.560000 0.000000 1.560000 ( 1.560901)
+
+ruby-1.9.2-p136
+
+explicit block vs implicit
+Rehearsal --------------------------------------------
+explicit 2.620000 0.010000 2.630000 ( 2.633762)
+implicit 1.080000 0.000000 1.080000 ( 1.076809)
+----------------------------------- total: 3.710000sec
+
+ user system total real
+explicit 2.630000 0.010000 2.640000 ( 2.637658)
+implicit 1.070000 0.000000 1.070000 ( 1.073589)
+=end
diff --git a/lib/vendor/excon/benchmarks/merging.rb b/lib/vendor/excon/benchmarks/merging.rb
new file mode 100644
index 0000000..7674e3f
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/merging.rb
@@ -0,0 +1,21 @@
+require 'rubygems'
+require 'tach'
+
+Tach.meter(10_000) do
+
+ tach('merge') do
+ default = { :a => 1, :b => 2 }
+ override = { :b => 3, :c => 4 }
+ override = default.merge(override)
+ end
+
+ tach('loop') do
+ default = { :a => 1, :b => 2 }
+ override = { :b => 3, :c => 4 }
+ for key, value in default
+ override[key] ||= default[key]
+ end
+ override
+ end
+
+end
diff --git a/lib/vendor/excon/benchmarks/single_vs_double_quotes.rb b/lib/vendor/excon/benchmarks/single_vs_double_quotes.rb
new file mode 100644
index 0000000..aac3342
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/single_vs_double_quotes.rb
@@ -0,0 +1,21 @@
+require 'rubygems'
+require 'tach'
+
+Tach.meter(1_000_000) do
+ tach('double') do
+ "path"
+ end
+ tach('single') do
+ 'path'
+ end
+end
+
+# [double, single]
+#
+# +--------+----------+
+# | tach | total |
+# +--------+----------+
+# | single | 0.416340 |
+# +--------+----------+
+# | double | 0.416570 |
+# +--------+----------+
diff --git a/lib/vendor/excon/benchmarks/string_ranged_index.rb b/lib/vendor/excon/benchmarks/string_ranged_index.rb
new file mode 100644
index 0000000..68c2fdc
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/string_ranged_index.rb
@@ -0,0 +1,87 @@
+# Copied from my benchmark_hell repo: github.com/sgonyea/benchmark_hell
+
+require 'benchmark'
+
+iters = 1000000
+
+string = "Test String OMG"
+
+puts 'String ranged index vs. "coordinates"'
+Benchmark.bmbm do |x|
+ x.report('ranged index') do
+ iters.times.each do
+ text = string[2..9]
+ end
+ end
+
+ x.report('coordinates') do
+ iters.times.each do
+ text = string[2, 9]
+ end
+ end
+end
+
+=begin
+rvm exec bash -c 'echo && echo $RUBY_VERSION && echo && ruby string_ranged_index.rb'
+
+
+jruby-1.5.6
+
+String ranged index vs. "coordinates"
+Rehearsal ------------------------------------------------
+ranged index 0.419000 0.000000 0.419000 ( 0.372000)
+coordinates 0.167000 0.000000 0.167000 ( 0.167000)
+--------------------------------------- total: 0.586000sec
+
+ user system total real
+ranged index 0.158000 0.000000 0.158000 ( 0.159000)
+coordinates 0.125000 0.000000 0.125000 ( 0.125000)
+
+macruby-0.7.1
+
+String ranged index vs. "coordinates"
+Rehearsal ------------------------------------------------
+ranged index 1.490000 0.030000 1.520000 ( 1.061326)
+coordinates 1.410000 0.030000 1.440000 ( 0.973640)
+--------------------------------------- total: 2.960000sec
+
+ user system total real
+ranged index 1.520000 0.030000 1.550000 ( 1.081424)
+coordinates 1.480000 0.030000 1.510000 ( 1.029214)
+
+rbx-head
+
+String ranged index vs. "coordinates"
+Rehearsal ------------------------------------------------
+ranged index 1.333304 0.009398 1.342702 ( 1.229629)
+coordinates 0.306087 0.000603 0.306690 ( 0.303538)
+--------------------------------------- total: 1.649392sec
+
+ user system total real
+ranged index 0.923626 0.001597 0.925223 ( 0.927411)
+coordinates 0.298910 0.000533 0.299443 ( 0.300255)
+
+ruby-1.8.7-p330
+
+String ranged index vs. "coordinates"
+Rehearsal ------------------------------------------------
+ranged index 0.730000 0.000000 0.730000 ( 0.738612)
+coordinates 0.660000 0.000000 0.660000 ( 0.660689)
+--------------------------------------- total: 1.390000sec
+
+ user system total real
+ranged index 0.750000 0.000000 0.750000 ( 0.746172)
+coordinates 0.640000 0.000000 0.640000 ( 0.640687)
+
+ruby-1.9.2-p136
+
+String ranged index vs. "coordinates"
+Rehearsal ------------------------------------------------
+ranged index 0.670000 0.000000 0.670000 ( 0.679046)
+coordinates 0.620000 0.000000 0.620000 ( 0.622257)
+--------------------------------------- total: 1.290000sec
+
+ user system total real
+ranged index 0.680000 0.000000 0.680000 ( 0.686510)
+coordinates 0.620000 0.000000 0.620000 ( 0.624269)
+=end
diff --git a/lib/vendor/excon/benchmarks/strip_newline.rb b/lib/vendor/excon/benchmarks/strip_newline.rb
new file mode 100644
index 0000000..88a964f
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/strip_newline.rb
@@ -0,0 +1,115 @@
+# require 'benchmark'
+#
+# COUNT = 1_000_000
+# data = "Content-Length: 100\r\n"
+# Benchmark.bmbm(25) do |bench|
+# bench.report('chomp') do
+# COUNT.times do
+# data = "Content-Length: 100\r\n"
+# data.chomp
+# end
+# end
+# bench.report('chomp!') do
+# COUNT.times do
+# data = "Content-Length: 100\r\n"
+# data.chomp!
+# end
+# end
+# bench.report('chop') do
+# COUNT.times do
+# data = "Content-Length: 100\r\n"
+# data.chop
+# end
+# end
+# bench.report('chop!') do
+# COUNT.times do
+# data = "Content-Length: 100\r\n"
+# data.chop!
+# end
+# end
+# bench.report('strip') do
+# COUNT.times do
+# data = "Content-Length: 100\r\n"
+# data.strip
+# end
+# end
+# bench.report('strip!') do
+# COUNT.times do
+# data = "Content-Length: 100\r\n"
+# data.strip!
+# end
+# end
+# bench.report('index') do
+# COUNT.times do
+# data = "Content-Length: 100\r\n"
+# data[0..-3]
+# end
+# end
+# end
+
+
+
+# Rehearsal ------------------------------------------------------------
+# chomp 0.640000 0.000000 0.640000 ( 0.644043)
+# chomp! 0.530000 0.000000 0.530000 ( 0.531415)
+# chop 0.620000 0.000000 0.620000 ( 0.624321)
+# chop! 0.500000 0.000000 0.500000 ( 0.509146)
+# strip 0.640000 0.000000 0.640000 ( 0.638785)
+# strip! 0.530000 0.000000 0.530000 ( 0.532196)
+# index 0.740000 0.000000 0.740000 ( 0.745742)
+# --------------------------------------------------- total: 4.200000sec
+#
+# user system total real
+# chomp 0.640000 0.010000 0.650000 ( 0.647287)
+# chomp! 0.530000 0.000000 0.530000 ( 0.532868)
+# chop 0.630000 0.000000 0.630000 ( 0.628236)
+# chop! 0.520000 0.000000 0.520000 ( 0.522950)
+# strip 0.640000 0.000000 0.640000 ( 0.646328)
+# strip! 0.520000 0.000000 0.520000 ( 0.532715)
+# index 0.740000 0.010000 0.750000 ( 0.771277)
+
+require 'rubygems'
+require 'tach'
+
+data = "Content-Length: 100\r\n"
+Tach.meter(1_000_000) do
+ tach('chomp') do
+ data.dup.chomp
+ end
+ tach('chomp!') do
+ data.dup.chomp!
+ end
+ tach('chop') do
+ data.dup.chop
+ end
+ tach('chop!') do
+ data.dup.chop!
+ end
+ tach('strip') do
+ data.dup.strip
+ end
+ tach('strip!') do
+ data.dup.strip!
+ end
+ tach('index') do
+ data.dup[0..-3]
+ end
+end
+
+# +--------+----------+----------+
+# | tach | average | total |
+# +--------+----------+----------+
+# | chomp | 1.444547 | 1.444547 |
+# +--------+----------+----------+
+# | chomp! | 1.276813 | 1.276813 |
+# +--------+----------+----------+
+# | chop | 1.422744 | 1.422744 |
+# +--------+----------+----------+
+# | chop! | 1.240941 | 1.240941 |
+# +--------+----------+----------+
+# | strip | 1.444776 | 1.444776 |
+# +--------+----------+----------+
+# | strip! | 1.266459 | 1.266459 |
+# +--------+----------+----------+
+# | index | 1.557975 | 1.557975 |
+# +--------+----------+----------+ \ No newline at end of file
diff --git a/lib/vendor/excon/benchmarks/vs_stdlib.rb b/lib/vendor/excon/benchmarks/vs_stdlib.rb
new file mode 100644
index 0000000..fca9a1e
--- /dev/null
+++ b/lib/vendor/excon/benchmarks/vs_stdlib.rb
@@ -0,0 +1,82 @@
+require 'rubygems' if RUBY_VERSION < '1.9'
+
+require 'sinatra/base'
+require 'tach'
+
+require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'excon')
+
+module Excon
+ class Server < Sinatra::Base
+
+ def self.run
+ Rack::Handler::WEBrick.run(
+ Excon::Server.new,
+ :Port => 9292,
+ :AccessLog => [],
+ :Logger => WEBrick::Log.new(nil, WEBrick::Log::ERROR)
+ )
+ end
+
+ get '/data/:amount' do |amount|
+ 'x' * amount.to_i
+ end
+
+ end
+end
+
+def with_server(&block)
+ pid = Process.fork do
+ Excon::Server.run
+ end
+ loop do
+ sleep(1)
+ begin
+ Excon.get('http://localhost:9292/api/foo')
+ break
+ rescue
+ end
+ end
+ yield
+ensure
+ Process.kill(9, pid)
+end
+
+require 'net/http'
+require 'open-uri'
+
+url = 'http://localhost:9292/data/1000'
+
+with_server do
+
+ Tach.meter(100) do
+
+ tach('Excon') do
+ Excon.get(url).body
+ end
+
+# tach('Excon (persistent)') do |times|
+# excon = Excon.new(url)
+# times.times do
+# excon.request(:method => 'get').body
+# end
+# end
+
+ tach('Net::HTTP') do
+ # Net::HTTP.get('localhost', '/data/1000', 9292)
+ Net::HTTP.start('localhost', 9292) {|http| http.get('/data/1000').body }
+ end
+
+# tach('Net::HTTP (persistent)') do |times|
+# Net::HTTP.start('localhost', 9292) do |http|
+# times.times do
+# http.get('/data/1000').body
+# end
+# end
+# end
+
+# tach('open-uri') do
+# open(url).read
+# end
+
+ end
+end
diff --git a/lib/vendor/excon/changelog.txt b/lib/vendor/excon/changelog.txt
new file mode 100644
index 0000000..5d3020f
--- /dev/null
+++ b/lib/vendor/excon/changelog.txt
@@ -0,0 +1,999 @@
+0.54.0 10/17/2016
+=================
+
+add howsmyssl rake task for sanity checking
+update default ciphers to mozilla intermediate list
+fix typo in changelog
+
+0.53.0 09/27/2016
+=================
+
+add ability to pass ssl options as strings
+progress towards rspec
+update bundled certs
+
+0.52.0 08/22/2016
+=================
+
+freeze string literals
+move toward interpolation, over concatenation (frozen string related)
+start conversion toward rspec
+move user/pass authorization header setting to request level
+
+0.51.0 07/08/2016
+=================
+
+tweak new errors to be an alias rather than inherit
+
+0.50.1 06/28/2016
+=================
+
+re-add some missing errors from refactoring
+
+0.50.0 06/28/2016
+=================
+
+expand readme
+refactor errors for consistancy
+optionally allow unstubbed requests
+parse/verify path as well as host for connection
+
+0.49.0 03/28/2016
+=================
+
+fix nonblock ssl socket connect timeout handling
+fix README debug example
+make unique class for certificate errors
+connection logic cleanup
+change stubs back to global (with local option via defaults)
+specific handling for set-cookie header exceptions
+
+0.48.0 03/07/2016
+=================
+
+optimize by writing part of body with headers when it fits in a chunk
+
+0.47.0 02/29/2016
+=================
+
+fix bundled certs
+fix instrumentors to allow recording timings
+
+0.46.0 02/26/2016
+=================
+
+empty host header for unix sockets
+raise EOFError on unexpectedly read nil
+add host/path/port to response
+keep cookies through redirects
+fix to skip decompressing empty bodies
+fix escaping for query string
+README improvements
+fix SocketError initializer
+fix incorrect error class usage
+
+0.45.4 07/13/2015
+=================
+
+fix undefined errors in error handling
+ignore empty proxy values
+
+0.45.3 04/21/2015
+=================
+
+guard warning about openssl versions in case constant undefined
+ensure rackup listens properly, fixes local tests
+
+0.45.2 04/16/2015
+=================
+
+add raw_status reader
+improved tests around response/status
+rescue IO::WaitWritable for SSL sockets also
+indentation fixes
+tighten rescue in ssl socket connect to better report non-timeouts
+rescue EAGAIN and EWOULDBLOCK for non-blocking connects
+
+0.45.1 03/27/2015
+=================
+
+fix scope for readline buffer, fixes dropped initial characters
+
+0.45.0 03/26/2015
+=================
+
+prefer default SSL config to ENV, when available
+document instrumentor deviation from rails format
+better error/warning around openssl 1.0.2 bug
+fix nonblocking ssl connect to not have tight loop
+also remove user/pass when following redirects
+
+0.44.4 03/04/2015
+=================
+
+update bundled certs
+loosen travis versions, to get ~> type follow-the-leader behavior
+fix syntax issue in ruby 2.2.1
+
+0.44.3 02/24/2015
+=================
+
+don't pass body when following GET redirects
+fix error rescue case to properly reference error object
+
+0.44.2 02/11/2015
+=================
+
+simplify data[:debug] logic
+catch nonblock errors around readline
+
+
+0.44.1 02/01/2015
+=================
+
+fix issue with frozen strings in user/pass
+
+0.44.0 01/30/2015
+=================
+
+re-implement timeout using IO.select
+document custom URI parser usage
+fix ruby 2.2 build
+improved IPv6 support
+Excon::Utils improvements
+add 429 errors
+
+0.43.0 01/09/2015
+=================
+
+use basic error instead of nil as default for socket error
+allow setup_proxy to accept uri
+add disable_proxy and proxy: false to disable proxy settings
+
+0.42.1 12/04/2014
+=================
+
+update bundled certs
+fix redirect follower to avoid erroneously setting basic auth
+
+0.42.0 12/02/2014
+=================
+
+fix stubbing section of README
+follow redirect for all request methods
+remove unhelpful link for excon.io
+rescue/ignore illegal seek on rewind
+add ssl_cert_store option
+allow non-RSA ssl keys
+attempt to rewind request_block when idempotent
+add configurable thread safety for socket pool
+
+
+0.41.0 11/05/2014
+=================
+
+add :ssl_verify_peer_host option for dev purposes
+add #reason_phrase to response
+
+0.40.0 10/06/2014
+=================
+
+fix support for specifying ssl_ca_path
+more consistent response_block/response.body behavior for mocks
+add support for proxies running on unix domain sockets
+
+0.39.6 09/22/2014
+=================
+
+pretty print stub not found errors
+
+0.39.5 09/14/2014
+=================
+
+fix double delegation error
+make client_key_pass valid connection key
+cast headers to_s to fix historical symbol usage
+
+0.39.4 08/08/2014
+=================
+
+ensure Response#new uses case-insensitive headers
+add client cert pass phrase support
+
+0.39.3 08/05/2014
+=================
+
+fix for nil and/or unknown proxy values
+
+0.39.2 08/04/2014
+=================
+
+respect both ca_file/ca_path when both present
+
+0.39.1 08/04/2014
+=================
+
+fix for ssl proxies + remote_ip stuff
+
+0.39.0 08/01/2014
+=================
+
+revert to a blocking readline, for performance
+simplify status lookup
+consolidate proxy code
+store defaults as a constant
+avoid setting nil user/pass vs just no setting keys
+move idempotent warnings in to middleware
+simplify validations
+use constants in utils
+group non-chunk response paring
+optimize/simplify socket local lookup
+simplify to pro-actively build downcased headers instead of lazily do so
+add version to options (so it will appear in debug)
+add OS/Ruby version info to options/version for debugging
+more consistent output styling for errors
+remove TE stuff to simplify
+shorten timeout/sleep in streaming tests
+remove transfer-encoding altogether if it only includes chunked
+only rescue http status errors in relevant tests
+use case-insensitive headers in stubs also
+
+0.38.0 07/09/2014
+=================
+
+avoid reading non-file bodies (mock related fix)
+fixes to readme links
+fix excon_debug to set debug_response
+ensure both \r and \n are read when parsing headers
+
+0.37.0 06/09/2014
+=================
+
+fix chunked reading to avoid chop! on non-chunk endings
+fixes for proxy usage
+
+0.36.0 06/04/2014
+=================
+
+fix to reconcile streaming changes for chunked encoding
+
+0.35.0 06/03/2014
+=================
+
+fix for responses with content_length
+
+0.34.0 05/29/2014
+=================
+
+add support for setting ssl_verify_callback
+stream partial results imediately, when available
+update rack/unicorn in tests to support streaming tests
+skip streaming tests on jruby (as they depend on unicorn)
+update travis tests to use newest rubinius
+improve formatting/readibility of standard instrumentor output
+
+0.33.0 05/15/2014
+=================
+
+README clarifications around defaults and basic auth
+case insensitive headers
+
+0.32.1 03/13/2014
+=================
+
+Fix for SNI (should occur prior to connect)
+
+0.32.0 02/27/2014
+=================
+
+README improvements
+fixes around LICENSE/CONTRIBUTING/CONTRIBUTORS
+update bundled cert
+nonblock connect/timeout fixes for ssl sockets
+skip reverse lookups where feasible
+more secure ssl settings, when available
+add escape stuff as middleware
+fix to raise exceptions properly
+fix for keep alive check
+add tests around keep alive
+escape/unescape uri added to utils
+add support for reusable local ports
+
+0.31.0 12/16/2013
+=================
+
+test fixes for Bundler.require usage and Rack::Lint
+use production mode + dump errors for tests
+use Utils in Excon.stub
+add implementation of stuff from WEBrick directly to utils
+update test server to send connection close and process buffer after response
+add :persistent option, defaults true
+group HTTP errors by type
+patch to webrick to workaround intermitent test failures
+only use Open4 for 1.8.7
+update/expand getting help/getting involved in readme
+
+0.30.0 11/25/2013
+=================
+
+ensure schema/host/port are passed to redirect follower with relative location
+add .ruby-version and .ruby-gemset to .gitignore
+pass nil to :response_block for unknown values
+use :response_block if expects middleware is not used
+refactor Response.parse, add tests
+support header continuations
+support chunked trailers
+improve decompress middleware/tests
+add accept-encoding in decompress middleware requests, if missing
+fixes for connection close detection
+support transfer encoding
+fix deprecated URI.decode usage
+do not try to use tcp_nodelay for unix sockets
+nonblocking connect, connect timeouts for unix sockets
+ignore IO#close exceptions
+move conditional nonblock to only SSLSocket
+skip reverse lookups
+avoid mutating canned response from middleware
+test against latest rubinius, no longer allow failures
+add unicorn as rubinius dev dependency
+use webbrick form decode
+
+0.29.0 11/07/2013
+=================
+
+make nonblock invalid as request key
+add backtrace to all warnings
+do not allow idempotent + pipeline
+close socket after pipeline if needed
+fix Socket#read to match IO.read EOF behavior
+use Socket#read for non-blocking readline
+respect read_timeout for status read
+read response until status line, discard chunked trailer
+fix redirect follower to properly change host
+
+0.28.0 10/28/2013
+=================
+
+tag warning messages with [excon]
+allow specific ssl_versions
+fixes around param validation
+create a new connection for redirect_follower middleware
+add connection_uri/request_uri to utils
+avoid mutating connection data
+remove connection key in redirect_follower
+
+
+0.27.6 10/15/2013
+=================
+
+warn, but no longer mutate params during validation
+
+0.27.5 10/14/2013
+=================
+
+extract validations/port_string to utils module
+
+0.27.4 10/14/2013
+=================
+
+fix for https/port string values
+
+0.27.3 10/11/2013
+=================
+
+better invalid key handling
+avoid mutating port value
+
+0.27.2 10/10/2013
+=================
+
+avoid mutating datum in idempotent middleware
+
+0.27.1 10/09/2013
+=================
+
+improve warning messages for valid keys
+
+0.27.0 10/04/2013
+=================
+
+display warnings based on ruby and/or debug settings
+add missing valid connection keys
+remove 1.8.7 related nonblock warning
+add support for unix sockets
+cleanup constants
+improve test setup to minimize server spawning
+separate connection/request key validation
+
+0.26.0 09/24/2013
+=================
+
+add basic decompress middleware
+update readme mocking+stubbing info
+add unstub functionality
+avoid modifying original options in request
+jruby fixes
+misc cleanup/fixes
+encoding/compatibility fixes
+close sockets on error
+warn when both request_block and idempotent are set
+
+0.25.3 07/18/2013
+=================
+
+respect SSL_CERT_DIR/SSL_CERT_FILE
+more aggressively include bundled cert as fallback
+
+0.25.2 07/18/2013
+=================
+
+add license to gemspec
+add "excon/#{version}" default user agent
+create/use response parser middleware
+fix proxy request info to use datum rather than @data
+
+
+0.25.1 07/01/2013
+=================
+
+fix for jruby ssl
+more explicit description in docs
+
+0.25.0 06/20/2013
+=================
+
+attempt to use OS certs first, only use bundled as fallback
+normalize method in stubs
+
+0.24.0 06/12/2013
+=================
+
+allow passing ssl creds as strings or file paths
+
+0.23.0 06/10/2013
+=================
+
+defer writing request/headers to allow all-in-one
+allow opt-in for request/response error info
+add configurable TCP_NODELAY
+consolidate warning display
+respect ruby verbosity conventions
+fix copyright years in notice
+
+0.22.1 05/17/2013
+=================
+
+fix logic error in dropping default ports
+
+0.22.0 05/17/2013
+=================
+
+remove request/response info from default error messages to avoid credential leaks
+add option to omit default ports (http:80 and https:443)
+add examples for form encoding
+updates to facilitate streaming responses from middleware responses
+
+0.21.0 05/04/2013
+=================
+
+update bundled cacert
+add deprecated connection helper
+URL decode user/pass for basic auth
+fix odd name/permissions in benchmarks
+check for socket before closing one
+add support for no_proxy
+include scheme in socket key
+make socket.connect private
+allow stub lookup with Excon.stub_for
+
+0.20.1 03/19/2013
+=================
+
+dup middlewares to avoid overwriting original set
+delete datum[:response] in idempotent to ensure new response is parsed
+
+0.20.0 03/08/2013
+=================
+
+redact password from inspect/instrument
+downgrade severity of invalid keys from error to warning
+
+0.19.5 03/04/2013
+=================
+
+fix ssl socket proxy setup
+
+0.19.4 03/04/2013
+=================
+
+fix merge order of params in new
+
+0.19.3 03/01/2013
+=================
+
+properly raise errors when datum[:stack] has not yet been set
+
+0.19.2 02/28/2013
+=================
+
+add client_cert, client_key to valid connection options
+
+0.19.1 02/27/2013
+=================
+
+fix for ssl proxies to allow connect response to be read
+
+0.19.0 02/27/2013
+=================
+
+fix requests (pipeline) example in README
+make StubNotFound inherit from StandardError (not Excon::Errors::Error)
+idempotent reimplemented as middleware
+remaining idempotent/instrumentor functionality moved to middleware
+move uri parsing to Excon.new
+allow for configurable URI parser (ie Addressable vs URI)
+move VALID_CONNECTION_KEYS to constants
+move idempotent tests to middleware directory
+fix output of expects middleware to pass response objects instead of hashes
+
+0.18.5 02/22/2013
+=================
+
+add family to known keys
+
+0.18.4 02/21/2013
+=================
+
+remove ssl proxy host_port usage
+
+0.18.3 02/21/2013
+=================
+
+update response accessors to read from/write to @data
+
+0.18.2 02/21/2013
+=================
+
+one shouldn't rush, fix typo in previous
+
+0.18.1 02/21/2013
+=================
+
+fix for http errors when using mocks
+
+0.18.0 02/21/2013
+=================
+
+more refactoring around middlewares
+add pipelining capabilities
+allow [] style access to response attributes
+
+
+0.17.0 02/01/2013
+=================
+
+add patch method
+allow passing family for addresses to params/proxy
+more consistent empty header passing
+nicer debug output
+internal refactoring toward middleware pattern
+
+0.16.10 11/16/2012
+==================
+
+set default request_params for stub
+do not attempt to read body for CONNECT requests
+
+0.16.9 11/16/2012
+=================
+
+readme cleanup/clarification around stubs
+fix for reading response from ssl proxy
+
+0.16.8 11/12/2012
+=================
+
+set file body pos to 0 at beginning of request
+add eventmachine to dev dependencies for bad server tests
+comment out benchmark deps for now
+fix typo in readme
+
+0.16.7 10/17/2012
+=================
+
+fix typo in host_port per-request patch
+
+0.16.6 10/17/2012
+=================
+
+fix for host_port to recalculate on a per-request basis
+
+0.16.5 10/17/2012
+=================
+
+Also retry Timeouts on idempotent requests
+Excon.stub now breaks out user/pass from url if supplied
+loosen ssl version requirement to allow negotiation
+eof on read should return '' instead of nil
+build host_port up front to avoid recalculating
+set Proxy-Connection: Keep-Alive for https proxies
+postpone https upgrade until after proxy connect
+
+0.16.4 09/25/2012
+=================
+
+better behavior nonblock and use DEFAULT_NONBLOCK constant
+update deprecation/warnings to use $stderr
+consistency fixes for REDACT
+add REDACT behavior to standard_instrumentor
+
+0.16.3 09/20/2012
+=================
+
+remove overly paranoid const checking
+change chunk_size to be a param for consistency
+
+0.16.2 08/27/2012
+=================
+
+provide more helpful backtraces on connection requests
+provide more helpful backtraces on one-off requests
+rearrange class methods so params will pass to socket
+integrate nonblock backwards compatability fix
+rearrange excon.rb to initialize defaults sooner
+set nonblock at init time for ssl socket
+fixes around nonbleck to properly skip/warn if unavailable but selected
+
+0.16.1 08/15/2012
+=================
+
+default to SSLv3 usage
+
+0.16.0 08/14/2012
+=================
+
+add nonblock => false to use blocking requests with Timeout.timeout
+update readme to describe nonblock and idempotent options
+
+0.15.5 08/01/2012
+=================
+
+consolidate proxy handling
+proxy settings should pull from connection instead of params (allows
+Excon.defaults[:proxy])
+properly raise connect timeout errors
+change recommended standard instrumentor ENV to EXCON_DEBUG
+remove readline nonblock protections (they didn't fix the windows issue)
+don't swallow non-nonblock SSL exceptions
+consistency fixes for ssl nonblock error handling
+do SNI in ssl_socket setup
+use Excon::Response#parse to read https proxy response
+
+0.15.4 07/16/12
+===============
+
+rescue/retry nonblock errors from readline (even though they shouldn't occur)
+
+0.15.3 07/16/12
+===============
+
+remove erroneous newline in proxy auth header
+
+0.15.2 07/16/12
+===============
+
+fix capitalization of EXCON constant in auth stuff
+properly handle nil user/password values in auth
+various fixes to proxy and related tests
+
+0.15.1 07/16/12
+===============
+
+fix for sending user/pass to proxy
+
+0.15.0 07/16/12
+===============
+
+clarifications in README
+added base error class to message for Excon::SocketError
+fixes for proxy, sets properly on http and passes auth
+
+0.14.3 07/05/12
+===============
+
+remove a redundant setter in response streamer
+standardize on each (instead of for) to iterate enumerables
+
+0.14.2 06/26/12
+===============
+
+fix invoke_stub to convert files into strings before comparing
+
+0.14.1 06/19/12
+===============
+
+accept port as a separate option
+ensure first read from socket is nonblock (fixes read_timeouts)
+respect upper case env vars
+
+0.14.0 05/31/12
+===============
+
+make stubs LIFO for ease of use/understanding, updated README to explain
+simplify https proxy logic
+add instrumentation for responses
+add StandardInstrumentor (events got to stderr)
+EXCON_STANDARD_INSTRUMENTOR=true sets StandardInstrumentor as default
+
+0.13.3 04/05/12
+===============
+
+* fix for file size calculation in 1.8.7
+
+0.13.3 04/05/12
+===============
+
+* fixes for file like objects which do not respond to binmode
+
+0.13.2 03/26/12
+===============
+
+* fix to avoid issues when Tempfile is not required/defined. Thanks nextmat
+
+0.13.1 03/26/12
+===============
+
+* fix to allow for passing Tempfile objects as body. Thanks rkyrychuk
+
+0.13.0 03/22/12
+===============
+
+* workaround for jruby (use blocking read/write for ssl sockets)
+
+0.12.0 03/18/12
+===============
+
+* use params to set ssl (so each connection could differ)
+* bundle a default cert
+
+0.11.0 03/15/12
+===============
+
+* add request_block to support chunked requests
+* deprecate implicit block in favor of explicit response_block
+* loosen activesupport and jruby-openssl development dependencies
+
+0.10.1 03/13/12
+===============
+
+* avoid calling empty? on file body
+
+0.10.0 03/01/12
+===============
+
+* avoid setting/passing Content-Length headers for GET requests with no body
+* remove rcov from tasks/bundle in development
+* automatically parse and use basic auth when passed as part of a uri
+* fix for erroneous recursion in Excon.defaults=
+
+0.9.6 02/22/12
+==============
+
+* add support for setting ca_file. Thanks mattmatt!
+* add docs for Excon.stubs.clear and expects. Thanks masterkain!
+* add class level defaults
+* fix ruby warnings. Thanks foca!
+* improve instrumentation docs. Thanks mkb!
+* fix for empty body and SSL sockets. Thanks pweldon!
+
+0.9.5 01/16/12
+==============
+
+* fix getaddrinfo usage for rbx
+* fix mock handling when a block in passed
+* add jruby to ci
+
+0.9.4 12/21/11
+==============
+
+* fix for regexp/capture setting
+
+0.9.3 12/21/11
+==============
+
+* fix CONSTANTS referenced in SSL_Socket
+* fix default value for proxy in SSL_Socket
+* fix non-regexp header matching
+* return captures from regexp based params
+
+0.9.2 12/16/11
+==============
+
+* update mocks to allow for regex based matching
+* fixes for write_nonblock+OpenSSL weirdness
+
+0.9.1 12/15/11
+==============
+
+* update mock usage to be at the connection/request level
+
+0.9.0 12/14/11
+==============
+
+* add ability to do instrumentation
+* misc cleanup
+* deprecate retry_limit accessor in favor of passing as a param
+
+0.8.0 12/12/11
+==============
+
+* move mock handler to its own method
+* better handling around openssl errors
+* simplify writing by removing buffer
+
+0.7.12 12/04/11
+===============
+
+* revert: explicitly close files after writing
+
+0.7.11 12/24/11
+==============
+
+* rebuild gem broken gemspec with 1.8.x
+
+0.7.10 12/04/11
+===============
+
+* explicitly close files after writing
+
+0.7.9 11/30/11
+==============
+
+* add ability to modify retry limit
+* use addrinfo to avoid localhost and other IPv6 issues
+* update gemspec authors to add Dan Peterson and Matt Sanders
+
+0.7.8 11/24/11
+==============
+
+* rebuild gem broken gemspec with 1.8.x
+
+0.7.7 11/24/11
+==============
+
+* setup for travis ci automated testing
+* fix EOFError
+* use Socket.getaddrinfo to fix IPv6 issues
+
+0.7.6 10/04/11
+==============
+
+* fixes to provide for using openssl-nonblock for 1.8.x
+* correctly pass per-request settings to socket
+* fix for nonblocking stuff when waiting for socket close
+* use 127.0.0.1 instead of localhost in tests (fixes some errors)
+
+0.7.5 10/03/11
+==============
+
+* convert port to integer in sockaddr_in (jruby won't convert for you)
+
+0.7.4 09/30/11
+==============
+
+* rescue write would block from openssl
+
+0.7.3 09/27/11
+==============
+
+* fix nonblocking read to avoid reading past chunk in chunked encoded
+* rescue read would block from openssl
+
+0.7.2 09/24/11
+==============
+
+* fix buffer drain for socket#write. thanks dpiddy
+* rescue/retry timeout errors for idempotent requests. thanks dpiddy
+* timeouts should raise an excon specific error
+
+0.7.1 09/13/11
+==============
+
+* use nonblocking only when available (skip for 1.8.x SSL)
+
+0.7.0 09/12/11
+==============
+
+* change connects and most read/writes to use nonblocking methods
+* provide connect/read/write timeouts
+
+0.6.6 09/06/11
+==============
+
+* cleanup/refactoring. thanks nextmat
+* default to connection close as request delimiter
+
+0.6.5 07/13/11
+==============
+
+* properly stream responses with proc
+* fix mock with block to match real requests
+
+0.6.4 07/05/11
+==============
+
+* add block support to mocks. thanks dmeiz
+* fixes for stub matching. thanks dmeiz
+* don't do post_connection_check if verify mode is off
+* check excon state for verify mode instead of checking OpenSSL constants
+* use RbConfig to find OS. thanks trym
+* fixes for idempotent/retry. thanks lstoll
+
+0.6.3 05/02/11
+==============
+
+* fixes for header parsing to allow whitespace after :. thanks myronmarston
+* get_header optimization. thanks nextmat
+* rewind body on retry. thanks pweldon
+
+0.6.2 04/11/11
+==============
+
+* fix block arguments for connection close. thanks ggoodale
+
+0.6.1 04/05/11
+==============
+
+* add support for HTTPS proxies. thanks mrowe
+* add support for http_proxy and https_proxy ENV variables. thanks mrowe
+* fix progress for requests with blocks that are chunked or connection close
+
+0.6.0 03/30/11
+==============
+
+* basic support for using proxies. thanks mattsa
+* yield remaining/total bytes to streaming block. thanks nate
+* minor optimizations/cleanup
+
+0.5.8 03/24/11
+==============
+
+* fix regression where nil values in queries were ignored in 1.9. thanks mattsa
+* fix regression causing EOFError when making many connections in one thread
+* added tests to prevent both of the former from recurring
+
+0.5.7 03/21/11
+==============
+
+* lazily connect, rather than connecting at #initialize
+* add rough first pass at stubbing
+* minor optimizations
+* ssl client certification support. thanks thommay
+* skip figuring out/setting Content-Length if one is supplied. Thanks pweldon
+* do not try to parse body for 205 and 304. Thanks seancribbs
+
+0.5.6 02/19/11
+==============
+
+* only split headers by first ':' to allow for values with ':'. Thanks mtodd!
+* check a string instance for force_encoding, not class. Thanks seancribbs!
+* add benchmarks related to for vs each for enumerable. Thanks caius!
+* fix default rake task to run tests
+
+0.5.5 02/18/11
+==============
+
+* use local variables in response parsing, prevents keeping state across requests
+
+0.5.4 02/18/11
+==============
+
+* 204 should not attempt to parse body
+
+
+0.5.3 02/17/11
+==============
+
+* header comparison for responses is now case insensitive
+* change to allow :idempotent => false to operate correctly
+* misc cleanup
diff --git a/lib/vendor/excon/data/cacert.pem b/lib/vendor/excon/data/cacert.pem
new file mode 100644
index 0000000..74e5f52
--- /dev/null
+++ b/lib/vendor/excon/data/cacert.pem
@@ -0,0 +1,4036 @@
+##
+## Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Wed Sep 14 03:12:05 2016
+##
+## 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:
+## http://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.26.
+## SHA256: 01bbf1ecdd693f554ff4dcbe15880b3e6c33188a956c15ff845d313ca69cfeb8
+##
+
+
+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 Low-Value Services Root
+================================
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
+cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
+CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
+ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
+54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
+oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
+Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
+GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
+HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
+RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
+HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
+ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
+iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
+mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
+ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----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-----
+
+AddTrust Public Services Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
+cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
+BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
+dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
+nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
+d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
+Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
+HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
+A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
+A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
+JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
+Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
+EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+AddTrust Qualified Certificates Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
+cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
+CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
+IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
+64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
+KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
+L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
+wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
+MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
+BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
+azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
+GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
+RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
+iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
+-----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-----
+
+RSA Security 2048 v3
+====================
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
+ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
+MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
+BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
+Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
+WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
+KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
+FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
+v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
+0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
+VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
+nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
+pKnXwiJPZ9d37CAFYd4=
+-----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 Global CA 2
+====================
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
+MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
+NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
+LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
+Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
+HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
+K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
+srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
+ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
+OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
+x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
+H4z1Ir+rzoPz4iIprn2DQKi6bA==
+-----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-----
+
+Visa eCommerce Root
+===================
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
+EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
+QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
+WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
+VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
+F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
+RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
+TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
+/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
+GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
+CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
+YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
+zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
+YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+Certum Root CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
+ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
+Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
+by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
+wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
+kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
+89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
+Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
+NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
+hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
+GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
+GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
+0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
+qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
+-----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-----
+
+Comodo Secure Services root
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
+MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
+Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
+BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
+9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
+rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
+oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
+p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
+FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
+YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
+aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
+4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
+DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
+pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
+RR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+Comodo Trusted Services root
+============================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
+MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
+bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
+IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
+3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
+/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
+juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
+ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
+DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
+ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
+cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
+uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
+BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
+R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
+9y5Xt5hwXsjEeLBi
+-----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-----
+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
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+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
+-----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-----
+
+UTN USERFirst Hardware Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
+BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
+OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
+eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
+ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
+wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
+tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
+i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
+Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
+gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
+lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
+UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
+BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
+XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
+lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
+iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
+nfhmqA==
+-----END CERTIFICATE-----
+
+Camerfirma Chambers of Commerce Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
+NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
+cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
+MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
+xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
+NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
+DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
+d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
+EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
+cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
+AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
+bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
+VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
+fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
+L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
+UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
+ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
+erfutGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+Camerfirma Global Chambersign Root
+==================================
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
+NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
+YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
+MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
+ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
+1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
+by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
+6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
+8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
+BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
+aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
+Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
+aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
+ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
+PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
+gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
+PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
+IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
+t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----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-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
+YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
+AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
+Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
+U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
+LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
+cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
+dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
+AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
+3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
+vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
+fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
+fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
+EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
+1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
+lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
+g14=
+-----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-----
+
+Swisscom Root CA 1
+==================
+-----BEGIN CERTIFICATE-----
+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
+NY6E0F/6MBr1mmz0DlP5OlvRHA==
+-----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-----
+
+DST ACES CA X6
+==============
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
+MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
+MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
+CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
+DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
+pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
+GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
+MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
+Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
+dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
+CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
+5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
+Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
+vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
+oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+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
+-----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-----
+
+WellsSecure Public Root Certificate Authority
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
+F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
+NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
+bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
+VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
+iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
+i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
+bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
+K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
+AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
+cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
+lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
+i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
+GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
+K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
+bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
+qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
+E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
+tylv2G0xffX8oRAHh84vWdw+WNs=
+-----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-----
+
+IGC/A
+=====
+-----BEGIN CERTIFICATE-----
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
+VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
+Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
+MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
+EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
+STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
+TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
+So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
+HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
+frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
+tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
+egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
+iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
+q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
+MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
+lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
+0mBWWg==
+-----END CERTIFICATE-----
+
+Security Communication EV RootCA1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
+BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
+Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
+/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
+WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
+ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
+bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
+9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
+iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
+Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
+mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
+T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----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-----
+
+Microsec e-Szigno Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
+BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
+EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
+MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
+dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
+GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
+d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
+oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
+QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
+PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
+MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
+IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
+VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
+LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
+dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
+4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
+AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
+egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
+Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
+PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
+c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
+cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
+IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
+WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
+MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
+Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
+HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
+nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
+aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
+yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
+S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----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-----
+
+T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
+=============================================================================================================================
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
+DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
+aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
+b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
+BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
+S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
+MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
+IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
+n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
+IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
+dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
+cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
+Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
+xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
+6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
+BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
+N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
+y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
+LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
+dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+Buypass Class 2 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
+MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
+cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
+0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
+0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
+uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
+1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
+7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
+fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
+wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+
+EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
+==========================================================================
+-----BEGIN CERTIFICATE-----
+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
+-----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-----
+
+CNNIC ROOT
+==========
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
+ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
+OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
+o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
+VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
+VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
+czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
+y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
+wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
+lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
+Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
+O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
+BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
+G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
+mxE=
+-----END CERTIFICATE-----
+
+ApplicationCA - Japanese Government
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
+SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
+MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
+cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
+fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
+wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
+jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
+nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
+WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
+BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
+vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
+o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
+/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
+io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
+dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----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-----
+
+Juur-SK
+=======
+-----BEGIN CERTIFICATE-----
+MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
+c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
+DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
+SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
+aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
+TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
+UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
+Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
+MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
+HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
+AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
+cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
+AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
+cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
+FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
+A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
+ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
+abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
+IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
+Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
+yyqcjg==
+-----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-----
+
+ACEDICOM Root
+=============
+-----BEGIN CERTIFICATE-----
+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
+-----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-----
+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
+-----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-----
+
+Certinomis - Autorité Racine
+=============================
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
+LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
+A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
+JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
+wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
+Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
+2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
+jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
+c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
+lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
+xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
+530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
+4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
+WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
+R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
+nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
+CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
+JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
+qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
+WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
+wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
+vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+
+Root CA Generalitat Valenciana
+==============================
+-----BEGIN CERTIFICATE-----
+MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
+ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
+IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
+WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
+CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
+F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
+ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
+D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
+JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
+AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
+dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
+ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
+AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
+YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
+AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
+aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
+AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
+YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
+AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
+OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
+dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
+BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
+A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
+b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
+TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
+Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
+NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
+iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
+-----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-----
+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
+-----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-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
+Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
+dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
+c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
+bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
+aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
+L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
+cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
+fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
+N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
+Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
+tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
+e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
+2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
+HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
+D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority G2
+===================================
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
+ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
+o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
+4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
+Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
+Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
+O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
+vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
+nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
+FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
+z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
+KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
+2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
+J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
+/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
+nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
+blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
+l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
+7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
+obp573PYtlNXLfbQ4ddI
+-----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-----
+
+TURKTRUST Certificate Services Provider Root 2007
+=================================================
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
+DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
+a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
+YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
+KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
+KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
+rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
+AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
+Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
+Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
+BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
+poRq0Tl9
+-----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-----
+
+PSCProcert
+==========
+-----BEGIN CERTIFICATE-----
+MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
+ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
+MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
+dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
+cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
+IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
+MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
+DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
+ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
+Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
+wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
+3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
+RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
+EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
+0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
+0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
+td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
+Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
+r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
+AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
+Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
+xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
+ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
+EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
+Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
+ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
+9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
+MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
+LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
+ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
+YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
+Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
+dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
+T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
+g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
+uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
+n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
+FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
+5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
+3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
+poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
+eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
+-----END CERTIFICATE-----
+
+China Internet Network Information Center EV Certificates Root
+==============================================================
+-----BEGIN CERTIFICATE-----
+MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
+BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
+aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
+Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
+A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
+PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
+cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
+jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
+98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
+klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
+KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
+7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
+glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
+0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
+7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
+ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
+5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+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
+5OfNeOI5wSsSnqaeG8XmDtkx2Q==
+-----END CERTIFICATE-----
+
+Swisscom Root EV CA 2
+=====================
+-----BEGIN CERTIFICATE-----
+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
+l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
+-----END CERTIFICATE-----
+
+CA Disig Root R1
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy
+3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8
+u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2
+m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk
+CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa
+YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6
+vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL
+LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX
+ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is
+XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ
+04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
+xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B
+LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM
+CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb
+VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85
+YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS
+ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix
+lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N
+UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ
+a7+h89n07eLw4+1knj0vllJPgFOL
+-----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-----
+
+WoSign
+======
+-----BEGIN CERTIFICATE-----
+MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g
+QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ
+BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
+vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO
+CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX
+2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5
+KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR
++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez
+EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk
+lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2
+8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY
+yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C
+AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R
+8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1
+LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq
+T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj
+y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC
+2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes
+5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/
+EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh
+mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx
+kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi
+kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w==
+-----END CERTIFICATE-----
+
+WoSign China
+============
+-----BEGIN CERTIFICATE-----
+MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv
+geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD
+VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k
+8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5
+uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85
+dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5
+Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy
+b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc
+76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m
++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6
+yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX
+GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA
+A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6
+yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY
+r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115
+j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A
+kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97
+qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y
+jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB
+ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv
+T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO
+kI26oQ==
+-----END CERTIFICATE-----
+
+COMODO RSA Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+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
+LaZRfyHBNVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+USERTrust RSA Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+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
+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-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
+RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
+ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
+SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
+n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
+ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
+jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
+ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
+9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
+4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
+HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
+BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
+URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
+lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
+B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
+-----END CERTIFICATE-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
+A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5
+MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL
+BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf
+aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm
+aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a
+2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED
+wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb
+HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV
++DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT
+9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
+9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R
+fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
+o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW
+hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1
+O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==
+-----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-----
+
+Certification Authority of WoSign G2
+====================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
+CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
+XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
+W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
+5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
+v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
+hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
+P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
+TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
+7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
+-----END CERTIFICATE-----
+
+CA WoSign ECC Root
+==================
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
+TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
+dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
+ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
+zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
+t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
+QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
+MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
+Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
+a/GRspBl9JrmkO5K
+-----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-----
+
+Certplus Root CA G1
+===================
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV
+BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe
+Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD
+ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN
+r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx
+Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj
+BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv
+LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2
+z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc
+4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd
+4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj
+jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+
+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G
+A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY
+lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
+66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG
+YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/
+2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F
+6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX
+CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe
+tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC
+VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/
++mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+
+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
+-----END CERTIFICATE-----
+
+Certplus Root CA G2
+===================
+-----BEGIN CERTIFICATE-----
+MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
+AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
+NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
+cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
+Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
+AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
+IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
+HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
+vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G1
+====================
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx
+MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
+CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa
+Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87
+ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO
+YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9
+xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO
+9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq
+3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi
+n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9
+URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr
+TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px
+N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
+PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv
+uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK
+n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh
+X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80
+nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm
+GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/
+bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o
+4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA
+OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G2
+====================
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy
+MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
+CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+
+Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz
+4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV
+eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt
+UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz
+3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj
+3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz
+9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0
+0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT
+y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59
+M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
+Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI
+mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG
+S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp
+EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ
+6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr
+gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo
+SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0
+YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm
+u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G3
+====================
+-----BEGIN CERTIFICATE-----
+MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
+DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
+ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
+ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
+/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
+BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
+BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
+3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
+-----END CERTIFICATE-----
diff --git a/lib/vendor/excon/excon.gemspec b/lib/vendor/excon/excon.gemspec
new file mode 100644
index 0000000..6261674
--- /dev/null
+++ b/lib/vendor/excon/excon.gemspec
@@ -0,0 +1,201 @@
+## This is the rakegem gemspec template. Make sure you read and understand
+## all of the comments. Some sections require modification, and others can
+## be deleted if you don't need them. Once you understand the contents of
+## this file, feel free to delete any comments that begin with two hash marks.
+## You can find comprehensive Gem::Specification documentation, at
+## http://docs.rubygems.org/read/chapter/20
+Gem::Specification.new do |s|
+ s.specification_version = 2 if s.respond_to? :specification_version=
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+ s.rubygems_version = '1.3.5'
+
+ ## Leave these as is they will be modified for you by the rake gemspec task.
+ ## If your rubyforge_project name is different, then edit it and comment out
+ ## the sub! line in the Rakefile
+ s.name = 'excon'
+ s.version = '0.54.0'
+ s.date = '2016-10-17'
+ s.rubyforge_project = 'excon'
+
+ ## Make sure your summary is short. The description may be as long
+ ## as you like.
+ s.summary = "speed, persistence, http(s)"
+ s.description = "EXtended http(s) CONnections"
+
+ ## List the primary authors. If there are a bunch of authors, it's probably
+ ## better to set the email to an email list or something. If you don't have
+ ## a custom homepage, consider using your GitHub URL or the like.
+ s.authors = ["dpiddy (Dan Peterson)", "geemus (Wesley Beary)", "nextmat (Matt Sanders)"]
+ s.email = 'geemus@gmail.com'
+ s.homepage = 'https://github.com/excon/excon'
+ s.license = 'MIT'
+
+ ## This gets added to the $LOAD_PATH so that 'lib/NAME.rb' can be required as
+ ## require 'NAME.rb' or'/lib/NAME/file.rb' can be as require 'NAME/file.rb'
+ s.require_paths = %w[lib]
+
+ ## This sections is only necessary if you have C extensions.
+ # s.require_paths << 'ext'
+ # s.extensions = %w[ext/extconf.rb]
+
+ ## If your gem includes any executables, list them here.
+ # s.executables = ["name"]
+ # s.default_executable = 'name'
+
+ ## Specify any RDoc options here. You'll want to add your README and
+ ## LICENSE files to the extra_rdoc_files list.
+ s.rdoc_options = ["--charset=UTF-8"]
+ s.extra_rdoc_files = %w[README.md]
+
+ ## List your runtime dependencies here. Runtime dependencies are those
+ ## that are needed for an end user to actually USE your code.
+ # s.add_dependency('DEPNAME', [">= 1.1.0", "< 2.0.0"])
+
+ ## List your development dependencies here. Development dependencies are
+ ## those that are only needed during development
+ # s.add_development_dependency('DEVDEPNAME', [">= 1.1.0", "< 2.0.0"])
+ s.add_development_dependency('rspec', '>= 3.5.0')
+ s.add_development_dependency('activesupport')
+ s.add_development_dependency('delorean')
+ s.add_development_dependency('eventmachine', '>= 1.0.4')
+ s.add_development_dependency('open4')
+ s.add_development_dependency('rake')
+ s.add_development_dependency('rdoc')
+ s.add_development_dependency('shindo')
+ s.add_development_dependency('sinatra')
+ s.add_development_dependency('sinatra-contrib')
+ s.add_development_dependency('json', '>= 1.8.2')
+ if RUBY_VERSION.to_f >= 1.9
+ s.add_development_dependency 'puma'
+ end
+ ## Leave this section as-is. It will be automatically generated from the
+ ## contents of your Git repository via the gemspec task. DO NOT REMOVE
+ ## THE MANIFEST COMMENTS, they are used as delimiters by the task.
+ # = MANIFEST =
+ s.files = %w[
+ CONTRIBUTING.md
+ CONTRIBUTORS.md
+ Gemfile
+ Gemfile.lock
+ LICENSE.md
+ README.md
+ Rakefile
+ benchmarks/class_vs_lambda.rb
+ benchmarks/concat_vs_insert.rb
+ benchmarks/concat_vs_interpolate.rb
+ benchmarks/cr_lf.rb
+ benchmarks/downcase-eq-eq_vs_casecmp.rb
+ benchmarks/excon.rb
+ benchmarks/excon_vs.rb
+ benchmarks/for_vs_array_each.rb
+ benchmarks/for_vs_hash_each.rb
+ benchmarks/has_key-vs-lookup.rb
+ benchmarks/headers_case_sensitivity.rb
+ benchmarks/headers_split_vs_match.rb
+ benchmarks/implicit_block-vs-explicit_block.rb
+ benchmarks/merging.rb
+ benchmarks/single_vs_double_quotes.rb
+ benchmarks/string_ranged_index.rb
+ benchmarks/strip_newline.rb
+ benchmarks/vs_stdlib.rb
+ changelog.txt
+ data/cacert.pem
+ excon.gemspec
+ lib/excon.rb
+ lib/excon/connection.rb
+ lib/excon/constants.rb
+ lib/excon/error.rb
+ lib/excon/extensions/uri.rb
+ lib/excon/headers.rb
+ lib/excon/middlewares/base.rb
+ lib/excon/middlewares/capture_cookies.rb
+ lib/excon/middlewares/decompress.rb
+ lib/excon/middlewares/escape_path.rb
+ lib/excon/middlewares/expects.rb
+ lib/excon/middlewares/idempotent.rb
+ lib/excon/middlewares/instrumentor.rb
+ lib/excon/middlewares/mock.rb
+ lib/excon/middlewares/redirect_follower.rb
+ lib/excon/middlewares/response_parser.rb
+ lib/excon/pretty_printer.rb
+ lib/excon/response.rb
+ lib/excon/socket.rb
+ lib/excon/ssl_socket.rb
+ lib/excon/standard_instrumentor.rb
+ lib/excon/test/plugin/server/exec.rb
+ lib/excon/test/plugin/server/puma.rb
+ lib/excon/test/plugin/server/unicorn.rb
+ lib/excon/test/plugin/server/webrick.rb
+ lib/excon/test/server.rb
+ lib/excon/unix_socket.rb
+ lib/excon/utils.rb
+ spec/excon/error_spec.rb
+ spec/excon/test/server_spec.rb
+ spec/excon_spec.rb
+ spec/helpers/file_path_helpers.rb
+ spec/requests/basic_spec.rb
+ spec/requests/eof_requests_spec.rb
+ spec/spec_helper.rb
+ spec/support/shared_contexts/test_server_context.rb
+ spec/support/shared_examples/shared_example_for_clients.rb
+ spec/support/shared_examples/shared_example_for_streaming_clients.rb
+ spec/support/shared_examples/shared_example_for_test_servers.rb
+ tests/authorization_header_tests.rb
+ tests/bad_tests.rb
+ tests/basic_tests.rb
+ tests/complete_responses.rb
+ tests/data/127.0.0.1.cert.crt
+ tests/data/127.0.0.1.cert.key
+ tests/data/excon.cert.crt
+ tests/data/excon.cert.key
+ tests/data/xs
+ tests/error_tests.rb
+ tests/header_tests.rb
+ tests/middlewares/canned_response_tests.rb
+ tests/middlewares/capture_cookies_tests.rb
+ tests/middlewares/decompress_tests.rb
+ tests/middlewares/escape_path_tests.rb
+ tests/middlewares/idempotent_tests.rb
+ tests/middlewares/instrumentation_tests.rb
+ tests/middlewares/mock_tests.rb
+ tests/middlewares/redirect_follower_tests.rb
+ tests/pipeline_tests.rb
+ tests/proxy_tests.rb
+ tests/query_string_tests.rb
+ tests/rackups/basic.rb
+ tests/rackups/basic.ru
+ tests/rackups/basic_auth.ru
+ tests/rackups/deflater.ru
+ tests/rackups/proxy.ru
+ tests/rackups/query_string.ru
+ tests/rackups/redirecting.ru
+ tests/rackups/redirecting_with_cookie.ru
+ tests/rackups/request_headers.ru
+ tests/rackups/request_methods.ru
+ tests/rackups/response_header.ru
+ tests/rackups/ssl.ru
+ tests/rackups/ssl_mismatched_cn.ru
+ tests/rackups/ssl_verify_peer.ru
+ tests/rackups/streaming.ru
+ tests/rackups/thread_safety.ru
+ tests/rackups/timeout.ru
+ tests/rackups/webrick_patch.rb
+ tests/request_headers_tests.rb
+ tests/request_method_tests.rb
+ tests/request_tests.rb
+ tests/response_tests.rb
+ tests/servers/bad.rb
+ tests/servers/eof.rb
+ tests/servers/error.rb
+ tests/servers/good.rb
+ tests/test_helper.rb
+ tests/thread_safety_tests.rb
+ tests/timeout_tests.rb
+ tests/utils_tests.rb
+ ]
+ # = MANIFEST =
+
+ ## Test files will be grabbed from the file list. Make sure the path glob
+ ## matches what you actually use.
+ s.test_files = s.files.select { |path| path =~ /^[spec|tests]\/.*_[spec|tests]\.rb/ }
+end
diff --git a/lib/vendor/excon/lib/excon.rb b/lib/vendor/excon/lib/excon.rb
new file mode 100644
index 0000000..1ea0b8b
--- /dev/null
+++ b/lib/vendor/excon/lib/excon.rb
@@ -0,0 +1,244 @@
+# frozen_string_literal: true
+$:.unshift(File.dirname(__FILE__)) unless
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
+
+require 'cgi'
+require 'forwardable'
+require 'openssl'
+require 'rbconfig'
+require 'socket'
+require 'timeout'
+require 'uri'
+require 'zlib'
+require 'stringio'
+
+require 'excon/extensions/uri'
+
+require 'excon/middlewares/base'
+require 'excon/middlewares/expects'
+require 'excon/middlewares/idempotent'
+require 'excon/middlewares/instrumentor'
+require 'excon/middlewares/mock'
+require 'excon/middlewares/response_parser'
+
+require 'excon/constants'
+require 'excon/utils'
+
+require 'excon/connection'
+require 'excon/error'
+require 'excon/headers'
+require 'excon/response'
+require 'excon/middlewares/decompress'
+require 'excon/middlewares/escape_path'
+require 'excon/middlewares/redirect_follower'
+require 'excon/middlewares/capture_cookies'
+require 'excon/pretty_printer'
+require 'excon/socket'
+require 'excon/ssl_socket'
+require 'excon/standard_instrumentor'
+require 'excon/unix_socket'
+
+# Define defaults first so they will be available to other files
+module Excon
+ class << self
+
+ # @return [Hash] defaults for Excon connections
+ def defaults
+ @defaults ||= DEFAULTS
+ end
+
+ # Change defaults for Excon connections
+ # @return [Hash] defaults for Excon connections
+ def defaults=(new_defaults)
+ @defaults = new_defaults
+ end
+
+ def display_warning(warning)
+ # Show warning if $VERBOSE or ENV['EXCON_DEBUG'] is set
+ if $VERBOSE || ENV['EXCON_DEBUG']
+ $stderr.puts "[excon][WARNING] #{warning}\n#{ caller.join("\n") }"
+ end
+ end
+
+ # Status of mocking
+ def mock
+ display_warning('Excon#mock is deprecated, use Excon.defaults[:mock] instead.')
+ self.defaults[:mock]
+ end
+
+ # Change the status of mocking
+ # false is the default and works as expected
+ # true returns a value from stubs or raises
+ def mock=(new_mock)
+ display_warning('Excon#mock is deprecated, use Excon.defaults[:mock]= instead.')
+ self.defaults[:mock] = new_mock
+ end
+
+ # @return [String] The filesystem path to the SSL Certificate Authority
+ def ssl_ca_path
+ display_warning('Excon#ssl_ca_path is deprecated, use Excon.defaults[:ssl_ca_path] instead.')
+ self.defaults[:ssl_ca_path]
+ end
+
+ # Change path to the SSL Certificate Authority
+ # @return [String] The filesystem path to the SSL Certificate Authority
+ def ssl_ca_path=(new_ssl_ca_path)
+ display_warning('Excon#ssl_ca_path= is deprecated, use Excon.defaults[:ssl_ca_path]= instead.')
+ self.defaults[:ssl_ca_path] = new_ssl_ca_path
+ end
+
+ # @return [true, false] Whether or not to verify the peer's SSL certificate / chain
+ def ssl_verify_peer
+ display_warning('Excon#ssl_verify_peer is deprecated, use Excon.defaults[:ssl_verify_peer] instead.')
+ self.defaults[:ssl_verify_peer]
+ end
+
+ # Change the status of ssl peer verification
+ # @see Excon#ssl_verify_peer (attr_reader)
+ def ssl_verify_peer=(new_ssl_verify_peer)
+ display_warning('Excon#ssl_verify_peer= is deprecated, use Excon.defaults[:ssl_verify_peer]= instead.')
+ self.defaults[:ssl_verify_peer] = new_ssl_verify_peer
+ end
+
+ # @see Connection#initialize
+ # Initializes a new keep-alive session for a given remote host
+ # @param [String] url The destination URL
+ # @param [Hash<Symbol, >] params One or more option params to set on the Connection instance
+ # @return [Connection] A new Excon::Connection instance
+ def new(url, params = {})
+ uri_parser = params[:uri_parser] || defaults[:uri_parser]
+ uri = uri_parser.parse(url)
+ if params[:path]
+ uri_parser.parse(params[:path])
+ end
+ unless uri.scheme
+ raise ArgumentError.new("Invalid URI: #{uri}")
+ end
+ params = {
+ :host => uri.host,
+ :hostname => uri.hostname,
+ :path => uri.path,
+ :port => uri.port,
+ :query => uri.query,
+ :scheme => uri.scheme
+ }.merge(params)
+ if uri.password
+ params[:password] = Utils.unescape_uri(uri.password)
+ end
+ if uri.user
+ params[:user] = Utils.unescape_uri(uri.user)
+ end
+ Excon::Connection.new(params)
+ end
+
+ # push an additional stub onto the list to check for mock requests
+ # @param [Hash<Symbol, >] request params to match against, omitted params match all
+ # @param [Hash<Symbol, >] response params to return from matched request or block to call with params
+ def stub(request_params = {}, response_params = nil)
+ if method = request_params.delete(:method)
+ request_params[:method] = method.to_s.downcase.to_sym
+ end
+ if url = request_params.delete(:url)
+ uri = URI.parse(url)
+ request_params = {
+ :host => uri.host,
+ :path => uri.path,
+ :port => uri.port,
+ :query => uri.query,
+ :scheme => uri.scheme
+ }.merge!(request_params)
+ if uri.user || uri.password
+ request_params[:headers] ||= {}
+ user, pass = Utils.unescape_form(uri.user.to_s), Utils.unescape_form(uri.password.to_s)
+ request_params[:headers]['Authorization'] ||= 'Basic ' + ["#{user}:#{pass}"].pack('m').delete(Excon::CR_NL)
+ end
+ end
+ if request_params.has_key?(:headers)
+ headers = Excon::Headers.new
+ request_params[:headers].each do |key, value|
+ headers[key] = value
+ end
+ request_params[:headers] = headers
+ end
+ if block_given?
+ if response_params
+ raise(ArgumentError.new("stub requires either response_params OR a block"))
+ else
+ stub = [request_params, Proc.new]
+ end
+ elsif response_params
+ stub = [request_params, response_params]
+ else
+ raise(ArgumentError.new("stub requires either response_params OR a block"))
+ end
+ stubs.unshift(stub)
+ stub
+ end
+
+ # get a stub matching params or nil
+ # @param [Hash<Symbol, >] request params to match against, omitted params match all
+ # @return [Hash<Symbol, >] response params to return from matched request or block to call with params
+ def stub_for(request_params={})
+ if method = request_params.delete(:method)
+ request_params[:method] = method.to_s.downcase.to_sym
+ end
+ Excon.stubs.each do |stub, response_params|
+ captures = { :headers => {} }
+ headers_match = !stub.has_key?(:headers) || stub[:headers].keys.all? do |key|
+ case value = stub[:headers][key]
+ when Regexp
+ if match = value.match(request_params[:headers][key])
+ captures[:headers][key] = match.captures
+ end
+ match
+ else
+ value == request_params[:headers][key]
+ end
+ end
+ non_headers_match = (stub.keys - [:headers]).all? do |key|
+ case value = stub[key]
+ when Regexp
+ if match = value.match(request_params[key])
+ captures[key] = match.captures
+ end
+ match
+ else
+ value == request_params[key]
+ end
+ end
+ if headers_match && non_headers_match
+ request_params[:captures] = captures
+ return [stub, response_params]
+ end
+ end
+ nil
+ end
+
+ # get a list of defined stubs
+ def stubs
+ case Excon.defaults[:stubs]
+ when :global
+ @stubs ||= []
+ when :local
+ Thread.current[:_excon_stubs] ||= []
+ end
+ end
+
+ # remove first/oldest stub matching request_params
+ # @param [Hash<Symbol, >] request params to match against, omitted params match all
+ # @return [Hash<Symbol, >] response params from deleted stub
+ def unstub(request_params = {})
+ stub = stub_for(request_params)
+ Excon.stubs.delete_at(Excon.stubs.index(stub))
+ end
+
+ # Generic non-persistent HTTP methods
+ HTTP_VERBS.each do |method|
+ module_eval <<-DEF, __FILE__, __LINE__ + 1
+ def #{method}(url, params = {}, &block)
+ new(url, params).request(:method => :#{method}, &block)
+ end
+ DEF
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/connection.rb b/lib/vendor/excon/lib/excon/connection.rb
new file mode 100644
index 0000000..8c4ce4a
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/connection.rb
@@ -0,0 +1,495 @@
+# frozen_string_literal: true
+module Excon
+ class Connection
+ include Utils
+
+ attr_reader :data
+
+ def connection
+ Excon.display_warning('Excon::Connection#connection is deprecated use Excon::Connection#data instead.')
+ @data
+ end
+ def connection=(new_params)
+ Excon.display_warning('Excon::Connection#connection= is deprecated. Use of this method may cause unexpected results.')
+ @data = new_params
+ end
+
+ def params
+ Excon.display_warning('Excon::Connection#params is deprecated use Excon::Connection#data instead.')
+ @data
+ end
+ def params=(new_params)
+ Excon.display_warning('Excon::Connection#params= is deprecated. Use of this method may cause unexpected results.')
+ @data = new_params
+ end
+
+ def proxy
+ Excon.display_warning('Excon::Connection#proxy is deprecated use Excon::Connection#data[:proxy] instead.')
+ @data[:proxy]
+ end
+ def proxy=(new_proxy)
+ Excon.display_warning('Excon::Connection#proxy= is deprecated. Use of this method may cause unexpected results.')
+ @data[:proxy] = new_proxy
+ end
+
+ # Initializes a new Connection instance
+ # @param [Hash<Symbol, >] params One or more optional params
+ # @option params [String] :body Default text to be sent over a socket. Only used if :body absent in Connection#request params
+ # @option params [Hash<Symbol, String>] :headers The default headers to supply in a request. Only used if params[:headers] is not supplied to Connection#request
+ # @option params [String] :host The destination host's reachable DNS name or IP, in the form of a String. IPv6 addresses must be wrapped (e.g. [::1]). See URI#host.
+ # @option params [String] :hostname Same as host, but usable for socket connections. IPv6 addresses must not be wrapped (e.g. ::1). See URI#hostname.
+ # @option params [String] :path Default path; appears after 'scheme://host:port/'. Only used if params[:path] is not supplied to Connection#request
+ # @option params [Fixnum] :port The port on which to connect, to the destination host
+ # @option params [Hash] :query Default query; appended to the 'scheme://host:port/path/' in the form of '?key=value'. Will only be used if params[:query] is not supplied to Connection#request
+ # @option params [String] :scheme The protocol; 'https' causes OpenSSL to be used
+ # @option params [String] :socket The path to the unix socket (required for 'unix://' connections)
+ # @option params [String] :ciphers Only use the specified SSL/TLS cipher suites; use OpenSSL cipher spec format e.g. 'HIGH:!aNULL:!3DES' or 'AES256-SHA:DES-CBC3-SHA'
+ # @option params [String] :proxy Proxy server; e.g. 'http://myproxy.com:8888'
+ # @option params [Fixnum] :retry_limit Set how many times we'll retry a failed request. (Default 4)
+ # @option params [Class] :instrumentor Responds to #instrument as in ActiveSupport::Notifications
+ # @option params [String] :instrumentor_name Name prefix for #instrument events. Defaults to 'excon'
+ def initialize(params = {})
+ @data = Excon.defaults.dup
+ # merge does not deep-dup, so make sure headers is not the original
+ @data[:headers] = @data[:headers].dup
+
+ # the same goes for :middlewares
+ @data[:middlewares] = @data[:middlewares].dup
+
+ params = validate_params(:connection, params)
+ @data.merge!(params)
+
+ setup_proxy
+
+ if ENV.has_key?('EXCON_STANDARD_INSTRUMENTOR')
+ @data[:instrumentor] = Excon::StandardInstrumentor
+ end
+
+ if @data[:debug] || ENV.has_key?('EXCON_DEBUG')
+ @data[:debug_request] = @data[:debug_response] = true
+ @data[:instrumentor] = Excon::StandardInstrumentor
+ end
+
+ if @data[:scheme] == UNIX
+ if @data[:host]
+ raise ArgumentError, "The `:host` parameter should not be set for `unix://` connections.\n" +
+ "When supplying a `unix://` URI, it should start with `unix:/` or `unix:///`."
+ elsif !@data[:socket]
+ raise ArgumentError, 'You must provide a `:socket` for `unix://` connections'
+ else
+ @socket_key = "#{@data[:scheme]}://#{@data[:socket]}"
+ end
+ else
+ @socket_key = "#{@data[:scheme]}://#{@data[:host]}#{port_string(@data)}"
+ end
+ reset
+ end
+
+ def error_call(datum)
+ if datum[:error]
+ raise(datum[:error])
+ end
+ end
+
+ def request_call(datum)
+ begin
+ if datum.has_key?(:response)
+ # we already have data from a middleware, so bail
+ return datum
+ else
+ socket.data = datum
+ # start with "METHOD /path"
+ request = datum[:method].to_s.upcase + ' '
+ if datum[:proxy] && datum[:scheme] != HTTPS
+ request << datum[:scheme] << '://' << datum[:host] << port_string(datum)
+ end
+ request << datum[:path]
+
+ # add query to path, if there is one
+ request << query_string(datum)
+
+ # finish first line with "HTTP/1.1\r\n"
+ request << HTTP_1_1
+
+ if datum.has_key?(:request_block)
+ datum[:headers]['Transfer-Encoding'] = 'chunked'
+ else
+ body = datum[:body].is_a?(String) ? StringIO.new(datum[:body]) : datum[:body]
+
+ # The HTTP spec isn't clear on it, but specifically, GET requests don't usually send bodies;
+ # if they don't, sending Content-Length:0 can cause issues.
+ unless datum[:method].to_s.casecmp('GET') == 0 && body.nil?
+ unless datum[:headers].has_key?('Content-Length')
+ datum[:headers]['Content-Length'] = detect_content_length(body)
+ end
+ end
+ end
+
+ # add headers to request
+ datum[:headers].each do |key, values|
+ [values].flatten.each do |value|
+ request << key.to_s << ': ' << value.to_s << CR_NL
+ end
+ end
+
+ # add additional "\r\n" to indicate end of headers
+ request << CR_NL
+
+ if datum.has_key?(:request_block)
+ socket.write(request) # write out request + headers
+ while true # write out body with chunked encoding
+ chunk = datum[:request_block].call
+ if FORCE_ENC
+ chunk.force_encoding('BINARY')
+ end
+ if chunk.length > 0
+ socket.write(chunk.length.to_s(16) << CR_NL << chunk << CR_NL)
+ else
+ socket.write(String.new("0#{CR_NL}#{CR_NL}"))
+ break
+ end
+ end
+ elsif body.nil?
+ socket.write(request) # write out request + headers
+ else # write out body
+ if body.respond_to?(:binmode)
+ body.binmode
+ end
+ if body.respond_to?(:rewind)
+ body.rewind rescue nil
+ end
+
+ # if request + headers is less than chunk size, fill with body
+ if FORCE_ENC
+ request.force_encoding('BINARY')
+ end
+ chunk = body.read([datum[:chunk_size] - request.length, 0].max)
+ if chunk
+ if FORCE_ENC
+ chunk.force_encoding('BINARY')
+ end
+ socket.write(request << chunk)
+ else
+ socket.write(request) # write out request + headers
+ end
+
+ while chunk = body.read(datum[:chunk_size])
+ socket.write(chunk)
+ end
+ end
+ end
+ rescue => error
+ case error
+ when Excon::Errors::StubNotFound, Excon::Errors::Timeout
+ raise(error)
+ else
+ raise_socket_error(error)
+ end
+ end
+
+ datum
+ end
+
+ def response_call(datum)
+ # ensure response_block is yielded to and body is empty from middlewares
+ if datum.has_key?(:response_block) && !datum[:response][:body].empty?
+ response_body = datum[:response][:body].dup
+ datum[:response][:body] = ''
+ content_length = remaining = response_body.bytesize
+ while remaining > 0
+ datum[:response_block].call(response_body.slice!(0, [datum[:chunk_size], remaining].min), [remaining - datum[:chunk_size], 0].max, content_length)
+ remaining -= datum[:chunk_size]
+ end
+ end
+ datum
+ end
+
+ # Sends the supplied request to the destination host.
+ # @yield [chunk] @see Response#self.parse
+ # @param [Hash<Symbol, >] params One or more optional params, override defaults set in Connection.new
+ # @option params [String] :body text to be sent over a socket
+ # @option params [Hash<Symbol, String>] :headers The default headers to supply in a request
+ # @option params [String] :path appears after 'scheme://host:port/'
+ # @option params [Hash] :query appended to the 'scheme://host:port/path/' in the form of '?key=value'
+ def request(params={}, &block)
+ params = validate_params(:request, params)
+ # @data has defaults, merge in new params to override
+ datum = @data.merge(params)
+ datum[:headers] = @data[:headers].merge(datum[:headers] || {})
+
+ if datum[:user] || datum[:password]
+ user, pass = Utils.unescape_form(datum[:user].to_s), Utils.unescape_form(datum[:password].to_s)
+ datum[:headers]['Authorization'] ||= 'Basic ' + ["#{user}:#{pass}"].pack('m').delete(Excon::CR_NL)
+ end
+
+ if datum[:scheme] == UNIX
+ datum[:headers]['Host'] = ''
+ else
+ datum[:headers]['Host'] ||= datum[:host] + port_string(datum)
+ end
+ datum[:retries_remaining] ||= datum[:retry_limit]
+
+ # if path is empty or doesn't start with '/', insert one
+ unless datum[:path][0, 1] == '/'
+ datum[:path] = datum[:path].dup.insert(0, '/')
+ end
+
+ if block_given?
+ Excon.display_warning('Excon requests with a block are deprecated, pass :response_block instead.')
+ datum[:response_block] = Proc.new
+ end
+
+ datum[:connection] = self
+
+ datum[:stack] = datum[:middlewares].map do |middleware|
+ lambda {|stack| middleware.new(stack)}
+ end.reverse.inject(self) do |middlewares, middleware|
+ middleware.call(middlewares)
+ end
+ datum = datum[:stack].request_call(datum)
+
+ unless datum[:pipeline]
+ datum = response(datum)
+
+ if datum[:persistent]
+ if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Connection') == 0 }
+ if datum[:response][:headers][key].casecmp('close') == 0
+ reset
+ end
+ end
+ else
+ reset
+ end
+
+ Excon::Response.new(datum[:response])
+ else
+ datum
+ end
+ rescue => error
+ reset
+ datum[:error] = error
+ if datum[:stack]
+ datum[:stack].error_call(datum)
+ else
+ raise error
+ end
+ end
+
+ # Sends the supplied requests to the destination host using pipelining.
+ # @pipeline_params [Array<Hash>] pipeline_params An array of one or more optional params, override defaults set in Connection.new, see #request for details
+ def requests(pipeline_params)
+ pipeline_params.each {|params| params.merge!(:pipeline => true, :persistent => true) }
+ pipeline_params.last.merge!(:persistent => @data[:persistent])
+
+ responses = pipeline_params.map do |params|
+ request(params)
+ end.map do |datum|
+ Excon::Response.new(response(datum)[:response])
+ end
+
+ if @data[:persistent]
+ if key = responses.last[:headers].keys.detect {|k| k.casecmp('Connection') == 0 }
+ if responses.last[:headers][key].casecmp('close') == 0
+ reset
+ end
+ end
+ else
+ reset
+ end
+
+ responses
+ end
+
+ def reset
+ if old_socket = sockets.delete(@socket_key)
+ old_socket.close rescue nil
+ end
+ end
+
+ # Generate HTTP request verb methods
+ Excon::HTTP_VERBS.each do |method|
+ class_eval <<-DEF, __FILE__, __LINE__ + 1
+ def #{method}(params={}, &block)
+ request(params.merge!(:method => :#{method}), &block)
+ end
+ DEF
+ end
+
+ def retry_limit=(new_retry_limit)
+ Excon.display_warning('Excon::Connection#retry_limit= is deprecated, pass :retry_limit to the initializer.')
+ @data[:retry_limit] = new_retry_limit
+ end
+
+ def retry_limit
+ Excon.display_warning('Excon::Connection#retry_limit is deprecated, use Excon::Connection#data[:retry_limit].')
+ @data[:retry_limit] ||= DEFAULT_RETRY_LIMIT
+ end
+
+ def inspect
+ vars = instance_variables.inject({}) do |accum, var|
+ accum.merge!(var.to_sym => instance_variable_get(var))
+ end
+ if vars[:'@data'][:headers].has_key?('Authorization')
+ vars[:'@data'] = vars[:'@data'].dup
+ vars[:'@data'][:headers] = vars[:'@data'][:headers].dup
+ vars[:'@data'][:headers]['Authorization'] = REDACTED
+ end
+ if vars[:'@data'][:password]
+ vars[:'@data'] = vars[:'@data'].dup
+ vars[:'@data'][:password] = REDACTED
+ end
+ inspection = '#<Excon::Connection:'
+ inspection += (object_id << 1).to_s(16)
+ vars.each do |key, value|
+ inspection += " #{key}=#{value.inspect}"
+ end
+ inspection += '>'
+ inspection
+ end
+
+ private
+
+ def detect_content_length(body)
+ if body.respond_to?(:size)
+ # IO object: File, Tempfile, StringIO, etc.
+ body.size
+ elsif body.respond_to?(:stat)
+ # for 1.8.7 where file does not have size
+ body.stat.size
+ else
+ 0
+ end
+ end
+
+ def validate_params(validation, params)
+ valid_keys = case validation
+ when :connection
+ Excon::VALID_CONNECTION_KEYS
+ when :request
+ Excon::VALID_REQUEST_KEYS
+ end
+ invalid_keys = params.keys - valid_keys
+ unless invalid_keys.empty?
+ Excon.display_warning("Invalid Excon #{validation} keys: #{invalid_keys.map(&:inspect).join(', ')}")
+ # FIXME: for now, just warn, don't mutate, give things (ie fog) a chance to catch up
+ #params = params.dup
+ #invalid_keys.each {|key| params.delete(key) }
+ end
+
+ if validation == :connection && params.key?(:host) && !params.key?(:hostname)
+ Excon.display_warning('hostname is missing! For IPv6 support, provide both host and hostname: Excon::Connection#new(:host => uri.host, :hostname => uri.hostname, ...).')
+ params[:hostname] = params[:host]
+ end
+
+ params
+ end
+
+ def response(datum={})
+ datum[:stack].response_call(datum)
+ rescue => error
+ case error
+ when Excon::Errors::HTTPStatusError, Excon::Errors::Timeout
+ raise(error)
+ else
+ raise_socket_error(error)
+ end
+ end
+
+ def socket
+ unix_proxy = @data[:proxy] ? @data[:proxy][:scheme] == UNIX : false
+ sockets[@socket_key] ||= if @data[:scheme] == UNIX || unix_proxy
+ Excon::UnixSocket.new(@data)
+ elsif @data[:ssl_uri_schemes].include?(@data[:scheme])
+ Excon::SSLSocket.new(@data)
+ else
+ Excon::Socket.new(@data)
+ end
+ end
+
+ def sockets
+ if @data[:thread_safe_sockets]
+ Thread.current[:_excon_sockets] ||= {}
+ else
+ @_excon_sockets ||= {}
+ end
+ end
+
+ def raise_socket_error(error)
+ if error.message =~ /certificate verify failed/
+ raise(Excon::Errors::CertificateError.new(error))
+ else
+ raise(Excon::Errors::SocketError.new(error))
+ end
+ end
+
+ def setup_proxy
+ if @data[:disable_proxy]
+ if @data[:proxy]
+ raise ArgumentError, "`:disable_proxy` parameter and `:proxy` parameter cannot both be set at the same time."
+ end
+ return
+ end
+
+ unless @data[:scheme] == UNIX
+ if no_proxy_env = ENV["no_proxy"] || ENV["NO_PROXY"]
+ no_proxy_list = no_proxy_env.scan(/\*?\.?([^\s,:]+)(?::(\d+))?/i).map { |s| [s[0], s[1]] }
+ end
+
+ unless no_proxy_env && no_proxy_list.index { |h| /(^|\.)#{h[0]}$/.match(@data[:host]) && (h[1].nil? || h[1].to_i == @data[:port]) }
+ if @data[:scheme] == HTTPS && (ENV.has_key?('https_proxy') || ENV.has_key?('HTTPS_PROXY'))
+ @data[:proxy] = ENV['https_proxy'] || ENV['HTTPS_PROXY']
+ elsif (ENV.has_key?('http_proxy') || ENV.has_key?('HTTP_PROXY'))
+ @data[:proxy] = ENV['http_proxy'] || ENV['HTTP_PROXY']
+ end
+ end
+
+ case @data[:proxy]
+ when nil
+ @data.delete(:proxy)
+ when ''
+ @data.delete(:proxy)
+ when Hash
+ # no processing needed
+ when String, URI
+ uri = @data[:proxy].is_a?(String) ? URI.parse(@data[:proxy]) : @data[:proxy]
+ @data[:proxy] = {
+ :host => uri.host,
+ :hostname => uri.hostname,
+ # path is only sensible for a Unix socket proxy
+ :path => uri.scheme == UNIX ? uri.path : nil,
+ :port => uri.port,
+ :scheme => uri.scheme,
+ }
+ if uri.password
+ @data[:proxy][:password] = uri.password
+ end
+ if uri.user
+ @data[:proxy][:user] = uri.user
+ end
+ if @data[:proxy][:scheme] == UNIX
+ if @data[:proxy][:host]
+ raise ArgumentError, "The `:host` parameter should not be set for `unix://` proxies.\n" +
+ "When supplying a `unix://` URI, it should start with `unix:/` or `unix:///`."
+ end
+ else
+ unless uri.host && uri.port && uri.scheme
+ raise Excon::Errors::ProxyParseError, "Proxy is invalid"
+ end
+ end
+ else
+ raise Excon::Errors::ProxyParseError, "Proxy is invalid"
+ end
+
+ if @data.has_key?(:proxy) && @data[:scheme] == 'http'
+ @data[:headers]['Proxy-Connection'] ||= 'Keep-Alive'
+ # https credentials happen in handshake
+ if @data[:proxy].has_key?(:user) || @data[:proxy].has_key?(:password)
+ user, pass = Utils.unescape_form(@data[:proxy][:user].to_s), Utils.unescape_form(@data[:proxy][:password].to_s)
+ auth = ["#{user}:#{pass}"].pack('m').delete(Excon::CR_NL)
+ @data[:headers]['Proxy-Authorization'] = 'Basic ' + auth
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/constants.rb b/lib/vendor/excon/lib/excon/constants.rb
new file mode 100644
index 0000000..2d786f9
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/constants.rb
@@ -0,0 +1,146 @@
+# frozen_string_literal: true
+module Excon
+
+ VERSION = '0.54.0'
+
+ CR_NL = "\r\n"
+
+ DEFAULT_CA_FILE = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "data", "cacert.pem"))
+
+ DEFAULT_CHUNK_SIZE = 1048576 # 1 megabyte
+
+ # avoid overwrite if somebody has redefined
+ unless const_defined?(:CHUNK_SIZE)
+ CHUNK_SIZE = DEFAULT_CHUNK_SIZE
+ end
+
+ DEFAULT_RETRY_LIMIT = 4
+
+ FORCE_ENC = CR_NL.respond_to?(:force_encoding)
+
+ HTTP_1_1 = " HTTP/1.1\r\n"
+
+ HTTP_VERBS = %w{connect delete get head options patch post put trace}
+
+ HTTPS = 'https'
+
+ NO_ENTITY = [204, 205, 304].freeze
+
+ REDACTED = 'REDACTED'
+
+ UNIX = 'unix'
+
+ USER_AGENT = "excon/#{VERSION}"
+
+ VERSIONS = "#{USER_AGENT} (#{RUBY_PLATFORM}) ruby/#{RUBY_VERSION}"
+
+ VALID_REQUEST_KEYS = [
+ :body,
+ :captures,
+ :chunk_size,
+ :debug_request,
+ :debug_response,
+ :expects,
+ :headers,
+ :idempotent,
+ :instrumentor,
+ :instrumentor_name,
+ :method,
+ :middlewares,
+ :mock,
+ :path,
+ :persistent,
+ :pipeline,
+ :query,
+ :read_timeout,
+ :request_block,
+ :response_block,
+ :retries_remaining, # used internally
+ :retry_limit,
+ :versions,
+ :write_timeout
+ ]
+
+ VALID_CONNECTION_KEYS = VALID_REQUEST_KEYS + [
+ :ciphers,
+ :client_key,
+ :client_key_pass,
+ :client_cert,
+ :certificate,
+ :certificate_path,
+ :disable_proxy,
+ :private_key,
+ :private_key_path,
+ :connect_timeout,
+ :family,
+ :host,
+ :hostname,
+ :omit_default_port,
+ :nonblock,
+ :reuseaddr,
+ :password,
+ :port,
+ :proxy,
+ :scheme,
+ :socket,
+ :ssl_ca_file,
+ :ssl_ca_path,
+ :ssl_cert_store,
+ :ssl_verify_callback,
+ :ssl_verify_peer,
+ :ssl_verify_peer_host,
+ :ssl_version,
+ :tcp_nodelay,
+ :thread_safe_sockets,
+ :uri_parser,
+ :user
+ ]
+
+ unless ::IO.const_defined?(:WaitReadable)
+ class ::IO
+ module WaitReadable; end
+ end
+ end
+
+ unless ::IO.const_defined?(:WaitWritable)
+ class ::IO
+ module WaitWritable; end
+ end
+ end
+ # these come last as they rely on the above
+ DEFAULTS = {
+ :chunk_size => CHUNK_SIZE || DEFAULT_CHUNK_SIZE,
+ # see https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28default.29
+ :ciphers => 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS',
+ :connect_timeout => 60,
+ :debug_request => false,
+ :debug_response => false,
+ :headers => {
+ 'User-Agent' => USER_AGENT
+ },
+ :idempotent => false,
+ :instrumentor_name => 'excon',
+ :middlewares => [
+ Excon::Middleware::ResponseParser,
+ Excon::Middleware::Expects,
+ Excon::Middleware::Idempotent,
+ Excon::Middleware::Instrumentor,
+ Excon::Middleware::Mock
+ ],
+ :mock => false,
+ :nonblock => true,
+ :omit_default_port => false,
+ :persistent => false,
+ :read_timeout => 60,
+ :retry_limit => DEFAULT_RETRY_LIMIT,
+ :ssl_verify_peer => true,
+ :ssl_uri_schemes => [HTTPS],
+ :stubs => :global,
+ :tcp_nodelay => false,
+ :thread_safe_sockets => true,
+ :uri_parser => URI,
+ :versions => VERSIONS,
+ :write_timeout => 60
+ }
+
+end
diff --git a/lib/vendor/excon/lib/excon/error.rb b/lib/vendor/excon/lib/excon/error.rb
new file mode 100644
index 0000000..757fe6e
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/error.rb
@@ -0,0 +1,215 @@
+# frozen_string_literal: true
+module Excon
+ # Excon exception classes
+ class Error < StandardError
+ @default_status_error = :HTTPStatus
+
+ class StubNotFound < Error; end
+ class InvalidStub < Error; end
+
+ # Socket related errors
+ class Socket < Error
+ attr_reader :socket_error
+
+ def initialize(socket_error = Excon::Error.new)
+ if is_a?(Certificate) || is_a?(Excon::Errors::CertificateError)
+ super
+ else
+ super("#{socket_error.message} (#{socket_error.class})")
+ set_backtrace(socket_error.backtrace)
+ @socket_error = socket_error
+ end
+ end
+ end
+
+ # Certificate related errors
+ class Certificate < Socket
+ def initialize(socket_error = Excon::Error.new)
+ msg = <<-EOL
+Unable to verify certificate. This may be an issue with the remote host or with Excon. Excon has certificates bundled, but these can be customized:
+
+ `Excon.defaults[:ssl_ca_path] = path_to_certs`
+ `ENV['SSL_CERT_DIR'] = path_to_certs`
+ `Excon.defaults[:ssl_ca_file] = path_to_file`
+ `ENV['SSL_CERT_FILE'] = path_to_file'
+ `Excon.defaults[:ssl_verify_callback] = callback`
+ (see OpenSSL::SSL::SSLContext#verify_callback)
+or:
+ `Excon.defaults[:ssl_verify_peer] = false` (less secure).
+ EOL
+ full_message = "#{socket_error.message} (#{socket_error.class})" +
+ ' ' + msg
+ super(full_message)
+ set_backtrace(socket_error.backtrace)
+ @socket_error = socket_error
+ end
+ end
+
+ class Timeout < Error; end
+ class ResponseParse < Error; end
+ class ProxyParse < Error; end
+ class ProxyConnection < Error; end
+
+ # Base class for HTTP Error classes
+ class HTTPStatus < Error
+ attr_reader :request, :response
+
+ def initialize(msg, request = nil, response = nil)
+ super(msg)
+ @request = request
+ @response = response
+ end
+ end
+
+ # HTTP Error classes
+ class Informational < HTTPStatus; end
+ class Success < HTTPStatus; end
+ class Redirection < HTTPStatus; end
+ class Client < HTTPStatus; end
+ class Server < HTTPStatus; end
+
+ class Continue < Informational; end # 100
+ class SwitchingProtocols < Informational; end # 101
+ class OK < Success; end # 200
+ class Created < Success; end # 201
+ class Accepted < Success; end # 202
+ class NonAuthoritativeInformation < Success; end # 203
+ class NoContent < Success; end # 204
+ class ResetContent < Success; end # 205
+ class PartialContent < Success; end # 206
+ class MultipleChoices < Redirection; end # 300
+ class MovedPermanently < Redirection; end # 301
+ class Found < Redirection; end # 302
+ class SeeOther < Redirection; end # 303
+ class NotModified < Redirection; end # 304
+ class UseProxy < Redirection; end # 305
+ class TemporaryRedirect < Redirection; end # 307
+ class BadRequest < Client; end # 400
+ class Unauthorized < Client; end # 401
+ class PaymentRequired < Client; end # 402
+ class Forbidden < Client; end # 403
+ class NotFound < Client; end # 404
+ class MethodNotAllowed < Client; end # 405
+ class NotAcceptable < Client; end # 406
+ class ProxyAuthenticationRequired < Client; end # 407
+ class RequestTimeout < Client; end # 408
+ class Conflict < Client; end # 409
+ class Gone < Client; end # 410
+ class LengthRequired < Client; end # 411
+ class PreconditionFailed < Client; end # 412
+ class RequestEntityTooLarge < Client; end # 413
+ class RequestURITooLong < Client; end # 414
+ class UnsupportedMediaType < Client; end # 415
+ class RequestedRangeNotSatisfiable < Client; end # 416
+ class ExpectationFailed < Client; end # 417
+ class UnprocessableEntity < Client; end # 422
+ class TooManyRequests < Client; end # 429
+ class InternalServerError < Server; end # 500
+ class NotImplemented < Server; end # 501
+ class BadGateway < Server; end # 502
+ class ServiceUnavailable < Server; end # 503
+ class GatewayTimeout < Server; end # 504
+
+ def self.status_errors
+ @status_errors ||= {
+ 100 => [Excon::Error::Continue, 'Continue'],
+ 101 => [Excon::Error::SwitchingProtocols, 'Switching Protocols'],
+ 200 => [Excon::Error::OK, 'OK'],
+ 201 => [Excon::Error::Created, 'Created'],
+ 202 => [Excon::Error::Accepted, 'Accepted'],
+ 203 => [Excon::Error::NonAuthoritativeInformation, 'Non-Authoritative Information'],
+ 204 => [Excon::Error::NoContent, 'No Content'],
+ 205 => [Excon::Error::ResetContent, 'Reset Content'],
+ 206 => [Excon::Error::PartialContent, 'Partial Content'],
+ 300 => [Excon::Error::MultipleChoices, 'Multiple Choices'],
+ 301 => [Excon::Error::MovedPermanently, 'Moved Permanently'],
+ 302 => [Excon::Error::Found, 'Found'],
+ 303 => [Excon::Error::SeeOther, 'See Other'],
+ 304 => [Excon::Error::NotModified, 'Not Modified'],
+ 305 => [Excon::Error::UseProxy, 'Use Proxy'],
+ 307 => [Excon::Error::TemporaryRedirect, 'Temporary Redirect'],
+ 400 => [Excon::Error::BadRequest, 'Bad Request'],
+ 401 => [Excon::Error::Unauthorized, 'Unauthorized'],
+ 402 => [Excon::Error::PaymentRequired, 'Payment Required'],
+ 403 => [Excon::Error::Forbidden, 'Forbidden'],
+ 404 => [Excon::Error::NotFound, 'Not Found'],
+ 405 => [Excon::Error::MethodNotAllowed, 'Method Not Allowed'],
+ 406 => [Excon::Error::NotAcceptable, 'Not Acceptable'],
+ 407 => [Excon::Error::ProxyAuthenticationRequired, 'Proxy Authentication Required'],
+ 408 => [Excon::Error::RequestTimeout, 'Request Timeout'],
+ 409 => [Excon::Error::Conflict, 'Conflict'],
+ 410 => [Excon::Error::Gone, 'Gone'],
+ 411 => [Excon::Error::LengthRequired, 'Length Required'],
+ 412 => [Excon::Error::PreconditionFailed, 'Precondition Failed'],
+ 413 => [Excon::Error::RequestEntityTooLarge, 'Request Entity Too Large'],
+ 414 => [Excon::Error::RequestURITooLong, 'Request-URI Too Long'],
+ 415 => [Excon::Error::UnsupportedMediaType, 'Unsupported Media Type'],
+ 416 => [Excon::Error::RequestedRangeNotSatisfiable, 'Request Range Not Satisfiable'],
+ 417 => [Excon::Error::ExpectationFailed, 'Expectation Failed'],
+ 422 => [Excon::Error::UnprocessableEntity, 'Unprocessable Entity'],
+ 429 => [Excon::Error::TooManyRequests, 'Too Many Requests'],
+ 500 => [Excon::Error::InternalServerError, 'InternalServerError'],
+ 501 => [Excon::Error::NotImplemented, 'Not Implemented'],
+ 502 => [Excon::Error::BadGateway, 'Bad Gateway'],
+ 503 => [Excon::Error::ServiceUnavailable, 'Service Unavailable'],
+ 504 => [Excon::Error::GatewayTimeout, 'Gateway Timeout']
+ }
+ end
+
+ # Messages for nicer exceptions, from rfc2616
+ def self.status_error(request, response)
+ error_class, error_message = status_errors[response[:status]]
+ if error_class.nil?
+ default_class = Excon::Error.const_get(@default_status_error)
+ error_class, error_message = [default_class, 'Unknown']
+ end
+ message = StringIO.new
+ str = "Expected(#{request[:expects].inspect}) <=>" +
+ " Actual(#{response[:status]} #{error_message})"
+ message.puts(str)
+ if request[:debug_request]
+ message.puts('excon.error.request')
+ Excon::PrettyPrinter.pp(message, request)
+ end
+
+ if request[:debug_response]
+ message.puts('excon.error.response')
+ Excon::PrettyPrinter.pp(message, response.data)
+ end
+ message.rewind
+ error_class.new(message.read, request, response)
+ end
+ end
+
+ # Legacy
+ module Errors
+ Excon::Errors::Error = Excon::Error
+
+ legacy_re = /
+ \A
+ Client
+ |Server
+ |Socket
+ |Certificate
+ |HTTPStatus
+ |InternalServer
+ \Z
+ /x
+
+ klasses = Excon::Error.constants.select do |c|
+ Excon::Error.const_get(c).is_a? Class
+ end
+
+ klasses.each do |klass|
+ class_name = klass.to_s
+ unless class_name =~ /Error\Z/
+ class_name = klass.to_s + 'Error' if class_name =~ legacy_re
+ end
+ Excon::Errors.const_set(class_name, Excon::Error.const_get(klass))
+ end
+
+ def self.status_error(request, response)
+ Excon::Error.status_error(request, response)
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/extensions/uri.rb b/lib/vendor/excon/lib/excon/extensions/uri.rb
new file mode 100644
index 0000000..eae9580
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/extensions/uri.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+# TODO: Remove this monkey patch once ruby 1.9.3+ is the minimum supported version.
+#
+# This patch backports URI#hostname to ruby 1.9.2 and older.
+# URI#hostname is used for IPv6 support in Excon.
+#
+# URI#hostname was added in stdlib in v1_9_3_0 in this commit:
+# https://github.com/ruby/ruby/commit/5fd45a4b79dd26f9e7b6dc41142912df911e4d7d
+#
+# Addressable::URI is also an URI parser accepted in some parts of Excon.
+# Addressable::URI#hostname was added in addressable-2.3.5+ in this commit:
+# https://github.com/sporkmonger/addressable/commit/1b94abbec1f914d5f707c92a10efbb9e69aab65e
+#
+# Users who want to use Addressable::URI to parse URIs must upgrade to 2.3.5 or newer.
+require 'uri'
+unless URI("http://foo/bar").respond_to?(:hostname)
+ module URI
+ class Generic
+ # extract the host part of the URI and unwrap brackets for IPv6 addresses.
+ #
+ # This method is same as URI::Generic#host except
+ # brackets for IPv6 (and future IP) addresses are removed.
+ #
+ # u = URI("http://[::1]/bar")
+ # p u.hostname #=> "::1"
+ # p u.host #=> "[::1]"
+ #
+ def hostname
+ v = self.host
+ /\A\[(.*)\]\z/ =~ v ? $1 : v
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/headers.rb b/lib/vendor/excon/lib/excon/headers.rb
new file mode 100644
index 0000000..e5de16e
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/headers.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+module Excon
+ class Headers < Hash
+
+ SENTINEL = {}
+
+ alias_method :raw_writer, :[]=
+ alias_method :raw_reader, :[]
+ if SENTINEL.respond_to?(:assoc)
+ alias_method :raw_assoc, :assoc
+ end
+ alias_method :raw_delete, :delete
+ alias_method :raw_fetch, :fetch
+ alias_method :raw_has_key?, :has_key?
+ alias_method :raw_include?, :include?
+ alias_method :raw_key?, :key?
+ alias_method :raw_member?, :member?
+ alias_method :raw_merge, :merge
+ alias_method :raw_merge!, :merge!
+ alias_method :raw_rehash, :rehash
+ alias_method :raw_store, :store
+ alias_method :raw_values_at, :values_at
+
+ def initialize
+ @downcased = {}
+ end
+
+ def [](key)
+ @downcased[key.to_s.downcase]
+ end
+
+ alias_method :[]=, :store
+ def []=(key, value)
+ raw_writer(key, value)
+ @downcased[key.to_s.downcase] = value
+ end
+
+ if SENTINEL.respond_to? :assoc
+ def assoc(obj)
+ @downcased.assoc(obj.downcase)
+ end
+ end
+
+ def delete(key, &proc)
+ raw_delete(key, &proc)
+ @downcased.delete(key.to_s.downcase, &proc)
+ end
+
+ def fetch(key, default = nil, &proc)
+ if proc
+ @downcased.fetch(key.to_s.downcase, &proc)
+ else
+ @downcased.fetch(key.to_s.downcase, default)
+ end
+ end
+
+ alias_method :has_key?, :key?
+ alias_method :has_key?, :member?
+ def has_key?(key)
+ raw_key?(key) || @downcased.has_key?(key.to_s.downcase)
+ end
+
+ def merge(other_hash)
+ self.dup.merge!(other_hash)
+ end
+
+ def merge!(other_hash)
+ other_hash.each do |key, value|
+ self[key] = value
+ end
+ raw_merge!(other_hash)
+ end
+
+ def rehash
+ @downcased.rehash
+ raw_rehash
+ end
+
+ def values_at(*keys)
+ @downcased.values_at(*keys.map {|key| key.to_s.downcase})
+ end
+
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/middlewares/base.rb b/lib/vendor/excon/lib/excon/middlewares/base.rb
new file mode 100644
index 0000000..a81dace
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/middlewares/base.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+module Excon
+ module Middleware
+ class Base
+ def initialize(stack)
+ @stack = stack
+ end
+
+ def error_call(datum)
+ # do stuff
+ @stack.error_call(datum)
+ end
+
+ def request_call(datum)
+ # do stuff
+ @stack.request_call(datum)
+ end
+
+ def response_call(datum)
+ @stack.response_call(datum)
+ # do stuff
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/middlewares/capture_cookies.rb b/lib/vendor/excon/lib/excon/middlewares/capture_cookies.rb
new file mode 100644
index 0000000..d39b34b
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/middlewares/capture_cookies.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+module Excon
+ module Middleware
+ class CaptureCookies < Excon::Middleware::Base
+
+ def extract_cookies_from_set_cookie(set_cookie)
+ set_cookie.split(',').map { |full| full.split(';').first.strip }.join('; ')
+ end
+
+ def get_header(datum, header)
+ _, header_value = datum[:response][:headers].detect do |key, value|
+ key.casecmp(header) == 0
+ end
+ header_value
+ end
+
+ def response_call(datum)
+ cookie = get_header(datum, 'Set-Cookie')
+ if cookie
+ cookie = extract_cookies_from_set_cookie(cookie)
+ unless datum[:headers].key?("Cookie")
+ datum[:headers]["Cookie"] = cookie
+ else
+ original_cookies = datum[:headers]["Cookie"]
+ datum[:headers]["Cookie"] = original_cookies.empty? ? cookie : [original_cookies,cookie].join('; ')
+ end
+ end
+ super(datum)
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/middlewares/decompress.rb b/lib/vendor/excon/lib/excon/middlewares/decompress.rb
new file mode 100644
index 0000000..a4976bf
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/middlewares/decompress.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+module Excon
+ module Middleware
+ class Decompress < Excon::Middleware::Base
+ def request_call(datum)
+ unless datum.has_key?(:response_block)
+ key = datum[:headers].keys.detect {|k| k.to_s.casecmp('Accept-Encoding') == 0 } || 'Accept-Encoding'
+ if datum[:headers][key].to_s.empty?
+ datum[:headers][key] = 'deflate, gzip'
+ end
+ end
+ @stack.request_call(datum)
+ end
+
+ def response_call(datum)
+ body = datum[:response][:body]
+ unless datum.has_key?(:response_block) || body.nil? || body.empty?
+ if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Content-Encoding') == 0 }
+ encodings = Utils.split_header_value(datum[:response][:headers][key])
+ if encoding = encodings.last
+ if encoding.casecmp('deflate') == 0
+ # assume inflate omits header
+ datum[:response][:body] = Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(body)
+ encodings.pop
+ elsif encoding.casecmp('gzip') == 0 || encoding.casecmp('x-gzip') == 0
+ datum[:response][:body] = Zlib::GzipReader.new(StringIO.new(body)).read
+ encodings.pop
+ end
+ datum[:response][:headers][key] = encodings.join(', ')
+ end
+ end
+ end
+ @stack.response_call(datum)
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/middlewares/escape_path.rb b/lib/vendor/excon/lib/excon/middlewares/escape_path.rb
new file mode 100644
index 0000000..33bed67
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/middlewares/escape_path.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+module Excon
+ module Middleware
+ class EscapePath < Excon::Middleware::Base
+ def request_call(datum)
+ # make sure path is encoded, prevent double encoding
+ datum[:path] = Excon::Utils.escape_uri(Excon::Utils.unescape_uri(datum[:path]))
+ @stack.request_call(datum)
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/middlewares/expects.rb b/lib/vendor/excon/lib/excon/middlewares/expects.rb
new file mode 100644
index 0000000..78721b4
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/middlewares/expects.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+module Excon
+ module Middleware
+ class Expects < Excon::Middleware::Base
+ def response_call(datum)
+ if datum.has_key?(:expects) && ![*datum[:expects]].include?(datum[:response][:status])
+ raise(
+ Excon::Errors.status_error(
+ datum.reject {|key,value| key == :response},
+ Excon::Response.new(datum[:response])
+ )
+ )
+ else
+ @stack.response_call(datum)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/middlewares/idempotent.rb b/lib/vendor/excon/lib/excon/middlewares/idempotent.rb
new file mode 100644
index 0000000..09257db
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/middlewares/idempotent.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+module Excon
+ module Middleware
+ class Idempotent < Excon::Middleware::Base
+ def error_call(datum)
+ if datum[:idempotent]
+ if datum.has_key?(:request_block)
+ if datum[:request_block].respond_to?(:rewind)
+ datum[:request_block].rewind
+ else
+ Excon.display_warning('Excon requests with a :request_block must implement #rewind in order to be :idempotent.')
+ datum[:idempotent] = false
+ end
+ end
+ if datum.has_key?(:pipeline)
+ Excon.display_warning("Excon requests can not be :idempotent when pipelining.")
+ datum[:idempotent] = false
+ end
+ end
+
+ if datum[:idempotent] && [Excon::Errors::Timeout, Excon::Errors::SocketError,
+ Excon::Errors::HTTPStatusError].any? {|ex| datum[:error].kind_of?(ex) } && datum[:retries_remaining] > 1
+ # reduces remaining retries, reset connection, and restart request_call
+ datum[:retries_remaining] -= 1
+ connection = datum.delete(:connection)
+ datum.reject! {|key, _| !Excon::VALID_REQUEST_KEYS.include?(key) }
+ connection.request(datum)
+ else
+ @stack.error_call(datum)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/middlewares/instrumentor.rb b/lib/vendor/excon/lib/excon/middlewares/instrumentor.rb
new file mode 100644
index 0000000..086016e
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/middlewares/instrumentor.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+module Excon
+ module Middleware
+ class Instrumentor < Excon::Middleware::Base
+ def error_call(datum)
+ if datum.has_key?(:instrumentor)
+ datum[:instrumentor].instrument("#{datum[:instrumentor_name]}.error", :error => datum[:error]) do
+ @stack.error_call(datum)
+ end
+ else
+ @stack.error_call(datum)
+ end
+ end
+
+ def request_call(datum)
+ if datum.has_key?(:instrumentor)
+ if datum[:retries_remaining] < datum[:retry_limit]
+ event_name = "#{datum[:instrumentor_name]}.retry"
+ else
+ event_name = "#{datum[:instrumentor_name]}.request"
+ end
+ datum[:instrumentor].instrument(event_name, datum) do
+ @stack.request_call(datum)
+ end
+ else
+ @stack.request_call(datum)
+ end
+ end
+
+ def response_call(datum)
+ if datum.has_key?(:instrumentor)
+ datum[:instrumentor].instrument("#{datum[:instrumentor_name]}.response", datum[:response]) do
+ @stack.response_call(datum)
+ end
+ else
+ @stack.response_call(datum)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/middlewares/mock.rb b/lib/vendor/excon/lib/excon/middlewares/mock.rb
new file mode 100644
index 0000000..f970456
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/middlewares/mock.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+module Excon
+ module Middleware
+ class Mock < Excon::Middleware::Base
+ def request_call(datum)
+ if datum[:mock]
+ # convert File/Tempfile body to string before matching:
+ if datum[:body].respond_to?(:read)
+ if datum[:body].respond_to?(:binmode)
+ datum[:body].binmode
+ end
+ if datum[:body].respond_to?(:rewind)
+ datum[:body].rewind
+ end
+ datum[:body] = datum[:body].read
+ elsif !datum[:body].nil? && !datum[:body].is_a?(String)
+ raise Excon::Errors::InvalidStub.new("Request body should be a string or an IO object. #{datum[:body].class} provided")
+ end
+
+ if stub = Excon.stub_for(datum)
+ datum[:response] = {
+ :body => '',
+ :headers => {},
+ :status => 200,
+ :remote_ip => '127.0.0.1'
+ }
+
+ stub_datum = case stub.last
+ when Proc
+ stub.last.call(datum)
+ else
+ stub.last
+ end
+
+ datum[:response].merge!(stub_datum.reject {|key,value| key == :headers})
+ if stub_datum.has_key?(:headers)
+ datum[:response][:headers].merge!(stub_datum[:headers])
+ end
+ elsif datum[:allow_unstubbed_requests] != true
+ # if we reach here no stubs matched
+ message = StringIO.new
+ message.puts('no stubs matched')
+ Excon::PrettyPrinter.pp(message, datum)
+ raise(Excon::Errors::StubNotFound.new(message.string))
+ end
+ end
+
+ @stack.request_call(datum)
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/middlewares/redirect_follower.rb b/lib/vendor/excon/lib/excon/middlewares/redirect_follower.rb
new file mode 100644
index 0000000..9c9b358
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/middlewares/redirect_follower.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+module Excon
+ module Middleware
+ class RedirectFollower < Excon::Middleware::Base
+
+ def get_header(datum, header)
+ _, header_value = datum[:response][:headers].detect do |key, value|
+ key.casecmp(header) == 0
+ end
+ header_value
+ end
+
+ def response_call(datum)
+ if datum.has_key?(:response)
+ case datum[:response][:status]
+ when 301, 302, 303, 307, 308
+ uri_parser = datum[:uri_parser] || Excon.defaults[:uri_parser]
+
+ location = get_header(datum, 'Location')
+ uri = uri_parser.parse(location)
+
+ # delete old/redirect response
+ response = datum.delete(:response)
+
+ params = datum.dup
+ params.delete(:connection)
+ params.delete(:password)
+ params.delete(:stack)
+ params.delete(:user)
+
+ if [301, 302, 303].include?(response[:status])
+ params[:method] = :get
+ params.delete(:body)
+ params[:headers].delete('Content-Length')
+ end
+ params[:headers] = datum[:headers].dup
+ params[:headers].delete('Authorization')
+ params[:headers].delete('Proxy-Connection')
+ params[:headers].delete('Proxy-Authorization')
+ params[:headers].delete('Host')
+ params.merge!(
+ :scheme => uri.scheme || datum[:scheme],
+ :host => uri.host || datum[:host],
+ :hostname => uri.hostname || datum[:hostname],
+ :port => uri.port || datum[:port],
+ :path => uri.path,
+ :query => uri.query
+ )
+
+ params.merge!(:user => Utils.unescape_uri(uri.user)) if uri.user
+ params.merge!(:password => Utils.unescape_uri(uri.password)) if uri.password
+
+ response = Excon::Connection.new(params).request
+ datum.merge!({:response => response.data})
+ else
+ @stack.response_call(datum)
+ end
+ else
+ @stack.response_call(datum)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/middlewares/response_parser.rb b/lib/vendor/excon/lib/excon/middlewares/response_parser.rb
new file mode 100644
index 0000000..852903d
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/middlewares/response_parser.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+module Excon
+ module Middleware
+ class ResponseParser < Excon::Middleware::Base
+ def response_call(datum)
+ unless datum.has_key?(:response)
+ datum = Excon::Response.parse(datum[:connection].send(:socket), datum)
+ end
+ @stack.response_call(datum)
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/pretty_printer.rb b/lib/vendor/excon/lib/excon/pretty_printer.rb
new file mode 100644
index 0000000..0ba2e2b
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/pretty_printer.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+module Excon
+ class PrettyPrinter
+ def self.pp(io, datum, indent=0)
+ datum = datum.dup
+
+ # reduce duplication/noise of output
+ unless datum.is_a?(Excon::Headers)
+ datum.delete(:connection)
+ datum.delete(:stack)
+
+ if datum.has_key?(:headers) && datum[:headers].has_key?('Authorization')
+ datum[:headers] = datum[:headers].dup
+ datum[:headers]['Authorization'] = REDACTED
+ end
+
+ if datum.has_key?(:password)
+ datum[:password] = REDACTED
+ end
+ end
+
+ indent += 2
+ max_key_length = datum.keys.map {|key| key.inspect.length}.max
+ datum.keys.sort_by {|key| key.to_s}.each do |key|
+ value = datum[key]
+ io.write("#{' ' * indent}#{key.inspect.ljust(max_key_length)} => ")
+ case value
+ when Array
+ io.puts("[")
+ value.each do |v|
+ io.puts("#{' ' * indent} #{v.inspect}")
+ end
+ io.write("#{' ' * indent}]")
+ when Hash
+ io.puts("{")
+ self.pp(io, value, indent)
+ io.write("#{' ' * indent}}")
+ else
+ io.write("#{value.inspect}")
+ end
+ io.puts
+ end
+ indent -= 2
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/response.rb b/lib/vendor/excon/lib/excon/response.rb
new file mode 100644
index 0000000..8e9c03f
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/response.rb
@@ -0,0 +1,231 @@
+# frozen_string_literal: true
+module Excon
+ class Response
+
+ attr_accessor :data
+
+ # backwards compatability reader/writers
+ def body=(new_body)
+ @data[:body] = new_body
+ end
+ def body
+ @data[:body]
+ end
+ def headers=(new_headers)
+ @data[:headers] = new_headers
+ end
+ def headers
+ @data[:headers]
+ end
+ def host
+ @data[:host]
+ end
+ def local_address
+ @data[:local_address]
+ end
+ def local_port
+ @data[:local_port]
+ end
+ def path
+ @data[:path]
+ end
+ def port
+ @data[:port]
+ end
+ def reason_phrase=(new_reason_phrase)
+ @data[:reason_phrase] = new_reason_phrase
+ end
+ def reason_phrase
+ @data[:reason_phrase]
+ end
+ def remote_ip=(new_remote_ip)
+ @data[:remote_ip] = new_remote_ip
+ end
+ def remote_ip
+ @data[:remote_ip]
+ end
+ def status=(new_status)
+ @data[:status] = new_status
+ end
+ def status
+ @data[:status]
+ end
+ def status_line
+ @data[:status_line]
+ end
+ def status_line=(new_status_line)
+ @data[:status_line] = new_status_line
+ end
+
+ def self.parse(socket, datum)
+ # this will discard any trailing lines from the previous response if any.
+ begin
+ line = socket.readline
+ end until status = line[9, 3].to_i
+
+ reason_phrase = line[13..-3] # -3 strips the trailing "\r\n"
+
+ datum[:response] = {
+ :body => String.new,
+ :cookies => [],
+ :host => datum[:host],
+ :headers => Excon::Headers.new,
+ :path => datum[:path],
+ :port => datum[:port],
+ :status => status,
+ :status_line => line,
+ :reason_phrase => reason_phrase
+ }
+
+ unix_proxy = datum[:proxy] ? datum[:proxy][:scheme] == UNIX : false
+ unless datum[:scheme] == UNIX || unix_proxy
+ datum[:response].merge!(
+ :remote_ip => socket.remote_ip,
+ :local_port => socket.local_port,
+ :local_address => socket.local_address
+ )
+ end
+
+ parse_headers(socket, datum)
+
+ unless (['HEAD', 'CONNECT'].include?(datum[:method].to_s.upcase)) || NO_ENTITY.include?(datum[:response][:status])
+
+ if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Transfer-Encoding') == 0 }
+ encodings = Utils.split_header_value(datum[:response][:headers][key])
+ if (encoding = encodings.last) && encoding.casecmp('chunked') == 0
+ transfer_encoding_chunked = true
+ if encodings.length == 1
+ datum[:response][:headers].delete(key)
+ else
+ datum[:response][:headers][key] = encodings[0...-1].join(', ')
+ end
+ end
+ end
+
+ # use :response_block unless :expects would fail
+ if response_block = datum[:response_block]
+ if datum[:middlewares].include?(Excon::Middleware::Expects) && datum[:expects] &&
+ !Array(datum[:expects]).include?(datum[:response][:status])
+ response_block = nil
+ end
+ end
+
+ if transfer_encoding_chunked
+ if response_block
+ while (chunk_size = socket.readline.chomp!.to_i(16)) > 0
+ while chunk_size > 0
+ chunk = socket.read(chunk_size) || raise(EOFError)
+ chunk_size -= chunk.bytesize
+ response_block.call(chunk, nil, nil)
+ end
+ new_line_size = 2 # 2 == "\r\n".length
+ while new_line_size > 0
+ chunk = socket.read(new_line_size) || raise(EOFError)
+ new_line_size -= chunk.length
+ end
+ end
+ else
+ while (chunk_size = socket.readline.chomp!.to_i(16)) > 0
+ while chunk_size > 0
+ chunk = socket.read(chunk_size) || raise(EOFError)
+ chunk_size -= chunk.bytesize
+ datum[:response][:body] << chunk
+ end
+ new_line_size = 2 # 2 == "\r\n".length
+ while new_line_size > 0
+ chunk = socket.read(new_line_size) || raise(EOFError)
+ new_line_size -= chunk.length
+ end
+ end
+ end
+ parse_headers(socket, datum) # merge trailers into headers
+ else
+ if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Content-Length') == 0 }
+ content_length = datum[:response][:headers][key].to_i
+ end
+
+ if remaining = content_length
+ if response_block
+ while remaining > 0
+ chunk = socket.read([datum[:chunk_size], remaining].min) || raise(EOFError)
+ response_block.call(chunk, [remaining - chunk.bytesize, 0].max, content_length)
+ remaining -= chunk.bytesize
+ end
+ else
+ while remaining > 0
+ chunk = socket.read([datum[:chunk_size], remaining].min) || raise(EOFError)
+ datum[:response][:body] << chunk
+ remaining -= chunk.bytesize
+ end
+ end
+ else
+ if response_block
+ while chunk = socket.read(datum[:chunk_size])
+ response_block.call(chunk, nil, nil)
+ end
+ else
+ while chunk = socket.read(datum[:chunk_size])
+ datum[:response][:body] << chunk
+ end
+ end
+ end
+ end
+ end
+ datum
+ end
+
+ def self.parse_headers(socket, datum)
+ last_key = nil
+ until (data = socket.readline.chomp).empty?
+ if !data.lstrip!.nil?
+ raise Excon::Errors::ResponseParseError, 'malformed header' unless last_key
+ # append to last_key's last value
+ datum[:response][:headers][last_key] << ' ' << data.rstrip
+ else
+ key, value = data.split(':', 2)
+ raise Excon::Errors::ResponseParseError, 'malformed header' unless value
+ # add key/value or append value to existing values
+ datum[:response][:headers][key] = ([datum[:response][:headers][key]] << value.strip).compact.join(', ')
+ if key.casecmp('Set-Cookie') == 0
+ datum[:response][:cookies] << value.strip
+ end
+ last_key = key
+ end
+ end
+ end
+
+ def initialize(params={})
+ @data = {
+ :body => ''
+ }.merge(params)
+ @data[:headers] = Excon::Headers.new.merge!(params[:headers] || {})
+
+ @body = @data[:body]
+ @headers = @data[:headers]
+ @status = @data[:status]
+ @remote_ip = @data[:remote_ip]
+ @local_port = @data[:local_port]
+ @local_address = @data[:local_address]
+ end
+
+ def [](key)
+ @data[key]
+ end
+
+ def params
+ Excon.display_warning('Excon::Response#params is deprecated use Excon::Response#data instead.')
+ data
+ end
+
+ def pp
+ Excon::PrettyPrinter.pp($stdout, @data)
+ end
+
+ # Retrieve a specific header value. Header names are treated case-insensitively.
+ # @param [String] name Header name
+ def get_header(name)
+ headers[name]
+ end
+
+ end # class Response
+end # module Excon
diff --git a/lib/vendor/excon/lib/excon/socket.rb b/lib/vendor/excon/lib/excon/socket.rb
new file mode 100644
index 0000000..a753309
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/socket.rb
@@ -0,0 +1,278 @@
+# frozen_string_literal: true
+module Excon
+ class Socket
+ include Utils
+
+ extend Forwardable
+
+ attr_accessor :data
+
+ def params
+ Excon.display_warning('Excon::Socket#params is deprecated use Excon::Socket#data instead.')
+ @data
+ end
+
+ def params=(new_params)
+ Excon.display_warning('Excon::Socket#params= is deprecated use Excon::Socket#data= instead.')
+ @data = new_params
+ end
+
+ attr_reader :remote_ip
+
+ def_delegators(:@socket, :close)
+
+ def initialize(data = {})
+ @data = data
+ @nonblock = data[:nonblock]
+ @read_buffer = String.new
+ @eof = false
+ connect
+ end
+
+ def read(max_length = nil)
+ if @eof
+ return max_length ? nil : ''
+ elsif @nonblock
+ read_nonblock(max_length)
+ else
+ read_block(max_length)
+ end
+ end
+
+ def readline
+ return legacy_readline if RUBY_VERSION.to_f <= 1.8_7
+ buffer = String.new
+ begin
+ buffer << @socket.read_nonblock(1) while buffer[-1] != "\n"
+ buffer
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
+ select_with_timeout(@socket, :read) && retry
+ rescue OpenSSL::SSL::SSLError => error
+ if error.message == 'read would block'
+ select_with_timeout(@socket, :read) && retry
+ else
+ raise(error)
+ end
+ end
+ end
+
+ def legacy_readline
+ begin
+ Timeout.timeout(@data[:read_timeout]) do
+ @socket.readline
+ end
+ rescue Timeout::Error
+ raise Excon::Errors::Timeout.new('read timeout reached')
+ end
+ end
+
+ def write(data)
+ if @nonblock
+ write_nonblock(data)
+ else
+ write_block(data)
+ end
+ end
+
+ def local_address
+ unpacked_sockaddr[1]
+ end
+
+ def local_port
+ unpacked_sockaddr[0]
+ end
+
+ private
+
+ def connect
+ @socket = nil
+ exception = nil
+
+ if @data[:proxy]
+ family = @data[:proxy][:family] || ::Socket::Constants::AF_UNSPEC
+ args = [@data[:proxy][:hostname], @data[:proxy][:port], family, ::Socket::Constants::SOCK_STREAM]
+ else
+ family = @data[:family] || ::Socket::Constants::AF_UNSPEC
+ args = [@data[:hostname], @data[:port], family, ::Socket::Constants::SOCK_STREAM]
+ end
+ if RUBY_VERSION >= '1.9.2' && defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby'
+ args << nil << nil << false # no reverse lookup
+ end
+ addrinfo = ::Socket.getaddrinfo(*args)
+
+ addrinfo.each do |_, port, _, ip, a_family, s_type|
+ @remote_ip = ip
+
+ # already succeeded on previous addrinfo
+ if @socket
+ break
+ end
+
+ # nonblocking connect
+ begin
+ sockaddr = ::Socket.sockaddr_in(port, ip)
+
+ socket = ::Socket.new(a_family, s_type, 0)
+
+ if @data[:reuseaddr]
+ socket.setsockopt(::Socket::Constants::SOL_SOCKET, ::Socket::Constants::SO_REUSEADDR, true)
+ if defined?(::Socket::Constants::SO_REUSEPORT)
+ socket.setsockopt(::Socket::Constants::SOL_SOCKET, ::Socket::Constants::SO_REUSEPORT, true)
+ end
+ end
+
+ if @nonblock
+ socket.connect_nonblock(sockaddr)
+ else
+ socket.connect(sockaddr)
+ end
+ @socket = socket
+ rescue Errno::EINPROGRESS
+ select_with_timeout(socket, :connect_write)
+ begin
+ socket.connect_nonblock(sockaddr)
+ @socket = socket
+ rescue Errno::EISCONN
+ @socket = socket
+ rescue SystemCallError => exception
+ socket.close rescue nil
+ end
+ rescue SystemCallError => exception
+ socket.close rescue nil if socket
+ end
+ end
+
+ # this will be our last encountered exception
+ fail exception unless @socket
+
+ if @data[:tcp_nodelay]
+ @socket.setsockopt(::Socket::IPPROTO_TCP,
+ ::Socket::TCP_NODELAY,
+ true)
+ end
+ end
+
+ def read_nonblock(max_length)
+ begin
+ if max_length
+ until @read_buffer.length >= max_length
+ @read_buffer << @socket.read_nonblock(max_length - @read_buffer.length)
+ end
+ else
+ loop do
+ @read_buffer << @socket.read_nonblock(@data[:chunk_size])
+ end
+ end
+ rescue OpenSSL::SSL::SSLError => error
+ if error.message == 'read would block'
+ select_with_timeout(@socket, :read) && retry
+ else
+ raise(error)
+ end
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
+ if @read_buffer.empty?
+ # if we didn't read anything, try again...
+ select_with_timeout(@socket, :read) && retry
+ end
+ rescue EOFError
+ @eof = true
+ end
+
+ if max_length
+ if @read_buffer.empty?
+ nil # EOF met at beginning
+ else
+ @read_buffer.slice!(0, max_length)
+ end
+ else
+ # read until EOFError, so return everything
+ @read_buffer.slice!(0, @read_buffer.length)
+ end
+ end
+
+ def read_block(max_length)
+ @socket.read(max_length)
+ rescue OpenSSL::SSL::SSLError => error
+ if error.message == 'read would block'
+ select_with_timeout(@socket, :read) && retry
+ else
+ raise(error)
+ end
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
+ if @read_buffer.empty?
+ select_with_timeout(@socket, :read) && retry
+ end
+ rescue EOFError
+ @eof = true
+ end
+
+ def write_nonblock(data)
+ if FORCE_ENC
+ data.force_encoding('BINARY')
+ end
+ loop do
+ written = nil
+ begin
+ # I wish that this API accepted a start position, then we wouldn't
+ # have to slice data when there is a short write.
+ written = @socket.write_nonblock(data)
+ rescue Errno::EFAULT => error
+ if OpenSSL.const_defined?(:OPENSSL_LIBRARY_VERSION) && OpenSSL::OPENSSL_LIBRARY_VERSION.split(' ')[1] == '1.0.2'
+ msg = "The version of OpenSSL this ruby is built against (1.0.2) has a vulnerability
+ which causes a fault. For more, see https://github.com/excon/excon/issues/467"
+ raise SecurityError.new(msg)
+ else
+ raise error
+ end
+ rescue OpenSSL::SSL::SSLError, Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitWritable => error
+ if error.is_a?(OpenSSL::SSL::SSLError) && error.message != 'write would block'
+ raise error
+ else
+ select_with_timeout(@socket, :write) && retry
+ end
+ end
+
+ # Fast, common case.
+ break if written == data.size
+
+ # This takes advantage of the fact that most ruby implementations
+ # have Copy-On-Write strings. Thusly why requesting a subrange
+ # of data, we actually don't copy data because the new string
+ # simply references a subrange of the original.
+ data = data[written, data.size]
+ end
+ end
+
+ def write_block(data)
+ @socket.write(data)
+ rescue OpenSSL::SSL::SSLError, Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitWritable => error
+ if error.is_a?(OpenSSL::SSL::SSLError) && error.message != 'write would block'
+ raise error
+ else
+ select_with_timeout(@socket, :write) && retry
+ end
+ end
+
+ def select_with_timeout(socket, type)
+ select = case type
+ when :connect_read
+ IO.select([socket], nil, nil, @data[:connect_timeout])
+ when :connect_write
+ IO.select(nil, [socket], nil, @data[:connect_timeout])
+ when :read
+ IO.select([socket], nil, nil, @data[:read_timeout])
+ when :write
+ IO.select(nil, [socket], nil, @data[:write_timeout])
+ end
+ select || raise(Excon::Errors::Timeout.new("#{type} timeout reached"))
+ end
+
+ def unpacked_sockaddr
+ @unpacked_sockaddr ||= ::Socket.unpack_sockaddr_in(@socket.to_io.getsockname)
+ rescue ArgumentError => e
+ unless e.message == 'not an AF_INET/AF_INET6 sockaddr'
+ raise
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/ssl_socket.rb b/lib/vendor/excon/lib/excon/ssl_socket.rb
new file mode 100644
index 0000000..dc65d86
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/ssl_socket.rb
@@ -0,0 +1,172 @@
+# frozen_string_literal: true
+module Excon
+ class SSLSocket < Socket
+ HAVE_NONBLOCK = [:connect_nonblock, :read_nonblock, :write_nonblock].all? do |m|
+ OpenSSL::SSL::SSLSocket.public_method_defined?(m)
+ end
+
+ def initialize(data = {})
+ super
+
+ # create ssl context
+ ssl_context = OpenSSL::SSL::SSLContext.new
+
+ # disable less secure options, when supported
+ ssl_context_options = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options]
+ if defined?(OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS)
+ ssl_context_options &= ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS
+ end
+
+ if defined?(OpenSSL::SSL::OP_NO_COMPRESSION)
+ ssl_context_options |= OpenSSL::SSL::OP_NO_COMPRESSION
+ end
+ ssl_context.options = ssl_context_options
+
+ ssl_context.ciphers = @data[:ciphers]
+ if @data[:ssl_version]
+ ssl_context.ssl_version = @data[:ssl_version]
+ end
+
+ if @data[:ssl_verify_peer]
+ # turn verification on
+ ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER
+
+ if ca_file = @data[:ssl_ca_file] || ENV['SSL_CERT_FILE']
+ ssl_context.ca_file = ca_file
+ end
+ if ca_path = @data[:ssl_ca_path] || ENV['SSL_CERT_DIR']
+ ssl_context.ca_path = ca_path
+ end
+ if cert_store = @data[:ssl_cert_store]
+ ssl_context.cert_store = cert_store
+ end
+
+ # no defaults, fallback to bundled
+ unless ca_file || ca_path || cert_store
+ ssl_context.cert_store = OpenSSL::X509::Store.new
+ ssl_context.cert_store.set_default_paths
+
+ # workaround issue #257 (JRUBY-6970)
+ ca_file = DEFAULT_CA_FILE
+ ca_file = ca_file.gsub(/^jar:/, '') if ca_file =~ /^jar:file:\//
+
+ begin
+ ssl_context.cert_store.add_file(ca_file)
+ rescue
+ Excon.display_warning("Excon unable to add file to cert store, ignoring: #{ca_file}\n[#{$!.class}] #{$!.message}")
+ end
+ end
+
+ if verify_callback = @data[:ssl_verify_callback]
+ ssl_context.verify_callback = verify_callback
+ end
+ else
+ # turn verification off
+ ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
+ end
+
+ if client_cert_data && client_key_data
+ ssl_context.cert = OpenSSL::X509::Certificate.new client_cert_data
+ if OpenSSL::PKey.respond_to? :read
+ ssl_context.key = OpenSSL::PKey.read(client_key_data, client_key_pass)
+ else
+ ssl_context.key = OpenSSL::PKey::RSA.new(client_key_data, client_key_pass)
+ end
+ elsif @data.key?(:certificate) && @data.key?(:private_key)
+ ssl_context.cert = OpenSSL::X509::Certificate.new(@data[:certificate])
+ if OpenSSL::PKey.respond_to? :read
+ ssl_context.key = OpenSSL::PKey.read(@data[:private_key], client_key_pass)
+ else
+ ssl_context.key = OpenSSL::PKey::RSA.new(@data[:private_key], client_key_pass)
+ end
+ end
+
+ if @data[:proxy]
+ request = "CONNECT #{@data[:host]}#{port_string(@data.merge(:omit_default_port => false))}#{Excon::HTTP_1_1}" +
+ "Host: #{@data[:host]}#{port_string(@data)}#{Excon::CR_NL}"
+
+ if @data[:proxy][:password] || @data[:proxy][:user]
+ auth = ["#{@data[:proxy][:user]}:#{@data[:proxy][:password]}"].pack('m').delete(Excon::CR_NL)
+ request += "Proxy-Authorization: Basic #{auth}#{Excon::CR_NL}"
+ end
+
+ request += "Proxy-Connection: Keep-Alive#{Excon::CR_NL}"
+
+ request += Excon::CR_NL
+
+ # write out the proxy setup request
+ @socket.write(request)
+
+ # eat the proxy's connection response
+ Excon::Response.parse(self, :expects => 200, :method => 'CONNECT')
+ end
+
+ # convert Socket to OpenSSL::SSL::SSLSocket
+ @socket = OpenSSL::SSL::SSLSocket.new(@socket, ssl_context)
+ @socket.sync_close = true
+
+ # Server Name Indication (SNI) RFC 3546
+ if @socket.respond_to?(:hostname=)
+ @socket.hostname = @data[:host]
+ end
+
+ begin
+ if @nonblock
+ begin
+ @socket.connect_nonblock
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
+ select_with_timeout(@socket, :connect_read) && retry
+ rescue IO::WaitWritable
+ select_with_timeout(@socket, :connect_write) && retry
+ end
+ else
+ @socket.connect
+ end
+ rescue Errno::ETIMEDOUT, Timeout::Error
+ raise Excon::Errors::Timeout.new('connect timeout reached')
+ end
+
+ # verify connection
+ if @data[:ssl_verify_peer]
+ @socket.post_connection_check(@data[:ssl_verify_peer_host] || @data[:host])
+ end
+
+ @socket
+ end
+
+ private
+
+ def client_cert_data
+ @client_cert_data ||= if ccd = @data[:client_cert_data]
+ ccd
+ elsif path = @data[:client_cert]
+ File.read path
+ elsif path = @data[:certificate_path]
+ warn ":certificate_path is no longer supported and will be deprecated. Please use :client_cert or :client_cert_data"
+ File.read path
+ end
+ end
+
+ def connect
+ # backwards compatability for things lacking nonblock
+ @nonblock = HAVE_NONBLOCK && @nonblock
+ super
+ end
+
+ def client_key_data
+ @client_key_data ||= if ckd = @data[:client_key_data]
+ ckd
+ elsif path = @data[:client_key]
+ File.read path
+ elsif path = @data[:private_key_path]
+ warn ":private_key_path is no longer supported and will be deprecated. Please use :client_key or :client_key_data"
+ File.read path
+ end
+ end
+
+ def client_key_pass
+ @data[:client_key_pass] || @data[:private_key_pass]
+ end
+
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/standard_instrumentor.rb b/lib/vendor/excon/lib/excon/standard_instrumentor.rb
new file mode 100644
index 0000000..575a42c
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/standard_instrumentor.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+module Excon
+ class StandardInstrumentor
+ def self.instrument(name, params = {}, &block)
+ params = params.dup
+
+ # reduce duplication/noise of output
+ params.delete(:connection)
+ params.delete(:stack)
+
+ if params.has_key?(:headers) && params[:headers].has_key?('Authorization')
+ params[:headers] = params[:headers].dup
+ params[:headers]['Authorization'] = REDACTED
+ end
+
+ if params.has_key?(:password)
+ params[:password] = REDACTED
+ end
+
+ $stderr.puts(name)
+ Excon::PrettyPrinter.pp($stderr, params)
+
+ if block_given?
+ yield
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/test/plugin/server/exec.rb b/lib/vendor/excon/lib/excon/test/plugin/server/exec.rb
new file mode 100644
index 0000000..ba12e24
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/test/plugin/server/exec.rb
@@ -0,0 +1,23 @@
+module Excon
+ module Test
+ module Plugin
+ module Server
+ module Exec
+ def start(app_str = app)
+ line = ''
+ open_process(app)
+ until line =~ /\Aready\Z/
+ line = error.gets
+ fatal_time = elapsed_time > timeout
+ if fatal_time
+ msg = "executable #{app} has taken too long to start"
+ raise msg
+ end
+ end
+ true
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/test/plugin/server/puma.rb b/lib/vendor/excon/lib/excon/test/plugin/server/puma.rb
new file mode 100644
index 0000000..d87a8af
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/test/plugin/server/puma.rb
@@ -0,0 +1,20 @@
+module Excon
+ module Test
+ module Plugin
+ module Server
+ module Puma
+ def start(app_str = app, bind_uri = bind)
+ open_process('puma', '-b', bind_uri.to_s, app_str)
+ line = ''
+ until line =~ /Use Ctrl-C to stop/
+ line = read.gets
+ fatal_time = elapsed_time > timeout
+ raise 'puma server has taken too long to start' if fatal_time
+ end
+ true
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/test/plugin/server/unicorn.rb b/lib/vendor/excon/lib/excon/test/plugin/server/unicorn.rb
new file mode 100644
index 0000000..990502d
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/test/plugin/server/unicorn.rb
@@ -0,0 +1,35 @@
+module Excon
+ module Test
+ module Plugin
+ module Server
+ module Unicorn
+ def start(app_str = app, bind_uri = bind)
+ bind_uri = URI.parse(bind_uri) unless bind_uri.is_a? URI::Generic
+ is_unix_socket = (bind_uri.scheme == "unix")
+ if is_unix_socket
+ bind_str = bind_uri.to_s
+ else
+ host = bind_uri.host.gsub(/[\[\]]/, '')
+ bind_str = "#{host}:#{bind_uri.port}"
+ end
+ args = [
+ 'unicorn',
+ '--no-default-middleware',
+ '-l',
+ bind_str,
+ app_str
+ ]
+ open_process(*args)
+ line = ''
+ until line =~ /worker\=0 ready/
+ line = error.gets
+ fatal_time = elapsed_time > timeout
+ raise 'unicorn server has taken too long to start' if fatal_time
+ end
+ true
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/test/plugin/server/webrick.rb b/lib/vendor/excon/lib/excon/test/plugin/server/webrick.rb
new file mode 100644
index 0000000..19354d5
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/test/plugin/server/webrick.rb
@@ -0,0 +1,23 @@
+module Excon
+ module Test
+ module Plugin
+ module Server
+ module Webrick
+ def start(app_str = app, bind_uri = bind)
+ bind_uri = URI.parse(bind_uri) unless bind_uri.is_a? URI::Generic
+ host = bind_uri.host.gsub(/[\[\]]/, '')
+ port = bind_uri.port.to_s
+ open_process('rackup', '-s', 'webrick', '--host', host, '--port', port, app_str)
+ line = ''
+ until line =~ /HTTPServer#start/
+ line = error.gets
+ fatal_time = elapsed_time > timeout
+ raise 'webrick server has taken too long to start' if fatal_time
+ end
+ true
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/test/server.rb b/lib/vendor/excon/lib/excon/test/server.rb
new file mode 100644
index 0000000..1d4a117
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/test/server.rb
@@ -0,0 +1,106 @@
+require 'open4'
+require 'excon'
+require 'excon/test/plugin/server/webrick'
+require 'excon/test/plugin/server/unicorn'
+require 'excon/test/plugin/server/puma'
+require 'excon/test/plugin/server/exec'
+
+
+module Excon
+ module Test
+ class Server
+ attr_accessor :app, :server, :bind, :pid, :read, :write, :error, :started_at, :timeout
+
+ # Methods that must be implemented by a plugin
+ INSTANCE_REQUIRES = [:start]
+ Excon.defaults.merge!(
+ connect_timeout: 5,
+ read_timeout: 5,
+ write_timeout: 5
+ )
+
+ def initialize(args)
+ # TODO: Validate these args
+ @server = args.keys.first
+ @app = args[server]
+ args[:bind] ||= 'tcp://127.0.0.1:9292'
+ @bind = URI.parse(args[:bind])
+ @is_unix_socket = (@bind.scheme == 'unix')
+ @bind.host = @bind.host.gsub(/[\[\]]/, '') unless @is_unix_socket
+ if args[:timeout]
+ @timeout = args[:timeout]
+ else
+ @timeout = 20
+ end
+ name = @server.to_s.split('_').collect(&:capitalize).join
+ plug = nested_const_get("Excon::Test::Plugin::Server::#{name}")
+ self.extend plug
+ check_implementation(plug)
+ end
+
+ def open_process(*args)
+ if RUBY_PLATFORM == 'java'
+ @pid, @write, @read, @error = IO.popen4(*args)
+ else
+ GC.disable if RUBY_VERSION < '1.9'
+ @pid, @write, @read, @error = Open4.popen4(*args)
+ end
+ @started_at = Time.now
+ end
+
+ def elapsed_time
+ Time.now - started_at
+ end
+
+ def stop
+ if RUBY_PLATFORM == 'java'
+ Process.kill('USR1', pid)
+ else
+ Process.kill(9, pid)
+ GC.enable if RUBY_VERSION < '1.9'
+ Process.wait(pid)
+ end
+
+ if @is_unix_socket
+ socket = @bind.path
+ File.delete(socket) if File.exist?(socket)
+ end
+
+ # TODO: Ensure process is really dead
+ dump_errors
+ true
+ end
+ def dump_errors
+ lines = error.read.split($/)
+ while line = lines.shift
+ case line
+ when /(ERROR|Error)/
+ unless line =~ /(null cert chain|did not return a certificate|SSL_read:: internal error)/
+ in_err = true
+ puts
+ end
+ when /^(127|localhost)/
+ in_err = false
+ end
+ puts line if in_err
+ end
+ end
+
+ private
+
+ def nested_const_get(namespace)
+ namespace.split('::').inject(Object) do |mod, klass|
+ mod.const_get(klass)
+ end
+ end
+
+ def check_implementation(plug)
+ INSTANCE_REQUIRES.each do |m|
+ unless self.respond_to? m
+ raise "FATAL: #{plug} does not implement ##{m}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/unix_socket.rb b/lib/vendor/excon/lib/excon/unix_socket.rb
new file mode 100644
index 0000000..bb8488f
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/unix_socket.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+module Excon
+ class UnixSocket < Excon::Socket
+
+ private
+
+ def connect
+ @socket = ::Socket.new(::Socket::AF_UNIX, ::Socket::SOCK_STREAM, 0)
+ # If a Unix proxy was specified, the :path option will be set for it,
+ # otherwise fall back to the :socket option.
+ proxy_path = @data[:proxy] ? @data[:proxy][:path] : nil
+ sockaddr = ::Socket.sockaddr_un(proxy_path || @data[:socket])
+ if @nonblock
+ begin
+ @socket.connect_nonblock(sockaddr)
+ rescue Errno::EINPROGRESS
+ unless IO.select(nil, [@socket], nil, @data[:connect_timeout])
+ raise(Excon::Errors::Timeout.new("connect timeout reached"))
+ end
+ begin
+ @socket.connect_nonblock(sockaddr)
+ rescue Errno::EISCONN
+ end
+ end
+ else
+ begin
+ Timeout.timeout(@data[:connect_timeout]) do
+ @socket.connect(sockaddr)
+ end
+ rescue Timeout::Error
+ raise Excon::Errors::Timeout.new('connect timeout reached')
+ end
+ end
+
+ rescue => error
+ @socket.close rescue nil if @socket
+ raise error
+ end
+
+ end
+end
diff --git a/lib/vendor/excon/lib/excon/utils.rb b/lib/vendor/excon/lib/excon/utils.rb
new file mode 100644
index 0000000..69fc199
--- /dev/null
+++ b/lib/vendor/excon/lib/excon/utils.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+module Excon
+ module Utils
+ extend self
+
+ CONTROL = (0x0..0x1f).map {|c| c.chr }.join + "\x7f"
+ DELIMS = '<>#%"'
+ UNWISE = '{}|\\^[]`'
+ NONASCII = (0x80..0xff).map {|c| c.chr }.join
+ UNESCAPED = /([#{ Regexp.escape(CONTROL + ' ' + DELIMS + UNWISE + NONASCII) }])/
+ ESCAPED = /%([0-9a-fA-F]{2})/
+
+ def connection_uri(datum = @data)
+ unless datum
+ raise ArgumentError, '`datum` must be given unless called on a Connection'
+ end
+ if datum[:scheme] == UNIX
+ "#{datum[:scheme]}://#{datum[:socket]}"
+ else
+ "#{datum[:scheme]}://#{datum[:host]}#{port_string(datum)}"
+ end
+ end
+
+ def request_uri(datum)
+ connection_uri(datum) + datum[:path] + query_string(datum)
+ end
+
+ def port_string(datum)
+ if datum[:port].nil? || (datum[:omit_default_port] && ((datum[:scheme].casecmp('http') == 0 && datum[:port] == 80) || (datum[:scheme].casecmp('https') == 0 && datum[:port] == 443)))
+ ''
+ else
+ ':' + datum[:port].to_s
+ end
+ end
+
+ def query_string(datum)
+ str = String.new
+ case datum[:query]
+ when String
+ str << '?' << datum[:query]
+ when Hash
+ str << '?'
+ datum[:query].sort_by {|k,_| k.to_s }.each do |key, values|
+ key = CGI.escape(key.to_s)
+ if values.nil?
+ str << key << '&'
+ else
+ [values].flatten.each do |value|
+ str << key << '=' << CGI.escape(value.to_s) << '&'
+ end
+ end
+ end
+ str.chop! # remove trailing '&'
+ end
+ str
+ end
+
+ # Splits a header value +str+ according to HTTP specification.
+ def split_header_value(str)
+ return [] if str.nil?
+ str = str.dup.strip
+ str.force_encoding('BINARY') if FORCE_ENC
+ str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]+)+)
+ (?:,\s*|\Z)'xn).flatten
+ end
+
+ # Escapes HTTP reserved and unwise characters in +str+
+ def escape_uri(str)
+ str = str.dup
+ str.force_encoding('BINARY') if FORCE_ENC
+ str.gsub(UNESCAPED) { "%%%02X" % $1[0].ord }
+ end
+
+ # Unescapes HTTP reserved and unwise characters in +str+
+ def unescape_uri(str)
+ str = str.dup
+ str.force_encoding('BINARY') if FORCE_ENC
+ str.gsub(ESCAPED) { $1.hex.chr }
+ end
+
+ # Unescape form encoded values in +str+
+ def unescape_form(str)
+ str = str.dup
+ str.force_encoding('BINARY') if FORCE_ENC
+ str.gsub!(/\+/, ' ')
+ str.gsub(ESCAPED) { $1.hex.chr }
+ end
+ end
+end
diff --git a/lib/vendor/excon/spec/excon/error_spec.rb b/lib/vendor/excon/spec/excon/error_spec.rb
new file mode 100644
index 0000000..3354c6a
--- /dev/null
+++ b/lib/vendor/excon/spec/excon/error_spec.rb
@@ -0,0 +1,137 @@
+describe Excon::Error do
+ # Regression against e300458f2d9330cb265baeb8973120d08c665d9
+ describe '#status_errors' do
+ describe '.keys ' do
+ expected = [
+ 100,
+ 101,
+ (200..206).to_a,
+ (300..307).to_a,
+ (400..417).to_a,
+ 422,
+ 429,
+ (500..504).to_a
+ ].flatten
+
+ it('returns the pertinent HTTP error numbers') do
+ expected.flatten == Excon::Error.status_errors.keys
+ end
+ end
+ end
+
+ describe '#new' do
+ it('returns an Excon::Error') do
+ expect(Excon::Error.new('bar').class == Excon::Error).to be true
+ end
+ it('raises errors for bad URIs') do
+ expect { Excon.new('foo') }.to raise_error(ArgumentError)
+ end
+
+ it('raises errors for bad paths') do
+ expect { Excon.new('http://localhost', path: "foo\r\nbar: baz") }.to raise_error(URI::InvalidURIError)
+ end
+ end
+
+ context 'when remaining backwards compatible' do
+ describe '#new' do
+ it 'should raise standard error and catch standard error' do
+ expect { raise Excon::Error::Client, 'foo' }.to raise_error(Excon::Error)
+ end
+
+ it 'should raise legacy errors and catch legacy errors' do
+ expect do
+ raise Excon::Errors::Error, 'bar'
+ end.to raise_error(Excon::Errors::Error)
+ end
+
+ it 'should raise standard error and catch legacy errors' do
+ expect do
+ raise Excon::Error::NotFound, 'bar'
+ end.to raise_error(Excon::Errors::Error)
+ end
+ end
+
+ describe '#status_error' do
+ it 'should raise with status_error() and catch with standard error' do
+ expect do
+ raise Excon::Error.status_error({ expects: 200 }, status: 400)
+ end.to raise_error(Excon::Error)
+ end
+
+ it 'should raise with status_error() and catch with legacy error' do
+ expect do
+ raise Excon::Error.status_error({ expects: 200 }, status: 400)
+ end.to raise_error(Excon::Errors::BadRequest)
+ end
+
+ it 'should raise with legacy status_error() and catch with standard' do
+ expect do
+ raise Excon::Errors.status_error({ expects: 200 }, status: 400)
+ end.to raise_error(Excon::Error)
+ end
+ end
+ end
+
+ context 'when exceptions are rescued' do
+ include_context("test server", :exec, 'error.rb', :before => :start, :after => :stop )
+
+ context 'when :debug_request and :debug_response are switched off' do
+ it('exception message does not include response or response info') do
+ begin
+ Excon.get('http://127.0.0.1:9292/error/not_found', expects: 200)
+ rescue Excon::Errors::HTTPStatusError => err
+ truth =
+ err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
+ !err.message.include?('excon.error.request') &&
+ !err.message.include?('excon.error.response')
+ expect(truth).to be true
+ end
+ end
+ end
+
+ context 'when :debug_request and :debug_response are switched on' do
+ it 'exception message includes request and response info' do
+ begin
+ Excon.get('http://127.0.0.1:9292/error/not_found', expects: 200,
+ debug_request: true, debug_response: true)
+ rescue Excon::Errors::HTTPStatusError => err
+ truth =
+ err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
+ err.message.include?('excon.error.request') &&
+ err.message.include?('excon.error.response')
+ expect(truth).to be true
+ end
+ end
+ end
+
+ context 'when only :debug_request is turned on' do
+ it('exception message includes only request info') do
+ begin
+ Excon.get('http://127.0.0.1:9292/error/not_found', expects: 200,
+ debug_request: true)
+ rescue Excon::Errors::HTTPStatusError => err
+ truth =
+ err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
+ err.message.include?('excon.error.request') &&
+ !err.message.include?('excon.error.response')
+ expect(truth).to be true
+ end
+ end
+ end
+
+ context 'when only :debug_response is turned on ' do
+ it('exception message includes only response info') do
+ begin
+ Excon.get('http://127.0.0.1:9292/error/not_found', expects: 200,
+ debug_response: true)
+ rescue Excon::Errors::HTTPStatusError => err
+ truth =
+ err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
+ !err.message.include?('excon.error.request') &&
+ err.message.include?('excon.error.response')
+ expect(truth).to be true
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/spec/excon/test/server_spec.rb b/lib/vendor/excon/spec/excon/test/server_spec.rb
new file mode 100644
index 0000000..3fadb04
--- /dev/null
+++ b/lib/vendor/excon/spec/excon/test/server_spec.rb
@@ -0,0 +1,28 @@
+require 'spec_helper'
+
+describe Excon::Test::Server do
+
+ context 'when the web server is webrick' do
+ it_should_behave_like "a excon test server", :webrick, 'basic.ru'
+ end
+
+
+ context 'when the web server is unicorn' do
+ context 'bound to a tcp socket' do
+ it_should_behave_like "a excon test server", :unicorn, 'streaming.ru'
+ end
+
+ context "bound to a unix socket" do
+ socket_uri = 'unix:///tmp/unicorn.socket'
+ it_should_behave_like "a excon test server", :unicorn, 'streaming.ru', socket_uri
+ end
+ end
+
+ context 'when the web server is puma' do
+ it_should_behave_like "a excon test server", :puma, 'streaming.ru'
+ end
+
+ context 'when the web server is a executable' do
+ it_should_behave_like "a excon test server", :exec, 'good.rb'
+ end
+end
diff --git a/lib/vendor/excon/spec/excon_spec.rb b/lib/vendor/excon/spec/excon_spec.rb
new file mode 100644
index 0000000..64cc5a8
--- /dev/null
+++ b/lib/vendor/excon/spec/excon_spec.rb
@@ -0,0 +1,7 @@
+require 'spec_helper'
+
+describe Excon do
+ it 'has a version number' do
+ expect(Excon::VERSION).not_to be nil
+ end
+end
diff --git a/lib/vendor/excon/spec/helpers/file_path_helpers.rb b/lib/vendor/excon/spec/helpers/file_path_helpers.rb
new file mode 100644
index 0000000..2424ec6
--- /dev/null
+++ b/lib/vendor/excon/spec/helpers/file_path_helpers.rb
@@ -0,0 +1,22 @@
+# Todo: s/tests/specs when migration is complete
+def get_abs_path(*parts)
+ File.join(File.expand_path('../../..', __FILE__), 'tests', *parts)
+end
+
+def data_path(*parts)
+ get_abs_path('data', *parts)
+end
+
+def rackup_path(*parts)
+ get_abs_path('rackups', *parts)
+end
+
+def webrick_path(*parts) rackup_path(*parts); end
+
+def unicorn_path(*parts) rackup_path(*parts); end
+
+def puma_path(*parts) rackup_path(*parts); end
+
+def exec_path(*parts)
+ get_abs_path('servers', *parts)
+end
diff --git a/lib/vendor/excon/spec/requests/basic_spec.rb b/lib/vendor/excon/spec/requests/basic_spec.rb
new file mode 100644
index 0000000..c46dc6f
--- /dev/null
+++ b/lib/vendor/excon/spec/requests/basic_spec.rb
@@ -0,0 +1,40 @@
+require 'spec_helper'
+
+describe Excon::Connection do
+ include_context('test server', :webrick, 'basic.ru', before: :start, after: :stop)
+ context 'when an explicit uri is passed' do
+ let(:conn) do
+ Excon::Connection.new(host: '127.0.0.1',
+ hostname: '127.0.0.1',
+ nonblock: false,
+ port: 9292,
+ scheme: 'http',
+ ssl_verify_peer: false)
+ end
+
+ describe '.new' do
+ it 'returns an instance' do
+ expect(conn).to be_instance_of Excon::Connection
+ end
+ end
+
+ context "when :method is :get and :path is /content-length/100" do
+ describe "#request" do
+ let(:response) do
+ response = conn.request(method: :get, path: '/content-length/100')
+ end
+ it 'returns an Excon::Response' do
+ expect(response).to be_instance_of Excon::Response
+ end
+ describe Excon::Response do
+ describe '#status' do
+ it 'returns 200' do
+ expect(response.status).to eq 200
+ end
+ end
+ end
+ end
+ end
+ include_examples 'a basic client'
+ end
+end
diff --git a/lib/vendor/excon/spec/requests/eof_requests_spec.rb b/lib/vendor/excon/spec/requests/eof_requests_spec.rb
new file mode 100644
index 0000000..e918ec7
--- /dev/null
+++ b/lib/vendor/excon/spec/requests/eof_requests_spec.rb
@@ -0,0 +1,36 @@
+require 'spec_helper'
+
+describe Excon do
+ context "when dispatching requests" do
+ context('to a server that does not supply response headers') do
+ include_context("test server", :exec, 'bad.rb', :before => :start, :after => :stop )
+ before(:all) do
+ @conn = Excon.new('http://127.0.0.1:9292')
+ end
+
+ context('when no block is given') do
+ it 'should rescue from an EOFError and return response' do
+ body = @conn.request(:method => :get, :path => '/eof/no_content_length_and_no_chunking').body
+ expect(body).to eq 'hello'
+ end
+ end
+
+ context('when a block is given') do
+ it 'should rescue from EOFError and return response' do
+ body = ""
+ response_block = lambda {|chunk, remaining, total| body << chunk }
+ @conn.request(:method => :get, :path => '/eof/no_content_length_and_no_chunking', :response_block => response_block)
+ expect(body).to eq 'hello'
+ end
+ end
+ end
+
+ context('to a server that prematurely aborts the request with no response') do
+ include_context("test server", :exec, 'eof.rb', :before => :start, :after => :stop )
+
+ it 'should raise an EOFError' do
+ expect { Excon.get('http://127.0.0.1:9292/eof') }.to raise_error(Excon::Errors::SocketError)
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/spec/spec_helper.rb b/lib/vendor/excon/spec/spec_helper.rb
new file mode 100644
index 0000000..999f830
--- /dev/null
+++ b/lib/vendor/excon/spec/spec_helper.rb
@@ -0,0 +1,24 @@
+require 'excon'
+require 'excon/test/server'
+require 'json'
+
+# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
+RSpec.configure do |config|
+ config.expect_with :rspec do |expectations|
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
+ end
+
+ config.mock_with :rspec do |mocks|
+ mocks.verify_partial_doubles = true
+ end
+
+ if config.files_to_run.one?
+ config.default_formatter = 'doc'
+ end
+end
+
+# Load helpers
+Dir["./spec/helpers/**/*.rb"].sort.each { |f| require f}
+
+# Load shared examples and contexts
+Dir["./spec/support/**/*.rb"].sort.each { |f| require f}
diff --git a/lib/vendor/excon/spec/support/shared_contexts/test_server_context.rb b/lib/vendor/excon/spec/support/shared_contexts/test_server_context.rb
new file mode 100644
index 0000000..f40e34c
--- /dev/null
+++ b/lib/vendor/excon/spec/support/shared_contexts/test_server_context.rb
@@ -0,0 +1,83 @@
+# TODO: Clean up this doc and dry up the conditionals
+#
+# Required params:
+# plugin (e.g., webrick, unicorn, etc)
+# file (e.g. a rackup )
+#
+# Optional params:
+# optional paramters may given as a hash
+# opts may contain a bind argument
+# opts may also contain before and after options
+#
+# In its simplest form:
+# { :before => :start, :after => :stop }
+#
+# With lambdas, which recieve @server as an argument
+# { before: lambda {|s| s.start }, after: lambda { |s| s.stop} }
+#
+# In both the cases above, before defaults to before(:all)
+# This can be circumvented with a Hash
+# { before: { :context => :start }, after: { :context => :stop } }
+# or
+# { before: { context: lambda { |s| s.start } }, after: { context: lambda { |s| s.stop } } }
+
+shared_context "test server" do |plugin, file, opts = {}|
+ plugin = plugin.to_sym unless plugin.is_a? Symbol
+ if plugin == :unicorn && RUBY_PLATFORM == "java"
+ before { skip("until unicorn supports jruby") }
+ end
+ abs_file = Object.send("#{plugin}_path", file)
+ args = { plugin => abs_file}
+ args[:bind] = opts[:bind] if opts.key? :bind
+
+
+ before_hook = opts.key?(:before) && (opts[:before].is_a?(Symbol) || opts[:before].is_a?(Proc) || opts[:before].is_a?(Hash))
+
+ if before_hook && opts[:before].is_a?(Hash)
+ event = opts[:before].keys.first
+ before(event) {
+ @server = Excon::Test::Server.new(args)
+ if opts[:before][event].is_a? Symbol
+ @server.send(opts[:before][event])
+ else
+ opts[:before][event].call(@server)
+ end
+ }
+ elsif
+ before(:all) {
+ @server = Excon::Test::Server.new(args)
+ before_hook = opts.key?(:before) && (opts[:before].is_a?(Symbol) || opts[:before].is_a?(Proc) || opts[:before].is_a?(Hash))
+
+ if before_hook
+ if opts[:before].is_a? Symbol
+ @server.send(opts[:before])
+ else
+ opts[:before].call(@server)
+ end
+ end
+ }
+ end
+
+ after_hook = opts.key?(:after) && (opts[:after].is_a?(Symbol) || opts[:after].is_a?(Proc) || opts[:after].is_a?(Hash))
+
+ if after_hook && opts[:after].is_a?(Hash)
+ event = opts[:after].keys.first
+ after(event) {
+ if opts[:after][event].is_a? Symbol
+ @server.send(opts[:after][event])
+ else
+ opts[:after][event].call(@server)
+ end
+ }
+ elsif after_hook
+ after(:all) {
+ if opts[:after].is_a? Symbol
+ @server.send(opts[:after])
+ elsif opts[:after].is_a? Hash
+
+ else
+ opts[:after].call(@server)
+ end
+ }
+ end
+end
diff --git a/lib/vendor/excon/spec/support/shared_examples/shared_example_for_clients.rb b/lib/vendor/excon/spec/support/shared_examples/shared_example_for_clients.rb
new file mode 100644
index 0000000..786e98f
--- /dev/null
+++ b/lib/vendor/excon/spec/support/shared_examples/shared_example_for_clients.rb
@@ -0,0 +1,207 @@
+shared_examples_for 'a basic client' do |url = 'http://127.0.0.1:9292', opts = {}|
+ # TODO: Ditch iterator and manually write a context for each set of options
+ ([true, false] * 2).combination(2).to_a.uniq.each do |nonblock, persistent|
+ context "when nonblock is #{nonblock} and persistent is #{persistent}" do
+ opts = opts.merge(ssl_verify_peer: false, nonblock: nonblock, persistent: persistent)
+
+ let(:conn) { Excon.new(url, opts) }
+
+ context 'when :method is get and :path is /content-length/100' do
+ describe '#request' do
+ let(:response) do
+ conn.request(method: :get, path: '/content-length/100')
+ end
+
+ it 'returns an Excon::Response' do
+ expect(response).to be_instance_of Excon::Response
+ end
+ describe Excon::Response do
+ describe '#status' do
+ it 'returns 200' do
+ expect(response.status).to eq 200
+ end
+
+ it '#status returns 200' do
+ expect(response[:status]).to eq 200
+ end
+ end
+ describe '#headers' do
+ it '["Content-Length"] returns 100' do
+ expect(response.headers['Content-Length']).to eq '100'
+ end
+ it '["Content-Type"] returns "text/html;charset=utf-8"' do
+ expect(response.headers['Content-Type']).to eq 'text/html;charset=utf-8'
+ end
+
+ it "['Date'] returns a valid date" do
+ if RUBY_PLATFORM == 'java' && conn.data[:scheme] == Excon::UNIX
+ skip('until puma responds with a date header')
+ else
+ time = Time.parse(response.headers['Date'])
+ expect(time.is_a?(Time)).to be true
+ end
+ end
+
+ it "['Server'] matches /^WEBrick/" do
+ pending('until unix_socket response has server header') if conn.data[:scheme] == Excon::UNIX
+ expect(!!(response.headers['Server'] =~ /^WEBrick/)).to be true
+ end
+
+ it "['Custom'] returns Foo: bar" do
+ expect(response.headers['Custom']).to eq 'Foo: bar'
+ end
+ end
+ describe '#remote_ip' do
+ it 'returns 127.0.0.1' do
+ pending('until pigs can fly') if conn.data[:scheme] == Excon::UNIX
+ expect(response.remote_ip).to eq '127.0.0.1'
+ end
+ end
+ end
+
+ context('when tcp_nodelay is true') do
+ describe '#request' do
+ response = nil
+ options = opts.merge(ssl_verify_peer: false, nonblock: nonblock, tcp_nodelay: true)
+ connection = Excon.new(url, options)
+
+ it 'returns an Excon::Response' do
+ expect do
+ response = connection.request(method: :get, path: '/content-length/100')
+ end.to_not raise_error
+ end
+
+ describe Excon::Response do
+ describe '#body' do
+ describe '.status' do
+ it '#returns 200' do
+ expect(response.status).to eq 200
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+
+ context 'when utilizing deprecated block usage' do
+ describe '#request' do
+ data = []
+ it 'yields with a chunk, remaining length, and total length' do
+ expect do
+ conn.request(method: :get, path: '/content-length/100') do |chunk, remaining_length, total_length|
+ data = [chunk, remaining_length, total_length]
+ end
+ end.to_not raise_error
+ end
+ it 'completes with expected data' do
+ expect(data).to eq ['x' * 100, 0, 100]
+ end
+ end
+ end
+
+ context 'when utilizing response_block usage' do
+ describe '#request' do
+ data = []
+ it 'yields a chunk, remaining length, and total_length' do
+ response_block = lambda do |chunk, remaining_length, total_length|
+ data = [chunk, remaining_length, total_length]
+ end
+ expect do
+ conn.request(method: :get, path: '/content-length/100', response_block: response_block)
+ end.to_not raise_error
+ end
+ it 'completes with expected data' do
+ expect(data).to eq ['x' * 100, 0, 100]
+ end
+ end
+ end
+ context 'when method is :post' do
+ context 'when :path is /body-sink' do
+ context 'when a body parameter is supplied' do
+ response = nil
+ it 'returns an Excon::Response' do
+ response = conn.request(method: :post, path: '/body-sink', headers: { 'Content-Type' => 'text/plain' }, body: 'x' * 5_000_000)
+ expect(response).to be_instance_of Excon::Response
+ end
+ describe Excon::Response do
+ describe '#body' do
+ it 'equals "5000000"' do
+ expect(response.body).to eq '5000000'
+ end
+ end
+ end
+ end
+ context 'when the body parameter is an empty string' do
+ response = nil
+
+ it 'returns an Excon::Response' do
+ response = conn.request(method: :post, path: '/body-sink', headers: { 'Content-Type' => 'text/plain' }, body: '')
+ expect(response).to be_instance_of Excon::Response
+ end
+ describe Excon::Response do
+ describe '#body' do
+ it 'equals "0"' do
+ expect(response.body).to eq '0'
+ end
+ end
+ end
+ end
+ end
+
+ context 'when :path is /echo' do
+ context('when a file handle is the body paramter') do
+ describe Excon::Response do
+ it '#body equals "x" * 100 + "\n"' do
+ file_path = data_path('xs')
+ response = conn.request(method: :post, path: '/echo', body: File.open(file_path))
+ expect(response.body).to eq 'x' * 100 + "\n"
+ end
+ end
+ end
+
+ context 'when a string is the body paramter' do
+ context 'without request_block' do
+ describe Excon::Response do
+ it "#body equals 'x' * 100)" do
+ response = conn.request(method: :post, path: '/echo', body: 'x' * 100)
+ expect(response.body).to eq 'x' * 100
+ end
+ end
+ end
+
+ context 'when a request_block paramter is supplied' do
+ describe Excon::Response do
+ it "#body equals'x' * 100" do
+ data = ['x'] * 100
+ request_block = lambda do
+ data.shift.to_s
+ end
+ response = conn.request(method: :post, path: '/echo', request_block: request_block)
+ expect(response.body).to eq 'x' * 100
+ end
+ end
+ end
+
+ context('when a multi-byte string is the body paramter') do
+ body = "\xC3\xBC" * 100
+ headers = { 'Custom' => body.dup }
+ if RUBY_VERSION >= '1.9'
+ body.force_encoding('BINARY')
+ headers['Custom'].force_encoding('UTF-8')
+ end
+ describe Excon::Response do
+ it '#body properly concatenates request+headers and body' do
+ response = conn.request(method: :post, path: '/echo',
+ headers: headers, body: body)
+ expect(response.body).to eq body
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/spec/support/shared_examples/shared_example_for_streaming_clients.rb b/lib/vendor/excon/spec/support/shared_examples/shared_example_for_streaming_clients.rb
new file mode 100644
index 0000000..15a9f05
--- /dev/null
+++ b/lib/vendor/excon/spec/support/shared_examples/shared_example_for_streaming_clients.rb
@@ -0,0 +1,20 @@
+shared_examples_for 'a streaming client' do |endpoint, timeout|
+ ret = []
+ timing = 'response times ok'
+ start = Time.now
+ block = lambda do |c,r,t|
+ # add the response
+ ret.push(c)
+ # check if the timing is ok
+ # each response arrives after timeout and before timeout + 1
+ cur_time = Time.now - start
+ if cur_time < ret.length * timeout or cur_time > (ret.length+1) * timeout
+ timing = 'response time not ok!'
+ end
+ end
+ it "gets a response in less than or equal to #{(timeout*3).round(2)} seconds" do
+ Excon.get(endpoint, :response_block => block)
+ # validate the final timing
+ expect((Time.now - start <= timeout*3) == true && timing == 'response times not ok!').to be false
+ end
+end
diff --git a/lib/vendor/excon/spec/support/shared_examples/shared_example_for_test_servers.rb b/lib/vendor/excon/spec/support/shared_examples/shared_example_for_test_servers.rb
new file mode 100644
index 0000000..fe0b569
--- /dev/null
+++ b/lib/vendor/excon/spec/support/shared_examples/shared_example_for_test_servers.rb
@@ -0,0 +1,16 @@
+shared_examples_for "a excon test server" do |plugin, file|
+
+ include_context("test server", plugin, file)
+
+ it "returns an instance" do
+ expect(@server).to be_instance_of Excon::Test::Server
+ end
+
+ it 'starts the server' do
+ expect(@server.start).to be true
+ end
+
+ it 'stops the server' do
+ expect(@server.stop).to be true
+ end
+end
diff --git a/lib/vendor/excon/tests/authorization_header_tests.rb b/lib/vendor/excon/tests/authorization_header_tests.rb
new file mode 100644
index 0000000..400a362
--- /dev/null
+++ b/lib/vendor/excon/tests/authorization_header_tests.rb
@@ -0,0 +1,29 @@
+Shindo.tests('Excon basics (Authorization data redacted)') do
+ with_rackup('basic_auth.ru') do
+ cases = [
+ ['user & pass', 'http://user1:pass1@foo.com/', 'Basic dXNlcjE6cGFzczE='],
+ ['email & pass', 'http://foo%40bar.com:pass1@foo.com/', 'Basic Zm9vQGJhci5jb206cGFzczE='],
+ ['user no pass', 'http://three_user@foo.com/', 'Basic dGhyZWVfdXNlcjo='],
+ ['pass no user', 'http://:derppass@foo.com/', 'Basic OmRlcnBwYXNz']
+ ]
+ cases.each do |desc,url,auth_header|
+ conn = nil
+
+ test("authorization header concealed for #{desc}") do
+ conn = Excon.new(url)
+ !conn.inspect.include?(auth_header)
+ end
+
+ if conn.data[:password]
+ test("password param concealed for #{desc}") do
+ !conn.inspect.include?(conn.data[:password])
+ end
+ end
+
+ test("password param remains correct for #{desc}") do
+ conn.data[:password] == URI.parse(url).password
+ end
+
+ end
+ end
+end
diff --git a/lib/vendor/excon/tests/bad_tests.rb b/lib/vendor/excon/tests/bad_tests.rb
new file mode 100644
index 0000000..1069cf3
--- /dev/null
+++ b/lib/vendor/excon/tests/bad_tests.rb
@@ -0,0 +1,47 @@
+Shindo.tests('Excon bad server interaction') do
+
+ with_server('bad') do
+
+ tests('bad server: causes EOFError') do
+
+ tests('with no content length and no chunking') do
+ tests('without a block') do
+ tests('response.body').returns('hello') do
+ connection = Excon.new('http://127.0.0.1:9292')
+
+ connection.request(:method => :get, :path => '/eof/no_content_length_and_no_chunking').body
+ end
+ end
+
+ tests('with a block') do
+ tests('body from chunks').returns('hello') do
+ connection = Excon.new('http://127.0.0.1:9292')
+
+ body = ""
+ response_block = lambda {|chunk, remaining, total| body << chunk }
+
+ connection.request(:method => :get, :path => '/eof/no_content_length_and_no_chunking', :response_block => response_block)
+
+ body
+ end
+ end
+
+ end
+
+ end
+
+ end
+
+ with_server('eof') do
+
+ tests('eof server: causes EOFError') do
+
+ tests('request').raises(Excon::Errors::SocketError) do
+ Excon.get('http://127.0.0.1:9292/eof')
+ end
+
+ end
+
+ end
+
+end
diff --git a/lib/vendor/excon/tests/basic_tests.rb b/lib/vendor/excon/tests/basic_tests.rb
new file mode 100644
index 0000000..f8ee529
--- /dev/null
+++ b/lib/vendor/excon/tests/basic_tests.rb
@@ -0,0 +1,349 @@
+require 'json'
+
+Shindo.tests('Excon basics') do
+ with_rackup('basic.ru') do
+ basic_tests
+
+ tests('explicit uri passed to connection') do
+ tests('GET /content-length/100').returns(200) do
+ connection = Excon::Connection.new({
+ :host => '127.0.0.1',
+ :hostname => '127.0.0.1',
+ :nonblock => false,
+ :port => 9292,
+ :scheme => 'http',
+ :ssl_verify_peer => false
+ })
+ response = connection.request(:method => :get, :path => '/content-length/100')
+ response[:status]
+ end
+ end
+ end
+end
+
+Shindo.tests('Excon streaming basics') do
+ pending if RUBY_PLATFORM == 'java' # need to find suitable server for jruby
+ with_unicorn('streaming.ru') do
+ # expected values: the response, in pieces, and a timeout after each piece
+ res = %w{Hello streamy world}
+ timeout = 0.1
+
+ # expect the full response as a string
+ # and expect it to take a (timeout * pieces) seconds
+ tests('simple blocking request on streaming endpoint').returns([res.join(''),'response time ok']) do
+ start = Time.now
+ ret = Excon.get('http://127.0.0.1:9292/streamed/simple').body
+
+ if Time.now - start <= timeout*3
+ [ret, 'streaming response came too quickly']
+ else
+ [ret, 'response time ok']
+ end
+ end
+
+ # expect the full response as a string and expect it to
+ # take a (timeout * pieces) seconds (with fixed Content-Length header)
+ tests('simple blocking request on streaming endpoint with fixed length').returns([res.join(''),'response time ok']) do
+ start = Time.now
+ ret = Excon.get('http://127.0.0.1:9292/streamed/fixed_length').body
+
+ if Time.now - start <= timeout*3
+ [ret, 'streaming response came too quickly']
+ else
+ [ret, 'response time ok']
+ end
+ end
+
+ # expect each response piece to arrive to the body right away
+ # and wait for timeout until next one arrives
+ def timed_streaming_test(endpoint, timeout)
+ ret = []
+ timing = 'response times ok'
+ start = Time.now
+ Excon.get(endpoint, :response_block => lambda do |c,r,t|
+ # add the response
+ ret.push(c)
+ # check if the timing is ok
+ # each response arrives after timeout and before timeout + 1
+ cur_time = Time.now - start
+ if cur_time < ret.length * timeout or cur_time > (ret.length+1) * timeout
+ timing = 'response time not ok!'
+ end
+ end)
+ # validate the final timing
+ if Time.now - start <= timeout*3
+ timing = 'final timing was not ok!'
+ end
+ [ret, timing]
+ end
+
+ tests('simple request with response_block on streaming endpoint').returns([res,'response times ok']) do
+ timed_streaming_test('http://127.0.0.1:9292/streamed/simple', timeout)
+ end
+
+ tests('simple request with response_block on streaming endpoint with fixed length').returns([res,'response times ok']) do
+ timed_streaming_test('http://127.0.0.1:9292/streamed/fixed_length', timeout)
+ end
+
+ end
+end
+
+Shindo.tests('Excon basics (Basic Auth Pass)') do
+ with_rackup('basic_auth.ru') do
+ basic_tests('http://test_user:test_password@127.0.0.1:9292')
+ user, pass, uri = ['test_user', 'test_password', 'http://127.0.0.1:9292'].map(&:freeze)
+
+ tests('with frozen args').returns(200) do
+ connection = Excon.new(uri, :method => :get, :password => pass, :path => '/content-length/100', :user => user)
+ response = connection.request
+ response.status
+ end
+
+ tests('with user/pass on request').returns(200) do
+ connection = Excon.new(uri, :method => :get, :path => '/content-length/100')
+ response = connection.request(:user => user, :password => pass)
+ response.status
+ end
+
+ tests('with user/pass on connection and request').returns(200) do
+ connection = Excon.new(uri, :method => :get, :password => 'incorrect_password', :path => '/content-length/100', :user => 'incorrect_user')
+ response = connection.request(user: user, password: pass)
+ response.status
+ end
+ end
+end
+
+Shindo.tests('Excon basics (Basic Auth Fail)') do
+ with_rackup('basic_auth.ru') do
+ cases = [
+ ['correct user, no password', 'http://test_user@127.0.0.1:9292'],
+ ['correct user, wrong password', 'http://test_user:fake_password@127.0.0.1:9292'],
+ ['wrong user, correct password', 'http://fake_user:test_password@127.0.0.1:9292']
+ ]
+ cases.each do |desc,url|
+ tests("response.status for #{desc}").returns(401) do
+ connection = Excon.new(url)
+ response = connection.request(:method => :get, :path => '/content-length/100')
+ response.status
+ end
+ end
+ end
+end
+
+Shindo.tests('Excon basics (ssl)') do
+ with_rackup('ssl.ru') do
+ basic_tests('https://127.0.0.1:9443')
+ end
+end
+
+Shindo.tests('Excon ssl verify peer (ssl)') do
+ with_rackup('ssl.ru') do
+ connection = nil
+ test do
+ ssl_ca_file = File.join(File.dirname(__FILE__), 'data', '127.0.0.1.cert.crt')
+ connection = Excon.new('https://127.0.0.1:9443', :ssl_verify_peer => true, :ssl_ca_file => ssl_ca_file )
+ true
+ end
+
+ tests('response.status').returns(200) do
+ response = connection.request(:method => :get, :path => '/content-length/100')
+
+ response.status
+ end
+ end
+
+ with_rackup('ssl_mismatched_cn.ru') do
+ connection = nil
+ test do
+ ssl_ca_file = File.join(File.dirname(__FILE__), 'data', 'excon.cert.crt')
+ connection = Excon.new('https://127.0.0.1:9443', :ssl_verify_peer => true, :ssl_ca_file => ssl_ca_file, :ssl_verify_peer_host => 'Excon' )
+ true
+ end
+
+ tests('response.status').returns(200) do
+ response = connection.request(:method => :get, :path => '/content-length/100')
+
+ response.status
+ end
+ end
+end
+
+Shindo.tests('Excon ssl verify peer (ssl cert store)') do
+ with_rackup('ssl.ru') do
+ connection = nil
+ test do
+ ssl_ca_cert = File.read(File.join(File.dirname(__FILE__), 'data', '127.0.0.1.cert.crt'))
+ ssl_cert_store = OpenSSL::X509::Store.new
+ ssl_cert_store.add_cert OpenSSL::X509::Certificate.new ssl_ca_cert
+ connection = Excon.new('https://127.0.0.1:9443', :ssl_verify_peer => true, :ssl_cert_store => ssl_cert_store )
+ true
+ end
+
+ tests('response.status').returns(200) do
+ response = connection.request(:method => :get, :path => '/content-length/100')
+
+ response.status
+ end
+ end
+end
+
+Shindo.tests('Excon basics (ssl file)',['focus']) do
+ with_rackup('ssl_verify_peer.ru') do
+
+ tests('GET /content-length/100').raises(Excon::Errors::SocketError) do
+ connection = Excon::Connection.new({
+ :host => '127.0.0.1',
+ :hostname => '127.0.0.1',
+ :nonblock => false,
+ :port => 8443,
+ :scheme => 'https',
+ :ssl_verify_peer => false
+ })
+ connection.request(:method => :get, :path => '/content-length/100')
+ end
+
+ cert_key_path = File.join(File.dirname(__FILE__), 'data', 'excon.cert.key')
+ cert_crt_path = File.join(File.dirname(__FILE__), 'data', 'excon.cert.crt')
+ basic_tests('https://127.0.0.1:8443', client_key: cert_key_path, client_cert: cert_crt_path)
+
+ cert_key_data = File.read cert_key_path
+ cert_crt_data = File.read cert_crt_path
+ basic_tests('https://127.0.0.1:8443', client_key_data: cert_key_data, client_cert_data: cert_crt_data)
+ end
+end
+
+Shindo.tests('Excon basics (ssl file paths)',['focus']) do
+ with_rackup('ssl_verify_peer.ru') do
+
+ tests('GET /content-length/100').raises(Excon::Errors::SocketError) do
+ connection = Excon::Connection.new({
+ :host => '127.0.0.1',
+ :hostname => '127.0.0.1',
+ :nonblock => false,
+ :port => 8443,
+ :scheme => 'https',
+ :ssl_verify_peer => false
+ })
+ connection.request(:method => :get, :path => '/content-length/100')
+ end
+
+ basic_tests('https://127.0.0.1:8443',
+ :private_key_path => File.join(File.dirname(__FILE__), 'data', 'excon.cert.key'),
+ :certificate_path => File.join(File.dirname(__FILE__), 'data', 'excon.cert.crt')
+ )
+
+ end
+end
+
+Shindo.tests('Excon basics (ssl string)', ['focus']) do
+ with_rackup('ssl_verify_peer.ru') do
+ basic_tests('https://127.0.0.1:8443',
+ :private_key => File.read(File.join(File.dirname(__FILE__), 'data', 'excon.cert.key')),
+ :certificate => File.read(File.join(File.dirname(__FILE__), 'data', 'excon.cert.crt'))
+ )
+ end
+end
+
+Shindo.tests('Excon basics (Unix socket)') do
+ pending if RUBY_PLATFORM == 'java' # need to find suitable server for jruby
+
+ file_name = '/tmp/unicorn.sock'
+ with_unicorn('basic.ru', 'unix://'+file_name) do
+ basic_tests("unix:/", :socket => file_name)
+
+ tests('explicit uri passed to connection') do
+ tests('GET /content-length/100').returns(200) do
+ connection = Excon::Connection.new({
+ :socket => file_name,
+ :nonblock => false,
+ :scheme => 'unix',
+ :ssl_verify_peer => false
+ })
+ response = connection.request(:method => :get, :path => '/content-length/100')
+ response[:status]
+ end
+ end
+
+ tests('http Host header is empty') do
+ tests('GET /headers').returns("") do
+ connection = Excon::Connection.new({
+ :socket => file_name,
+ :nonblock => false,
+ :scheme => 'unix',
+ :ssl_verify_peer => false
+ })
+ response = connection.request(:method => :get, :path => '/headers')
+ JSON.parse(response.body)['HTTP_HOST']
+ end
+ end
+ end
+end
+
+Shindo.tests('Excon basics (reusable local port)') do
+ class CustomSocket < Socket
+ def initialize
+ super(AF_INET, SOCK_STREAM, 0)
+ setsockopt(SOL_SOCKET, SO_REUSEADDR, true)
+ if defined?(SO_REUSEPORT)
+ setsockopt(SOL_SOCKET, SO_REUSEPORT, true)
+ end
+ end
+
+ def bind(address, port)
+ super(Socket.pack_sockaddr_in(port, address))
+ end
+
+ def connect(address, port)
+ super(Socket.pack_sockaddr_in(port, address))
+ end
+
+ def http_get(path)
+ print "GET /content-length/10 HTTP/1.0\r\n\r\n"
+ read.split("\r\n\r\n", 2)[1]
+ end
+
+ def self.ip_address_list
+ if Socket.respond_to?(:ip_address_list)
+ Socket.ip_address_list.select(&:ipv4?).map(&:ip_address)
+ else
+ `ifconfig`.scan(/inet.*?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/).flatten
+ end
+ end
+
+ def self.find_alternate_ip(ip)
+ ip_address_list.detect {|a| a != ip } || '127.0.0.1'
+ end
+ end
+
+ with_rackup('basic.ru', '0.0.0.0') do
+ connection = Excon.new("http://127.0.0.1:9292/echo",
+ :reuseaddr => true, # enable address and port reuse
+ :persistent => true # keep the socket open
+ )
+ response = connection.get
+
+ tests('has a local port').returns(true) do
+ response.local_port.to_s =~ /\d{4,5}/ ? true : false
+ end
+
+ tests('local port can be re-bound').returns('x' * 10) do
+ # create a socket with address/port reuse enabled
+ s = CustomSocket.new
+
+ # bind to the same local port and address used in the get above (won't work without reuse options on both sockets)
+ s.bind(response.local_address, response.local_port)
+
+ # connect to the server on a different address than was used for the initial connection to avoid duplicate 5-tuples of: {protcol, src_port, src_addr, dst_port, dst_addr}
+ s.connect(CustomSocket.find_alternate_ip(response.local_address), 9292)
+
+ # send the request
+ body = s.http_get("/content-length/10")
+
+ # close both the sockets
+ s.close
+ connection.reset
+
+ body
+ end
+ end
+end
diff --git a/lib/vendor/excon/tests/complete_responses.rb b/lib/vendor/excon/tests/complete_responses.rb
new file mode 100644
index 0000000..1dc79f7
--- /dev/null
+++ b/lib/vendor/excon/tests/complete_responses.rb
@@ -0,0 +1,31 @@
+Shindo.tests('Excon Response Validation') do
+ env_init
+
+ with_server('good') do
+ tests('good responses with complete headers') do
+ 100.times do
+ res = Excon.get('http://127.0.0.1:9292/chunked/simple')
+ returns(true) { res.body == "hello world" }
+ returns(true) { res.status_line == "HTTP/1.1 200 OK\r\n" }
+ returns(true) { res.status == 200}
+ returns(true) { res.reason_phrase == "OK" }
+ returns(true) { res.remote_ip == "127.0.0.1" }
+ end
+ end
+ end
+
+ with_server('error') do
+ tests('error responses with complete headers') do
+ 100.times do
+ res = Excon.get('http://127.0.0.1:9292/error/not_found')
+ returns(true) { res.body == "server says not found" }
+ returns(true) { res.status_line == "HTTP/1.1 404 Not Found\r\n" }
+ returns(true) { res.status == 404}
+ returns(true) { res.reason_phrase == "Not Found" }
+ returns(true) { res.remote_ip == "127.0.0.1" }
+ end
+ end
+ end
+
+ env_restore
+end
diff --git a/lib/vendor/excon/tests/data/127.0.0.1.cert.crt b/lib/vendor/excon/tests/data/127.0.0.1.cert.crt
new file mode 100644
index 0000000..b2684a9
--- /dev/null
+++ b/lib/vendor/excon/tests/data/127.0.0.1.cert.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICEzCCAXwCCQC94mWSE0+JcjANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzELMAkGA1UECBMCQ0ExDjAMBgNVBAoTBUV4Y29uMQ4wDAYDVQQLEwVFeGNvbjES
+MBAGA1UEAxMJMTI3LjAuMC4xMB4XDTE0MTAyODIwMjMzMVoXDTE5MTAyNzIwMjMz
+MVowTjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQ4wDAYDVQQKEwVFeGNvbjEO
+MAwGA1UECxMFRXhjb24xEjAQBgNVBAMTCTEyNy4wLjAuMTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAvqlKlQMoS4q9jgsm+sBh7B9jEJVYHqNBluqgLubMEmjs
+xFZUIicx+LmMPfUdnqtGDihR7q3yh/xeJuzzux38FBwTBDl8NRXWSyRkJqdi9XUA
+qihAlkqDoZ6Eb867isF7C5FEqohAuCE0FUaYU1HY3bV/foLqxEbyvQVwaRZ4rjkC
+AwEAATANBgkqhkiG9w0BAQUFAAOBgQCRxnrtbFJrBT4duYtOVuG/j8G46bf1DPrF
+wuRf38gdO2Ldu+kdNRMhQrgSA9CfkjwwQpcVK2gZTuGTdmtqTnvIKilsomtG3tFK
+ThWxuW6HrU9XgZ5KXIguVnL5tjYBNslsCFiQUeU/b8GF2MyMkOGUIC0p411ZB9v/
+mTKRgzf/qQ==
+-----END CERTIFICATE-----
diff --git a/lib/vendor/excon/tests/data/127.0.0.1.cert.key b/lib/vendor/excon/tests/data/127.0.0.1.cert.key
new file mode 100644
index 0000000..9e8a2c9
--- /dev/null
+++ b/lib/vendor/excon/tests/data/127.0.0.1.cert.key
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQC+qUqVAyhLir2OCyb6wGHsH2MQlVgeo0GW6qAu5swSaOzEVlQi
+JzH4uYw99R2eq0YOKFHurfKH/F4m7PO7HfwUHBMEOXw1FdZLJGQmp2L1dQCqKECW
+SoOhnoRvzruKwXsLkUSqiEC4ITQVRphTUdjdtX9+gurERvK9BXBpFniuOQIDAQAB
+AoGAEwJB41VrQQzWFUFbY4imuqnucIrTPEq+kVNXIRX1pqg7Yt/Qh48s1kV5i/vS
+Ni2RUHwInylMku5AXNUm/7LfnN1zCHiYVkddL6df73BdzKfM86j+eQJdqye3AOkZ
+GKrutsE8AEwOBCPtM9z3EbbAQZQpBBGyvAH3z8/GFLa34LkCQQDwEhEJleUGxiSR
+anm43iFWsNBqW680YSz3kh1O7aC+09u8BOvOJ6azOMBYgxBno0IR9Oe7k0iBl+8e
+YJmAuCVHAkEAy0/wdYeKwv9Dd3y9I+lS11VvaQaY2dmFmhbkPl/AAjUHju5ZF7me
+Znwpq0jLlKRlKatVjkO/mkOeWs1/8MhQfwJBAO5VkVKJ3IjAF7fCFDvjUwfEm/Sr
+NyJyQvk5tx0PrqEkpSZhYFUXaljNQ6/b1mJ9Yu9+yrye+MGnu73Vuy9eIasCQFT4
+fejA0y+X+5xul6Xwl9zDKiLczPkPPhUeSBoBbn/9pcEIwFd4DkmKzud1LxBafKUj
+pEgm7GcOp5oPlM8PCQUCQQCtPFpgobUK9nRewxWagUL+xlEo6C1CPFhTwtQvnyi9
+6UwgxZtOdzAc3xRvHo4uK3OwGuOklqkpIeiZg3hoZb6B
+-----END RSA PRIVATE KEY-----
diff --git a/lib/vendor/excon/tests/data/excon.cert.crt b/lib/vendor/excon/tests/data/excon.cert.crt
new file mode 100644
index 0000000..8218e49
--- /dev/null
+++ b/lib/vendor/excon/tests/data/excon.cert.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICLzCCAZgCCQCidUHPgYe2GTANBgkqhkiG9w0BAQUFADBcMQswCQYDVQQGEwJV
+UzELMAkGA1UECBMCQ0ExDjAMBgNVBAoTBUV4Y29uMQ4wDAYDVQQDEwVFeGNvbjEg
+MB4GCSqGSIb3DQEJARYRYWRtaW5AZXhhbXBsZS5jb20wHhcNMTMwMjI4MTczOTE4
+WhcNMTYxMTI0MTczOTE4WjBcMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExDjAM
+BgNVBAoTBUV4Y29uMQ4wDAYDVQQDEwVFeGNvbjEgMB4GCSqGSIb3DQEJARYRYWRt
+aW5AZXhhbXBsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKM+fgjX
+QfkMpepEWQBO7pJLQgoYY0EntYSgmFF/9E+fcokCWAHtmF5SBtpbWJRz3BcZ/bfq
+zYYlbTAWu3nsXwsp/6Fn4dv1jvUAreAH3QV4nm8kU8FcoQ8O085UruEHIDTpZec2
+hBLTcU7dDbxAdMJLZSpkxi75I8iB9+PKGYfRAgMBAAEwDQYJKoZIhvcNAQEFBQAD
+gYEAMJvD5vR3k3EkWodu318aQEgQWpy+KONsqVuL48qYevbNiEnc91Gao9i7bu66
+LIJFcJ/OKLvPuIOXY5KDaCo8zo/RYD2uFJK4uauQVUltfnz9CM3bMxIZpChAipNW
+Crnwin6S9W9SGjJ8PY4kwRv7T9NBOsjP7YG3Zpb1YSETKug=
+-----END CERTIFICATE-----
diff --git a/lib/vendor/excon/tests/data/excon.cert.key b/lib/vendor/excon/tests/data/excon.cert.key
new file mode 100644
index 0000000..c28c0a0
--- /dev/null
+++ b/lib/vendor/excon/tests/data/excon.cert.key
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQCjPn4I10H5DKXqRFkATu6SS0IKGGNBJ7WEoJhRf/RPn3KJAlgB
+7ZheUgbaW1iUc9wXGf236s2GJW0wFrt57F8LKf+hZ+Hb9Y71AK3gB90FeJ5vJFPB
+XKEPDtPOVK7hByA06WXnNoQS03FO3Q28QHTCS2UqZMYu+SPIgffjyhmH0QIDAQAB
+AoGACOChIgHyyIRzkWXeITIprzMAiGQDIcvzBx9kqSn4M0xMgj7qYlB1dMupK77D
+9m7GjUsQjSvruVvXsEHMODkugeqo/3pZWMj+WnXBtc+30Jfi1kzkTjk/dL0jG0hq
+rrb+10dS/jfhlUptgzG3tnDHOS1AqEhwH3zXSqn/AoNy5DECQQDV1f+1pGhLTf66
+6u9IJc6MZz5zw2avdk9O6qo6et+gmtq1FIpvw7S3zP8M0uOq0+g88PHQSgBeJ8BZ
+9YUWdH9XAkEAw264uoNVCpEpscfbGPRkDZXZE8nhmqhzkWBZAMcsqjdTcMdW0tVB
+8zdNSGg7GWM5svSKrJcx++Xxpyu1AftBFwJABvF77Bn6iPdvXgJi4qTXoBd6H6go
+nWnqCVX1URDMUhq1H0wbcqWYKJ+vaGswmUtoLxJjx6+fc282/7TJLYF64QJBAIbQ
+ZVw8ZriwZLu/61Mum6qHeUTeWePPWlGpzhvsSdJt8gB1cl5kQGdf+c7+H+6mdVIO
+wW7HqfJjsCyqyOXCBicCQQDS8aqD1iSfOi7J8DNrX1LnGudqdn+I7YITeQWZd07a
+uEiTDzuaxaDtvUrN+jS0I9K1Vnn2UQCwqhvFaARHzgVB
+-----END RSA PRIVATE KEY-----
diff --git a/lib/vendor/excon/tests/data/xs b/lib/vendor/excon/tests/data/xs
new file mode 100644
index 0000000..762ca2a
--- /dev/null
+++ b/lib/vendor/excon/tests/data/xs
@@ -0,0 +1 @@
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
diff --git a/lib/vendor/excon/tests/error_tests.rb b/lib/vendor/excon/tests/error_tests.rb
new file mode 100644
index 0000000..c1bf15f
--- /dev/null
+++ b/lib/vendor/excon/tests/error_tests.rb
@@ -0,0 +1,145 @@
+
+
+Shindo.tests('HTTPStatusError request/response debugging') do
+
+ # Regression against e300458f2d9330cb265baeb8973120d08c665d9
+ tests('Excon::Error knows about pertinent errors') do
+ expected = [
+ 100,
+ 101,
+ (200..206).to_a,
+ (300..307).to_a,
+ (400..417).to_a,
+ 422,
+ 429,
+ (500..504).to_a
+ ]
+ expected.flatten == Excon::Error.status_errors.keys
+ end
+
+ tests('new returns an Error').returns(true) do
+ Excon::Error.new('bar').class == Excon::Error
+ end
+
+ tests('new raises errors for bad URIs').returns(true) do
+ begin
+ Excon.new('foo')
+ false
+ rescue => err
+ err.to_s.include? 'foo'
+ end
+ end
+
+ tests('new raises errors for bad paths').returns(true) do
+ begin
+ Excon.new('http://localhost', path: "foo\r\nbar: baz")
+ false
+ rescue => err
+ err.to_s.include? "foo\r\nbar: baz"
+ end
+ end
+
+ tests('can raise standard error and catch standard error').returns(true) do
+ begin
+ raise Excon::Error::Client.new('foo')
+ rescue Excon::Error => e
+ true
+ end
+ end
+
+ tests('can raise legacy errors and catch legacy errors').returns(true) do
+ begin
+ raise Excon::Errors::Error.new('bar')
+ rescue Excon::Errors::Error => e
+ true
+ end
+ end
+
+ tests('can raise standard error and catch legacy errors').returns(true) do
+ begin
+ raise Excon::Error::NotFound.new('bar')
+ rescue Excon::Errors::Error => e
+ true
+ end
+ end
+
+ tests('can raise with status_error() and catch with standard error').returns(true) do
+ begin
+ raise Excon::Error.status_error({expects: 200}, {status: 400})
+ rescue Excon::Error
+ true
+ end
+ end
+
+
+ tests('can raise with status_error() and catch with legacy error').returns(true) do
+ begin
+ raise Excon::Error.status_error({expects: 200}, {status: 400})
+ rescue Excon::Errors::BadRequest
+ true
+ end
+ end
+
+ tests('can raise with legacy status_error() and catch with legacy').returns(true) do
+ begin
+ raise Excon::Errors.status_error({expects: 200}, {status: 400})
+ rescue Excon::Errors::BadRequest
+ true
+ end
+ end
+
+
+ tests('can raise with legacy status_error() and catch with standard').returns(true) do
+ begin
+ raise Excon::Errors.status_error({expects: 200}, {status: 400})
+ rescue Excon::Error
+ true
+ end
+ end
+
+ with_server('error') do
+
+ tests('message does not include response or response info').returns(true) do
+ begin
+ Excon.get('http://127.0.0.1:9292/error/not_found', :expects => 200)
+ rescue Excon::Errors::HTTPStatusError => err
+ err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
+ !err.message.include?('excon.error.request') &&
+ !err.message.include?('excon.error.response')
+ end
+ end
+
+ tests('message includes only request info').returns(true) do
+ begin
+ Excon.get('http://127.0.0.1:9292/error/not_found', :expects => 200,
+ :debug_request => true)
+ rescue Excon::Errors::HTTPStatusError => err
+ err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
+ err.message.include?('excon.error.request') &&
+ !err.message.include?('excon.error.response')
+ end
+ end
+
+ tests('message includes only response info').returns(true) do
+ begin
+ Excon.get('http://127.0.0.1:9292/error/not_found', :expects => 200,
+ :debug_response => true)
+ rescue Excon::Errors::HTTPStatusError => err
+ err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
+ !err.message.include?('excon.error.request') &&
+ err.message.include?('excon.error.response')
+ end
+ end
+
+ tests('message include request and response info').returns(true) do
+ begin
+ Excon.get('http://127.0.0.1:9292/error/not_found', :expects => 200,
+ :debug_request => true, :debug_response => true)
+ rescue Excon::Errors::HTTPStatusError => err
+ err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
+ err.message.include?('excon.error.request') &&
+ err.message.include?('excon.error.response')
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/tests/header_tests.rb b/lib/vendor/excon/tests/header_tests.rb
new file mode 100644
index 0000000..a779b05
--- /dev/null
+++ b/lib/vendor/excon/tests/header_tests.rb
@@ -0,0 +1,119 @@
+Shindo.tests('Excon response header support') do
+ env_init
+
+ tests('Excon::Headers storage') do
+ headers = Excon::Headers.new
+ headers['Exact-Case'] = 'expected'
+ headers['Another-Fixture'] = 'another'
+
+ tests('stores and retrieves as received').returns('expected') do
+ headers['Exact-Case']
+ end
+
+ tests('enumerates keys as received') do
+ ks = headers.keys
+ tests('contains Exact-Case').returns(true) { ks.include? 'Exact-Case' }
+ tests('contains Another-Fixture').returns(true) { ks.include? 'Another-Fixture' }
+ end
+
+ tests('supports case-insensitive access').returns('expected') do
+ headers['EXACT-CASE']
+ end
+
+ tests('but still returns nil for missing keys').returns(nil) do
+ headers['Missing-Header']
+ end
+
+ tests('Hash methods that should support case-insensitive access') do
+ if {}.respond_to? :assoc
+ tests('#assoc').returns(%w{exact-case expected}) do
+ headers.assoc('exact-Case')
+ end
+ end
+
+ tests('#delete') do
+ tests('with just a key').returns('yes') do
+ headers['Extra'] = 'yes'
+ headers.delete('extra')
+ end
+
+ tests('with a proc').returns('called with notpresent') do
+ headers.delete('notpresent') { |k| "called with #{k}" }
+ end
+ end
+
+ tests('#fetch') do
+ tests('when present').returns('expected') { headers.fetch('exact-CASE') }
+ tests('with a default value').returns('default') { headers.fetch('missing', 'default') }
+ tests('with a default proc').returns('got missing') do
+ headers.fetch('missing') { |k| "got #{k}" }
+ end
+ end
+
+ tests('#has_key?') do
+ tests('when present').returns(true) { headers.has_key?('EXACT-case') }
+ tests('when absent').returns(false) { headers.has_key?('missing') }
+ end
+
+ tests('#values_at') do
+ tests('all present').returns(%w{expected another}) do
+ headers.values_at('exACT-cASE', 'anotheR-fixturE')
+ end
+ tests('some missing').returns(['expected', nil]) do
+ headers.values_at('exact-case', 'missing-header')
+ end
+ end
+ end
+ end
+
+ with_rackup('response_header.ru') do
+
+ tests('Response#get_header') do
+ connection = nil
+ response = nil
+
+ tests('with variable header capitalization') do
+
+ tests('response.get_header("mixedcase-header")').returns('MixedCase') do
+ connection = Excon.new('http://foo.com:8080', :proxy => 'http://127.0.0.1:9292')
+ response = connection.request(:method => :get, :path => '/foo')
+
+ response.get_header("mixedcase-header")
+ end
+
+ tests('response.get_header("uppercase-header")').returns('UPPERCASE') do
+ response.get_header("uppercase-header")
+ end
+
+ tests('response.get_header("lowercase-header")').returns('lowercase') do
+ response.get_header("lowercase-header")
+ end
+
+ end
+
+ tests('when provided key capitalization varies') do
+
+ tests('response.get_header("MIXEDCASE-HEADER")').returns('MixedCase') do
+ response.get_header("MIXEDCASE-HEADER")
+ end
+
+ tests('response.get_header("MiXeDcAsE-hEaDeR")').returns('MixedCase') do
+ response.get_header("MiXeDcAsE-hEaDeR")
+ end
+
+ end
+
+ tests('when header is unavailable') do
+
+ tests('response.get_header("missing")').returns(nil) do
+ response.get_header("missing")
+ end
+
+ end
+
+ end
+
+ end
+
+ env_restore
+end
diff --git a/lib/vendor/excon/tests/middlewares/canned_response_tests.rb b/lib/vendor/excon/tests/middlewares/canned_response_tests.rb
new file mode 100644
index 0000000..e4a70c1
--- /dev/null
+++ b/lib/vendor/excon/tests/middlewares/canned_response_tests.rb
@@ -0,0 +1,34 @@
+Shindo.tests("Excon support for middlewares that return canned responses") do
+ the_body = "canned"
+
+ canned_response_middleware = Class.new(Excon::Middleware::Base) do
+ define_method :request_call do |params|
+ params[:response] = {
+ :body => the_body,
+ :headers => {},
+ :status => 200
+ }
+ super(params)
+ end
+ end
+
+ tests('does not mutate the canned response body').returns(the_body) do
+ Excon.get(
+ 'http://some-host.com/some-path',
+ :middlewares => [canned_response_middleware] + Excon.defaults[:middlewares]
+ ).body
+ end
+
+ tests('yields non-mutated body to response_block').returns(the_body) do
+ body = ''
+ response_block = lambda { |chunk, _, _| body << chunk }
+ Excon.get(
+ 'http://some-host.com/some-path',
+ :middlewares => [canned_response_middleware] + Excon.defaults[:middlewares],
+ :response_block => response_block
+ )
+ body
+ end
+
+end
+
diff --git a/lib/vendor/excon/tests/middlewares/capture_cookies_tests.rb b/lib/vendor/excon/tests/middlewares/capture_cookies_tests.rb
new file mode 100644
index 0000000..0e681ce
--- /dev/null
+++ b/lib/vendor/excon/tests/middlewares/capture_cookies_tests.rb
@@ -0,0 +1,34 @@
+Shindo.tests("Excon redirecting with cookie preserved") do
+ env_init
+
+ with_rackup('redirecting_with_cookie.ru') do
+ tests('second request will send cookies set by the first').returns('ok') do
+ Excon.get(
+ 'http://127.0.0.1:9292',
+ :path => '/sets_cookie',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::CaptureCookies, Excon::Middleware::RedirectFollower]
+ ).body
+ end
+
+ tests('second request will send multiple cookies set by the first').returns('ok') do
+ Excon.get(
+ 'http://127.0.0.1:9292',
+ :path => '/sets_multi_cookie',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::CaptureCookies, Excon::Middleware::RedirectFollower]
+ ).body
+ end
+ end
+
+ with_rackup('redirecting.ru') do
+ tests("runs normally when there are no cookies set").returns('ok') do
+ Excon.post(
+ 'http://127.0.0.1:9292',
+ :path => '/first',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::CaptureCookies, Excon::Middleware::RedirectFollower],
+ :body => "a=Some_content"
+ ).body
+ end
+ end
+
+ env_restore
+end
diff --git a/lib/vendor/excon/tests/middlewares/decompress_tests.rb b/lib/vendor/excon/tests/middlewares/decompress_tests.rb
new file mode 100644
index 0000000..aebba34
--- /dev/null
+++ b/lib/vendor/excon/tests/middlewares/decompress_tests.rb
@@ -0,0 +1,157 @@
+Shindo.tests('Excon Decompress Middleware') do
+ env_init
+
+ with_server('good') do
+
+ before do
+ @connection ||= Excon.new(
+ 'http://127.0.0.1:9292/echo/content-encoded',
+ :method => :post,
+ :body => 'hello world',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::Decompress]
+ )
+ end
+
+ tests('gzip') do
+ resp = nil
+
+ tests('response body decompressed').returns('hello world') do
+ resp = @connection.request(
+ :headers => { 'Accept-Encoding' => 'gzip, deflate;q=0' }
+ )
+ resp[:body]
+ end
+
+ tests('server sent content-encoding').returns('gzip') do
+ resp[:headers]['Content-Encoding-Sent']
+ end
+
+ tests('removes processed encoding from header').returns('') do
+ resp[:headers]['Content-Encoding']
+ end
+
+ tests('empty response body').returns('') do
+ resp = @connection.request(:body => '')
+ resp[:body]
+ end
+ end
+
+ tests('deflate') do
+ resp = nil
+
+ tests('response body decompressed').returns('hello world') do
+ resp = @connection.request(
+ :headers => { 'Accept-Encoding' => 'gzip;q=0, deflate' }
+ )
+ resp[:body]
+ end
+
+ tests('server sent content-encoding').returns('deflate') do
+ resp[:headers]['Content-Encoding-Sent']
+ end
+
+ tests('removes processed encoding from header').returns('') do
+ resp[:headers]['Content-Encoding']
+ end
+ end
+
+ tests('with pre-encoding') do
+ resp = nil
+
+ tests('server sent content-encoding').returns('other, gzip') do
+ resp = @connection.request(
+ :headers => { 'Accept-Encoding' => 'gzip, deflate;q=0',
+ 'Content-Encoding-Pre' => 'other' }
+ )
+ resp[:headers]['Content-Encoding-Sent']
+ end
+
+ tests('processed encoding removed from header').returns('other') do
+ resp[:headers]['Content-Encoding']
+ end
+
+ tests('response body decompressed').returns('hello world') do
+ resp[:body]
+ end
+
+ end
+
+ tests('with post-encoding') do
+ resp = nil
+
+ tests('server sent content-encoding').returns('gzip, other') do
+ resp = @connection.request(
+ :headers => { 'Accept-Encoding' => 'gzip, deflate;q=0',
+ 'Content-Encoding-Post' => 'other' }
+ )
+ resp[:headers]['Content-Encoding-Sent']
+ end
+
+ tests('unprocessed since last applied is unknown').returns('gzip, other') do
+ resp[:headers]['Content-Encoding']
+ end
+
+ tests('response body still compressed').returns('hello world') do
+ Zlib::GzipReader.new(StringIO.new(resp[:body])).read
+ end
+
+ end
+
+ tests('with a :response_block') do
+ captures = nil
+ resp = nil
+
+ tests('server sent content-encoding').returns('gzip') do
+ captures = capture_response_block do |block|
+ resp = @connection.request(
+ :headers => { 'Accept-Encoding' => 'gzip'},
+ :response_block => block
+ )
+ end
+ resp[:headers]['Content-Encoding-Sent']
+ end
+
+ tests('unprocessed since :response_block was used').returns('gzip') do
+ resp[:headers]['Content-Encoding']
+ end
+
+ tests(':response_block passed unprocessed data').returns('hello world') do
+ body = captures.map {|capture| capture[0] }.join
+ Zlib::GzipReader.new(StringIO.new(body)).read
+ end
+
+ end
+
+ tests('adds Accept-Encoding if needed') do
+
+ tests('without a :response_block').returns('deflate, gzip') do
+ resp = Excon.post(
+ 'http://127.0.0.1:9292/echo/request',
+ :body => 'hello world',
+ :middlewares => Excon.defaults[:middlewares] +
+ [Excon::Middleware::Decompress]
+ )
+ request = Marshal.load(resp.body)
+ request[:headers]['Accept-Encoding']
+ end
+
+ tests('with a :response_block').returns(nil) do
+ captures = capture_response_block do |block|
+ Excon.post(
+ 'http://127.0.0.1:9292/echo/request',
+ :body => 'hello world',
+ :response_block => block,
+ :middlewares => Excon.defaults[:middlewares] +
+ [Excon::Middleware::Decompress]
+ )
+ end
+ request = Marshal.load(captures.map {|capture| capture[0] }.join)
+ request[:headers]['Accept-Encoding']
+ end
+
+ end
+
+ end
+
+ env_restore
+end
diff --git a/lib/vendor/excon/tests/middlewares/escape_path_tests.rb b/lib/vendor/excon/tests/middlewares/escape_path_tests.rb
new file mode 100644
index 0000000..f354a0f
--- /dev/null
+++ b/lib/vendor/excon/tests/middlewares/escape_path_tests.rb
@@ -0,0 +1,36 @@
+Shindo.tests('Excon Decompress Middleware') do
+ env_init
+ with_rackup('basic.ru') do
+ tests('encoded uri passed to connection') do
+ tests('GET /echo%20dirty').returns(200) do
+ connection = Excon::Connection.new({
+ :host => '127.0.0.1',
+ :hostname => '127.0.0.1',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::EscapePath],
+ :nonblock => false,
+ :port => 9292,
+ :scheme => 'http',
+ :ssl_verify_peer => false
+ })
+ response = connection.request(:method => :get, :path => '/echo%20dirty')
+ response[:status]
+ end
+ end
+
+ tests('unencoded uri passed to connection') do
+ tests('GET /echo dirty').returns(200) do
+ connection = Excon::Connection.new({
+ :host => '127.0.0.1',
+ :hostname => '127.0.0.1',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::EscapePath],
+ :nonblock => false,
+ :port => 9292,
+ :scheme => 'http',
+ :ssl_verify_peer => false
+ })
+ response = connection.request(:method => :get, :path => '/echo dirty')
+ response[:status]
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/tests/middlewares/idempotent_tests.rb b/lib/vendor/excon/tests/middlewares/idempotent_tests.rb
new file mode 100644
index 0000000..4c58bce
--- /dev/null
+++ b/lib/vendor/excon/tests/middlewares/idempotent_tests.rb
@@ -0,0 +1,131 @@
+Shindo.tests('Excon request idempotencey') do
+
+ before do
+ @connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ end
+
+ after do
+ # flush any existing stubs after each test
+ Excon.stubs.clear
+ end
+
+ tests("Non-idempotent call with an erroring socket").raises(Excon::Errors::SocketError) do
+ run_count = 0
+ Excon.stub({:method => :get}) { |params|
+ run_count += 1
+ if run_count <= 3 # First 3 calls fail.
+ raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
+ else
+ {:body => params[:body], :headers => params[:headers], :status => 200}
+ end
+ }
+
+ @connection.request(:method => :get, :path => '/some-path')
+ end
+
+ tests("Idempotent request with socket erroring first 3 times").returns(200) do
+ run_count = 0
+ Excon.stub({:method => :get}) { |params|
+ run_count += 1
+ if run_count <= 3 # First 3 calls fail.
+ raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
+ else
+ {:body => params[:body], :headers => params[:headers], :status => 200}
+ end
+ }
+
+ response = @connection.request(:method => :get, :idempotent => true, :path => '/some-path')
+ response.status
+ end
+
+ tests("Idempotent request with socket erroring first 5 times").raises(Excon::Errors::SocketError) do
+ run_count = 0
+ Excon.stub({:method => :get}) { |params|
+ run_count += 1
+ if run_count <= 5 # First 5 calls fail.
+ raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
+ else
+ {:body => params[:body], :headers => params[:headers], :status => 200}
+ end
+ }
+
+ response = @connection.request(:method => :get, :idempotent => true, :path => '/some-path')
+ response.status
+ end
+
+ tests("Lowered retry limit with socket erroring first time").returns(200) do
+ run_count = 0
+ Excon.stub({:method => :get}) { |params|
+ run_count += 1
+ if run_count <= 1 # First call fails.
+ raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
+ else
+ {:body => params[:body], :headers => params[:headers], :status => 200}
+ end
+ }
+
+ response = @connection.request(:method => :get, :idempotent => true, :path => '/some-path', :retry_limit => 2)
+ response.status
+ end
+
+ tests("Lowered retry limit with socket erroring first 3 times").raises(Excon::Errors::SocketError) do
+ run_count = 0
+ Excon.stub({:method => :get}) { |params|
+ run_count += 1
+ if run_count <= 3 # First 3 calls fail.
+ raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
+ else
+ {:body => params[:body], :headers => params[:headers], :status => 200}
+ end
+ }
+
+ response = @connection.request(:method => :get, :idempotent => true, :path => '/some-path', :retry_limit => 2)
+ response.status
+ end
+
+ tests("Raised retry limit with socket erroring first 5 times").returns(200) do
+ run_count = 0
+ Excon.stub({:method => :get}) { |params|
+ run_count += 1
+ if run_count <= 5 # First 5 calls fail.
+ raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
+ else
+ {:body => params[:body], :headers => params[:headers], :status => 200}
+ end
+ }
+
+ response = @connection.request(:method => :get, :idempotent => true, :path => '/some-path', :retry_limit => 8)
+ response.status
+ end
+
+ tests("Raised retry limit with socket erroring first 9 times").raises(Excon::Errors::SocketError) do
+ run_count = 0
+ Excon.stub({:method => :get}) { |params|
+ run_count += 1
+ if run_count <= 9 # First 9 calls fail.
+ raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
+ else
+ {:body => params[:body], :headers => params[:headers], :status => 200}
+ end
+ }
+
+ response = @connection.request(:method => :get, :idempotent => true, :path => '/some-path', :retry_limit => 8)
+ response.status
+ end
+
+ tests("Retry limit in constructor with socket erroring first 5 times").returns(200) do
+ run_count = 0
+ Excon.stub({:method => :get}) { |params|
+ run_count += 1
+ if run_count <= 5 # First 5 calls fail.
+ raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
+ else
+ {:body => params[:body], :headers => params[:headers], :status => 200}
+ end
+ }
+
+ response = @connection.request(:method => :get, :idempotent => true, :path => '/some-path', :retry_limit => 6)
+ response.status
+ end
+
+end
diff --git a/lib/vendor/excon/tests/middlewares/instrumentation_tests.rb b/lib/vendor/excon/tests/middlewares/instrumentation_tests.rb
new file mode 100644
index 0000000..cc2f57d
--- /dev/null
+++ b/lib/vendor/excon/tests/middlewares/instrumentation_tests.rb
@@ -0,0 +1,315 @@
+require 'active_support/notifications'
+require 'securerandom'
+
+class SimpleInstrumentor
+ class << self
+ attr_accessor :events, :blocks
+
+ def instrument(name, params = {}, &block)
+ @events << name
+ @blocks << name if block_given?
+
+ yield if block_given?
+ end
+
+ def reset!
+ @events = []
+ @blocks = []
+ end
+ end
+end
+
+Shindo.tests('Excon instrumentation') do
+
+ after do
+ ActiveSupport::Notifications.unsubscribe("excon")
+ ActiveSupport::Notifications.unsubscribe("excon.request")
+ ActiveSupport::Notifications.unsubscribe("excon.response")
+ ActiveSupport::Notifications.unsubscribe("excon.retry")
+ ActiveSupport::Notifications.unsubscribe("excon.error")
+ ActiveSupport::Notifications.unsubscribe("gug")
+ Delorean.back_to_the_present
+ Excon.stubs.clear
+ end
+
+ before do
+ SimpleInstrumentor.reset!
+ end
+
+ def subscribe(match)
+ @events = []
+ ActiveSupport::Notifications.subscribe(match) do |*args|
+ @events << ActiveSupport::Notifications::Event.new(*args)
+ end
+ end
+
+ def make_request(idempotent = false, params = {})
+ connection = Excon.new(
+ 'http://127.0.0.1:9292',
+ :instrumentor => ActiveSupport::Notifications,
+ :mock => true
+ )
+ if idempotent
+ params[:idempotent] = :true
+ end
+ connection.get(params)
+ end
+
+ REQUEST_DELAY_SECONDS = 30
+ def stub_success
+ Excon.stub({:method => :get}) { |params|
+ Delorean.jump REQUEST_DELAY_SECONDS
+ {:body => params[:body], :headers => params[:headers], :status => 200}
+ }
+ end
+
+ def stub_retries
+ run_count = 0
+ Excon.stub({:method => :get}) { |params|
+ run_count += 1
+ if run_count <= 3 # First 3 calls fail.
+ raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
+ else
+ {:body => params[:body], :headers => params[:headers], :status => 200}
+ end
+ }
+ end
+
+ def stub_failure
+ Excon.stub({:method => :get}) { |params|
+ raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
+ }
+ end
+
+ tests('basic notification').returns(['excon.request', 'excon.response']) do
+ subscribe(/excon/)
+ stub_success
+ make_request
+ @events.map(&:name)
+ end
+
+ tests('captures scheme, host, port, and path').returns([:host, :path, :port, :scheme]) do
+ subscribe(/excon/)
+ stub_success
+ make_request
+ [:host, :path, :port, :scheme].select {|k| @events.first.payload.has_key? k}
+ end
+
+ tests('params in request overwrite those in constructor').returns('/cheezburger') do
+ subscribe(/excon/)
+ stub_success
+ make_request(false, :path => '/cheezburger')
+ @events.first.payload[:path]
+ end
+
+ tests('notify on retry').returns(3) do
+ subscribe(/excon/)
+ stub_retries
+ make_request(true)
+ @events.count{|e| e.name =~ /retry/}
+ end
+
+ tests('notify on error').returns(true) do
+ subscribe(/excon/)
+ stub_failure
+ raises(Excon::Errors::SocketError) do
+ make_request
+ end
+
+ @events.any?{|e| e.name =~ /error/}
+ end
+
+ tests('filtering').returns(['excon.request', 'excon.error']) do
+ subscribe(/excon.request/)
+ subscribe(/excon.error/)
+ stub_failure
+ raises(Excon::Errors::SocketError) do
+ make_request(true)
+ end
+
+ @events.map(&:name)
+ end
+
+ tests('more filtering').returns(['excon.retry', 'excon.retry', 'excon.retry']) do
+ subscribe(/excon.retry/)
+ stub_failure
+ raises(Excon::Errors::SocketError) do
+ make_request(true)
+ end
+
+ @events.map(&:name)
+ end
+
+ tests('indicates duration').returns(true) do
+ subscribe(/excon/)
+ stub_success
+ make_request
+ (@events.first.duration/1000 - REQUEST_DELAY_SECONDS).abs < 1
+ end
+
+ tests('standard instrumentor') do
+
+ tests('success').returns(
+ ['excon.request', 'excon.retry', 'excon.retry', 'excon.retry', 'excon.error']) do
+
+ begin
+ original_stderr = $stderr
+ $stderr = captured_stderr = StringIO.new
+ stub_failure
+ connection = Excon.new(
+ 'http://127.0.0.1:9292',
+ :instrumentor => Excon::StandardInstrumentor,
+ :mock => true
+ )
+ raises(Excon::Errors::SocketError) do
+ connection.get(:idempotent => true)
+ end
+
+ captured_stderr.string.split("\n").reject {|line| line =~ %r{^ }}.map {|event| event.split(' ').first}
+ ensure
+ $stderr = original_stderr
+ end
+ end
+
+ tests('authorization header REDACT') do
+
+ @auth_header = 'Basic dXNlcjpwYXNz'
+
+ begin
+ original_stderr = $stderr
+ $stderr = @captured_stderr = StringIO.new
+ stub_failure
+ raises(Excon::Errors::SocketError) do
+ @connection = Excon.new(
+ 'http://user:pass@127.0.0.1:9292',
+ :headers => {
+ 'Authorization' => @auth_header
+ },
+ :instrumentor => Excon::StandardInstrumentor,
+ :mock => true
+ )
+ @connection.get(:idempotent => true)
+ end
+ ensure
+ $stderr = original_stderr
+ end
+
+ test('does not appear in response') do
+ !@captured_stderr.string.include?(@auth_header)
+ end
+
+ test('does not mutate Authorization value') do
+ @connection.data[:headers]['Authorization'] == @auth_header
+ end
+
+ end
+
+ tests('password REDACT') do
+
+ begin
+ original_stderr = $stderr
+ $stderr = @captured_stderr = StringIO.new
+ stub_failure
+ raises(Excon::Errors::SocketError) do
+ @connection = Excon.new(
+ 'http://user:pass@127.0.0.1:9292',
+ :instrumentor => Excon::StandardInstrumentor,
+ :mock => true
+ )
+ @connection.get(:idempotent => true)
+ end
+ ensure
+ $stderr = original_stderr
+ end
+
+ @password_param = '"pass"'
+
+ test('does not appear in response') do
+ !@captured_stderr.string.include?(@password_param)
+ end
+
+ test('does not mutate password value') do
+ @connection.data[:password] == "pass"
+ end
+
+ end
+
+ end
+
+ tests('use our own instrumentor').returns(
+ ['excon.request', 'excon.retry', 'excon.retry', 'excon.retry', 'excon.error']) do
+ stub_failure
+ connection = Excon.new(
+ 'http://127.0.0.1:9292',
+ :instrumentor => SimpleInstrumentor,
+ :mock => true
+ )
+ raises(Excon::Errors::SocketError) do
+ connection.get(:idempotent => true)
+ end
+
+ SimpleInstrumentor.events
+ end
+
+ tests('always passes the block').returns(
+ ['excon.request', 'excon.response']) do
+ stub_success
+ connection = Excon.new(
+ 'http://127.0.0.1:9292',
+ :instrumentor => SimpleInstrumentor,
+ :mock => true
+ )
+ connection.get(:idempotent => true)
+
+ SimpleInstrumentor.blocks
+ end
+
+ tests('does not generate events when not provided').returns(0) do
+ subscribe(/excon/)
+ stub_success
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ connection.get(:idempotent => true)
+ @events.count
+ end
+
+ tests('allows setting the prefix').returns(
+ ['gug.request', 'gug.retry', 'gug.retry','gug.retry', 'gug.error']) do
+ subscribe(/gug/)
+ stub_failure
+ connection = Excon.new(
+ 'http://127.0.0.1:9292',
+ :instrumentor => ActiveSupport::Notifications,
+ :instrumentor_name => 'gug',
+ :mock => true
+ )
+ raises(Excon::Errors::SocketError) do
+ connection.get(:idempotent => true)
+ end
+ @events.map(&:name)
+ end
+
+ tests('allows setting the prefix when not idempotent', 'foo').returns(
+ ['gug.request', 'gug.error']) do
+ subscribe(/gug/)
+ stub_failure
+ connection = Excon.new(
+ 'http://127.0.0.1:9292',
+ :instrumentor => ActiveSupport::Notifications,
+ :instrumentor_name => 'gug',
+ :mock => true
+ )
+ raises(Excon::Errors::SocketError) do
+ connection.get()
+ end
+ @events.map(&:name)
+ end
+
+ with_rackup('basic.ru') do
+ tests('works unmocked').returns(['excon.request', 'excon.response']) do
+ subscribe(/excon/)
+ make_request(false, :mock => false)
+ @events.map(&:name)
+ end
+ end
+end
+
diff --git a/lib/vendor/excon/tests/middlewares/mock_tests.rb b/lib/vendor/excon/tests/middlewares/mock_tests.rb
new file mode 100644
index 0000000..49c25aa
--- /dev/null
+++ b/lib/vendor/excon/tests/middlewares/mock_tests.rb
@@ -0,0 +1,304 @@
+Shindo.tests('Excon stubs') do
+ env_init
+
+ tests("missing stub").raises(Excon::Errors::StubNotFound) do
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ connection.request(:method => :get, :path => '/content-length/100')
+ end
+
+ tests("stub({})").raises(ArgumentError) do
+ Excon.stub({})
+ end
+
+ tests("stub({}, {}) {}").raises(ArgumentError) do
+ Excon.stub({}, {}) {}
+ end
+
+ tests("stub({:method => :get}, {:body => 'body', :status => 200})") do
+ connection = nil
+ response = nil
+
+ tests('response.body').returns('body') do
+ Excon.stub({:method => :get}, {:body => 'body', :status => 200})
+
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ response = connection.request(:method => :get, :path => '/content-length/100')
+
+ response.body
+ end
+
+ tests('response.headers').returns({}) do
+ response.headers
+ end
+
+ tests('response.status').returns(200) do
+ response.status
+ end
+
+ tests('response_block yields body').returns('body') do
+ body = ''
+ response_block = lambda do |chunk, remaining_bytes, total_bytes|
+ body << chunk
+ end
+ connection.request(:method => :get, :path => '/content-length/100', :response_block => response_block)
+ body
+ end
+
+ tests('response.body empty with response_block').returns('') do
+ response_block = lambda { |_, _, _| }
+ connection.request(:method => :get, :path => '/content-length/100', :response_block => response_block).body
+ end
+
+ Excon.stubs.clear
+
+ end
+
+ tests("stub({:path => %r{/tests/(\S+)}}, {:body => $1, :status => 200})") do
+ connection = nil
+ response = nil
+
+ tests('response.body').returns('test') do
+ Excon.stub({:path => %r{/tests/(\S+)}}) do |params|
+ {
+ :body => params[:captures][:path].first,
+ :status => 200
+ }
+ end
+
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ response = connection.request(:method => :get, :path => '/tests/test')
+
+ response.body
+ end
+
+ tests('response.headers').returns({}) do
+ response.headers
+ end
+
+ tests('response.status').returns(200) do
+ response.status
+ end
+
+ Excon.stubs.clear
+
+ end
+
+ tests("stub({:body => 'body', :method => :get}) {|params| {:body => params[:body], :headers => params[:headers], :status => 200}}") do
+ connection = nil
+ response = nil
+
+ tests('response.body').returns('body') do
+ Excon.stub({:body => 'body', :method => :get}) {|params| {:body => params[:body], :headers => params[:headers], :status => 200}}
+
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ response = connection.request(:body => 'body', :method => :get, :path => '/content-length/100')
+
+ response.body
+ end
+
+ tests('response.headers').returns({'Host' => '127.0.0.1:9292', 'User-Agent' => "excon/#{Excon::VERSION}"}) do
+ response.headers
+ end
+
+ tests('response.status').returns(200) do
+ response.status
+ end
+
+ tests('response_block yields body').returns('body') do
+ body = ''
+ response_block = lambda do |chunk, remaining_bytes, total_bytes|
+ body << chunk
+ end
+ connection.request(:body => 'body', :method => :get, :path => '/content-length/100', :response_block => response_block)
+ body
+ end
+
+ tests('response.body empty with response_block').returns('') do
+ response_block = lambda { |_, _, _| }
+ connection.request(:body => 'body', :method => :get, :path => '/content-length/100', :response_block => response_block).body
+ end
+
+ Excon.stubs.clear
+
+ end
+
+ tests("stub({:body => File.open(...), :method => :get}, { :status => 200 })") do
+
+ tests('response.status').returns(200) do
+ file_path = File.join(File.dirname(__FILE__), '..', 'data', 'xs')
+
+ Excon.stub(
+ { :body => File.read(file_path), :method => :get },
+ { :status => 200 }
+ )
+
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ response = connection.request(:body => File.open(file_path), :method => :get, :path => '/')
+
+ response.status
+ end
+
+ Excon.stubs.clear
+
+ end
+
+ tests("invalid stub response").raises(Excon::Errors::InvalidStub) do
+ Excon.stub({:body => 42, :method => :get}, {:status => 200})
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ connection.request(:body => 42, :method => :get, :path => '/').status
+ end
+
+ tests("mismatched stub").raises(Excon::Errors::StubNotFound) do
+ Excon.stub({:method => :post}, {:body => 'body'})
+ Excon.get('http://127.0.0.1:9292/', :mock => true)
+ end
+
+ with_server('good') do
+ tests('allow mismatched stub').returns(200) do
+ Excon.stub({:path => '/echo/request_count'}, {:body => 'body'})
+ Excon.get(
+ 'http://127.0.0.1:9292/echo/request',
+ :mock => true,
+ :allow_unstubbed_requests => true
+ ).status
+ end
+ end
+
+ Excon.stubs.clear
+
+ tests("stub({}, {:body => 'x' * (Excon::DEFAULT_CHUNK_SIZE + 1)})") do
+
+ test("response_block yields body") do
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ Excon.stub({}, {:body => 'x' * (Excon::DEFAULT_CHUNK_SIZE + 1)})
+
+ chunks = []
+ response_block = lambda do |chunk, remaining_bytes, total_bytes|
+ chunks << chunk
+ end
+ connection.request(:method => :get, :path => '/content-length/100', :response_block => response_block)
+ chunks == ['x' * Excon::DEFAULT_CHUNK_SIZE, 'x']
+ end
+
+ tests("response.body empty with response_block").returns('') do
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ Excon.stub({}, {:body => 'x' * (Excon::DEFAULT_CHUNK_SIZE + 1)})
+ response_block = lambda { |_, _, _| }
+ connection.request(:method => :get, :path => '/content-length/100', :response_block => response_block).body
+ end
+
+ end
+
+ Excon.stubs.clear
+
+ tests("stub({:url => 'https://user:pass@foo.bar.com:9999/baz?quux=true'}, {:status => 200})") do
+ test("get(:expects => 200)") do
+ Excon.stub({:url => 'https://user:pass@foo.bar.com:9999/baz?quux=true'}, {:status => 200})
+ Excon.new("https://user:pass@foo.bar.com:9999/baz?quux=true", :mock => true).get(:expects => 200)
+ true
+ end
+ end
+
+ Excon.stubs.clear
+
+ tests("stub({}, {:status => 404, :body => 'Not Found'}") do
+ connection = nil
+
+ tests("request(:expects => 200, :method => :get, :path => '/')").raises(Excon::Errors::NotFound) do
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ Excon.stub({}, {:status => 404, :body => 'Not Found'})
+
+ connection.request(:expects => 200, :method => :get, :path => '/')
+ end
+
+ tests("Expects exception should contain response object").returns(Excon::Response) do
+ begin
+ connection.request(:expects => 200, :method => :get, :path => '/')
+ rescue Excon::Errors::NotFound => e
+ e.response.class
+ end
+ end
+
+ test("request(:expects => 200, :method => :get, :path => '/') with block does not invoke the block since it raises an error") do
+ block_called = false
+ begin
+ response_block = lambda do |_,_,_|
+ block_called = true
+ end
+ connection.request(:expects => 200, :method => :get, :path => '/', :response_block => response_block)
+ rescue Excon::Errors::NotFound
+ end
+ !block_called
+ end
+
+ Excon.stubs.clear
+
+ end
+
+ tests("stub_for({})") do
+ tests("stub_for({})").returns([{}, {}]) do
+ Excon.new('http://127.0.0.1:9292', :mock => true)
+ Excon.stub({}, {})
+
+ Excon.stub_for({})
+ end
+
+ Excon.stubs.clear
+ end
+
+ tests("unstub({})") do
+ connection = nil
+
+ tests("unstub({})").returns([{}, {}]) do
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ Excon.stub({}, {})
+
+ Excon.unstub({})
+ end
+
+ tests("request(:method => :get)").raises(Excon::Errors::StubNotFound) do
+ connection.request(:method => :get)
+ end
+
+ Excon.stubs.clear
+ end
+
+ tests("global stubs") do
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ Excon.stub({}, {:body => '1'})
+ t = Thread.new do
+ Excon.stub({}, {:body => '2'})
+ connection.request(:method => :get).body
+ end
+ tests("get on a different thread").returns('2') do
+ t.join.value
+ end
+ tests("get on main thread").returns('2') do
+ connection.request(:method => :get).body
+ end
+ Excon.stubs.clear
+ end
+
+ tests("thread-local stubs") do
+ original_stubs_value = Excon.defaults[:stubs]
+ Excon.defaults[:stubs] = :local
+
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ Excon.stub({}, {:body => '1'})
+ t = Thread.new do
+ Excon.stub({}, {:body => '2'})
+ connection.request(:method => :get).body
+ end
+ tests("get on a different thread").returns('2') do
+ t.join.value
+ end
+ tests("get on main thread").returns('1') do
+ connection.request(:method => :get).body
+ end
+ Excon.stubs.clear
+
+ Excon.defaults[:stubs] = original_stubs_value
+ end
+
+ env_restore
+end
diff --git a/lib/vendor/excon/tests/middlewares/redirect_follower_tests.rb b/lib/vendor/excon/tests/middlewares/redirect_follower_tests.rb
new file mode 100644
index 0000000..d99271b
--- /dev/null
+++ b/lib/vendor/excon/tests/middlewares/redirect_follower_tests.rb
@@ -0,0 +1,80 @@
+Shindo.tests('Excon redirector support') do
+ env_init
+
+ tests("request(:method => :get, :path => '/old').body").returns('new') do
+ Excon.stub(
+ { :path => '/old' },
+ {
+ :headers => { 'Location' => 'http://127.0.0.1:9292/new' },
+ :body => 'old',
+ :status => 301
+ }
+ )
+
+ Excon.stub(
+ { :path => '/new' },
+ {
+ :body => 'new',
+ :status => 200
+ }
+ )
+
+ Excon.get(
+ 'http://127.0.0.1:9292',
+ :path => '/old',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::RedirectFollower],
+ :mock => true
+ ).body
+ end
+
+ env_restore
+end
+
+Shindo.tests('Excon redirect support for relative Location headers') do
+ env_init
+
+ tests("request(:method => :get, :path => '/old').body").returns('new') do
+ Excon.stub(
+ { :path => '/old' },
+ {
+ :headers => { 'Location' => '/new' },
+ :body => 'old',
+ :status => 301
+ }
+ )
+
+ Excon.stub(
+ { :path => '/new' },
+ {
+ :body => 'new',
+ :status => 200
+ }
+ )
+
+ Excon.get(
+ 'http://127.0.0.1:9292',
+ :path => '/old',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::RedirectFollower],
+ :mock => true
+ ).body
+ end
+
+ env_restore
+end
+
+Shindo.tests("Excon redirecting post request") do
+ env_init
+
+ with_rackup('redirecting.ru') do
+ tests("request not have content-length and body").returns('ok') do
+ Excon.post(
+ 'http://127.0.0.1:9292',
+ :path => '/first',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::RedirectFollower],
+ :body => "a=Some_content"
+ ).body
+ end
+ end
+
+ env_restore
+end
diff --git a/lib/vendor/excon/tests/pipeline_tests.rb b/lib/vendor/excon/tests/pipeline_tests.rb
new file mode 100644
index 0000000..578762b
--- /dev/null
+++ b/lib/vendor/excon/tests/pipeline_tests.rb
@@ -0,0 +1,40 @@
+Shindo.tests('Pipelined Requests') do
+ with_server('good') do
+
+ tests('with default :persistent => true') do
+ returns(%w{ 1 2 3 4 }, 'connection is persistent') do
+ connection = Excon.new('http://127.0.0.1:9292', :persistent => true)
+
+ ret = []
+ ret << connection.requests([
+ {:method => :get, :path => '/echo/request_count'},
+ {:method => :get, :path => '/echo/request_count'}
+ ]).map(&:body)
+ ret << connection.requests([
+ {:method => :get, :path => '/echo/request_count'},
+ {:method => :get, :path => '/echo/request_count'}
+ ]).map(&:body)
+ ret.flatten
+ end
+ end
+
+ tests('with default :persistent => false') do
+ returns(%w{ 1 2 1 2 }, 'connection is persistent per call to #requests') do
+ connection = Excon.new('http://127.0.0.1:9292', :persistent => false)
+
+ ret = []
+ ret << connection.requests([
+ {:method => :get, :path => '/echo/request_count'},
+ {:method => :get, :path => '/echo/request_count'}
+ ]).map(&:body)
+ ret << connection.requests([
+ {:method => :get, :path => '/echo/request_count'},
+ {:method => :get, :path => '/echo/request_count'}
+ ]).map(&:body)
+ ret.flatten
+ end
+
+ end
+
+ end
+end
diff --git a/lib/vendor/excon/tests/proxy_tests.rb b/lib/vendor/excon/tests/proxy_tests.rb
new file mode 100644
index 0000000..b1a5e2f
--- /dev/null
+++ b/lib/vendor/excon/tests/proxy_tests.rb
@@ -0,0 +1,306 @@
+Shindo.tests('Excon proxy support') do
+ env_init
+
+ tests('proxy configuration') do
+
+ tests('no proxy') do
+ tests('connection.data[:proxy]').returns(nil) do
+ connection = Excon.new('http://foo.com')
+ connection.data[:proxy]
+ end
+ end
+
+ tests('empty proxy') do
+ tests('connection.data[:proxy]').returns(nil) do
+ connection = Excon.new('http://foo.com', :proxy => '')
+ connection.data[:proxy]
+ end
+ end
+
+ tests('with fully-specified proxy: https://myproxy.net:8080') do
+ connection = nil
+
+ tests('connection.data[:proxy][:host]').returns('myproxy.net') do
+ connection = Excon.new('http://foo.com', :proxy => 'https://myproxy.net:8080')
+ connection.data[:proxy][:host]
+ end
+
+ tests('connection.data[:proxy][:port]').returns(8080) do
+ connection.data[:proxy][:port]
+ end
+
+ tests('connection.data[:proxy][:scheme]').returns('https') do
+ connection.data[:proxy][:scheme]
+ end
+ end
+
+ tests('with fully-specified Unix socket proxy: unix:///') do
+ connection = nil
+
+ tests('connection.data[:proxy][:host]').returns(nil) do
+ connection = Excon.new('http://foo.com', :proxy => 'unix:///tmp/myproxy.sock')
+ connection.data[:proxy][:host]
+ end
+
+ tests('connection.data[:proxy][:port]').returns(nil) do
+ connection.data[:proxy][:port]
+ end
+
+ tests('connection.data[:proxy][:scheme]').returns('unix') do
+ connection.data[:proxy][:scheme]
+ end
+
+ tests('connection.data[:proxy][:path]').returns('/tmp/myproxy.sock') do
+ connection.data[:proxy][:path]
+ end
+ end
+
+ def env_proxy_tests(env)
+ env_init(env)
+
+ tests('an http connection') do
+ connection = nil
+
+ tests('connection.data[:proxy][:host]').returns('myproxy') do
+ connection = Excon.new('http://foo.com')
+ connection.data[:proxy][:host]
+ end
+
+ tests('connection.data[:proxy][:port]').returns(8080) do
+ connection.data[:proxy][:port]
+ end
+
+ tests('connection.data[:proxy][:scheme]').returns('http') do
+ connection.data[:proxy][:scheme]
+ end
+
+ tests('with disable_proxy set') do
+ connection = nil
+
+ tests('connection.data[:proxy]').returns(nil) do
+ connection = Excon.new('http://foo.com', :disable_proxy => true)
+ connection.data[:proxy]
+ end
+ end
+ end
+
+ tests('an https connection') do
+ connection = nil
+
+ tests('connection.data[:proxy][:host]').returns('mysecureproxy') do
+ connection = Excon.new('https://secret.com')
+ connection.data[:proxy][:host]
+ end
+
+ tests('connection.data[:proxy][:port]').returns(8081) do
+ connection.data[:proxy][:port]
+ end
+
+ tests('connection.data[:proxy][:scheme]').returns('http') do
+ connection.data[:proxy][:scheme]
+ end
+
+ tests('with disable_proxy set') do
+ connection = nil
+
+ tests('connection.data[:proxy]').returns(nil) do
+ connection = Excon.new('https://foo.com', :disable_proxy => true)
+ connection.data[:proxy]
+ end
+ end
+ end
+
+ tests('http proxy from the environment overrides config') do
+ connection = nil
+
+ tests('connection.data[:proxy][:host]').returns('myproxy') do
+ connection = Excon.new('http://foo.com', :proxy => 'http://hard.coded.proxy:6666')
+ connection.data[:proxy][:host]
+ end
+
+ tests('connection.data[:proxy][:port]').returns(8080) do
+ connection.data[:proxy][:port]
+ end
+ end
+
+ tests('an http connection in no_proxy') do
+ tests('connection.data[:proxy]').returns(nil) do
+ connection = Excon.new('http://somesubdomain.noproxy')
+ connection.data[:proxy]
+ end
+ end
+
+ tests('an http connection not completely matching no_proxy') do
+ tests('connection.data[:proxy][:host]').returns('myproxy') do
+ connection = Excon.new('http://noproxy2')
+ connection.data[:proxy][:host]
+ end
+ end
+
+ tests('an http connection with subdomain in no_proxy') do
+ tests('connection.data[:proxy]').returns(nil) do
+ connection = Excon.new('http://a.subdomain.noproxy2')
+ connection.data[:proxy]
+ end
+ end
+
+ env_restore
+ end
+
+ tests('with complete proxy config from the environment') do
+ env = {
+ 'http_proxy' => 'http://myproxy:8080',
+ 'https_proxy' => 'http://mysecureproxy:8081',
+ 'no_proxy' => 'noproxy, subdomain.noproxy2'
+ }
+ tests('lowercase') { env_proxy_tests(env) }
+ upperenv = {}
+ env.each do |k, v|
+ upperenv[k.upcase] = v
+ end
+ tests('uppercase') { env_proxy_tests(upperenv) }
+ end
+
+ tests('with only http_proxy config from the environment') do
+ env_init({'http_proxy' => 'http://myproxy:8080' })
+
+ tests('an https connection') do
+ connection = nil
+
+ tests('connection.data[:proxy][:host]').returns('myproxy') do
+ connection = Excon.new('https://secret.com')
+ connection.data[:proxy][:host]
+ end
+
+ tests('connection.data[:proxy][:port]').returns(8080) do
+ connection.data[:proxy][:port]
+ end
+
+ tests('connection.data[:proxy][:scheme]').returns('http') do
+ connection.data[:proxy][:scheme]
+ end
+ end
+
+ env_restore
+ end
+
+ tests('with a unix socket proxy config from the environment') do
+ env_init({
+ 'http_proxy' => 'unix:///tmp/myproxy.sock',
+ })
+
+ tests('an https connection') do
+ connection = nil
+
+ tests('connection.data[:proxy][:host]').returns(nil) do
+ connection = Excon.new('https://secret.com')
+ connection.data[:proxy][:host]
+ end
+
+ tests('connection.data[:proxy][:port]').returns(nil) do
+ connection.data[:proxy][:port]
+ end
+
+ tests('connection.data[:proxy][:scheme]').returns('unix') do
+ connection.data[:proxy][:scheme]
+ end
+
+ tests('connection.data[:proxy][:path]').returns('/tmp/myproxy.sock') do
+ connection.data[:proxy][:path]
+ end
+ end
+
+ env_restore
+ end
+
+ end
+
+ with_rackup('proxy.ru') do
+
+ tests('http proxying: http://foo.com:8080') do
+ response = nil
+
+ tests('response.status').returns(200) do
+ connection = Excon.new('http://foo.com:8080', :proxy => 'http://127.0.0.1:9292')
+ response = connection.request(:method => :get, :path => '/bar', :query => {:alpha => 'kappa'})
+
+ response.status
+ end
+
+ # must be absolute form for proxy requests
+ tests('sent Request URI').returns('http://foo.com:8080/bar?alpha=kappa') do
+ response.headers['Sent-Request-Uri']
+ end
+
+ tests('sent Sent-Host header').returns('foo.com:8080') do
+ response.headers['Sent-Host']
+ end
+
+ tests('sent Proxy-Connection header').returns('Keep-Alive') do
+ response.headers['Sent-Proxy-Connection']
+ end
+
+ tests('response.body (proxied content)').returns('proxied content') do
+ response.body
+ end
+ end
+
+ tests('http proxying: http://user:pass@foo.com:8080') do
+ response = nil
+
+ tests('response.status').returns(200) do
+ connection = Excon.new('http://foo.com:8080', :proxy => 'http://user:pass@127.0.0.1:9292')
+ response = connection.request(:method => :get, :path => '/bar', :query => {:alpha => 'kappa'})
+
+ response.status
+ end
+
+ # must be absolute form for proxy requests
+ tests('sent Request URI').returns('http://foo.com:8080/bar?alpha=kappa') do
+ response.headers['Sent-Request-Uri']
+ end
+
+ tests('sent Host header').returns('foo.com:8080') do
+ response.headers['Sent-Host']
+ end
+
+ tests('sent Proxy-Connection header').returns('Keep-Alive') do
+ response.headers['Sent-Proxy-Connection']
+ end
+
+ tests('response.body (proxied content)').returns('proxied content') do
+ response.body
+ end
+ end
+
+ end
+
+ with_unicorn('proxy.ru', 'unix:///tmp/myproxy.sock') do
+ pending if RUBY_PLATFORM == 'java' # need to find suitable server for jruby
+
+ tests('http proxying over unix socket: http://foo.com:8080') do
+ response = nil
+
+ tests('response.status').returns(200) do
+ connection = Excon.new('http://foo.com:8080', :proxy => 'unix:///tmp/myproxy.sock')
+ response = connection.request(:method => :get, :path => '/bar', :query => {:alpha => 'kappa'})
+
+ response.status
+ end
+
+ tests('sent Sent-Host header').returns('foo.com:8080') do
+ response.headers['Sent-Host']
+ end
+
+ tests('sent Proxy-Connection header').returns('Keep-Alive') do
+ response.headers['Sent-Proxy-Connection']
+ end
+
+ tests('response.body (proxied content)').returns('proxied content') do
+ response.body
+ end
+ end
+ end
+
+ env_restore
+end
diff --git a/lib/vendor/excon/tests/query_string_tests.rb b/lib/vendor/excon/tests/query_string_tests.rb
new file mode 100644
index 0000000..0304250
--- /dev/null
+++ b/lib/vendor/excon/tests/query_string_tests.rb
@@ -0,0 +1,87 @@
+Shindo.tests('Excon query string variants') do
+ with_rackup('query_string.ru') do
+ connection = Excon.new('http://127.0.0.1:9292')
+
+ tests(":query => {:foo => 'bar'}") do
+ response = connection.request(:method => :get, :path => '/query', :query => {:foo => 'bar'})
+ query_string = response.body[7..-1] # query string sent
+
+ tests("query string sent").returns('foo=bar') do
+ query_string
+ end
+ end
+
+ tests(":query => {:foo => nil}") do
+ response = connection.request(:method => :get, :path => '/query', :query => {:foo => nil})
+ query_string = response.body[7..-1] # query string sent
+
+ tests("query string sent").returns('foo') do
+ query_string
+ end
+ end
+
+ tests(":query => {:foo => 'bar', :me => nil}") do
+ response = connection.request(:method => :get, :path => '/query', :query => {:foo => 'bar', :me => nil})
+ query_string = response.body[7..-1] # query string sent
+
+ test("query string sent includes 'foo=bar'") do
+ query_string.split('&').include?('foo=bar')
+ end
+
+ test("query string sent includes 'me'") do
+ query_string.split('&').include?('me')
+ end
+ end
+
+ tests(":query => {:foo => 'bar', :me => 'too'}") do
+ response = connection.request(:method => :get, :path => '/query', :query => {:foo => 'bar', :me => 'too'})
+ query_string = response.body[7..-1] # query string sent
+
+ test("query string sent includes 'foo=bar'") do
+ query_string.split('&').include?('foo=bar')
+ end
+
+ test("query string sent includes 'me=too'") do
+ query_string.split('&').include?('me=too')
+ end
+ end
+
+ # You can use an atom or a string for the hash keys, what is shown here is emulating
+ # the Rails and PHP style of serializing a query array with a square brackets suffix.
+ tests(":query => {'foo[]' => ['bar', 'baz'], :me => 'too'}") do
+ response = connection.request(:method => :get, :path => '/query', :query => {'foo[]' => ['bar', 'baz'], :me => 'too'})
+ query_string = response.body[7..-1] # query string sent
+
+ test("query string sent includes 'foo%5B%5D=bar'") do
+ query_string.split('&').include?('foo%5B%5D=bar')
+ end
+
+ test("query string sent includes 'foo%5B%5D=baz'") do
+ query_string.split('&').include?('foo%5B%5D=baz')
+ end
+
+ test("query string sent includes 'me=too'") do
+ query_string.split('&').include?('me=too')
+ end
+ end
+
+ tests(":query => {'foo%=#' => 'bar%=#'}") do
+ response = connection.request(:method => :get, :path => '/query', :query => {'foo%=#' => 'bar%=#'})
+ query_string = response.body[7..-1] # query string sent
+
+ tests("query string sent").returns('foo%25%3D%23=bar%25%3D%23') do
+ query_string
+ end
+ end
+
+ tests(":query => {'foo%=#' => nil}") do
+ response = connection.request(:method => :get, :path => '/query', :query => {'foo%=#' => nil})
+ query_string = response.body[7..-1] # query string sent
+
+ tests("query string sent").returns('foo%25%3D%23') do
+ query_string
+ end
+ end
+
+ end
+end
diff --git a/lib/vendor/excon/tests/rackups/basic.rb b/lib/vendor/excon/tests/rackups/basic.rb
new file mode 100644
index 0000000..0bddd9a
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/basic.rb
@@ -0,0 +1,41 @@
+require 'sinatra'
+require 'json'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class Basic < Sinatra::Base
+ set :environment, :production
+ enable :dump_errors
+
+ get('/content-length/:value') do |value|
+ headers("Custom" => "Foo: bar")
+ 'x' * value.to_i
+ end
+
+ get('/headers') do
+ content_type :json
+ request.env.select{|key, _| key.start_with? 'HTTP_'}.to_json
+ end
+
+ post('/body-sink') do
+ request.body.read.size.to_s
+ end
+
+ post('/echo') do
+ echo
+ end
+
+ put('/echo') do
+ echo
+ end
+
+ get('/echo dirty') do
+ echo
+ end
+
+ private
+
+ def echo
+ request.body.read
+ end
+
+end
diff --git a/lib/vendor/excon/tests/rackups/basic.ru b/lib/vendor/excon/tests/rackups/basic.ru
new file mode 100644
index 0000000..90704a2
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/basic.ru
@@ -0,0 +1,3 @@
+require File.join(File.dirname(__FILE__), 'basic')
+
+run Basic
diff --git a/lib/vendor/excon/tests/rackups/basic_auth.ru b/lib/vendor/excon/tests/rackups/basic_auth.ru
new file mode 100644
index 0000000..d4565fb
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/basic_auth.ru
@@ -0,0 +1,14 @@
+require File.join(File.dirname(__FILE__), 'basic')
+
+class BasicAuth < Basic
+ before do
+ auth ||= Rack::Auth::Basic::Request.new(request.env)
+ user, pass = auth.provided? && auth.basic? && auth.credentials
+ unless [user, pass] == ["test_user", "test_password"]
+ response['WWW-Authenticate'] = %(Basic realm="Restricted Area")
+ throw(:halt, [401, "Not authorized\n"])
+ end
+ end
+end
+
+run BasicAuth
diff --git a/lib/vendor/excon/tests/rackups/deflater.ru b/lib/vendor/excon/tests/rackups/deflater.ru
new file mode 100644
index 0000000..1c881f1
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/deflater.ru
@@ -0,0 +1,4 @@
+require File.join(File.dirname(__FILE__), 'basic')
+
+use Rack::Deflater
+run Basic
diff --git a/lib/vendor/excon/tests/rackups/proxy.ru b/lib/vendor/excon/tests/rackups/proxy.ru
new file mode 100644
index 0000000..e6d7b65
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/proxy.ru
@@ -0,0 +1,18 @@
+require 'sinatra'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class App < Sinatra::Base
+ set :environment, :production
+ enable :dump_errors
+
+ get('*') do
+ headers(
+ "Sent-Request-Uri" => request.env['REQUEST_URI'].to_s,
+ "Sent-Host" => request.env['HTTP_HOST'].to_s,
+ "Sent-Proxy-Connection" => request.env['HTTP_PROXY_CONNECTION'].to_s
+ )
+ 'proxied content'
+ end
+end
+
+run App
diff --git a/lib/vendor/excon/tests/rackups/query_string.ru b/lib/vendor/excon/tests/rackups/query_string.ru
new file mode 100644
index 0000000..b5bca66
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/query_string.ru
@@ -0,0 +1,13 @@
+require 'sinatra'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class App < Sinatra::Base
+ set :environment, :production
+ enable :dump_errors
+
+ get('/query') do
+ "query: " << request.query_string
+ end
+end
+
+run App
diff --git a/lib/vendor/excon/tests/rackups/redirecting.ru b/lib/vendor/excon/tests/rackups/redirecting.ru
new file mode 100644
index 0000000..fff61e4
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/redirecting.ru
@@ -0,0 +1,23 @@
+require 'sinatra'
+require 'json'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class App < Sinatra::Base
+ set :environment, :production
+ enable :dump_errors
+
+ post('/first') do
+ redirect "/second"
+ end
+
+ get('/second') do
+ post_body = request.body.read
+ if post_body == "" && request["CONTENT_LENGTH"].nil?
+ "ok"
+ else
+ JSON.pretty_generate(request.env)
+ end
+ end
+end
+
+run App
diff --git a/lib/vendor/excon/tests/rackups/redirecting_with_cookie.ru b/lib/vendor/excon/tests/rackups/redirecting_with_cookie.ru
new file mode 100644
index 0000000..f0401f8
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/redirecting_with_cookie.ru
@@ -0,0 +1,40 @@
+require 'sinatra'
+require 'sinatra/cookies'
+require 'json'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class App < Sinatra::Base
+ helpers Sinatra::Cookies
+ set :environment, :production
+ enable :dump_errors
+
+ get('/sets_cookie') do
+ cookies[:chocolatechip] = "chunky"
+ redirect "/requires_cookie"
+ end
+
+ get('/requires_cookie') do
+ cookie = cookies[:chocolatechip]
+ unless cookie.nil? || cookie != "chunky"
+ "ok"
+ else
+ JSON.pretty_generate(headers)
+ end
+ end
+
+ get('/sets_multi_cookie') do
+ cookies[:chocolatechip] = "chunky"
+ cookies[:thinmints] = "minty"
+ redirect "/requires_cookie"
+ end
+
+ get('/requires_cookie') do
+ if cookies[:chocolatechip] == "chunky" && cookies[:thinmints] == "minty"
+ "ok"
+ else
+ JSON.pretty_generate(headers)
+ end
+ end
+end
+
+run App
diff --git a/lib/vendor/excon/tests/rackups/request_headers.ru b/lib/vendor/excon/tests/rackups/request_headers.ru
new file mode 100644
index 0000000..e1cc0f8
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/request_headers.ru
@@ -0,0 +1,15 @@
+require 'sinatra'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class App < Sinatra::Base
+ set :environment, :production
+ enable :dump_errors
+
+ post '/' do
+ h = ""
+ env.each { |k,v| h << "#{$1.downcase}: #{v}\n" if k =~ /http_(.*)/i }
+ h
+ end
+end
+
+run App
diff --git a/lib/vendor/excon/tests/rackups/request_methods.ru b/lib/vendor/excon/tests/rackups/request_methods.ru
new file mode 100644
index 0000000..1fc08f4
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/request_methods.ru
@@ -0,0 +1,21 @@
+require 'sinatra'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class App < Sinatra::Base
+ set :environment, :production
+ enable :dump_errors
+
+ get '/' do
+ 'GET'
+ end
+
+ post '/' do
+ 'POST'
+ end
+
+ delete '/' do
+ 'DELETE'
+ end
+end
+
+run App
diff --git a/lib/vendor/excon/tests/rackups/response_header.ru b/lib/vendor/excon/tests/rackups/response_header.ru
new file mode 100644
index 0000000..be0088f
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/response_header.ru
@@ -0,0 +1,18 @@
+require 'sinatra'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class App < Sinatra::Base
+ set :environment, :production
+ enable :dump_errors
+
+ get('/foo') do
+ headers(
+ "MixedCase-Header" => 'MixedCase',
+ "UPPERCASE-HEADER" => 'UPPERCASE',
+ "lowercase-header" => 'lowercase'
+ )
+ 'primary content'
+ end
+end
+
+run App
diff --git a/lib/vendor/excon/tests/rackups/ssl.ru b/lib/vendor/excon/tests/rackups/ssl.ru
new file mode 100644
index 0000000..fc17065
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/ssl.ru
@@ -0,0 +1,16 @@
+require 'openssl'
+require 'webrick'
+require 'webrick/https'
+
+require File.join(File.dirname(__FILE__), 'basic')
+
+key_file = File.join(File.dirname(__FILE__), '..', 'data', '127.0.0.1.cert.key')
+cert_file = File.join(File.dirname(__FILE__), '..', 'data', '127.0.0.1.cert.crt')
+Rack::Handler::WEBrick.run(Basic, {
+ :Port => 9443,
+ :SSLEnable => true,
+ :SSLPrivateKey => OpenSSL::PKey::RSA.new(File.open(key_file).read),
+ :SSLCertificate => OpenSSL::X509::Certificate.new(File.open(cert_file).read),
+ :SSLCACertificateFile => cert_file,
+ :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
+})
diff --git a/lib/vendor/excon/tests/rackups/ssl_mismatched_cn.ru b/lib/vendor/excon/tests/rackups/ssl_mismatched_cn.ru
new file mode 100644
index 0000000..d9c5edf
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/ssl_mismatched_cn.ru
@@ -0,0 +1,15 @@
+require 'openssl'
+require 'webrick'
+require 'webrick/https'
+
+require File.join(File.dirname(__FILE__), 'basic')
+key_file = File.join(File.dirname(__FILE__), '..', 'data', 'excon.cert.key')
+cert_file = File.join(File.dirname(__FILE__), '..', 'data', 'excon.cert.crt')
+Rack::Handler::WEBrick.run(Basic, {
+ :Port => 9443,
+ :SSLEnable => true,
+ :SSLPrivateKey => OpenSSL::PKey::RSA.new(File.open(key_file).read),
+ :SSLCertificate => OpenSSL::X509::Certificate.new(File.open(cert_file).read),
+ :SSLCACertificateFile => cert_file,
+ :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
+})
diff --git a/lib/vendor/excon/tests/rackups/ssl_verify_peer.ru b/lib/vendor/excon/tests/rackups/ssl_verify_peer.ru
new file mode 100644
index 0000000..44d64c7
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/ssl_verify_peer.ru
@@ -0,0 +1,16 @@
+require 'openssl'
+require 'webrick'
+require 'webrick/https'
+
+require File.join(File.dirname(__FILE__), 'basic')
+key_file = File.join(File.dirname(__FILE__), '..', 'data', 'excon.cert.key')
+cert_file = File.join(File.dirname(__FILE__), '..', 'data', 'excon.cert.crt')
+Rack::Handler::WEBrick.run(Basic, {
+ :Port => 8443,
+ :SSLCertName => [["CN", WEBrick::Utils::getservername]],
+ :SSLEnable => true,
+ :SSLPrivateKey => OpenSSL::PKey::RSA.new(File.open(key_file).read),
+ :SSLCertificate => OpenSSL::X509::Certificate.new(File.open(cert_file).read),
+ :SSLCACertificateFile => cert_file,
+ :SSLVerifyClient => OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT,
+})
diff --git a/lib/vendor/excon/tests/rackups/streaming.ru b/lib/vendor/excon/tests/rackups/streaming.ru
new file mode 100644
index 0000000..101c064
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/streaming.ru
@@ -0,0 +1,30 @@
+use Rack::ContentType, "text/plain"
+
+app = lambda do |env|
+ # streamed pieces to be sent
+ pieces = %w{Hello streamy world}
+
+ response_headers = {}
+
+ # set a fixed content length in the header if requested
+ if env['REQUEST_PATH'] == '/streamed/fixed_length'
+ response_headers['Content-Length'] = pieces.join.length.to_s
+ end
+
+ response_headers["rack.hijack"] = lambda do |io|
+ # Write directly to IO of the response
+ begin
+ # return the response in pieces
+ pieces.each do |x|
+ sleep(0.1)
+ io.write(x)
+ io.flush
+ end
+ ensure
+ io.close
+ end
+ end
+ [200, response_headers, nil]
+end
+
+run app
diff --git a/lib/vendor/excon/tests/rackups/thread_safety.ru b/lib/vendor/excon/tests/rackups/thread_safety.ru
new file mode 100644
index 0000000..436c596
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/thread_safety.ru
@@ -0,0 +1,17 @@
+require 'sinatra'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class App < Sinatra::Base
+ set :environment, :production
+ enable :dump_errors
+
+ get('/id/:id/wait/:wait') do |id, wait|
+ sleep(wait.to_i)
+ id.to_s
+ end
+end
+
+# get everything autoloaded, mainly for rbx
+App.new
+
+run App
diff --git a/lib/vendor/excon/tests/rackups/timeout.ru b/lib/vendor/excon/tests/rackups/timeout.ru
new file mode 100644
index 0000000..060436f
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/timeout.ru
@@ -0,0 +1,14 @@
+require 'sinatra'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class App < Sinatra::Base
+ set :environment, :production
+ enable :dump_errors
+
+ get('/timeout') do
+ sleep(2)
+ ''
+ end
+end
+
+run App
diff --git a/lib/vendor/excon/tests/rackups/webrick_patch.rb b/lib/vendor/excon/tests/rackups/webrick_patch.rb
new file mode 100644
index 0000000..d65cf58
--- /dev/null
+++ b/lib/vendor/excon/tests/rackups/webrick_patch.rb
@@ -0,0 +1,34 @@
+# The ruby 2.0 stdlib includes the following changes
+# to avoid "can't add a new key into hash during iteration" errors.
+# https://github.com/ruby/ruby/commit/3c491a92f6fbfecc065f7687c51c7d6d52a38883
+# https://github.com/ruby/ruby/commit/7b18633804c606e8bcccfbb44e7d7b795e777ea6
+# However, these changes were not backported to the 1.9.x stdlib.
+# These errors are causing intermittent errors in the tests (frequently in jruby),
+# so we're applying those changes here. This is loaded by all rackups using WEBrick.
+if RUBY_VERSION =~ /^1\.9/
+ require 'webrick/utils'
+ module WEBrick
+ module Utils
+ class TimeoutHandler
+ def initialize
+ @timeout_info = Hash.new
+ Thread.start{
+ while true
+ now = Time.now
+ @timeout_info.keys.each{|thread|
+ ary = @timeout_info[thread]
+ next unless ary
+ ary.dup.each{|info|
+ time, exception = *info
+ interrupt(thread, info.object_id, exception) if time < now
+ }
+ }
+ sleep 0.5
+ end
+ }
+ end
+ end
+ end
+ end
+end
+
diff --git a/lib/vendor/excon/tests/request_headers_tests.rb b/lib/vendor/excon/tests/request_headers_tests.rb
new file mode 100644
index 0000000..12ebbc7
--- /dev/null
+++ b/lib/vendor/excon/tests/request_headers_tests.rb
@@ -0,0 +1,21 @@
+Shindo.tests('Excon request methods') do
+
+ with_rackup('request_headers.ru') do
+
+ tests 'empty headers sent' do
+
+ test('Excon.post') do
+ headers = {
+ :one => 1,
+ :two => nil,
+ :three => 3,
+ }
+ r = Excon.post('http://localhost:9292', :headers => headers).body
+ !r.match(/two:/).nil?
+ end
+
+ end
+
+ end
+
+end
diff --git a/lib/vendor/excon/tests/request_method_tests.rb b/lib/vendor/excon/tests/request_method_tests.rb
new file mode 100644
index 0000000..3cc9855
--- /dev/null
+++ b/lib/vendor/excon/tests/request_method_tests.rb
@@ -0,0 +1,47 @@
+Shindo.tests('Excon request methods') do
+
+ with_rackup('request_methods.ru') do
+
+ tests 'one-offs' do
+
+ tests('Excon.get').returns('GET') do
+ Excon.get('http://localhost:9292').body
+ end
+
+ tests('Excon.post').returns('POST') do
+ Excon.post('http://localhost:9292').body
+ end
+
+ tests('Excon.delete').returns('DELETE') do
+ Excon.delete('http://localhost:9292').body
+ end
+
+ end
+
+ tests 'with a connection object' do
+ connection = nil
+
+ tests('connection.get').returns('GET') do
+ connection = Excon.new('http://localhost:9292')
+ connection.get.body
+ end
+
+ tests('connection.post').returns('POST') do
+ connection.post.body
+ end
+
+ tests('connection.delete').returns('DELETE') do
+ connection.delete.body
+ end
+
+ tests('not modifies path argument').returns('path') do
+ path = 'path'
+ connection.get(:path => path)
+ path
+ end
+
+ end
+
+ end
+
+end
diff --git a/lib/vendor/excon/tests/request_tests.rb b/lib/vendor/excon/tests/request_tests.rb
new file mode 100644
index 0000000..ad2662c
--- /dev/null
+++ b/lib/vendor/excon/tests/request_tests.rb
@@ -0,0 +1,59 @@
+Shindo.tests('Request Tests') do
+ with_server('good') do
+
+ tests('persistent connections') do
+ ip_ports = %w(127.0.0.1:9292)
+ ip_ports << "[::1]:9293" unless RUBY_PLATFORM == 'java'
+ ip_ports.each do |ip_port|
+
+ tests("with default :persistent => true, #{ip_port}") do
+ connection = nil
+
+ returns(['1', '2'], 'uses a persistent connection') do
+ connection = Excon.new("http://#{ip_port}", :persistent => true)
+ 2.times.map do
+ connection.request(:method => :get, :path => '/echo/request_count').body
+ end
+ end
+
+ returns(['3', '1', '2'], ':persistent => false resets connection') do
+ ret = []
+ ret << connection.request(:method => :get,
+ :path => '/echo/request_count',
+ :persistent => false).body
+ ret << connection.request(:method => :get,
+ :path => '/echo/request_count').body
+ ret << connection.request(:method => :get,
+ :path => '/echo/request_count').body
+ end
+ end
+
+ tests("with default :persistent => false, #{ip_port}") do
+ connection = nil
+
+ returns(['1', '1'], 'does not use a persistent connection') do
+ connection = Excon.new("http://#{ip_port}", :persistent => false)
+ 2.times.map do
+ connection.request(:method => :get, :path => '/echo/request_count').body
+ end
+ end
+
+ returns(['1', '2', '3', '1'], ':persistent => true enables persistence') do
+ ret = []
+ ret << connection.request(:method => :get,
+ :path => '/echo/request_count',
+ :persistent => true).body
+ ret << connection.request(:method => :get,
+ :path => '/echo/request_count',
+ :persistent => true).body
+ ret << connection.request(:method => :get,
+ :path => '/echo/request_count').body
+ ret << connection.request(:method => :get,
+ :path => '/echo/request_count').body
+ end
+ end
+
+ end
+ end
+ end
+end
diff --git a/lib/vendor/excon/tests/response_tests.rb b/lib/vendor/excon/tests/response_tests.rb
new file mode 100644
index 0000000..2a989dd
--- /dev/null
+++ b/lib/vendor/excon/tests/response_tests.rb
@@ -0,0 +1,197 @@
+Shindo.tests('Excon Response Parsing') do
+ env_init
+
+ with_server('good') do
+
+ tests('responses with chunked transfer-encoding') do
+
+ tests('simple response').returns('hello world') do
+ Excon.get('http://127.0.0.1:9292/chunked/simple').body
+ end
+
+ tests('with :response_block') do
+
+ tests('simple response').
+ returns([['hello ', nil, nil], ['world', nil, nil]]) do
+ capture_response_block do |block|
+ Excon.get('http://127.0.0.1:9292/chunked/simple',
+ :response_block => block,
+ :chunk_size => 5) # not used
+ end
+ end
+
+ tests('simple response has empty body').returns('') do
+ response_block = lambda { |_, _, _| }
+ Excon.get('http://127.0.0.1:9292/chunked/simple', :response_block => response_block).body
+ end
+
+ tests('with expected response status').
+ returns([['hello ', nil, nil], ['world', nil, nil]]) do
+ capture_response_block do |block|
+ Excon.get('http://127.0.0.1:9292/chunked/simple',
+ :response_block => block,
+ :expects => 200)
+ end
+ end
+
+ tests('with unexpected response status').returns('hello world') do
+ begin
+ Excon.get('http://127.0.0.1:9292/chunked/simple',
+ :response_block => Proc.new { raise 'test failed' },
+ :expects => 500)
+ rescue Excon::Errors::HTTPStatusError => err
+ err.response[:body]
+ end
+ end
+
+ end
+
+ tests('merges trailers into headers').
+ returns('one, two, three, four, five, six') do
+ Excon.get('http://127.0.0.1:9292/chunked/trailers').headers['Test-Header']
+ end
+
+ tests("removes 'chunked' from Transfer-Encoding").returns(nil) do
+ Excon.get('http://127.0.0.1:9292/chunked/simple').headers['Transfer-Encoding']
+ end
+
+ end
+
+ tests('responses with content-length') do
+
+ tests('simple response').returns('hello world') do
+ Excon.get('http://127.0.0.1:9292/content-length/simple').body
+ end
+
+ tests('with :response_block') do
+
+ tests('simple response').
+ returns([['hello', 6, 11], [' worl', 1, 11], ['d', 0, 11]]) do
+ capture_response_block do |block|
+ Excon.get('http://127.0.0.1:9292/content-length/simple',
+ :response_block => block,
+ :chunk_size => 5)
+ end
+ end
+
+ tests('simple response has empty body').returns('') do
+ response_block = lambda { |_, _, _| }
+ Excon.get('http://127.0.0.1:9292/content-length/simple', :response_block => response_block).body
+ end
+
+ tests('with expected response status').
+ returns([['hello', 6, 11], [' worl', 1, 11], ['d', 0, 11]]) do
+ capture_response_block do |block|
+ Excon.get('http://127.0.0.1:9292/content-length/simple',
+ :response_block => block,
+ :chunk_size => 5,
+ :expects => 200)
+ end
+ end
+
+ tests('with unexpected response status').returns('hello world') do
+ begin
+ Excon.get('http://127.0.0.1:9292/content-length/simple',
+ :response_block => Proc.new { raise 'test failed' },
+ :chunk_size => 5,
+ :expects => 500)
+ rescue Excon::Errors::HTTPStatusError => err
+ err.response[:body]
+ end
+ end
+
+ end
+
+ end
+
+ tests('responses with unknown length') do
+
+ tests('simple response').returns('hello world') do
+ Excon.get('http://127.0.0.1:9292/unknown/simple').body
+ end
+
+ tests('with :response_block') do
+
+ tests('simple response').
+ returns([['hello', nil, nil], [' worl', nil, nil], ['d', nil, nil]]) do
+ capture_response_block do |block|
+ Excon.get('http://127.0.0.1:9292/unknown/simple',
+ :response_block => block,
+ :chunk_size => 5)
+ end
+ end
+
+ tests('simple response has empty body').returns('') do
+ response_block = lambda { |_, _, _| }
+ Excon.get('http://127.0.0.1:9292/unknown/simple', :response_block => response_block).body
+ end
+
+ tests('with expected response status').
+ returns([['hello', nil, nil], [' worl', nil, nil], ['d', nil, nil]]) do
+ capture_response_block do |block|
+ Excon.get('http://127.0.0.1:9292/unknown/simple',
+ :response_block => block,
+ :chunk_size => 5,
+ :expects => 200)
+ end
+ end
+
+ tests('with unexpected response status').returns('hello world') do
+ begin
+ Excon.get('http://127.0.0.1:9292/unknown/simple',
+ :response_block => Proc.new { raise 'test failed' },
+ :chunk_size => 5,
+ :expects => 500)
+ rescue Excon::Errors::HTTPStatusError => err
+ err.response[:body]
+ end
+ end
+
+ end
+
+ end
+
+ tests('cookies') do
+
+ tests('parses cookies into array').returns(['one, two', 'three, four']) do
+ resp = Excon.get('http://127.0.0.1:9292/unknown/cookies')
+ resp[:cookies]
+ end
+
+ end
+
+ tests('header continuation') do
+
+ tests('proper continuation').returns('one, two, three, four, five, six') do
+ resp = Excon.get('http://127.0.0.1:9292/unknown/header_continuation')
+ resp.headers['Test-Header']
+ end
+
+ tests('malformed header').raises(Excon::Errors::SocketError) do
+ Excon.get('http://127.0.0.1:9292/bad/malformed_header')
+ end
+
+ tests('malformed header continuation').raises(Excon::Errors::SocketError) do
+ Excon.get('http://127.0.0.1:9292/bad/malformed_header_continuation')
+ end
+
+ end
+
+ tests('status line parsing') do
+
+ tests('proper status code').returns(404) do
+ resp = Excon.get('http://127.0.0.1:9292/not-found')
+ resp.status
+ end
+
+ tests('proper reason phrase').returns("Not Found") do
+ resp = Excon.get('http://127.0.0.1:9292/not-found')
+ resp.reason_phrase
+ end
+
+ end
+
+ end
+
+ env_restore
+end
diff --git a/lib/vendor/excon/tests/servers/bad.rb b/lib/vendor/excon/tests/servers/bad.rb
new file mode 100755
index 0000000..e502d83
--- /dev/null
+++ b/lib/vendor/excon/tests/servers/bad.rb
@@ -0,0 +1,20 @@
+#!/usr/bin/env ruby
+
+require "eventmachine"
+
+module BadServer
+ def receive_data(data)
+ case data
+ when %r{^GET /eof/no_content_length_and_no_chunking\s}
+ send_data "HTTP/1.1 200 OK\r\n"
+ send_data "\r\n"
+ send_data "hello"
+ close_connection(true)
+ end
+ end
+end
+
+EM.run do
+ EM.start_server("127.0.0.1", 9292, BadServer)
+ $stderr.puts "ready"
+end
diff --git a/lib/vendor/excon/tests/servers/eof.rb b/lib/vendor/excon/tests/servers/eof.rb
new file mode 100755
index 0000000..a82c729
--- /dev/null
+++ b/lib/vendor/excon/tests/servers/eof.rb
@@ -0,0 +1,17 @@
+#!/usr/bin/env ruby
+
+require "eventmachine"
+
+module EOFServer
+ def receive_data(data)
+ case data
+ when %r{^GET /eof\s}
+ close_connection(true)
+ end
+ end
+end
+
+EM.run do
+ EM.start_server("127.0.0.1", 9292, EOFServer)
+ $stderr.puts "ready"
+end
diff --git a/lib/vendor/excon/tests/servers/error.rb b/lib/vendor/excon/tests/servers/error.rb
new file mode 100755
index 0000000..ab3cd1f
--- /dev/null
+++ b/lib/vendor/excon/tests/servers/error.rb
@@ -0,0 +1,20 @@
+#!/usr/bin/env ruby
+
+require "eventmachine"
+
+module ErrorServer
+ def receive_data(data)
+ case data
+ when %r{^GET /error/not_found\s}
+ send_data "HTTP/1.1 404 Not Found\r\n"
+ send_data "\r\n"
+ send_data "server says not found"
+ close_connection(true)
+ end
+ end
+end
+
+EM.run do
+ EM.start_server("127.0.0.1", 9292, ErrorServer)
+ $stderr.puts "ready"
+end
diff --git a/lib/vendor/excon/tests/servers/good.rb b/lib/vendor/excon/tests/servers/good.rb
new file mode 100755
index 0000000..1cb6d7f
--- /dev/null
+++ b/lib/vendor/excon/tests/servers/good.rb
@@ -0,0 +1,350 @@
+#!/usr/bin/env ruby
+
+require 'eventmachine'
+require 'stringio'
+require 'uri'
+require 'zlib'
+
+module GoodServer
+ # This method will be called with each request received.
+ #
+ # request = {
+ # :method => method,
+ # :uri => URI.parse(uri),
+ # :headers => {},
+ # :body => ''
+ # }
+ #
+ # Each connection to this server is persistent unless the client sends
+ # "Connection: close" in the request. If a response requires the connection
+ # to be closed, use `start_response(:persistent => false)`.
+ def send_response(request)
+ type, path = request[:uri].path.split('/', 3)[1, 2]
+ case type
+ when 'echo'
+ case path
+ when 'request'
+ data = Marshal.dump(request)
+ start_response
+ send_data "Content-Length: #{ data.size }\r\n"
+ send_data "\r\n"
+ send_data data
+
+ when 'request_count'
+ (@request_count ||= '0').next!
+ start_response
+ send_data "Content-Length: #{ @request_count.size }\r\n"
+ send_data "Connection: Keep-Alive\r\n"
+ send_data "\r\n"
+ send_data @request_count
+
+ when /(content|transfer)-encoded\/?(.*)/
+ if (encoding_type = $1) == 'content'
+ accept_header = 'Accept-Encoding'
+ encoding_header = 'Content-Encoding'
+ else
+ accept_header = 'TE'
+ encoding_header = 'Transfer-Encoding'
+ end
+ chunked = $2 == 'chunked'
+
+ encodings = parse_encodings(request[:headers][accept_header])
+ while encoding = encodings.pop
+ break if ['gzip', 'deflate'].include?(encoding)
+ end
+
+ case encoding
+ when 'gzip'
+ body = request[:body]
+ if(body.nil? || body.empty?)
+ body = ''
+ else
+ io = (Zlib::GzipWriter.new(StringIO.new) << request[:body]).finish
+ io.rewind
+ body = io.read
+ end
+ when 'deflate'
+ # drops the zlib header
+ deflator = Zlib::Deflate.new(nil, -Zlib::MAX_WBITS)
+ body = deflator.deflate(request[:body], Zlib::FINISH)
+ deflator.close
+ else
+ body = request[:body]
+ end
+
+ # simulate server pre/post content encoding
+ encodings = [
+ request[:headers]["#{ encoding_header }-Pre"],
+ encoding,
+ request[:headers]["#{ encoding_header }-Post"],
+ ]
+ if chunked && encoding_type == 'transfer'
+ encodings << 'chunked'
+ end
+ encodings = encodings.compact.join(', ')
+
+ start_response
+ # let the test know what the server sent
+ send_data "#{ encoding_header }-Sent: #{ encodings }\r\n"
+ send_data "#{ encoding_header }: #{ encodings }\r\n" unless encodings.empty?
+ if chunked
+ if encoding_type == 'content'
+ send_data "Transfer-Encoding: chunked\r\n"
+ end
+ send_data "\r\n"
+ send_data chunks_for(body)
+ send_data "\r\n"
+ else
+ send_data "Content-Length: #{ body.size }\r\n"
+ send_data "\r\n"
+ send_data body
+ end
+ end
+
+ when 'chunked'
+ case path
+ when 'simple'
+ start_response
+ send_data "Transfer-Encoding: chunked\r\n"
+ send_data "\r\n"
+ # chunk-extension is currently ignored.
+ # this works because "6; chunk-extension".to_i => "6"
+ send_data "6; chunk-extension\r\n"
+ send_data "hello \r\n"
+ send_data "5; chunk-extension\r\n"
+ send_data "world\r\n"
+ send_data "0; chunk-extension\r\n" # last-chunk
+ send_data "\r\n"
+
+ # merged trailers also support continuations
+ when 'trailers'
+ start_response
+ send_data "Transfer-Encoding: chunked\r\n"
+ send_data "Test-Header: one, two\r\n"
+ send_data "\r\n"
+ send_data chunks_for('hello world')
+ send_data "Test-Header: three, four,\r\n"
+ send_data "\tfive, six\r\n"
+ send_data "\r\n"
+ end
+
+ when 'content-length'
+ case path
+ when 'simple'
+ start_response
+ send_data "Content-Length: 11\r\n"
+ send_data "\r\n"
+ send_data "hello world"
+ end
+
+ when 'unknown'
+ case path
+ when 'cookies'
+ start_response(:persistent => false)
+ send_data "Set-Cookie: one, two\r\n"
+ send_data "Set-Cookie: three, four\r\n"
+ send_data "\r\n"
+ send_data "hello world"
+
+ when 'simple'
+ start_response(:persistent => false)
+ send_data "\r\n"
+ send_data "hello world"
+
+ when 'header_continuation'
+ start_response(:persistent => false)
+ send_data "Test-Header: one, two\r\n"
+ send_data "Test-Header: three, four,\r\n"
+ send_data " five, six\r\n"
+ send_data "\r\n"
+ send_data "hello world"
+ end
+
+ when 'bad'
+ # Excon will close these connections due to the errors.
+ case path
+ when 'malformed_header'
+ start_response
+ send_data "Bad-Header\r\n" # no ':'
+ send_data "\r\n"
+ send_data "hello world"
+
+ when 'malformed_header_continuation'
+ send_data "HTTP/1.1 200 OK\r\n"
+ send_data " Bad-Header: one, two\r\n" # no previous header
+ send_data "\r\n"
+ send_data "hello world"
+ end
+
+ when 'not-found'
+ start_response(:status => "404 Not Found")
+ send_data "Content-Length: 11\r\n"
+ send_data "\r\n"
+ send_data "hello world"
+ end
+ end
+
+ # Sends response status-line, plus headers common to all responses.
+ def start_response(opts = {})
+ opts = {
+ :status => '200 OK',
+ :persistent => @persistent # true unless client sent Connection: close
+ }.merge!(opts)
+
+ @persistent = opts[:persistent]
+ send_data "HTTP/1.1 #{ opts[:status] }\r\n"
+ send_data "Connection: close\r\n" unless @persistent
+ end
+
+ def post_init
+ @buffer = StringIO.new
+ @buffer.set_encoding('BINARY') if @buffer.respond_to?(:set_encoding)
+ end
+
+ # Receives a String of +data+ sent from the client.
+ # +data+ may only be a portion of what the client sent.
+ # The data is buffered, then processed and removed from the buffer
+ # as data becomes available until the @request is complete.
+ def receive_data(data)
+ @buffer.seek(0, IO::SEEK_END)
+ @buffer.write(data)
+
+ parse_headers unless @request
+ parse_body if @request
+
+ if @request_complete
+ send_response(@request)
+ if @persistent
+ @request = nil
+ @request_complete = false
+ # process remaining buffer for next request
+ receive_data('') unless @buffer.eof?
+ else
+ close_connection(true)
+ end
+ end
+ end
+
+ # Removes the processed portion of the buffer
+ # by replacing the buffer with it's contents from the current pos.
+ def sync_buffer
+ @buffer.string = @buffer.read
+ end
+
+ def parse_headers
+ @buffer.rewind
+ # wait until buffer contains the end of the headers
+ if /\sHTTP\/\d+\.\d+\r\n.*?\r\n\r\n/m =~ @buffer.read
+ @buffer.rewind
+ # For persistent connections, the buffer could start with the
+ # \r\n chunked-message terminator from the previous request.
+ # This will discard anything up to the request-line.
+ until m = /^(\w+)\s(.*)\sHTTP\/\d+\.\d+$/.match(@buffer.readline.chop!); end
+ method, uri = m[1, 2]
+
+ headers = {}
+ last_key = nil
+ until (line = @buffer.readline.chop!).empty?
+ if !line.lstrip!.nil?
+ headers[last_key] << ' ' << line.rstrip
+ else
+ key, value = line.split(':', 2)
+ headers[key] = ([headers[key]] << value.strip).compact.join(', ')
+ last_key = key
+ end
+ end
+
+ sync_buffer
+
+ @chunked = headers['Transfer-Encoding'] =~ /chunked/i
+ @content_length = headers['Content-Length'].to_i
+ @persistent = headers['Connection'] !~ /close/i
+ @request = {
+ :method => method,
+ :uri => URI.parse(uri),
+ :headers => headers,
+ :body => ''
+ }
+ end
+ end
+
+ def parse_body
+ if @chunked
+ @buffer.rewind
+ until @request_complete || @buffer.eof?
+ unless @chunk_size
+ # in case buffer only contains a portion of the chunk-size line
+ if (line = @buffer.readline) =~ /\r\n\z/
+ @chunk_size = line.to_i(16)
+ if @chunk_size > 0
+ sync_buffer
+ else # last-chunk
+ @buffer.read(2) # the final \r\n may or may not be in the buffer
+ sync_buffer
+ @chunk_size = nil
+ @request_complete = true
+ end
+ end
+ end
+ if @chunk_size
+ if @buffer.size >= @chunk_size + 2
+ @request[:body] << @buffer.read(@chunk_size + 2).chop!
+ @chunk_size = nil
+ sync_buffer
+ else
+ break # wait for more data
+ end
+ end
+ end
+ elsif @content_length > 0
+ @buffer.rewind
+ unless @buffer.eof? # buffer only contained the headers
+ @request[:body] << @buffer.read(@content_length - @request[:body].size)
+ sync_buffer
+ if @request[:body].size == @content_length
+ @request_complete = true
+ end
+ end
+ else
+ # no body
+ @request_complete = true
+ end
+ end
+
+ def chunks_for(str)
+ chunks = ''
+ str.force_encoding('BINARY') if str.respond_to?(:force_encoding)
+ chunk_size = str.size / 2
+ until (chunk = str.slice!(0, chunk_size)).empty?
+ chunks << chunk.size.to_s(16) << "\r\n"
+ chunks << chunk << "\r\n"
+ end
+ chunks << "0\r\n" # last-chunk
+ end
+
+ # only supports a single quality parameter for tokens
+ def parse_encodings(encodings)
+ return [] if encodings.nil?
+ split_header_value(encodings).map do |value|
+ token, q_val = /^(.*?)(?:;q=(.*))?$/.match(value.strip)[1, 2]
+ if q_val && q_val.to_f == 0
+ nil
+ else
+ [token, (q_val || 1).to_f]
+ end
+ end.compact.sort_by {|_, q_val| q_val }.map {|token, _| token }
+ end
+
+ # Splits a header value +str+ according to HTTP specification.
+ def split_header_value(str)
+ return [] if str.nil?
+ str.strip.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]+)+)
+ (?:,\s*|\Z)'xn).flatten
+ end
+end
+
+EM.run do
+ EM.start_server("127.0.0.1", 9292, GoodServer)
+ EM.start_server("::1", 9293, GoodServer) unless RUBY_PLATFORM == 'java'
+ $stderr.puts "ready"
+end
diff --git a/lib/vendor/excon/tests/test_helper.rb b/lib/vendor/excon/tests/test_helper.rb
new file mode 100644
index 0000000..a3c6d63
--- /dev/null
+++ b/lib/vendor/excon/tests/test_helper.rb
@@ -0,0 +1,306 @@
+require 'rubygems' if RUBY_VERSION < '1.9'
+require 'bundler/setup'
+require 'excon'
+require 'delorean'
+require 'open4'
+
+Excon.defaults.merge!(
+ :connect_timeout => 5,
+ :read_timeout => 5,
+ :write_timeout => 5
+)
+
+def basic_tests(url = 'http://127.0.0.1:9292', options = {})
+ ([true, false] * 2).combination(2).to_a.uniq.each do |nonblock, persistent|
+ connection = nil
+ test do
+ options = options.merge({:ssl_verify_peer => false, :nonblock => nonblock, :persistent => persistent })
+ connection = Excon.new(url, options)
+ true
+ end
+
+ tests("nonblock => #{nonblock}, persistent => #{persistent}") do
+
+ tests('GET /content-length/100') do
+ response = nil
+
+ tests('response.status').returns(200) do
+ response = connection.request(:method => :get, :path => '/content-length/100')
+
+ response.status
+ end
+
+ tests('response[:status]').returns(200) do
+ response[:status]
+ end
+
+ tests("response.headers['Content-Length']").returns('100') do
+ response.headers['Content-Length']
+ end
+
+ tests("response.headers['Content-Type']").returns('text/html;charset=utf-8') do
+ response.headers['Content-Type']
+ end
+
+ test("Time.parse(response.headers['Date']).is_a?(Time)") do
+ pending if connection.data[:scheme] == Excon::UNIX
+ Time.parse(response.headers['Date']).is_a?(Time)
+ end
+
+ test("!!(response.headers['Server'] =~ /^WEBrick/)") do
+ pending if connection.data[:scheme] == Excon::UNIX
+ !!(response.headers['Server'] =~ /^WEBrick/)
+ end
+
+ tests("response.headers['Custom']").returns("Foo: bar") do
+ response.headers['Custom']
+ end
+
+ tests("response.remote_ip").returns("127.0.0.1") do
+ pending if connection.data[:scheme] == Excon::UNIX
+ response.remote_ip
+ end
+
+ tests("response.body").returns('x' * 100) do
+ response.body
+ end
+
+ tests("deprecated block usage").returns(['x' * 100, 0, 100]) do
+ data = []
+ silence_warnings do
+ connection.request(:method => :get, :path => '/content-length/100') do |chunk, remaining_length, total_length|
+ data = [chunk, remaining_length, total_length]
+ end
+ end
+ data
+ end
+
+ tests("response_block usage").returns(['x' * 100, 0, 100]) do
+ data = []
+ response_block = lambda do |chunk, remaining_length, total_length|
+ data = [chunk, remaining_length, total_length]
+ end
+ connection.request(:method => :get, :path => '/content-length/100', :response_block => response_block)
+ data
+ end
+
+ end
+
+ tests('POST /body-sink') do
+
+ tests('response.body').returns("5000000") do
+ response = connection.request(:method => :post, :path => '/body-sink', :headers => { 'Content-Type' => 'text/plain' }, :body => 'x' * 5_000_000)
+ response.body
+ end
+
+ tests('empty body').returns('0') do
+ response = connection.request(:method => :post, :path => '/body-sink', :headers => { 'Content-Type' => 'text/plain' }, :body => '')
+ response.body
+ end
+
+ end
+
+ tests('POST /echo') do
+
+ tests('with file').returns('x' * 100 + "\n") do
+ file_path = File.join(File.dirname(__FILE__), "data", "xs")
+ response = connection.request(:method => :post, :path => '/echo', :body => File.open(file_path))
+ response.body
+ end
+
+ tests('without request_block').returns('x' * 100) do
+ response = connection.request(:method => :post, :path => '/echo', :body => 'x' * 100)
+ response.body
+ end
+
+ tests('with request_block').returns('x' * 100) do
+ data = ['x'] * 100
+ request_block = lambda do
+ data.shift.to_s
+ end
+ response = connection.request(:method => :post, :path => '/echo', :request_block => request_block)
+ response.body
+ end
+
+ tests('with multi-byte strings') do
+ body = "\xC3\xBC" * 100
+ headers = { 'Custom' => body.dup }
+ if RUBY_VERSION >= '1.9'
+ body.force_encoding('BINARY')
+ headers['Custom'].force_encoding('UTF-8')
+ end
+
+ returns(body, 'properly concatenates request+headers and body') do
+ response = connection.request(:method => :post, :path => '/echo', :headers => headers, :body => body)
+ response.body
+ end
+ end
+
+ end
+
+ tests('PUT /echo') do
+
+ tests('with file').returns('x' * 100 + "\n") do
+ file_path = File.join(File.dirname(__FILE__), "data", "xs")
+ response = connection.request(:method => :put, :path => '/echo', :body => File.open(file_path))
+ response.body
+ end
+
+ tests('without request_block').returns('x' * 100) do
+ response = connection.request(:method => :put, :path => '/echo', :body => 'x' * 100)
+ response.body
+ end
+
+ tests('request_block usage').returns('x' * 100) do
+ data = ['x'] * 100
+ request_block = lambda do
+ data.shift.to_s
+ end
+ response = connection.request(:method => :put, :path => '/echo', :request_block => request_block)
+ response.body
+ end
+
+ tests('with multi-byte strings') do
+ body = "\xC3\xBC" * 100
+ headers = { 'Custom' => body.dup }
+ if RUBY_VERSION >= '1.9'
+ body.force_encoding('BINARY')
+ headers['Custom'].force_encoding('UTF-8')
+ end
+
+ returns(body, 'properly concatenates request+headers and body') do
+ response = connection.request(:method => :put, :path => '/echo', :headers => headers, :body => body)
+ response.body
+ end
+ end
+
+ end
+
+ tests('should succeed with tcp_nodelay').returns(200) do
+ options = options.merge(:ssl_verify_peer => false, :nonblock => nonblock, :tcp_nodelay => true)
+ connection = Excon.new(url, options)
+ response = connection.request(:method => :get, :path => '/content-length/100')
+ response.status
+ end
+
+ end
+ end
+end
+
+
+PROXY_ENV_VARIABLES = %w{http_proxy https_proxy no_proxy} # All lower-case
+
+def env_init(env={})
+ current = {}
+ PROXY_ENV_VARIABLES.each do |key|
+ current[key] = ENV.delete(key)
+ current[key.upcase] = ENV.delete(key.upcase)
+ end
+ env_stack << current
+
+ env.each do |key, value|
+ ENV[key] = value
+ end
+end
+
+def env_restore
+ ENV.update(env_stack.pop)
+end
+
+def env_stack
+ @env_stack ||= []
+end
+
+def silence_warnings
+ orig_verbose = $VERBOSE
+ $VERBOSE = nil
+ yield
+ensure
+ $VERBOSE = orig_verbose
+end
+
+def capture_response_block
+ captures = []
+ yield lambda {|chunk, remaining_bytes, total_bytes|
+ captures << [chunk, remaining_bytes, total_bytes]
+ }
+ captures
+end
+
+def rackup_path(*parts)
+ File.expand_path(File.join(File.dirname(__FILE__), 'rackups', *parts))
+end
+
+def with_rackup(name, host="127.0.0.1")
+ unless RUBY_PLATFORM == 'java'
+ GC.disable if RUBY_VERSION < '1.9'
+ pid, w, r, e = Open4.popen4("rackup", "-s", "webrick", "--host", host, rackup_path(name))
+ else
+ pid, w, r, e = IO.popen4("rackup", "-s", "webrick", "--host", host, rackup_path(name))
+ end
+ until e.gets =~ /HTTPServer#start:/; end
+ yield
+ensure
+ Process.kill(9, pid)
+ unless RUBY_PLATFORM == 'java'
+ GC.enable if RUBY_VERSION < '1.9'
+ Process.wait(pid)
+ end
+
+ # dump server errors
+ lines = e.read.split($/)
+ while line = lines.shift
+ case line
+ when /(ERROR|Error)/
+ unless line =~ /(null cert chain|did not return a certificate|SSL_read:: internal error)/
+ in_err = true
+ puts
+ end
+ when /^(127|localhost)/
+ in_err = false
+ end
+ puts line if in_err
+ end
+end
+
+def with_unicorn(name, listen='127.0.0.1:9292')
+ unless RUBY_PLATFORM == 'java'
+ GC.disable if RUBY_VERSION < '1.9'
+ unix_socket = listen.sub('unix://', '') if listen.start_with? 'unix://'
+ pid, w, r, e = Open4.popen4("unicorn", "--no-default-middleware","-l", listen, rackup_path(name))
+ until e.gets =~ /worker=0 ready/; end
+ else
+ # need to find suitable server for jruby
+ end
+ yield
+ensure
+ unless RUBY_PLATFORM == 'java'
+ Process.kill(9, pid)
+ GC.enable if RUBY_VERSION < '1.9'
+ Process.wait(pid)
+ end
+ if not unix_socket.nil? and File.exist?(unix_socket)
+ File.delete(unix_socket)
+ end
+end
+
+def server_path(*parts)
+ File.expand_path(File.join(File.dirname(__FILE__), 'servers', *parts))
+end
+
+def with_server(name)
+ unless RUBY_PLATFORM == 'java'
+ GC.disable if RUBY_VERSION < '1.9'
+ pid, w, r, e = Open4.popen4(server_path("#{name}.rb"))
+ else
+ pid, w, r, e = IO.popen4(server_path("#{name}.rb"))
+ end
+ until e.gets =~ /ready/; end
+ yield
+ensure
+ Process.kill(9, pid)
+ unless RUBY_PLATFORM == 'java'
+ GC.enable if RUBY_VERSION < '1.9'
+ Process.wait(pid)
+ end
+end
diff --git a/lib/vendor/excon/tests/thread_safety_tests.rb b/lib/vendor/excon/tests/thread_safety_tests.rb
new file mode 100644
index 0000000..32a76e0
--- /dev/null
+++ b/lib/vendor/excon/tests/thread_safety_tests.rb
@@ -0,0 +1,39 @@
+Shindo.tests('Excon thread safety') do
+
+ tests('thread_safe_sockets configuration') do
+ tests('thread_safe_sockets default').returns(true) do
+ connection = Excon.new('http://foo.com')
+ connection.data[:thread_safe_sockets]
+ end
+
+ tests('with thread_safe_sockets set false').returns(false) do
+ connection = Excon.new('http://foo.com', :thread_safe_sockets => false)
+ connection.data[:thread_safe_sockets]
+ end
+ end
+
+ with_rackup('thread_safety.ru') do
+ connection = Excon.new('http://127.0.0.1:9292')
+
+ long_thread = Thread.new {
+ response = connection.request(:method => 'GET', :path => '/id/1/wait/2')
+ Thread.current[:success] = response.body == '1'
+ }
+
+ short_thread = Thread.new {
+ response = connection.request(:method => 'GET', :path => '/id/2/wait/1')
+ Thread.current[:success] = response.body == '2'
+ }
+
+ test('long_thread') do
+ long_thread.join
+ short_thread.join
+
+ long_thread[:success]
+ end
+
+ test('short_thread') do
+ short_thread[:success]
+ end
+ end
+end
diff --git a/lib/vendor/excon/tests/timeout_tests.rb b/lib/vendor/excon/tests/timeout_tests.rb
new file mode 100644
index 0000000..88a5706
--- /dev/null
+++ b/lib/vendor/excon/tests/timeout_tests.rb
@@ -0,0 +1,12 @@
+Shindo.tests('read should timeout') do
+ with_rackup('timeout.ru') do
+
+ [false, true].each do |nonblock|
+ tests("nonblock => #{nonblock} hits read_timeout").raises(Excon::Errors::Timeout) do
+ connection = Excon.new('http://127.0.0.1:9292', :nonblock => nonblock)
+ connection.request(:method => :get, :path => '/timeout', :read_timeout => 1)
+ end
+ end
+
+ end
+end
diff --git a/lib/vendor/excon/tests/utils_tests.rb b/lib/vendor/excon/tests/utils_tests.rb
new file mode 100644
index 0000000..65f0382
--- /dev/null
+++ b/lib/vendor/excon/tests/utils_tests.rb
@@ -0,0 +1,81 @@
+Shindo.tests('Excon::Utils') do
+
+ tests('#connection_uri') do
+
+ expected_uri = 'unix:///tmp/some.sock'
+ tests('using UNIX scheme').returns(expected_uri) do
+ connection = Excon.new('unix:///some/path', :socket => '/tmp/some.sock')
+ Excon::Utils.connection_uri(connection.data)
+ end
+
+ tests('using HTTP scheme') do
+
+ expected_uri = 'http://foo.com:80'
+ tests('with default port').returns(expected_uri) do
+ connection = Excon.new('http://foo.com/some/path')
+ Excon::Utils.connection_uri(connection.data)
+ end
+
+ expected_uri = 'http://foo.com'
+ tests('without default port').returns(expected_uri) do
+ connection = Excon.new('http://foo.com/some/path', :omit_default_port => true)
+ Excon::Utils.connection_uri(connection.data)
+ end
+
+ end
+
+ end
+
+ tests('#request_uri') do
+
+ tests('using UNIX scheme') do
+
+ expected_uri = 'unix:///tmp/some.sock/some/path'
+ tests('without query').returns(expected_uri) do
+ connection = Excon.new('unix:/', :socket => '/tmp/some.sock')
+ params = { :path => '/some/path' }
+ Excon::Utils.request_uri(connection.data.merge(params))
+ end
+
+ expected_uri = 'unix:///tmp/some.sock/some/path?bar=that&foo=this'
+ tests('with query').returns(expected_uri) do
+ connection = Excon.new('unix:/', :socket => '/tmp/some.sock')
+ params = { :path => '/some/path', :query => { :foo => 'this', :bar => 'that' } }
+ Excon::Utils.request_uri(connection.data.merge(params))
+ end
+
+ end
+
+ tests('using HTTP scheme') do
+
+ expected_uri = 'http://foo.com:80/some/path'
+ tests('without query').returns(expected_uri) do
+ connection = Excon.new('http://foo.com')
+ params = { :path => '/some/path' }
+ Excon::Utils.request_uri(connection.data.merge(params))
+ end
+
+ expected_uri = 'http://foo.com:80/some/path?bar=that&foo=this'
+ tests('with query').returns(expected_uri) do
+ connection = Excon.new('http://foo.com')
+ params = { :path => '/some/path', :query => { :foo => 'this', :bar => 'that' } }
+ Excon::Utils.request_uri(connection.data.merge(params))
+ end
+
+ end
+
+ end
+
+ tests('#escape_uri').returns('/hello%20excon') do
+ Excon::Utils.escape_uri('/hello excon')
+ end
+
+ tests('#unescape_uri').returns('/hello excon') do
+ Excon::Utils.unescape_uri('/hello%20excon')
+ end
+
+ tests('#unescape_form').returns('message=We love excon!') do
+ Excon::Utils.unescape_form('message=We+love+excon!')
+ end
+
+end
diff --git a/spec/gitlab_net_spec.rb b/spec/gitlab_net_spec.rb
index 3d38231..beb2373 100644
--- a/spec/gitlab_net_spec.rb
+++ b/spec/gitlab_net_spec.rb
@@ -16,19 +16,20 @@ describe GitlabNet, vcr: true do
it 'should return 200 code for gitlab check' do
VCR.use_cassette("check-ok") do
result = gitlab_net.check
- result.code.should == '200'
+ result.status.should == 200
end
end
it 'adds the secret_token to request' do
VCR.use_cassette("check-ok") do
- Net::HTTP::Get.any_instance.should_receive(:set_form_data).with(hash_including(secret_token: 'a123'))
+ Excon::Connection.any_instance.should_receive(:request).with(hash_including(body: 'secret_token=a123')).
+ and_return(Excon::Response.new)
gitlab_net.check
end
end
it "raises an exception if the connection fails" do
- Net::HTTP.any_instance.stub(:request).and_raise(StandardError)
+ Excon::Connection.any_instance.stub(:request).and_raise(StandardError)
expect { gitlab_net.check }.to raise_error(GitlabNet::ApiUnreachableError)
end
end
@@ -44,14 +45,15 @@ describe GitlabNet, vcr: true do
it 'adds the secret_token to request' do
VCR.use_cassette("discover-ok") do
- Net::HTTP::Get.any_instance.should_receive(:set_form_data).with(hash_including(secret_token: 'a123'))
+ Excon::Connection.any_instance.should_receive(:request).with(hash_including(body: 'secret_token=a123')).
+ and_return(Excon::Response.new)
gitlab_net.discover('key-126')
end
end
it "raises an exception if the connection fails" do
VCR.use_cassette("discover-ok") do
- Net::HTTP.any_instance.stub(:request).and_raise(StandardError)
+ Excon::Connection.any_instance.stub(:request).and_raise(StandardError)
expect { gitlab_net.discover('key-126') }.to raise_error(GitlabNet::ApiUnreachableError)
end
end
@@ -149,7 +151,8 @@ describe GitlabNet, vcr: true do
it 'adds the secret_token to the request' do
VCR.use_cassette("allowed-pull") do
- Net::HTTP::Post.any_instance.should_receive(:set_form_data).with(hash_including(secret_token: 'a123'))
+ Excon::Connection.any_instance.should_receive(:request).with(hash_including(body: 'secret_token=a123')).
+ and_return(Excon::Response.new)
gitlab_net.check_access('git-receive-pack', 'gitlab/gitlabhq.git', 'key-126', changes, 'ssh')
end
end
@@ -222,7 +225,7 @@ describe GitlabNet, vcr: true do
end
it "raises an exception if the connection fails" do
- Net::HTTP.any_instance.stub(:request).and_raise(StandardError)
+ Excon::Connection.any_instance.stub(:request).and_raise(StandardError)
expect {
gitlab_net.check_access('git-upload-pack', 'gitlab/gitlabhq.git', 'user-1', changes, 'ssh')
}.to raise_error(GitlabNet::ApiUnreachableError)
@@ -238,34 +241,13 @@ describe GitlabNet, vcr: true do
end
describe :http_client_for do
- subject { gitlab_net.send :http_client_for, URI('https://localhost/') }
+ subject { gitlab_net.send(:http_client_for, 'https://localhost/').data }
before do
gitlab_net.stub :cert_store
gitlab_net.send(:config).stub(:http_settings) { {'self_signed_cert' => true} }
end
- its(:verify_mode) { should eq(OpenSSL::SSL::VERIFY_NONE) }
- end
-
- describe :http_request_for do
- let(:get) do
- double(Net::HTTP::Get).tap do |get|
- Net::HTTP::Get.stub(:new) { get }
- end
- end
- let(:user) { 'user' }
- let(:password) { 'password' }
- let(:url) { URI 'http://localhost/' }
- subject { gitlab_net.send :http_request_for, :get, url }
-
- before do
- gitlab_net.send(:config).http_settings.stub(:[]).with('user') { user }
- gitlab_net.send(:config).http_settings.stub(:[]).with('password') { password }
- get.should_receive(:basic_auth).with(user, password).once
- get.should_receive(:set_form_data).with(hash_including(secret_token: 'a123')).once
- end
-
- it { should_not be_nil }
+ it { expect(subject[:ssl_verify_peer]).to eq(false) }
end
describe :cert_store do
diff --git a/spec/httpunix_spec.rb b/spec/httpunix_spec.rb
deleted file mode 100644
index 0fcff4a..0000000
--- a/spec/httpunix_spec.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-require_relative 'spec_helper'
-require_relative '../lib/httpunix'
-require 'webrick'
-
-describe URI::HTTPUNIX do
- describe :parse do
- uri = URI::parse('http+unix://%2Fpath%2Fto%2Fsocket/img.jpg')
- subject { uri }
-
- it { should be_an_instance_of(URI::HTTPUNIX) }
- its(:scheme) { should eq('http+unix') }
- its(:hostname) { should eq('/path/to/socket') }
- its(:path) { should eq('/img.jpg') }
- end
-end
-
-
-# like WEBrick::HTTPServer, but listens on UNIX socket
-class HTTPUNIXServer < WEBrick::HTTPServer
- def listen(address, port)
- socket = Socket.unix_server_socket(address)
- socket.autoclose = false
- server = UNIXServer.for_fd(socket.fileno)
- socket.close
- @listeners << server
- end
-
- # Workaround:
- # https://bugs.ruby-lang.org/issues/10956
- # Affecting Ruby 2.2
- # Fix for 2.2 is at https://github.com/ruby/ruby/commit/ab0a64e1
- # However, this doesn't work with 2.1. The following should work for both:
- def start(&block)
- @shutdown_pipe = IO.pipe
- shutdown_pipe = @shutdown_pipe
- super(&block)
- end
-
- def cleanup_shutdown_pipe(shutdown_pipe)
- @shutdown_pipe = nil
- return if !shutdown_pipe
- super(shutdown_pipe)
- end
-end
-
-def tmp_socket_path
- File.join(ROOT_PATH, 'tmp', 'socket')
-end
-
-describe Net::HTTPUNIX do
- # "hello world" over unix socket server in background thread
- FileUtils.mkdir_p(File.dirname(tmp_socket_path))
- server = HTTPUNIXServer.new(:BindAddress => tmp_socket_path)
- server.mount_proc '/' do |req, resp|
- resp.body = "Hello World (at #{req.path})"
- end
- Thread.start { server.start }
-
- it "talks via HTTP ok" do
- VCR.turned_off do
- begin
- WebMock.allow_net_connect!
- http = Net::HTTPUNIX.new(tmp_socket_path)
- expect(http.get('/').body).to eq('Hello World (at /)')
- expect(http.get('/path').body).to eq('Hello World (at /path)')
-
- ensure
- WebMock.disable_net_connect!
- end
- end
- end
-end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 612af76..ce03fba 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -10,9 +10,10 @@ end
require 'vcr'
require 'webmock'
+require_relative '../lib/gitlab_excon'
VCR.configure do |c|
c.cassette_library_dir = 'spec/vcr_cassettes'
- c.hook_into :webmock
+ c.hook_into :excon
c.configure_rspec_metadata!
end