SendGrid - Version 1.5.4

Version Description

  • Updated the plugin to use the last version of Sendgrid library: https://github.com/sendgrid/sendgrid-php/releases/tag/v3.0.0
Download this release

Release Info

Developer team-rs
Plugin Icon 128x128 SendGrid
Version 1.5.4
Comparing to
See all releases

Code changes from version 1.5.3 to 1.5.4

Files changed (155) hide show
  1. lib/overwrite-sendgrid-methods.php +36 -17
  2. readme.txt +5 -1
  3. vendor/sendgrid-php/CHANGELOG.md +25 -5
  4. vendor/sendgrid-php/README.md +459 -185
  5. vendor/sendgrid-php/composer.lock +161 -6
  6. vendor/sendgrid-php/lib/SendGrid.php +105 -82
  7. vendor/sendgrid-php/lib/SendGrid/Email.php +622 -411
  8. vendor/sendgrid-php/lib/SendGrid/Exception.php +14 -0
  9. vendor/sendgrid-php/lib/SendGrid/Response.php +41 -0
  10. vendor/sendgrid-php/vendor/autoload.php +1 -1
  11. vendor/sendgrid-php/vendor/composer/ClassLoader.php +27 -0
  12. vendor/sendgrid-php/vendor/composer/autoload_namespaces.php +3 -0
  13. vendor/sendgrid-php/vendor/composer/autoload_real.php +4 -4
  14. vendor/sendgrid-php/vendor/composer/installed.json +165 -7
  15. vendor/sendgrid-php/vendor/guzzle/guzzle/CHANGELOG.md +751 -0
  16. vendor/sendgrid-php/vendor/guzzle/guzzle/LICENSE +19 -0
  17. vendor/sendgrid-php/vendor/guzzle/guzzle/README.md +57 -0
  18. vendor/sendgrid-php/vendor/guzzle/guzzle/UPGRADING.md +537 -0
  19. vendor/sendgrid-php/vendor/guzzle/guzzle/build.xml +45 -0
  20. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/Makefile +153 -0
  21. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_downloads/guzzle-schema-1.0.json +176 -0
  22. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_static/guzzle-icon.png +0 -0
  23. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_static/homepage.css +122 -0
  24. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_static/logo.png +0 -0
  25. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_static/prettify.css +41 -0
  26. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_static/prettify.js +28 -0
  27. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_templates/index.html +106 -0
  28. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_templates/leftbar.html +0 -0
  29. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_templates/nav_links.html +5 -0
  30. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/batching/batching.rst +183 -0
  31. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/conf.py +94 -0
  32. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/docs.rst +73 -0
  33. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/getting-started/faq.rst +29 -0
  34. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/getting-started/installation.rst +154 -0
  35. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/getting-started/overview.rst +85 -0
  36. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/client.rst +569 -0
  37. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/entity-bodies.rst +151 -0
  38. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/http-redirects.rst +99 -0
  39. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/request.rst +667 -0
  40. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/response.rst +141 -0
  41. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/uri-templates.rst +52 -0
  42. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/index.rst +5 -0
  43. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/iterators/guzzle-iterators.rst +97 -0
  44. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/iterators/resource-iterators.rst +149 -0
  45. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/async-plugin.rst +18 -0
  46. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/backoff-plugin.rst +22 -0
  47. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/cache-plugin.rst +169 -0
  48. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/cookie-plugin.rst +33 -0
  49. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/creating-plugins.rst +93 -0
  50. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/curl-auth-plugin.rst +32 -0
  51. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/history-plugin.rst +24 -0
  52. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/log-plugin.rst +69 -0
  53. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/md5-validator-plugin.rst +29 -0
  54. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/mock-plugin.rst +27 -0
  55. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/oauth-plugin.rst +30 -0
  56. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/plugins-list.rst.inc +9 -0
  57. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/plugins-overview.rst +59 -0
  58. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/requirements.txt +2 -0
  59. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/webservice-client/guzzle-service-descriptions.rst +619 -0
  60. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/webservice-client/using-the-service-builder.rst +316 -0
  61. vendor/sendgrid-php/vendor/guzzle/guzzle/docs/webservice-client/webservice-client.rst +659 -0
  62. vendor/sendgrid-php/vendor/guzzle/guzzle/phar-stub.php +16 -0
  63. vendor/sendgrid-php/vendor/guzzle/guzzle/phing/build.properties.dist +16 -0
  64. vendor/sendgrid-php/vendor/guzzle/guzzle/phing/imports/dependencies.xml +33 -0
  65. vendor/sendgrid-php/vendor/guzzle/guzzle/phing/imports/deploy.xml +142 -0
  66. vendor/sendgrid-php/vendor/guzzle/guzzle/phing/tasks/ComposerLintTask.php +152 -0
  67. vendor/sendgrid-php/vendor/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php +338 -0
  68. vendor/sendgrid-php/vendor/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php +385 -0
  69. vendor/sendgrid-php/vendor/guzzle/guzzle/phpunit.xml.dist +48 -0
  70. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/AbstractBatchDecorator.php +66 -0
  71. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/Batch.php +92 -0
  72. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchBuilder.php +199 -0
  73. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchClosureDivisor.php +39 -0
  74. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchClosureTransfer.php +40 -0
  75. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchCommandTransfer.php +75 -0
  76. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchDivisorInterface.php +18 -0
  77. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchInterface.php +32 -0
  78. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchRequestTransfer.php +65 -0
  79. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchSizeDivisor.php +47 -0
  80. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchTransferInterface.php +16 -0
  81. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/Exception/BatchTransferException.php +90 -0
  82. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/ExceptionBufferingBatch.php +50 -0
  83. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/FlushingBatch.php +60 -0
  84. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/HistoryBatch.php +39 -0
  85. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/NotifyingBatch.php +38 -0
  86. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/AbstractCacheAdapter.php +21 -0
  87. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterFactory.php +117 -0
  88. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterInterface.php +55 -0
  89. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/ClosureCacheAdapter.php +57 -0
  90. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/DoctrineCacheAdapter.php +41 -0
  91. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/NullCacheAdapter.php +31 -0
  92. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/Zf1CacheAdapter.php +44 -0
  93. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/Zf2CacheAdapter.php +41 -0
  94. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/AbstractHasDispatcher.php +49 -0
  95. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Collection.php +403 -0
  96. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Event.php +52 -0
  97. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/BadMethodCallException.php +5 -0
  98. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/ExceptionCollection.php +108 -0
  99. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/GuzzleException.php +8 -0
  100. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/InvalidArgumentException.php +5 -0
  101. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/RuntimeException.php +5 -0
  102. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/UnexpectedValueException.php +5 -0
  103. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/FromConfigInterface.php +18 -0
  104. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/HasDispatcherInterface.php +54 -0
  105. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/ToArrayInterface.php +16 -0
  106. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Version.php +29 -0
  107. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/AbstractEntityBodyDecorator.php +221 -0
  108. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/CachingEntityBody.php +229 -0
  109. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Client.php +524 -0
  110. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/ClientInterface.php +223 -0
  111. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlHandle.php +464 -0
  112. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php +423 -0
  113. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiInterface.php +58 -0
  114. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiProxy.php +150 -0
  115. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlVersion.php +66 -0
  116. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/RequestMediator.php +147 -0
  117. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/EntityBody.php +201 -0
  118. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/EntityBodyInterface.php +73 -0
  119. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/BadResponseException.php +69 -0
  120. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/ClientErrorResponseException.php +8 -0
  121. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/CouldNotRewindStreamException.php +7 -0
  122. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/CurlException.php +101 -0
  123. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/HttpException.php +10 -0
  124. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/MultiTransferException.php +145 -0
  125. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/RequestException.php +39 -0
  126. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/ServerErrorResponseException.php +8 -0
  127. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/TooManyRedirectsException.php +5 -0
  128. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/IoEmittingEntityBody.php +83 -0
  129. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/AbstractMessage.php +220 -0
  130. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php +247 -0
  131. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequestInterface.php +137 -0
  132. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header.php +182 -0
  133. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/CacheControl.php +121 -0
  134. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderCollection.php +108 -0
  135. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactory.php +26 -0
  136. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactoryInterface.php +19 -0
  137. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderInterface.php +83 -0
  138. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/Link.php +93 -0
  139. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/MessageInterface.php +102 -0
  140. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/PostFile.php +124 -0
  141. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/PostFileInterface.php +83 -0
  142. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Request.php +638 -0
  143. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php +359 -0
  144. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactoryInterface.php +105 -0
  145. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/RequestInterface.php +318 -0
  146. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Response.php +968 -0
  147. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Mimetypes.php +962 -0
  148. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/CommaAggregator.php +20 -0
  149. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/DuplicateAggregator.php +22 -0
  150. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/PhpAggregator.php +27 -0
  151. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php +22 -0
  152. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/QueryString.php +297 -0
  153. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/ReadLimitEntityBody.php +122 -0
  154. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/RedirectPlugin.php +250 -0
  155. vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem +3469 -0
lib/overwrite-sendgrid-methods.php CHANGED
@@ -8,6 +8,27 @@ if ( ! function_exists('wp_mail'))
8
  define( 'SENDGRID_PLUGIN_SETTINGS', 'settings_page_sendgrid-settings' );
9
  define( 'SENDGRID_PLUGIN_STATISTICS', 'dashboard_page_sendgrid-statistics' );
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  /**
12
  * Override Email send
13
  *
@@ -21,28 +42,19 @@ if ( ! function_exists('wp_mail'))
21
  $form['api_user'] = Sendgrid_Tools::get_username();
22
  $form['api_key'] = Sendgrid_Tools::get_password();
23
 
 
 
24
  $files = preg_grep( '/files/', array_keys( $form ) );
25
 
26
  if ( count( $files) > 0 )
27
  {
28
  if ( in_array( 'curl', get_loaded_extensions() ) )
29
  {
30
- $session = curl_init( $sendgrid->url );
31
- curl_setopt( $session, CURLOPT_POST, true );
32
- curl_setopt( $session, CURLOPT_POSTFIELDS, $form );
33
- curl_setopt( $session, CURLOPT_HEADER, false );
34
- curl_setopt( $session, CURLOPT_RETURNTRANSFER, true );
35
- curl_setopt( $session, CURLOPT_CONNECTTIMEOUT, 5 );
36
- curl_setopt( $session, CURLOPT_TIMEOUT, 30 );
37
- curl_setopt( $session, CURLOPT_SSL_VERIFYPEER, false);
38
-
39
- $response = curl_exec( $session );
40
 
41
  $response = array(
42
- 'body' => $response
43
  );
44
-
45
- curl_close( $session );
46
  }
47
  else
48
  {
@@ -54,10 +66,10 @@ if ( ! function_exists('wp_mail'))
54
  }
55
 
56
  $data = array(
57
- 'body' => $form
58
  );
59
 
60
- $response = wp_remote_post( $sendgrid->url, $data );
61
  }
62
  }
63
  else
@@ -66,7 +78,7 @@ if ( ! function_exists('wp_mail'))
66
  'body' => $form
67
  );
68
 
69
- $response = wp_remote_post( $sendgrid->url, $data );
70
  }
71
 
72
  return $response;
@@ -107,7 +119,14 @@ if ( ! function_exists('wp_mail'))
107
  */
108
  function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() )
109
  {
110
- $sendgrid = new SendGrid( Sendgrid_Tools::get_username(), Sendgrid_Tools::get_password() );
 
 
 
 
 
 
 
111
  $mail = new SendGrid\Email();
112
 
113
  $method = Sendgrid_Tools::get_send_method();
8
  define( 'SENDGRID_PLUGIN_SETTINGS', 'settings_page_sendgrid-settings' );
9
  define( 'SENDGRID_PLUGIN_STATISTICS', 'dashboard_page_sendgrid-statistics' );
10
 
11
+ // overwrite SendGrid class constructor for sending emails without having curl extension enabled
12
+ class SendGridwp extends SendGrid
13
+ {
14
+ public function __construct( $apiUser, $apiKey, $options = array() )
15
+ {
16
+ $this->apiUser = $apiUser;
17
+ $this->apiKey = $apiKey;
18
+
19
+ $options['turn_off_ssl_verification'] = ( isset($options['turn_off_ssl_verification'] ) &&
20
+ $options['turn_off_ssl_verification'] == true );
21
+ $protocol = isset( $options['protocol'] ) ? $options['protocol'] : 'https';
22
+ $host = isset( $options['host'] ) ? $options['host'] : 'api.sendgrid.com';
23
+ $port = isset( $options['port'] ) ? $options['port'] : '';
24
+ $this->options = $options;
25
+
26
+ $this->url = isset( $options['url'] ) ?
27
+ $options['url'] : $protocol . '://' . $host . ( $port ? ':' . $port : '' );
28
+ $this->endpoint = isset( $options['endpoint'] ) ? $options['endpoint'] : '/api/mail.send.json';
29
+ }
30
+ }
31
+
32
  /**
33
  * Override Email send
34
  *
42
  $form['api_user'] = Sendgrid_Tools::get_username();
43
  $form['api_key'] = Sendgrid_Tools::get_password();
44
 
45
+ $url = $sendgrid->url . $sendgrid->endpoint;
46
+
47
  $files = preg_grep( '/files/', array_keys( $form ) );
48
 
49
  if ( count( $files) > 0 )
50
  {
51
  if ( in_array( 'curl', get_loaded_extensions() ) )
52
  {
53
+ $response = $sendgrid->postRequest($sendgrid->endpoint, $form);
 
 
 
 
 
 
 
 
 
54
 
55
  $response = array(
56
+ 'body' => $response->raw_body
57
  );
 
 
58
  }
59
  else
60
  {
66
  }
67
 
68
  $data = array(
69
+ 'body' => $form
70
  );
71
 
72
+ $response = wp_remote_post( $url, $data );
73
  }
74
  }
75
  else
78
  'body' => $form
79
  );
80
 
81
+ $response = wp_remote_post( $url, $data );
82
  }
83
 
84
  return $response;
119
  */
120
  function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() )
121
  {
122
+ if ( in_array( 'curl', get_loaded_extensions() ) )
123
+ {
124
+ $sendgrid = new SendGrid( Sendgrid_Tools::get_username(), Sendgrid_Tools::get_password() );
125
+ }
126
+ else
127
+ {
128
+ $sendgrid = new SendGridwp( Sendgrid_Tools::get_username(), Sendgrid_Tools::get_password() );
129
+ }
130
  $mail = new SendGrid\Email();
131
 
132
  $method = Sendgrid_Tools::get_send_method();
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: http://sendgrid.com/
4
  Tags: email, email reliability, email templates, sendgrid, smtp, transactional email, wp_mail,email infrastructure, email marketing, marketing email, deliverability, email deliverability, email delivery, email server, mail server, email integration, cloud email
5
  Requires at least: 3.3
6
  Tested up to: 4.1.1
7
- Stable tag: 1.5.3
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -121,6 +121,8 @@ Create a SendGrid account at <a href="http://sendgrid.com/partner/wordpress" tar
121
 
122
  == Changelog ==
123
 
 
 
124
  = 1.5.3 =
125
  * Fix attachments issue
126
  = 1.5.2 =
@@ -166,6 +168,8 @@ Create a SendGrid account at <a href="http://sendgrid.com/partner/wordpress" tar
166
 
167
  == Upgrade notice ==
168
 
 
 
169
  = 1.5.3 =
170
  * Fix attachments issue
171
  = 1.5.2 =
4
  Tags: email, email reliability, email templates, sendgrid, smtp, transactional email, wp_mail,email infrastructure, email marketing, marketing email, deliverability, email deliverability, email delivery, email server, mail server, email integration, cloud email
5
  Requires at least: 3.3
6
  Tested up to: 4.1.1
7
+ Stable tag: 1.5.4
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
121
 
122
  == Changelog ==
123
 
124
+ = 1.5.4 =
125
+ * Updated the plugin to use the last version of Sendgrid library: https://github.com/sendgrid/sendgrid-php/releases/tag/v3.0.0
126
  = 1.5.3 =
127
  * Fix attachments issue
128
  = 1.5.2 =
168
 
169
  == Upgrade notice ==
170
 
171
+ = 1.5.4 =
172
+ * Updated the plugin to use the last version of Sendgrid library: https://github.com/sendgrid/sendgrid-php/releases/tag/v3.0.0
173
  = 1.5.3 =
174
  * Fix attachments issue
175
  = 1.5.2 =
vendor/sendgrid-php/CHANGELOG.md CHANGED
@@ -1,7 +1,27 @@
1
- v2.2.0 (2014-01-12)
2
- ===================
 
3
 
4
- * Remove [Unirest](https://github.com/Mashape/unirest-php/) and replace with native cURL
5
- * Add CHANGELOG.md
 
6
 
7
- --
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+ This project adheres to [Semantic Versioning](http://semver.org/).
4
 
5
+ ## [v3.0.0] - (2015-04-14)
6
+ ### Fixed
7
+ - CC and BCC not working with SMTPAPI To
8
 
9
+ ### Changed
10
+ - **Breaking:** A `\SendGrid\Exception` is now raised when response is not 200
11
+ - **Breaking:** `addTo` now uses the Web API parameter as opposed to the SMTPAPI Header. Substitutions will most likely break unless you update to use `addSmtpapiTo`
12
+ - The library now depends on Guzzle3
13
+ - Major refactoring
14
+
15
+ ### Added
16
+ - **Breaking:** `send()` now returns an instance of `\SendGrid\Response`
17
+ - Numerous missing methods for new functionality
18
+ - `addSmtpapiTo` for using the SMTPAPI To
19
+
20
+ ## [v2.2.1] - (2014-01-29)
21
+ ### Fixed
22
+ - Fix turn_off_ssl_verification option via [#123](https://github.com/sendgrid/sendgrid-php/pull/123)
23
+
24
+ ## [v2.2.0] - (2014-01-12)
25
+ ### Changed
26
+ - Remove [Unirest](https://github.com/Mashape/unirest-php/) and replace with native cURL
27
+ - Add CHANGELOG.md
vendor/sendgrid-php/README.md CHANGED
@@ -1,24 +1,49 @@
1
- # SendGrid-php
2
 
3
  This library allows you to quickly and easily send emails through SendGrid using PHP.
4
 
5
- WARNING: This module was recently upgraded from [1.1.7](https://github.com/sendgrid/sendgrid-php/tree/v1.1.7) to 2.X. There were API breaking changes for various method names. See [usage](https://github.com/sendgrid/sendgrid-php#usage) for up to date method names.
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
  Important: This library requires PHP 5.3 or higher.
8
 
9
- [![BuildStatus](https://travis-ci.org/sendgrid/sendgrid-php.png?branch=master)](https://travis-ci.org/sendgrid/sendgrid-php)
10
- [![Latest Stable Version](https://poser.pugx.org/sendgrid/sendgrid/version.png)](https://packagist.org/packages/sendgrid/sendgrid)
11
 
12
  ```php
13
  $sendgrid = new SendGrid('username', 'password');
14
- $email = new SendGrid\Email();
15
- $email->addTo('foo@bar.com')->
16
- setFrom('me@bar.com')->
17
- setSubject('Subject goes here')->
18
- setText('Hello World!')->
19
- setHtml('<strong>Hello World!</strong>');
 
 
20
 
21
  $sendgrid->send($email);
 
 
 
 
 
 
 
 
 
 
 
22
  ```
23
 
24
  ## Installation
@@ -28,7 +53,7 @@ Add SendGrid to your `composer.json` file. If you are not using [Composer](http:
28
  ```json
29
  {
30
  "require": {
31
- "sendgrid/sendgrid": "2.2.0"
32
  }
33
  }
34
  ```
@@ -69,12 +94,14 @@ Create a new SendGrid Email object and add your message details.
69
 
70
  ```php
71
  $email = new SendGrid\Email();
72
- $email->addTo('foo@bar.com')->
73
- addTo('bar@foo.com')->
74
- setFrom('me@bar.com')->
75
- setSubject('Subject goes here')->
76
- setText('Hello World!')->
77
- setHtml('<strong>Hello World!</strong>');
 
 
78
  ```
79
 
80
  Send it.
@@ -82,15 +109,189 @@ Send it.
82
  ```php
83
  $sendgrid->send($email);
84
  ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
  #### addTo
87
 
88
- You can add one or multiple TO addresses using `addTo`.
89
 
90
  ```php
91
  $email = new SendGrid\Email();
92
- $email->addTo('foo@bar.com')->
93
- addTo('another@another.com');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  $sendgrid->send($email);
95
  ```
96
 
@@ -99,16 +300,26 @@ $sendgrid->send($email);
99
  If you prefer, you can add multiple TO addresses as an array using the `setTos` method. This will unset any previous `addTo`s you appended.
100
 
101
  ```php
102
- $email = new SendGrid\Email();
103
  $emails = array("foo@bar.com", "another@another.com", "other@other.com");
104
  $email->setTos($emails);
105
  $sendgrid->send($email);
106
  ```
107
 
 
 
 
 
 
 
 
 
 
 
108
  #### setFrom
109
 
110
  ```php
111
- $email = new SendGrid\Email();
112
  $email->setFrom('foo@bar.com');
113
  $sendgrid->send($email);
114
  ```
@@ -116,11 +327,13 @@ $sendgrid->send($email);
116
  #### setFromName
117
 
118
  ```php
119
- $email = new SendGrid\Email();
120
- $email->setFrom('foo@bar.com');
121
- $email->setFromName('Foo Bar');
122
- $email->setFrom('other@example.com');
123
- $email->setFromName('Other Guy');
 
 
124
  $sendgrid->send($email);
125
  ```
126
 
@@ -128,10 +341,12 @@ $sendgrid->send($email);
128
 
129
  ```php
130
  $email = new SendGrid\Email();
131
- $email->addTo('foo@bar.com')->
132
- setReplyTo('someone.else@example.com')->
133
- setFromName('John Doe')->
134
- ...
 
 
135
  ```
136
 
137
  ### Cc
@@ -139,7 +354,7 @@ $email->addTo('foo@bar.com')->
139
  #### addCc
140
 
141
  ```php
142
- $email = new SendGrid\Email();
143
  $email->addCc('foo@bar.com');
144
  $sendgrid->send($email);
145
  ```
@@ -147,7 +362,7 @@ $sendgrid->send($email);
147
  #### setCc
148
 
149
  ```php
150
- $email = new SendGrid\Email();
151
  $email->setCc('foo@bar.com');
152
  $sendgrid->send($email);
153
  ```
@@ -155,7 +370,7 @@ $sendgrid->send($email);
155
  #### setCcs
156
 
157
  ```php
158
- $email = new SendGrid\Email();
159
  $emails = array("foo@bar.com", "another@another.com", "other@other.com");
160
  $email->setCcs($emails);
161
  $sendgrid->send($email);
@@ -169,14 +384,16 @@ $email->removeCc('foo@bar.com');
169
 
170
  ### Bcc
171
 
172
- Use multiple `addTo`s as a superior alternative to `setBcc`.
173
 
174
  ```php
175
  $email = new SendGrid\Email();
176
- $email->addTo('foo@bar.com')->
177
- addTo('someotheraddress@bar.com')->
178
- addTo('another@another.com')->
179
- ...
 
 
180
  ```
181
 
182
  But if you do still have a need for Bcc you can do the following:
@@ -184,7 +401,8 @@ But if you do still have a need for Bcc you can do the following:
184
  #### addBcc
185
 
186
  ```php
187
- $email = new SendGrid\Email();
 
188
  $email->addBcc('foo@bar.com');
189
  $sendgrid->send($email);
190
  ```
@@ -192,7 +410,7 @@ $sendgrid->send($email);
192
  #### setBcc
193
 
194
  ```php
195
- $email = new SendGrid\Email();
196
  $email->setBcc('foo@bar.com');
197
  $sendgrid->send($email);
198
  ```
@@ -200,7 +418,7 @@ $sendgrid->send($email);
200
  #### setBccs
201
 
202
  ```php
203
- $email = new SendGrid\Email();
204
  $emails = array("foo@bar.com", "another@another.com", "other@other.com");
205
  $email->setBccs($emails);
206
  $sendgrid->send($email);
@@ -212,10 +430,14 @@ $sendgrid->send($email);
212
  $email->removeBcc('foo@bar.com');
213
  ```
214
 
 
 
 
 
215
  #### setSubject
216
 
217
  ```php
218
- $email = new SendGrid\Email();
219
  $email->setSubject('This is a subject');
220
  $sendgrid->send($email);
221
  ```
@@ -223,7 +445,7 @@ $sendgrid->send($email);
223
  #### setText
224
 
225
  ```php
226
- $email = new SendGrid\Email();
227
  $email->setText('This is some text');
228
  $sendgrid->send($email);
229
  ```
@@ -231,7 +453,7 @@ $sendgrid->send($email);
231
  #### setHtml
232
 
233
  ```php
234
- $email = new SendGrid\Email();
235
  $email->setHtml('<h1>This is an html email</h1>');
236
  $sendgrid->send($email);
237
  ```
@@ -239,7 +461,7 @@ $sendgrid->send($email);
239
  #### setDate
240
 
241
  ```php
242
- $email = new SendGrid\Email();
243
  $email->setDate('Wed, 17 Dec 2014 19:21:16 +0000');
244
  $sendgrid->send($email);
245
  ```
@@ -247,7 +469,7 @@ $sendgrid->send($email);
247
  #### setSendAt
248
 
249
  ```php
250
- $email = new SendGrid\Email();
251
  $email->setSendAt(1409348513);
252
  $sendgrid->send($email);
253
  ```
@@ -255,7 +477,7 @@ $sendgrid->send($email);
255
  #### setSendEachAt
256
 
257
  ```php
258
- $email = new SendGrid\Email();
259
  $email->setSendEachAt(array(1409348513, 1409348514, 1409348515));
260
  $sendgrid->send($email);
261
  ```
@@ -263,10 +485,12 @@ $sendgrid->send($email);
263
  #### addSendEachAt
264
 
265
  ```php
266
- $email = new SendGrid\Email();
267
- $email->addSendEachAt(1409348513);
268
- $email->addSendEachAt(1409348514);
269
- $email->addSendEachAt(1409348515);
 
 
270
  $sendgrid->send($email);
271
  ```
272
 
@@ -280,19 +504,23 @@ To use a category, simply set the category name. Note: there is a maximum of 10
280
 
281
  ```php
282
  $email = new SendGrid\Email();
283
- $email->addTo('foo@bar.com')->
284
- ...
285
- addCategory("Category 1")->
286
- addCategory("Category 2");
 
 
287
  ```
288
 
289
  #### setCategory
290
 
291
  ```php
292
  $email = new SendGrid\Email();
293
- $email->addTo('foo@bar.com')->
294
- ...
295
- setCategory("Category 1");
 
 
296
  ```
297
 
298
  #### setCategories
@@ -307,9 +535,11 @@ $email->setCategories($categories);
307
 
308
  ```php
309
  $email = new SendGrid\Email();
310
- $email->addTo('foo@bar.com')->
311
- ...
312
- removeCategory("Category 1");
 
 
313
  ```
314
 
315
  ### Attachments ###
@@ -322,18 +552,22 @@ File attachments are limited to 7 MB per file.
322
 
323
  ```php
324
  $email = new SendGrid\Email();
325
- $email->addTo('foo@bar.com')->
326
- ...
327
- addAttachment("../path/to/file.txt");
 
 
328
  ```
329
 
330
  #### setAttachment
331
 
332
  ```php
333
  $email = new SendGrid\Email();
334
- $email->addTo('foo@bar.com')->
335
- ...
336
- setAttachment("../path/to/file.txt");
 
 
337
  ```
338
 
339
  #### setAttachments
@@ -341,71 +575,84 @@ $email->addTo('foo@bar.com')->
341
  ```php
342
  $email = new SendGrid\Email();
343
  $attachments = array("../path/to/file1.txt", "../path/to/file2.txt");
344
- $email->addTo('foo@bar.com')->
345
- ...
346
- setAttachments($attachments);
 
 
347
  ```
348
 
349
  #### removeAttachment
350
 
351
  ```php
352
  $email = new SendGrid\Email();
353
- $email->addTo('foo@bar.com')->
354
- ...
355
- addAttachment("../path/to/file.txt");
356
- $email->removeAttachment("../path/to/file.txt");
 
 
357
  ```
358
 
359
  You can tag files for use as inline HTML content. It will mark the file for inline disposition using the specified "cid".
360
 
361
  ```php
362
  $email = new SendGrid\Email();
363
- $email->addTo('foo@bar.com')
364
- ->setHtml('<div>Our logo:<img src="cid:file-cid"></div>')
365
- ->addAttachment("../path/to/file.txt", "super_file.txt", "file-cid");
 
 
366
  ```
367
 
368
- **Important Gotcha**: `setBcc` is not supported with attachments. This is by design. Instead use multiple `addTo`s. Each user will receive their own personalized email with that setup, and only see their own email.
369
-
370
-
371
- Standard `setBcc` will hide who the email is addressed to. If you use the multiple addTo, each user will receive a personalized email showing **only* their email. This is more friendly and more personal. Additionally, it is a good idea to use multiple `addTo`s because setBcc is not supported with attachments. This is by design.
372
-
373
- So just remember, when thinking 'bcc', instead use multiple `addTo`s.
374
-
375
  ### Substitutions ###
376
 
377
- Substitutions can be used to customize multi-recipient emails, and tailor them for the user
 
 
378
 
379
  #### addSubstitution
380
 
381
  ```php
382
  $email = new SendGrid\Email();
383
- $email->addTo('john@somewhere.com')->
384
- addTo('harry@somewhere.com')->
385
- addTo('Bob@somewhere.com')->
 
386
  ...
387
- setHtml('Hey %name%, we've seen that you've been gone for a while')->
388
- addSubstitution('%name%', array('John', 'Harry', 'Bob'));
 
389
  ```
390
 
391
  Substitutions can also be used to customize multi-recipient subjects.
392
 
393
  ```php
394
  $email = new SendGrid\Email();
395
- $email->addTos(array('john@somewhere.com', 'harry@somewhere.com', 'bob@somewhere.com'))
 
396
  ->setSubject('%subject%')
397
- ->addSubstitution('%subject%', array('Subject to John', 'Subject to Harry', 'Subject to Bob'))
398
- ...;
 
 
 
 
399
  ```
400
 
401
  #### setSubstitutions
402
 
403
  ```php
404
  $email = new SendGrid\Email();
405
- $email->addTos(array('john@somewhere.com', 'harry@somewhere.com', 'bob@somewhere.com'))
 
406
  ->setSubject('%subject%')
407
- ->setSubstitutions(array('%name%' => array('John', 'Harry', 'Bob') , '%subject%' => array('Subject to John', 'Subject to Harry', 'Subject to Bob')))
408
- ...;
 
 
 
 
409
  ```
410
 
411
  ### Sections ###
@@ -416,29 +663,33 @@ Sections can be used to further customize messages for the end users. A section
416
 
417
  ```php
418
  $email = new SendGrid\Email();
419
- $email->addTo('john@somewhere.com')->
420
- addTo("harry@somewhere.com")->
421
- addTo("Bob@somewhere.com")->
422
- ...
423
- setHtml("Hey %name%, you work at %place%")->
424
- addSubstitution("%name%", array("John", "Harry", "Bob"))->
425
- addSubstitution("%place%", array("%office%", "%office%", "%home%"))->
426
- addSection("%office%", "an office")->
427
- addSection("%home%", "your house");
 
 
428
  ```
429
 
430
  #### setSections
431
 
432
  ```php
433
  $email = new SendGrid\Email();
434
- $email->addTo('john@somewhere.com')->
435
- addTo("harry@somewhere.com")->
436
- addTo("Bob@somewhere.com")->
437
- ...
438
- setHtml("Hey %name%, you work at %place%")->
439
- addSubstitution("%name%", array("John", "Harry", "Bob"))->
440
- addSubstitution("%place%", array("%office%", "%office%", "%home%"))->
441
- setSections(array("%office%" => "an office", "%home%" => "your house"));
 
 
442
  ```
443
 
444
  ### Unique Arguments ###
@@ -449,19 +700,23 @@ Unique Arguments are used for tracking purposes
449
 
450
  ```php
451
  $email = new SendGrid\Email();
452
- $email->addTo('foo@bar.com')->
453
- ...
454
- addUniqueArg("Customer", "Someone")->
455
- addUniqueArg("location", "Somewhere")->
 
 
456
  ```
457
 
458
  #### setUniqueArgs / setUniqueArguments
459
 
460
  ```php
461
  $email = new SendGrid\Email();
462
- $email->addTo('foo@bar.com')->
463
- ...
464
- setUniqueArgs(array('cow' => 'chicken'));
 
 
465
  ```
466
 
467
  ### Filter Settings ###
@@ -472,116 +727,139 @@ Filter Settings are used to enable and disable apps, and to pass parameters to t
472
 
473
  ```php
474
  $email = new SendGrid\Email();
475
- $email->addTo('foo@bar.com')->
476
- ...
477
- addFilter("gravatar", "enable", 1)->
478
- addFilter("footer", "enable", 1)->
479
- addFilter("footer", "text/plain", "Here is a plain text footer")->
480
- addFilter("footer", "text/html", "<p style='color:red;'>Here is an HTML footer</p>");
 
 
 
 
 
 
481
  ```
482
 
483
  #### setFilters / setFilterSettings
484
 
485
  ```php
486
  $email = new SendGrid\Email();
487
- $email->addTo('foo@bar.com')->
488
- ...
489
- setFilters(array("gravatar" => array("settings" => array("enable" => 1))))
 
 
490
  ```
491
 
492
- ### Headers ###
493
 
494
- You can add standard email message headers as necessary.
495
 
496
- #### addHeader
497
 
498
  ```php
499
  $email = new SendGrid\Email();
500
- $email->addTo('foo@bar.com')->
501
- ...
502
- addHeader('X-Sent-Using', 'SendGrid-API')->
503
- addHeader('X-Transport', 'web');
 
 
 
 
 
 
504
  ```
505
 
506
- #### setHeaders
507
 
508
  ```php
509
  $email = new SendGrid\Email();
510
- $email->addTo('foo@bar.com')->
511
- ...
512
- setHeaders(array('X-Sent-Using' => 'SendGrid-API', 'X-Transport' => 'web'));
 
513
  ```
514
 
515
- #### removeHeader
 
 
 
 
516
 
517
  ```php
518
  $email = new SendGrid\Email();
519
- $email->addTo('foo@bar.com')->
520
- ...
521
- addHeader('X-Sent-Using', 'SendGrid-API')->
522
- addHeader('X-Transport', 'web');
523
- $email->removeHeader('X-Transport');
524
  ```
525
 
526
- ### Options
527
- Options may be passed to the library when initializing the SendGrid object:
528
 
529
- ```php
530
- $options = array(
531
- 'turn_off_ssl_verification' => false,
532
- 'protocol' => 'https',
533
- 'host' => 'api.sendgrid.com',
534
- 'endpoint' => '/api/mail.send.json',
535
- 'port' => null,
536
- 'url' => null
537
- );
538
- $sendgrid = new SendGrid('username', 'password', $options);
539
- ```
540
 
541
- #### Changing URL
542
- You may change the URL sendgrid-php uses to send email by supplying various parameters to `options`, all parameters are optional:
543
 
544
  ```php
545
- $sendgrid = new SendGrid('username', 'password', array( 'protocol' => 'http', 'host' => 'sendgrid.org', 'endpoint' => '/send', 'port' => '80' ));
 
 
 
 
 
 
546
  ```
547
 
548
- A full URL may also be provided:
549
 
550
  ```php
551
- $sendgrid = new SendGrid('username', 'password', array( 'url' => 'http://sendgrid.org:80/send'));
 
 
 
 
 
552
  ```
553
 
554
- #### Ignoring SSL certificate verification
555
-
556
- You can optionally ignore verification of SSL certificate when using the Web API.
557
 
558
  ```php
559
- $sendgrid = new SendGrid(SENDGRID_USERNAME, SENDGRID_PASSWORD, array("turn_off_ssl_verification" => true));
 
 
 
 
 
 
 
560
  ```
561
 
562
-
563
  ### Sending to 1,000s of emails in one batch
564
 
565
  Sometimes you might want to send 1,000s of emails in one request. You can do that. It is recommended you break each batch up in 1,000 increments. So if you need to send to 5,000 emails, then you'd break this into a loop of 1,000 emails at a time.
566
 
567
  ```php
568
- $sendgrid = new SendGrid(SENDGRID_USERNAME, SENDGRID_PASSWORD);
569
- $email = new SendGrid\Email();
570
 
571
- $recipients = array("alpha@mailinator.com", "beta@mailinator.com", "zeta@mailinator.com");
572
- $names = array("Alpha", "Beta", "Zeta");
 
 
 
 
573
 
574
- $email->setFrom("from@mailinator.com")->
575
- setSubject('[sendgrid-php-batch-email]')->
576
- setTos($recipients)->
577
- addSubstitution("%name%", $names)->
578
- setText("Hey %name, we have an email for you")->
579
- setHtml("<h1>Hey %name%, we have an email for you</h1>");
 
 
580
 
581
  $result = $sendgrid->send($email);
582
  ```
583
 
584
-
585
  ## Contributing
586
 
587
  1. Fork it
@@ -622,7 +900,3 @@ export S3_BUCKET="sendgrid-open-source"
622
  export S3_ACCESS_KEY="secret_access_key"
623
  ./scripts/s3upload.sh
624
  ```
625
-
626
-
627
-
628
-
1
+ # SendGrid-PHP
2
 
3
  This library allows you to quickly and easily send emails through SendGrid using PHP.
4
 
5
+ WARNING: This module was recently upgraded from [2.2.x](https://github.com/sendgrid/sendgrid-php/tree/v2.2.1) to 3.X. There were API breaking changes for various method names. See [usage](https://github.com/sendgrid/sendgrid-php#usage) for up to date method names.
6
+
7
+ ## PLEASE READ THIS
8
+
9
+ **TLDR: If you upgrade and don't change your code appropriately, things *WILL* break.**
10
+
11
+ One of the most notable changes is how `addTo()` behaves. We are now using our Web API parameters instead of the X-SMTPAPI header. What this means is that if you call `addTo()` multiple times for an email, **ONE** email will be sent with each email address visible to everyone. To utilize the original behavior of having an individual personalized email sent to each recipient you must now use `addSmtpapiTo()`. **This will break substitutions if there is more than one To address added unless you update to use `addSmtpapiTo()`.**
12
+
13
+ Smtpapi addressing methods cannot be mixed with non Smtpapi addressing methods. Meaning you cannot currently use Cc and Bcc with `addSmtpapiTo()`.
14
+
15
+ The `send()` method now raises a `\SendGrid\Exception` if the response code is not 200 and returns an instance of `\SendGrid\Response`.
16
+
17
+ ---
18
 
19
  Important: This library requires PHP 5.3 or higher.
20
 
21
+ [![BuildStatus](https://travis-ci.org/sendgrid/sendgrid-php.svg?branch=master)](https://travis-ci.org/sendgrid/sendgrid-php)
22
+ [![Latest Stable Version](https://poser.pugx.org/sendgrid/sendgrid/version.svg)](https://packagist.org/packages/sendgrid/sendgrid)
23
 
24
  ```php
25
  $sendgrid = new SendGrid('username', 'password');
26
+ $email = new SendGrid\Email();
27
+ $email
28
+ ->addTo('foo@bar.com')
29
+ ->setFrom('me@bar.com')
30
+ ->setSubject('Subject goes here')
31
+ ->setText('Hello World!')
32
+ ->setHtml('<strong>Hello World!</strong>')
33
+ ;
34
 
35
  $sendgrid->send($email);
36
+
37
+ // Or catch the error
38
+
39
+ try {
40
+ $sendgrid->send($email);
41
+ } catch(\SendGrid\Exception $e) {
42
+ echo $e->getCode();
43
+ foreach($e->getErrors() as $er) {
44
+ echo $er;
45
+ }
46
+ }
47
  ```
48
 
49
  ## Installation
53
  ```json
54
  {
55
  "require": {
56
+ "sendgrid/sendgrid": "~3.0"
57
  }
58
  }
59
  ```
94
 
95
  ```php
96
  $email = new SendGrid\Email();
97
+ $email
98
+ ->addTo('foo@bar.com')
99
+ ->addTo('bar@foo.com')
100
+ ->setFrom('me@bar.com')
101
+ ->setSubject('Subject goes here')
102
+ ->setText('Hello World!')
103
+ ->setHtml('<strong>Hello World!</strong>')
104
+ ;
105
  ```
106
 
107
  Send it.
109
  ```php
110
  $sendgrid->send($email);
111
  ```
112
+ ### Options
113
+ Options may be passed to the library when initializing the SendGrid object:
114
+
115
+ ```php
116
+ $options = array(
117
+ 'turn_off_ssl_verification' => false,
118
+ 'protocol' => 'https',
119
+ 'host' => 'api.sendgrid.com',
120
+ 'endpoint' => '/api/mail.send.json',
121
+ 'port' => null,
122
+ 'url' => null,
123
+ );
124
+ $sendgrid = new SendGrid('username', 'password', $options);
125
+ ```
126
+
127
+ #### Changing URL
128
+ You may change the URL sendgrid-php uses to send email by supplying various parameters to `options`, all parameters are optional:
129
+
130
+ ```php
131
+ $sendgrid = new SendGrid(
132
+ 'username',
133
+ 'password',
134
+ array(
135
+ 'protocol' => 'http',
136
+ 'host' => 'sendgrid.org',
137
+ 'endpoint' => '/send',
138
+ 'port' => '80'
139
+ )
140
+ );
141
+ ```
142
+
143
+ A full URL may also be provided:
144
+
145
+ ```php
146
+ $sendgrid = new SendGrid(
147
+ 'username',
148
+ 'password',
149
+ array( 'url' => 'http://sendgrid.org:80/send')
150
+ );
151
+ ```
152
+
153
+ #### Ignoring SSL certificate verification
154
+
155
+ You can optionally ignore verification of SSL certificate when using the Web API.
156
+
157
+ ```php
158
+ $sendgrid = new SendGrid(
159
+ SENDGRID_USERNAME,
160
+ SENDGRID_PASSWORD,
161
+ array("turn_off_ssl_verification" => true)
162
+ );
163
+ ```
164
+
165
+ #### Response ####
166
+
167
+ An instance of `\SendGrid\Response` is returned from the `send()` method.
168
+
169
+ ```php
170
+ $email = new SendGrid\Email();
171
+ $email
172
+ ->addTo('foo@bar.com')
173
+ ->setFrom('me@bar.com')
174
+ ->setSubject('Subject goes here')
175
+ ->setText('Hello World!');
176
+ $res = sendgrid->send($email);
177
+
178
+ var_dump($res);
179
+
180
+ // Output
181
+ object(SendGrid\Response)#31 (4) {
182
+ ["code"]=>
183
+ int(200)
184
+ ["headers"]=>
185
+ object(Guzzle\Http\Message\Header\HeaderCollection)#48 (1) {
186
+ ["headers":protected]=>
187
+ array(6) {
188
+ ...
189
+ ["content-type"]=>
190
+ object(Guzzle\Http\Message\Header)#41 (3) {
191
+ ["values":protected]=>
192
+ array(1) {
193
+ [0]=>
194
+ string(16) "application/json"
195
+ }
196
+ ["header":protected]=>
197
+ string(12) "Content-Type"
198
+ ["glue":protected]=>
199
+ string(1) ","
200
+ }
201
+ ...
202
+ }
203
+ }
204
+ ["raw_body"]=>
205
+ string(21) "{"message":"success"}"
206
+ ["body"]=>
207
+ array(1) {
208
+ ["message"]=>
209
+ string(7) "success"
210
+ }
211
+ }
212
+ ```
213
+
214
+ #### getCode ####
215
+
216
+ Returns the status code of the response.
217
+
218
+ #### getHeaders ####
219
+
220
+ Returns the headers of the response as a [Guzzle\Http\Message\Header\HeaderCollection object](http://api.guzzlephp.org/class-Guzzle.Http.Message.Header.HeaderCollection.html).
221
+
222
+ #### getRawBody ####
223
+
224
+ Returns the unparsed JSON response from SendGrid.
225
+
226
+ #### getBody ####
227
+
228
+ Returns the parsed JSON from SendGrid.
229
+
230
+ ### Exception ###
231
+
232
+ A `\SendGrid\Exception` is raised if the response code is not 200. Catching it is optional but highly recommended.
233
+
234
+ ```php
235
+ try {
236
+ $sendgrid->send($email);
237
+ } catch(\SendGrid\Exception $e) {
238
+ echo $e->getCode() . "\n";
239
+ foreach($e->getErrors() as $er) {
240
+ echo $er;
241
+ }
242
+ }
243
+
244
+ // Output
245
+ 400
246
+ Permission denied, wrong credentials
247
+ ```
248
+
249
+ ### SMTPAPI ###
250
+
251
+ This library makes use of [sendgrid/smtpapi-php](https://github.com/sendgrid/smtpapi-php/) for all things related to the [X-SMTPAPI Header](https://sendgrid.com/docs/API_Reference/SMTP_API/index.html).
252
+
253
+ ---
254
+
255
+ ### Library Methods ###
256
 
257
  #### addTo
258
 
259
+ You can add one or multiple TO addresses using `addTo` along with an optional TO name. Note: If using TO names, each address needs a name.
260
 
261
  ```php
262
  $email = new SendGrid\Email();
263
+ $email
264
+ ->addTo('foo@bar.com')
265
+ ->addTo('another@another.com')
266
+ ;
267
+ $sendgrid->send($email);
268
+
269
+ // With names
270
+ $email = new SendGrid\Email();
271
+ $email
272
+ ->addTo('foo@bar.com', 'Frank Foo')
273
+ ->addTo('another@another.com', 'Joe Bar')
274
+ ;
275
+ $sendgrid->send($email);
276
+
277
+ // As an array
278
+ $email = new SendGrid\Email();
279
+ $email
280
+ ->addTo(array('foo@bar.com', 'bar@example'), array('Frank Foo', 'Brian Bar'))
281
+ ;
282
+ $sendgrid->send($email);
283
+ ```
284
+
285
+ #### addSmtpapiTo
286
+
287
+ Add a TO address to the smtpapi header along with an optional name.
288
+
289
+ ```php
290
+ $email = new SendGrid\Email();
291
+ $email
292
+ ->addSmtpapiTo('foo@bar.com')
293
+ ->addSmtpapiTo('another@another.com', 'Mike Bar')
294
+ ;
295
  $sendgrid->send($email);
296
  ```
297
 
300
  If you prefer, you can add multiple TO addresses as an array using the `setTos` method. This will unset any previous `addTo`s you appended.
301
 
302
  ```php
303
+ $email = new SendGrid\Email();
304
  $emails = array("foo@bar.com", "another@another.com", "other@other.com");
305
  $email->setTos($emails);
306
  $sendgrid->send($email);
307
  ```
308
 
309
+ #### setSmtpapiTos
310
+
311
+ ```php
312
+ $email = new SendGrid\Email();
313
+ $emails = array("foo@bar.com", "Brian Bar <bar@example.com>", "other@example.com");
314
+ $email->setSmtpapiTos($emails);
315
+ $sendgrid->send($email);
316
+ ```
317
+
318
+
319
  #### setFrom
320
 
321
  ```php
322
+ $email = new SendGrid\Email();
323
  $email->setFrom('foo@bar.com');
324
  $sendgrid->send($email);
325
  ```
327
  #### setFromName
328
 
329
  ```php
330
+ $email = new SendGrid\Email();
331
+ $email
332
+ ->setFrom('foo@bar.com')
333
+ ->setFromName('Foo Bar')
334
+ ->setFrom('other@example.com')
335
+ ->setFromName('Other Guy')
336
+ ;
337
  $sendgrid->send($email);
338
  ```
339
 
341
 
342
  ```php
343
  $email = new SendGrid\Email();
344
+ $email
345
+ ->addTo('foo@bar.com')
346
+ ->setReplyTo('someone.else@example.com')
347
+ ->setFromName('John Doe')
348
+ ...
349
+ ;
350
  ```
351
 
352
  ### Cc
354
  #### addCc
355
 
356
  ```php
357
+ $email = new SendGrid\Email();
358
  $email->addCc('foo@bar.com');
359
  $sendgrid->send($email);
360
  ```
362
  #### setCc
363
 
364
  ```php
365
+ $email = new SendGrid\Email();
366
  $email->setCc('foo@bar.com');
367
  $sendgrid->send($email);
368
  ```
370
  #### setCcs
371
 
372
  ```php
373
+ $email = new SendGrid\Email();
374
  $emails = array("foo@bar.com", "another@another.com", "other@other.com");
375
  $email->setCcs($emails);
376
  $sendgrid->send($email);
384
 
385
  ### Bcc
386
 
387
+ Use multiple `addSmtpapiTo`s as a superior alternative to `setBcc`.
388
 
389
  ```php
390
  $email = new SendGrid\Email();
391
+ $email
392
+ ->addSmtpapiTo('foo@bar.com')
393
+ ->addSmtpapiTo('someotheraddress@bar.com')
394
+ ->addSmtpapiTo('another@another.com')
395
+ ...
396
+ ;
397
  ```
398
 
399
  But if you do still have a need for Bcc you can do the following:
401
  #### addBcc
402
 
403
  ```php
404
+ $email = new SendGrid\Email();
405
+ $email->addTo('bar@example.com');
406
  $email->addBcc('foo@bar.com');
407
  $sendgrid->send($email);
408
  ```
410
  #### setBcc
411
 
412
  ```php
413
+ $email = new SendGrid\Email();
414
  $email->setBcc('foo@bar.com');
415
  $sendgrid->send($email);
416
  ```
418
  #### setBccs
419
 
420
  ```php
421
+ $email = new SendGrid\Email();
422
  $emails = array("foo@bar.com", "another@another.com", "other@other.com");
423
  $email->setBccs($emails);
424
  $sendgrid->send($email);
430
  $email->removeBcc('foo@bar.com');
431
  ```
432
 
433
+ **Important Gotcha**: Using multiple `addSmtpapiTo`s is recommended over bcc whenever possible. Each user will receive their own personalized email with that setup, and only see their own email.
434
+
435
+ Standard `setBcc` will hide who the email is addressed to. If you use multiple `addSmtpapiTo`'s, each user will receive a personalized email showing *only* their email. This is more friendly and more personal.
436
+
437
  #### setSubject
438
 
439
  ```php
440
+ $email = new SendGrid\Email();
441
  $email->setSubject('This is a subject');
442
  $sendgrid->send($email);
443
  ```
445
  #### setText
446
 
447
  ```php
448
+ $email = new SendGrid\Email();
449
  $email->setText('This is some text');
450
  $sendgrid->send($email);
451
  ```
453
  #### setHtml
454
 
455
  ```php
456
+ $email = new SendGrid\Email();
457
  $email->setHtml('<h1>This is an html email</h1>');
458
  $sendgrid->send($email);
459
  ```
461
  #### setDate
462
 
463
  ```php
464
+ $email = new SendGrid\Email();
465
  $email->setDate('Wed, 17 Dec 2014 19:21:16 +0000');
466
  $sendgrid->send($email);
467
  ```
469
  #### setSendAt
470
 
471
  ```php
472
+ $email = new SendGrid\Email();
473
  $email->setSendAt(1409348513);
474
  $sendgrid->send($email);
475
  ```
477
  #### setSendEachAt
478
 
479
  ```php
480
+ $email = new SendGrid\Email();
481
  $email->setSendEachAt(array(1409348513, 1409348514, 1409348515));
482
  $sendgrid->send($email);
483
  ```
485
  #### addSendEachAt
486
 
487
  ```php
488
+ $email = new SendGrid\Email();
489
+ $email
490
+ ->addSendEachAt(1409348513)
491
+ ->addSendEachAt(1409348514)
492
+ ->addSendEachAt(1409348515)
493
+ ;
494
  $sendgrid->send($email);
495
  ```
496
 
504
 
505
  ```php
506
  $email = new SendGrid\Email();
507
+ $email
508
+ ->addTo('foo@bar.com')
509
+ ...
510
+ ->addCategory("Category 1")
511
+ ->addCategory("Category 2")
512
+ ;
513
  ```
514
 
515
  #### setCategory
516
 
517
  ```php
518
  $email = new SendGrid\Email();
519
+ $email
520
+ ->addTo('foo@bar.com')
521
+ ...
522
+ ->setCategory("Category 1")
523
+ ;
524
  ```
525
 
526
  #### setCategories
535
 
536
  ```php
537
  $email = new SendGrid\Email();
538
+ $email
539
+ ->addTo('foo@bar.com')
540
+ ...
541
+ ->removeCategory("Category 1")
542
+ ;
543
  ```
544
 
545
  ### Attachments ###
552
 
553
  ```php
554
  $email = new SendGrid\Email();
555
+ $email
556
+ ->addTo('foo@bar.com')
557
+ ...
558
+ ->addAttachment("../path/to/file.txt")
559
+ ;
560
  ```
561
 
562
  #### setAttachment
563
 
564
  ```php
565
  $email = new SendGrid\Email();
566
+ $email
567
+ ->addTo('foo@bar.com')
568
+ ...
569
+ ->setAttachment("../path/to/file.txt")
570
+ ;
571
  ```
572
 
573
  #### setAttachments
575
  ```php
576
  $email = new SendGrid\Email();
577
  $attachments = array("../path/to/file1.txt", "../path/to/file2.txt");
578
+ $email
579
+ ->addTo('foo@bar.com')
580
+ ...
581
+ ->setAttachments($attachments)
582
+ ;
583
  ```
584
 
585
  #### removeAttachment
586
 
587
  ```php
588
  $email = new SendGrid\Email();
589
+ $email
590
+ ->addTo('foo@bar.com')
591
+ ...
592
+ ->addAttachment("../path/to/file.txt")
593
+ ->removeAttachment("../path/to/file.txt")
594
+ ;
595
  ```
596
 
597
  You can tag files for use as inline HTML content. It will mark the file for inline disposition using the specified "cid".
598
 
599
  ```php
600
  $email = new SendGrid\Email();
601
+ $email
602
+ ->addTo('foo@bar.com')
603
+ ->setHtml('<div>Our logo:<img src="cid:file-cid"></div>')
604
+ ->addAttachment("../path/to/file.txt", "super_file.txt", "file-cid")
605
+ ;
606
  ```
607
 
 
 
 
 
 
 
 
608
  ### Substitutions ###
609
 
610
+ Substitutions can be used to customize multi-recipient emails, and tailor them for the user.
611
+
612
+ Unless you are only sending to one recipient, please make sure to use `addSmtpapiTo()`.
613
 
614
  #### addSubstitution
615
 
616
  ```php
617
  $email = new SendGrid\Email();
618
+ $email
619
+ ->addSmtpapiTo('john@somewhere.com')
620
+ ->addSmtpapiTo('harry@somewhere.com')
621
+ ->addSmtpapiTo('Bob@somewhere.com')
622
  ...
623
+ ->setHtml("Hey %name%, we've seen that you've been gone for a while")
624
+ ->addSubstitution('%name%', array('John', 'Harry', 'Bob'))
625
+ ;
626
  ```
627
 
628
  Substitutions can also be used to customize multi-recipient subjects.
629
 
630
  ```php
631
  $email = new SendGrid\Email();
632
+ $email
633
+ ->addSmtpapiTo(array('john@somewhere.com', 'harry@somewhere.com', 'bob@somewhere.com'))
634
  ->setSubject('%subject%')
635
+ ->addSubstitution(
636
+ '%subject%',
637
+ array('Subject to John', 'Subject to Harry', 'Subject to Bob')
638
+ )
639
+ ...
640
+ ;
641
  ```
642
 
643
  #### setSubstitutions
644
 
645
  ```php
646
  $email = new SendGrid\Email();
647
+ $email
648
+ ->addSmtpapiTo(array('john@somewhere.com', 'harry@somewhere.com', 'bob@somewhere.com'))
649
  ->setSubject('%subject%')
650
+ ->setSubstitutions(array(
651
+ '%name%' => array('John', 'Harry', 'Bob'),
652
+ '%subject%' => array('Subject to John', 'Subject to Harry', 'Subject to Bob')
653
+ ))
654
+ ...
655
+ ;
656
  ```
657
 
658
  ### Sections ###
663
 
664
  ```php
665
  $email = new SendGrid\Email();
666
+ $email
667
+ ->addSmtpapiTo('john@somewhere.com')
668
+ ->addSmtpapiTo("harry@somewhere.com")
669
+ ->addSmtpapiTo("Bob@somewhere.com")
670
+ ...
671
+ ->setHtml("Hey %name%, you work at %place%")
672
+ ->addSubstitution("%name%", array("John", "Harry", "Bob"))
673
+ ->addSubstitution("%place%", array("%office%", "%office%", "%home%"))
674
+ ->addSection("%office%", "an office")
675
+ ->addSection("%home%", "your house")
676
+ ;
677
  ```
678
 
679
  #### setSections
680
 
681
  ```php
682
  $email = new SendGrid\Email();
683
+ $email
684
+ ->addSmtpapiTo('john@somewhere.com')
685
+ ->addSmtpapiTo("harry@somewhere.com")
686
+ ->addSmtpapiTo("Bob@somewhere.com")
687
+ ...
688
+ ->setHtml("Hey %name%, you work at %place%")
689
+ ->addSubstitution("%name%", array("John", "Harry", "Bob"))
690
+ ->addSubstitution("%place%", array("%office%", "%office%", "%home%"))
691
+ ->setSections(array("%office%" => "an office", "%home%" => "your house"))
692
+ ;
693
  ```
694
 
695
  ### Unique Arguments ###
700
 
701
  ```php
702
  $email = new SendGrid\Email();
703
+ $email
704
+ ->addTo('foo@bar.com')
705
+ ...
706
+ ->addUniqueArg("Customer", "Someone")
707
+ ->addUniqueArg("location", "Somewhere")
708
+ ;
709
  ```
710
 
711
  #### setUniqueArgs / setUniqueArguments
712
 
713
  ```php
714
  $email = new SendGrid\Email();
715
+ $email
716
+ ->addTo('foo@bar.com')
717
+ ...
718
+ ->setUniqueArgs(array('cow' => 'chicken'))
719
+ ;
720
  ```
721
 
722
  ### Filter Settings ###
727
 
728
  ```php
729
  $email = new SendGrid\Email();
730
+ $email
731
+ ->addTo('foo@bar.com')
732
+ ...
733
+ addFilter("gravatar", "enable", 1)
734
+ ->addFilter("footer", "enable", 1)
735
+ ->addFilter("footer", "text/plain", "Here is a plain text footer")
736
+ ->addFilter(
737
+ "footer",
738
+ "text/html",
739
+ "<p style='color:red;'>Here is an HTML footer</p>"
740
+ )
741
+ ;
742
  ```
743
 
744
  #### setFilters / setFilterSettings
745
 
746
  ```php
747
  $email = new SendGrid\Email();
748
+ $email
749
+ ->addTo('foo@bar.com')
750
+ ...
751
+ setFilters(array("gravatar" => array("settings" => array("enable" => 1))))
752
+ ;
753
  ```
754
 
755
+ ### Templates ###
756
 
757
+ You can easily use SendGrid's [template engine](https://sendgrid.com/docs/User_Guide/Apps/template_engine.html) by applying filters.
758
 
759
+ #### setTemplateId
760
 
761
  ```php
762
  $email = new SendGrid\Email();
763
+ $email
764
+ ->addTo('someone@example.com')
765
+ ->setFrom('support@example.com')
766
+ ->setFromName('Support')
767
+ ->setSubject('Subject goes here')
768
+ // set html or text to an empty space (see http://git.io/hCNy)
769
+ ->setHtml(' ') // <-- triggers the html version of the template
770
+ // AND / OR
771
+ ->setText(' ') // <-- triggers the plaintext version of the template
772
+ ->setTemplateId($templateId);
773
  ```
774
 
775
+ This is simply a convenience method for:
776
 
777
  ```php
778
  $email = new SendGrid\Email();
779
+ $email
780
+ ->addFilter('templates', 'enabled', 1)
781
+ ->addFilter('templates', 'template_id', $templateId)
782
+ ;
783
  ```
784
 
785
+ ### Advanced Suppression Manager ###
786
+
787
+ [ASM](https://sendgrid.com/docs/User_Guide/advanced_suppression_manager.html) is used to handle suppression groups.
788
+
789
+ #### setAsmGroupId ####
790
 
791
  ```php
792
  $email = new SendGrid\Email();
793
+ $email->setAsmGroupId('my_group_id');
 
 
 
 
794
  ```
795
 
796
+ ### Headers ###
 
797
 
798
+ You can add standard email message headers as necessary.
 
 
 
 
 
 
 
 
 
 
799
 
800
+ #### addHeader
 
801
 
802
  ```php
803
+ $email = new SendGrid\Email();
804
+ $email
805
+ ->addTo('foo@bar.com')
806
+ ...
807
+ ->addHeader('X-Sent-Using', 'SendGrid-API')
808
+ ->addHeader('X-Transport', 'web')
809
+ ;
810
  ```
811
 
812
+ #### setHeaders
813
 
814
  ```php
815
+ $email = new SendGrid\Email();
816
+ $email
817
+ ->addTo('foo@bar.com')
818
+ ...
819
+ ->setHeaders(array('X-Sent-Using' => 'SendGrid-API', 'X-Transport' => 'web'))
820
+ ;
821
  ```
822
 
823
+ #### removeHeader
 
 
824
 
825
  ```php
826
+ $email = new SendGrid\Email();
827
+ $email
828
+ ->addTo('foo@bar.com')
829
+ ...
830
+ ->addHeader('X-Sent-Using', 'SendGrid-API')
831
+ ->addHeader('X-Transport', 'web')
832
+ ;
833
+ $email->removeHeader('X-Transport');
834
  ```
835
 
 
836
  ### Sending to 1,000s of emails in one batch
837
 
838
  Sometimes you might want to send 1,000s of emails in one request. You can do that. It is recommended you break each batch up in 1,000 increments. So if you need to send to 5,000 emails, then you'd break this into a loop of 1,000 emails at a time.
839
 
840
  ```php
841
+ $sendgrid = new SendGrid(SENDGRID_USERNAME, SENDGRID_PASSWORD);
842
+ $email = new SendGrid\Email();
843
 
844
+ $recipients = array(
845
+ "alpha@mailinator.com",
846
+ "beta@mailinator.com",
847
+ "zeta@mailinator.com"
848
+ );
849
+ $names = array("Alpha", "Beta", "Zeta");
850
 
851
+ $email
852
+ ->setFrom("from@mailinator.com")
853
+ ->setSubject('[sendgrid-php-batch-email]')
854
+ ->setSmtpapiTos($recipients)
855
+ ->addSubstitution("%name%", $names)
856
+ ->setText("Hey %name%, we have an email for you")
857
+ ->setHtml("<h1>Hey %name%, we have an email for you</h1>")
858
+ ;
859
 
860
  $result = $sendgrid->send($email);
861
  ```
862
 
 
863
  ## Contributing
864
 
865
  1. Fork it
900
  export S3_ACCESS_KEY="secret_access_key"
901
  ./scripts/s3upload.sh
902
  ```
 
 
 
 
vendor/sendgrid-php/composer.lock CHANGED
@@ -4,20 +4,115 @@
4
  "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
  "This file is @generated automatically"
6
  ],
7
- "hash": "3a90e3b3629e5b3255180ad7f34e52c9",
8
  "packages": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  {
10
  "name": "sendgrid/smtpapi",
11
- "version": "0.1.0",
12
  "source": {
13
  "type": "git",
14
  "url": "https://github.com/sendgrid/smtpapi-php.git",
15
- "reference": "7d964a32e07732bb2d6d4098c502c712befcd8b5"
16
  },
17
  "dist": {
18
  "type": "zip",
19
- "url": "https://api.github.com/repos/sendgrid/smtpapi-php/zipball/7d964a32e07732bb2d6d4098c502c712befcd8b5",
20
- "reference": "7d964a32e07732bb2d6d4098c502c712befcd8b5",
21
  "shasum": ""
22
  },
23
  "require": {
@@ -52,7 +147,66 @@
52
  "smtpapi",
53
  "xsmtp"
54
  ],
55
- "time": "2014-12-17 20:38:56"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  }
57
  ],
58
  "packages-dev": null,
@@ -60,6 +214,7 @@
60
  "minimum-stability": "stable",
61
  "stability-flags": [],
62
  "prefer-stable": false,
 
63
  "platform": {
64
  "php": ">=5.3"
65
  },
4
  "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
  "This file is @generated automatically"
6
  ],
7
+ "hash": "f7fedb7a545e4e6692a28421a438785b",
8
  "packages": [
9
+ {
10
+ "name": "guzzle/guzzle",
11
+ "version": "v3.9.3",
12
+ "source": {
13
+ "type": "git",
14
+ "url": "https://github.com/guzzle/guzzle3.git",
15
+ "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9"
16
+ },
17
+ "dist": {
18
+ "type": "zip",
19
+ "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9",
20
+ "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9",
21
+ "shasum": ""
22
+ },
23
+ "require": {
24
+ "ext-curl": "*",
25
+ "php": ">=5.3.3",
26
+ "symfony/event-dispatcher": "~2.1"
27
+ },
28
+ "replace": {
29
+ "guzzle/batch": "self.version",
30
+ "guzzle/cache": "self.version",
31
+ "guzzle/common": "self.version",
32
+ "guzzle/http": "self.version",
33
+ "guzzle/inflection": "self.version",
34
+ "guzzle/iterator": "self.version",
35
+ "guzzle/log": "self.version",
36
+ "guzzle/parser": "self.version",
37
+ "guzzle/plugin": "self.version",
38
+ "guzzle/plugin-async": "self.version",
39
+ "guzzle/plugin-backoff": "self.version",
40
+ "guzzle/plugin-cache": "self.version",
41
+ "guzzle/plugin-cookie": "self.version",
42
+ "guzzle/plugin-curlauth": "self.version",
43
+ "guzzle/plugin-error-response": "self.version",
44
+ "guzzle/plugin-history": "self.version",
45
+ "guzzle/plugin-log": "self.version",
46
+ "guzzle/plugin-md5": "self.version",
47
+ "guzzle/plugin-mock": "self.version",
48
+ "guzzle/plugin-oauth": "self.version",
49
+ "guzzle/service": "self.version",
50
+ "guzzle/stream": "self.version"
51
+ },
52
+ "require-dev": {
53
+ "doctrine/cache": "~1.3",
54
+ "monolog/monolog": "~1.0",
55
+ "phpunit/phpunit": "3.7.*",
56
+ "psr/log": "~1.0",
57
+ "symfony/class-loader": "~2.1",
58
+ "zendframework/zend-cache": "2.*,<2.3",
59
+ "zendframework/zend-log": "2.*,<2.3"
60
+ },
61
+ "suggest": {
62
+ "guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated."
63
+ },
64
+ "type": "library",
65
+ "extra": {
66
+ "branch-alias": {
67
+ "dev-master": "3.9-dev"
68
+ }
69
+ },
70
+ "autoload": {
71
+ "psr-0": {
72
+ "Guzzle": "src/",
73
+ "Guzzle\\Tests": "tests/"
74
+ }
75
+ },
76
+ "notification-url": "https://packagist.org/downloads/",
77
+ "license": [
78
+ "MIT"
79
+ ],
80
+ "authors": [
81
+ {
82
+ "name": "Michael Dowling",
83
+ "email": "mtdowling@gmail.com",
84
+ "homepage": "https://github.com/mtdowling"
85
+ },
86
+ {
87
+ "name": "Guzzle Community",
88
+ "homepage": "https://github.com/guzzle/guzzle/contributors"
89
+ }
90
+ ],
91
+ "description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle",
92
+ "homepage": "http://guzzlephp.org/",
93
+ "keywords": [
94
+ "client",
95
+ "curl",
96
+ "framework",
97
+ "http",
98
+ "http client",
99
+ "rest",
100
+ "web service"
101
+ ],
102
+ "time": "2015-03-18 18:23:50"
103
+ },
104
  {
105
  "name": "sendgrid/smtpapi",
106
+ "version": "0.5.0",
107
  "source": {
108
  "type": "git",
109
  "url": "https://github.com/sendgrid/smtpapi-php.git",
110
+ "reference": "05ccf57bad5d1524e479b6dc0a2dfade88b3fbe5"
111
  },
112
  "dist": {
113
  "type": "zip",
114
+ "url": "https://api.github.com/repos/sendgrid/smtpapi-php/zipball/05ccf57bad5d1524e479b6dc0a2dfade88b3fbe5",
115
+ "reference": "05ccf57bad5d1524e479b6dc0a2dfade88b3fbe5",
116
  "shasum": ""
117
  },
118
  "require": {
147
  "smtpapi",
148
  "xsmtp"
149
  ],
150
+ "time": "2015-04-14 02:37:45"
151
+ },
152
+ {
153
+ "name": "symfony/event-dispatcher",
154
+ "version": "v2.6.6",
155
+ "target-dir": "Symfony/Component/EventDispatcher",
156
+ "source": {
157
+ "type": "git",
158
+ "url": "https://github.com/symfony/EventDispatcher.git",
159
+ "reference": "70f7c8478739ad21e3deef0d977b38c77f1fb284"
160
+ },
161
+ "dist": {
162
+ "type": "zip",
163
+ "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/70f7c8478739ad21e3deef0d977b38c77f1fb284",
164
+ "reference": "70f7c8478739ad21e3deef0d977b38c77f1fb284",
165
+ "shasum": ""
166
+ },
167
+ "require": {
168
+ "php": ">=5.3.3"
169
+ },
170
+ "require-dev": {
171
+ "psr/log": "~1.0",
172
+ "symfony/config": "~2.0,>=2.0.5",
173
+ "symfony/dependency-injection": "~2.6",
174
+ "symfony/expression-language": "~2.6",
175
+ "symfony/phpunit-bridge": "~2.7",
176
+ "symfony/stopwatch": "~2.3"
177
+ },
178
+ "suggest": {
179
+ "symfony/dependency-injection": "",
180
+ "symfony/http-kernel": ""
181
+ },
182
+ "type": "library",
183
+ "extra": {
184
+ "branch-alias": {
185
+ "dev-master": "2.6-dev"
186
+ }
187
+ },
188
+ "autoload": {
189
+ "psr-0": {
190
+ "Symfony\\Component\\EventDispatcher\\": ""
191
+ }
192
+ },
193
+ "notification-url": "https://packagist.org/downloads/",
194
+ "license": [
195
+ "MIT"
196
+ ],
197
+ "authors": [
198
+ {
199
+ "name": "Symfony Community",
200
+ "homepage": "http://symfony.com/contributors"
201
+ },
202
+ {
203
+ "name": "Fabien Potencier",
204
+ "email": "fabien@symfony.com"
205
+ }
206
+ ],
207
+ "description": "Symfony EventDispatcher Component",
208
+ "homepage": "http://symfony.com",
209
+ "time": "2015-03-13 17:37:22"
210
  }
211
  ],
212
  "packages-dev": null,
214
  "minimum-stability": "stable",
215
  "stability-flags": [],
216
  "prefer-stable": false,
217
+ "prefer-lowest": false,
218
  "platform": {
219
  "php": ">=5.3"
220
  },
vendor/sendgrid-php/lib/SendGrid.php CHANGED
@@ -1,82 +1,105 @@
1
- <?php
2
-
3
- class SendGrid {
4
- const VERSION = '2.2.0';
5
-
6
- protected $namespace = 'SendGrid',
7
- $headers = array('Content-Type' => 'application/json'),
8
- $options,
9
- $web;
10
- public $api_user,
11
- $api_key,
12
- $url,
13
- $version = self::VERSION;
14
-
15
-
16
- public function __construct($api_user, $api_key, $options=array()) {
17
- $this->api_user = $api_user;
18
- $this->api_key = $api_key;
19
-
20
- $options['turn_off_ssl_verification'] = (isset($options['turn_off_ssl_verification']) && $options['turn_off_ssl_verification'] === true);
21
- $protocol = isset($options['protocol']) ? $options['protocol'] : 'https';
22
- $host = isset($options['host']) ? $options['host'] : 'api.sendgrid.com';
23
- $port = isset($options['port']) ? $options['port'] : '';
24
- $endpoint = isset($options['endpoint']) ? $options['endpoint'] : '/api/mail.send.json';
25
-
26
- $this->url = isset($options['url']) ? $options['url'] : $protocol . '://' . $host . ($port ? ':' . $port : '') . $endpoint;
27
-
28
- $this->options = $options;
29
- }
30
-
31
- public function send(SendGrid\Email $email) {
32
- $form = $email->toWebFormat();
33
- $form['api_user'] = $this->api_user;
34
- $form['api_key'] = $this->api_key;
35
-
36
- $response = $this->makeRequest($form);
37
-
38
- return $response;
39
- }
40
-
41
- /**
42
- * Makes the actual HTTP request to SendGrid
43
- * @param $form array web ready version of SendGrid\Email
44
- * @return stdClass parsed JSON returned from SendGrid
45
- */
46
- private function makeRequest($form) {
47
- $ch = curl_init();
48
-
49
- curl_setopt($ch, CURLOPT_URL, $this->url);
50
- curl_setopt($ch, CURLOPT_POST, 1);
51
- curl_setopt($ch, CURLOPT_POSTFIELDS, $form);
52
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
53
- curl_setopt($ch, CURLOPT_USERAGENT, 'sendgrid/' . $this->version . ';php');
54
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->options['turn_off_ssl_verification']);
55
-
56
- $response = curl_exec($ch);
57
-
58
- $error = curl_error($ch);
59
- if ($error) {
60
- throw new Exception($error);
61
- }
62
-
63
- curl_close($ch);
64
-
65
- return json_decode($response);
66
- }
67
-
68
- public static function register_autoloader() {
69
- spl_autoload_register(array('SendGrid', 'autoloader'));
70
- }
71
-
72
- public static function autoloader($class) {
73
- // Check that the class starts with 'SendGrid'
74
- if ($class == 'SendGrid' || stripos($class, 'SendGrid\\') === 0) {
75
- $file = str_replace('\\', '/', $class);
76
-
77
- if (file_exists(dirname(__FILE__) . '/' . $file . '.php')) {
78
- require_once(dirname(__FILE__) . '/' . $file . '.php');
79
- }
80
- }
81
- }
82
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SendGrid
4
+ {
5
+ const VERSION = '3.0.0';
6
+
7
+ protected
8
+ $namespace = 'SendGrid',
9
+ $headers = array('Content-Type' => 'application/json'),
10
+ $client,
11
+ $options;
12
+
13
+ public
14
+ $apiUser,
15
+ $apiKey,
16
+ $url,
17
+ $endpoint,
18
+ $version = self::VERSION;
19
+
20
+ public function __construct($apiUser, $apiKey, $options = array())
21
+ {
22
+ $this->apiUser = $apiUser;
23
+ $this->apiKey = $apiKey;
24
+
25
+ $options['turn_off_ssl_verification'] = (isset($options['turn_off_ssl_verification']) && $options['turn_off_ssl_verification'] == true);
26
+ $protocol = isset($options['protocol']) ? $options['protocol'] : 'https';
27
+ $host = isset($options['host']) ? $options['host'] : 'api.sendgrid.com';
28
+ $port = isset($options['port']) ? $options['port'] : '';
29
+ $this->options = $options;
30
+
31
+ $this->url = isset($options['url']) ? $options['url'] : $protocol . '://' . $host . ($port ? ':' . $port : '');
32
+ $this->endpoint = isset($options['endpoint']) ? $options['endpoint'] : '/api/mail.send.json';
33
+
34
+ $this->client = new \Guzzle\Http\Client($this->url, array(
35
+ 'request.options' => array(
36
+ 'verify' => !$this->options['turn_off_ssl_verification'],
37
+ 'exceptions' => false // FIXME: This might not be wise but we don't want guzzle throwing
38
+ )
39
+ ));
40
+ $this->client->setUserAgent('sendgrid/' . $this->version . ';php');
41
+ }
42
+
43
+ /**
44
+ * @return array The protected options array
45
+ */
46
+ public function getOptions()
47
+ {
48
+ return $this->options;
49
+ }
50
+
51
+ /**
52
+ * Makes a post request to SendGrid to send an email
53
+ * @param SendGrid\Email $email Email object built
54
+ * @throws SendGrid\Exception if the response code is not 200
55
+ * @return stdClass SendGrid response object
56
+ */
57
+ public function send(SendGrid\Email $email)
58
+ {
59
+ $form = $email->toWebFormat();
60
+ $form['api_user'] = $this->apiUser;
61
+ $form['api_key'] = $this->apiKey;
62
+
63
+ $response = $this->postRequest($this->endpoint, $form);
64
+
65
+ if ($response->code != 200) {
66
+ throw new SendGrid\Exception($response->raw_body, $response->code);
67
+ }
68
+
69
+ return $response;
70
+ }
71
+
72
+ /**
73
+ * Makes the actual HTTP request to SendGrid
74
+ * @param $endpoint string endpoint to post to
75
+ * @param $form array web ready version of SendGrid\Email
76
+ * @return SendGrid\Response
77
+ */
78
+ public function postRequest($endpoint, $form)
79
+ {
80
+ $req = $this->client->post($endpoint, null, $form);
81
+
82
+ $res = $req->send();
83
+
84
+ $response = new SendGrid\Response($res->getStatusCode(), $res->getHeaders(), $res->getBody(true), $res->json());
85
+
86
+ return $response;
87
+ }
88
+
89
+ public static function register_autoloader()
90
+ {
91
+ spl_autoload_register(array('SendGrid', 'autoloader'));
92
+ }
93
+
94
+ public static function autoloader($class)
95
+ {
96
+ // Check that the class starts with 'SendGrid'
97
+ if ($class == 'SendGrid' || stripos($class, 'SendGrid\\') === 0) {
98
+ $file = str_replace('\\', '/', $class);
99
+
100
+ if (file_exists(dirname(__FILE__) . '/' . $file . '.php')) {
101
+ require_once(dirname(__FILE__) . '/' . $file . '.php');
102
+ }
103
+ }
104
+ }
105
+ }
vendor/sendgrid-php/lib/SendGrid/Email.php CHANGED
@@ -1,411 +1,622 @@
1
- <?php
2
-
3
- namespace SendGrid;
4
-
5
- class Email {
6
-
7
- public $to,
8
- $from,
9
- $from_name,
10
- $reply_to,
11
- $cc_list,
12
- $bcc_list,
13
- $subject,
14
- $text,
15
- $html,
16
- $date,
17
- $content,
18
- $headers,
19
- $smtpapi,
20
- $attachments;
21
-
22
- public function __construct() {
23
- $this->from_name = false;
24
- $this->reply_to = false;
25
- $this->smtpapi = new \Smtpapi\Header();
26
- }
27
-
28
- /**
29
- * _removeFromList
30
- * Given a list of key/value pairs, removes the associated keys
31
- * where a value matches the given string ($item)
32
- * @param Array $list - the list of key/value pairs
33
- * @param String $item - the value to be removed
34
- */
35
- private function _removeFromList(&$list, $item, $key_field = null) {
36
- foreach ($list as $key => $val) {
37
- if($key_field) {
38
- if($val[$key_field] == $item) {
39
- unset($list[$key]);
40
- }
41
- } else {
42
- if ($val == $item) {
43
- unset($list[$key]);
44
- }
45
- }
46
- }
47
- //repack the indices
48
- $list = array_values($list);
49
- }
50
-
51
- public function addTo($email, $name=null) {
52
- $this->smtpapi->addTo($email, $name);
53
- return $this;
54
- }
55
-
56
- public function setTos(array $emails) {
57
- $this->smtpapi->setTos($emails);
58
- return $this;
59
- }
60
-
61
- public function setFrom($email) {
62
- $this->from = $email;
63
- return $this;
64
- }
65
-
66
- public function getFrom($as_array = false) {
67
- if($as_array && ($name = $this->getFromName())) {
68
- return array("$this->from" => $name);
69
- } else {
70
- return $this->from;
71
- }
72
- }
73
-
74
- public function setFromName($name) {
75
- $this->from_name = $name;
76
- return $this;
77
- }
78
-
79
- public function getFromName() {
80
- return $this->from_name;
81
- }
82
-
83
- public function setReplyTo($email) {
84
- $this->reply_to = $email;
85
- return $this;
86
- }
87
-
88
- public function getReplyTo() {
89
- return $this->reply_to;
90
- }
91
-
92
- public function setCc($email) {
93
- $this->cc_list = array($email);
94
- return $this;
95
- }
96
-
97
- public function setCcs(array $email_list) {
98
- $this->cc_list = $email_list;
99
- return $this;
100
- }
101
-
102
- public function addCc($email) {
103
- $this->cc_list[] = $email;
104
- return $this;
105
- }
106
-
107
- public function removeCc($email) {
108
- $this->_removeFromList($this->cc_list, $email);
109
-
110
- return $this;
111
- }
112
-
113
- public function getCcs() {
114
- return $this->cc_list;
115
- }
116
-
117
- public function setBcc($email) {
118
- $this->bcc_list = array($email);
119
- return $this;
120
- }
121
-
122
- public function setBccs($email_list) {
123
- $this->bcc_list = $email_list;
124
- return $this;
125
- }
126
-
127
- public function addBcc($email) {
128
- $this->bcc_list[] = $email;
129
- return $this;
130
- }
131
-
132
- public function removeBcc($email) {
133
- $this->_removeFromList($this->bcc_list, $email);
134
- return $this;
135
- }
136
-
137
- public function getBccs() {
138
- return $this->bcc_list;
139
- }
140
-
141
- public function setSubject($subject) {
142
- $this->subject = $subject;
143
- return $this;
144
- }
145
-
146
- public function getSubject() {
147
- return $this->subject;
148
- }
149
-
150
- public function setDate($date) {
151
- $this->date = $date;
152
- return $this;
153
- }
154
-
155
- public function getDate() {
156
- return $this->date;
157
- }
158
-
159
- public function setText($text) {
160
- $this->text = $text;
161
- return $this;
162
- }
163
-
164
- public function getText() {
165
- return $this->text;
166
- }
167
-
168
- public function setHtml($html) {
169
- $this->html = $html;
170
- return $this;
171
- }
172
-
173
- public function getHtml() {
174
- return $this->html;
175
- }
176
-
177
- public function setSendAt($timestamp) {
178
- $this->smtpapi->setSendAt($timestamp);
179
- return $this;
180
- }
181
-
182
- public function setSendEachAt(array $timestamps) {
183
- $this->smtpapi->setSendEachAt($timestamps);
184
- return $this;
185
- }
186
-
187
- public function addSendEachAt($timestamp) {
188
- $this->smtpapi->addSendEachAt($timestamp);
189
- return $this;
190
- }
191
-
192
- public function setAttachments(array $files) {
193
- $this->attachments = array();
194
-
195
- foreach($files as $filename => $file) {
196
- if (is_string($filename)) {
197
- $this->addAttachment($file, $filename);
198
- } else {
199
- $this->addAttachment($file);
200
- }
201
- }
202
-
203
- return $this;
204
- }
205
-
206
- public function setAttachment($file, $custom_filename=null, $cid=null) {
207
- $this->attachments = array($this->_getAttachmentInfo($file, $custom_filename, $cid));
208
- return $this;
209
- }
210
-
211
- public function addAttachment($file, $custom_filename=null, $cid=null) {
212
- $this->attachments[] = $this->_getAttachmentInfo($file, $custom_filename, $cid);
213
- return $this;
214
- }
215
-
216
- public function getAttachments() {
217
- return $this->attachments;
218
- }
219
-
220
- public function removeAttachment($file) {
221
- $this->_removeFromList($this->attachments, $file, "file");
222
- return $this;
223
- }
224
-
225
- private function _getAttachmentInfo($file, $custom_filename=null, $cid=null) {
226
- $info = pathinfo($file);
227
- $info['file'] = $file;
228
- if (!is_null($custom_filename)) {
229
- $info['custom_filename'] = $custom_filename;
230
- }
231
- if ($cid !== null) {
232
- $info['cid'] = $cid;
233
- }
234
-
235
- return $info;
236
- }
237
-
238
- public function setCategories($categories) {
239
- $this->smtpapi->setCategories($categories);
240
- return $this;
241
- }
242
-
243
- public function setCategory($category) {
244
- $this->smtpapi->setCategory($category);
245
- return $this;
246
- }
247
-
248
- public function addCategory($category) {
249
- $this->smtpapi->addCategory($category);
250
- return $this;
251
- }
252
-
253
- public function removeCategory($category) {
254
- $this->smtpapi->removeCategory($category);
255
- return $this;
256
- }
257
-
258
- public function setSubstitutions($key_value_pairs) {
259
- $this->smtpapi->setSubstitutions($key_value_pairs);
260
- return $this;
261
- }
262
-
263
- public function addSubstitution($from_value, array $to_values) {
264
- $this->smtpapi->addSubstitution($from_value, $to_values);
265
- return $this;
266
- }
267
-
268
- public function setSections(array $key_value_pairs) {
269
- $this->smtpapi->setSections($key_value_pairs);
270
- return $this;
271
- }
272
-
273
- public function addSection($from_value, $to_value) {
274
- $this->smtpapi->addSection($from_value, $to_value);
275
- return $this;
276
- }
277
-
278
- public function setUniqueArgs(array $key_value_pairs) {
279
- $this->smtpapi->setUniqueArgs($key_value_pairs);
280
- return $this;
281
- }
282
-
283
- ## synonym method
284
- public function setUniqueArguments(array $key_value_pairs) {
285
- $this->smtpapi->setUniqueArgs($key_value_pairs);
286
- return $this;
287
- }
288
-
289
- public function addUniqueArg($key, $value) {
290
- $this->smtpapi->addUniqueArg($key, $value);
291
- return $this;
292
- }
293
-
294
- ## synonym method
295
- public function addUniqueArgument($key, $value) {
296
- $this->smtpapi->addUniqueArg($key, $value);
297
- return $this;
298
- }
299
-
300
- public function setFilters($filter_settings) {
301
- $this->smtpapi->setFilters($filter_settings);
302
- return $this;
303
- }
304
-
305
- ## synonym method
306
- public function setFilterSettings($filter_settings) {
307
- $this->smtpapi->setFilters($filter_settings);
308
- return $this;
309
- }
310
-
311
- public function addFilter($filter_name, $parameter_name, $parameter_value) {
312
- $this->smtpapi->addFilter($filter_name, $parameter_name, $parameter_value);
313
- return $this;
314
- }
315
-
316
- ## synonym method
317
- public function addFilterSetting($filter_name, $parameter_name, $parameter_value) {
318
- $this->smtpapi->addFilter($filter_name, $parameter_name, $parameter_value);
319
- return $this;
320
- }
321
-
322
- public function getHeaders() {
323
- return $this->headers;
324
- }
325
-
326
- public function getHeadersJson() {
327
- if (count($this->getHeaders()) <= 0) {
328
- return "{}";
329
- }
330
- return json_encode($this->getHeaders(), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
331
- }
332
-
333
- public function setHeaders($key_value_pairs) {
334
- $this->headers = $key_value_pairs;
335
- return $this;
336
- }
337
-
338
- public function addHeader($key, $value) {
339
- $this->headers[$key] = $value;
340
- return $this;
341
- }
342
-
343
- public function removeHeader($key) {
344
- unset($this->headers[$key]);
345
- return $this;
346
- }
347
-
348
- public function toWebFormat() {
349
- $web = array(
350
- 'to' => $this->to,
351
- 'from' => $this->getFrom(),
352
- 'x-smtpapi' => $this->smtpapi->jsonString(),
353
- 'subject' => $this->getSubject(),
354
- 'text' => $this->getText(),
355
- 'html' => $this->getHtml(),
356
- 'headers' => $this->getHeadersJson(),
357
- );
358
-
359
- if ($this->getCcs()) { $web['cc'] = $this->getCcs(); }
360
- if ($this->getBccs()) { $web['bcc'] = $this->getBccs(); }
361
- if ($this->getFromName()) { $web['fromname'] = $this->getFromName(); }
362
- if ($this->getReplyTo()) { $web['replyto'] = $this->getReplyTo(); }
363
- if ($this->getDate()) { $web['date'] = $this->getDate(); }
364
- if ($this->smtpapi->to && (count($this->smtpapi->to) > 0)) { $web['to'] = ""; }
365
-
366
- $web = $this->updateMissingTo($web);
367
-
368
- if ($this->getAttachments()) {
369
- foreach($this->getAttachments() as $f) {
370
- $file = $f['file'];
371
- $extension = null;
372
- if (array_key_exists('extension', $f)) {
373
- $extension = $f['extension'];
374
- };
375
- $filename = $f['filename'];
376
- $full_filename = $filename;
377
-
378
- if (isset($extension)) {
379
- $full_filename = $filename.'.'.$extension;
380
- }
381
- if (array_key_exists('custom_filename', $f)) {
382
- $full_filename = $f['custom_filename'];
383
- }
384
-
385
- if (array_key_exists('cid', $f)) {
386
- $web['content['.$full_filename.']'] = $f['cid'];
387
- }
388
-
389
- $contents = '@' . $file;
390
- if (class_exists('CurlFile', false)) { // php >= 5.5
391
- $contents = new \CurlFile($file, $extension, $filename);
392
- }
393
-
394
- $web['files['.$full_filename.']'] = $contents;
395
- };
396
- }
397
-
398
- return $web;
399
- }
400
-
401
- /**
402
- * There needs to be at least 1 to address, or else the mail won't send.
403
- * This method modifies the data that will be sent via either Rest
404
- */
405
- public function updateMissingTo($data) {
406
- if ($this->smtpapi->to && (count($this->smtpapi->to) > 0)) {
407
- $data['to'] = $this->getFrom();
408
- }
409
- return $data;
410
- }
411
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace SendGrid;
4
+
5
+ class Email
6
+ {
7
+ public
8
+ $to,
9
+ $toName,
10
+ $from,
11
+ $fromName,
12
+ $replyTo,
13
+ $cc,
14
+ $ccName,
15
+ $bcc,
16
+ $bccName,
17
+ $subject,
18
+ $text,
19
+ $html,
20
+ $date,
21
+ $content,
22
+ $headers,
23
+ $smtpapi,
24
+ $attachments;
25
+
26
+ public function __construct()
27
+ {
28
+ $this->fromName = false;
29
+ $this->replyTo = false;
30
+ $this->smtpapi = new \Smtpapi\Header();
31
+ }
32
+
33
+ /**
34
+ * _removeFromList
35
+ * Given a list of key/value pairs, removes the associated keys
36
+ * where a value matches the given string ($item)
37
+ * @param Array $list - the list of key/value pairs
38
+ * @param String $item - the value to be removed
39
+ */
40
+ private function _removeFromList(&$list, $item, $key_field = null)
41
+ {
42
+ foreach ($list as $key => $val) {
43
+ if($key_field) {
44
+ if($val[$key_field] == $item) {
45
+ unset($list[$key]);
46
+ }
47
+ } else {
48
+ if ($val == $item) {
49
+ unset($list[$key]);
50
+ }
51
+ }
52
+ }
53
+ //repack the indices
54
+ $list = array_values($list);
55
+ }
56
+
57
+ public function addTo($email, $name = null)
58
+ {
59
+ if ($this->to == null) {
60
+ $this->to = array();
61
+ }
62
+
63
+ if (is_array($email)) {
64
+ foreach ($email as $e) {
65
+ $this->to[] = $e;
66
+ }
67
+ } else {
68
+ $this->to[] = $email;
69
+ }
70
+
71
+ if (is_array($name)) {
72
+ foreach ($name as $n) {
73
+ $this->addToName($n);
74
+ }
75
+ } elseif ($name) {
76
+ $this->addToName($name);
77
+ }
78
+
79
+ return $this;
80
+ }
81
+
82
+ public function addSmtpapiTo($email, $name = null)
83
+ {
84
+ $this->smtpapi->addTo($email, $name);
85
+ return $this;
86
+ }
87
+
88
+ public function setTos(array $emails)
89
+ {
90
+ $this->to = $emails;
91
+ return $this;
92
+ }
93
+
94
+ public function setSmtpapiTos(array $emails)
95
+ {
96
+ $this->smtpapi->setTos($emails);
97
+ return $this;
98
+ }
99
+
100
+ public function addToName($name)
101
+ {
102
+ if ($this->toName == null) {
103
+ $this->toName = array();
104
+ }
105
+
106
+ $this->toName[] = $name;
107
+ return $this;
108
+ }
109
+
110
+ public function getToNames()
111
+ {
112
+ return $this->toName;
113
+ }
114
+
115
+ public function setFrom($email)
116
+ {
117
+ $this->from = $email;
118
+ return $this;
119
+ }
120
+
121
+ public function getFrom($as_array = false)
122
+ {
123
+ if($as_array && ($name = $this->getFromName())) {
124
+ return array("$this->from" => $name);
125
+ } else {
126
+ return $this->from;
127
+ }
128
+ }
129
+
130
+ public function setFromName($name)
131
+ {
132
+ $this->fromName = $name;
133
+ return $this;
134
+ }
135
+
136
+ public function getFromName()
137
+ {
138
+ return $this->fromName;
139
+ }
140
+
141
+ public function setReplyTo($email)
142
+ {
143
+ $this->replyTo = $email;
144
+ return $this;
145
+ }
146
+
147
+ public function getReplyTo()
148
+ {
149
+ return $this->replyTo;
150
+ }
151
+
152
+ public function setCc($email)
153
+ {
154
+ $this->cc = array($email);
155
+ return $this;
156
+ }
157
+
158
+ public function setCcs(array $email_list)
159
+ {
160
+ $this->cc = $email_list;
161
+ return $this;
162
+ }
163
+
164
+ public function addCc($email, $name = null)
165
+ {
166
+ if ($this->cc == null) {
167
+ $this->cc = array();
168
+ }
169
+
170
+ if (is_array($email)) {
171
+ foreach ($email as $e) {
172
+ $this->cc[] = $e;
173
+ }
174
+ } else {
175
+ $this->cc[] = $email;
176
+ }
177
+
178
+ if (is_array($name)) {
179
+ foreach ($name as $n) {
180
+ $this->addCcName($n);
181
+ }
182
+ } elseif ($name) {
183
+ $this->addCcName($name);
184
+ }
185
+
186
+ return $this;
187
+ }
188
+
189
+ public function addCcName($name)
190
+ {
191
+ if ($this->ccName == null) {
192
+ $this->ccName = array();
193
+ }
194
+
195
+ $this->ccName[] = $name;
196
+ return $this;
197
+ }
198
+
199
+ public function removeCc($email)
200
+ {
201
+ $this->_removeFromList($this->cc, $email);
202
+
203
+ return $this;
204
+ }
205
+
206
+ public function getCcs()
207
+ {
208
+ return $this->cc;
209
+ }
210
+
211
+ public function getCcNames()
212
+ {
213
+ return $this->ccName;
214
+ }
215
+
216
+ public function setBcc($email)
217
+ {
218
+ $this->bcc = array($email);
219
+ return $this;
220
+ }
221
+
222
+ public function setBccs($email_list)
223
+ {
224
+ $this->bcc = $email_list;
225
+ return $this;
226
+ }
227
+
228
+ public function addBcc($email, $name = null)
229
+ {
230
+ if ($this->bcc == null) {
231
+ $this->bcc = array();
232
+ }
233
+
234
+ if (is_array($email)) {
235
+ foreach ($email as $e) {
236
+ $this->bcc[] = $e;
237
+ }
238
+ } else {
239
+ $this->bcc[] = $email;
240
+ }
241
+
242
+ if (is_array($name)) {
243
+ foreach ($name as $n) {
244
+ $this->addBccName($n);
245
+ }
246
+ } elseif ($name) {
247
+ $this->addBccName($name);
248
+ }
249
+
250
+ return $this;
251
+ }
252
+
253
+ public function addBccName($name)
254
+ {
255
+ if ($this->bccName == null) {
256
+ $this->bccName = array();
257
+ }
258
+
259
+ $this->bccName[] = $name;
260
+ return $this;
261
+ }
262
+
263
+ public function getBccNames()
264
+ {
265
+ return $this->bccName;
266
+ }
267
+
268
+ public function removeBcc($email)
269
+ {
270
+ $this->_removeFromList($this->bcc, $email);
271
+ return $this;
272
+ }
273
+
274
+ public function getBccs()
275
+ {
276
+ return $this->bcc;
277
+ }
278
+
279
+ public function setSubject($subject)
280
+ {
281
+ $this->subject = $subject;
282
+ return $this;
283
+ }
284
+
285
+ public function getSubject()
286
+ {
287
+ return $this->subject;
288
+ }
289
+
290
+ public function setDate($date)
291
+ {
292
+ $this->date = $date;
293
+ return $this;
294
+ }
295
+
296
+ public function getDate()
297
+ {
298
+ return $this->date;
299
+ }
300
+
301
+ public function setText($text)
302
+ {
303
+ $this->text = $text;
304
+ return $this;
305
+ }
306
+
307
+ public function getText()
308
+ {
309
+ return $this->text;
310
+ }
311
+
312
+ public function setHtml($html)
313
+ {
314
+ $this->html = $html;
315
+ return $this;
316
+ }
317
+
318
+ public function getHtml()
319
+ {
320
+ return $this->html;
321
+ }
322
+
323
+ public function setSendAt($timestamp)
324
+ {
325
+ $this->smtpapi->setSendAt($timestamp);
326
+ return $this;
327
+ }
328
+
329
+ public function setSendEachAt(array $timestamps)
330
+ {
331
+ $this->smtpapi->setSendEachAt($timestamps);
332
+ return $this;
333
+ }
334
+
335
+ public function addSendEachAt($timestamp)
336
+ {
337
+ $this->smtpapi->addSendEachAt($timestamp);
338
+ return $this;
339
+ }
340
+
341
+ /**
342
+ * Convenience method to add template
343
+ * @param string The id of the template
344
+ * @return $this
345
+ */
346
+ public function setTemplateId($templateId)
347
+ {
348
+ $this->addFilter('templates', 'enabled', 1);
349
+ $this->addFilter('templates', 'template_id', $templateId);
350
+ return $this;
351
+ }
352
+
353
+ /** Convenience method to set asm group id
354
+ * @param string the group id
355
+ * @return $this
356
+ */
357
+ public function setAsmGroupId($groupId)
358
+ {
359
+ $this->smtpapi->setASMGroupID($groupId);
360
+ return $this;
361
+ }
362
+
363
+ public function setAttachments(array $files)
364
+ {
365
+ $this->attachments = array();
366
+
367
+ foreach($files as $filename => $file) {
368
+ if (is_string($filename)) {
369
+ $this->addAttachment($file, $filename);
370
+ } else {
371
+ $this->addAttachment($file);
372
+ }
373
+ }
374
+
375
+ return $this;
376
+ }
377
+
378
+ public function setAttachment($file, $custom_filename = null, $cid = null)
379
+ {
380
+ $this->attachments = array($this->getAttachmentInfo($file, $custom_filename, $cid));
381
+ return $this;
382
+ }
383
+
384
+ public function addAttachment($file, $custom_filename = null, $cid = null)
385
+ {
386
+ $this->attachments[] = $this->getAttachmentInfo($file, $custom_filename, $cid);
387
+ return $this;
388
+ }
389
+
390
+ public function getAttachments()
391
+ {
392
+ return $this->attachments;
393
+ }
394
+
395
+ public function removeAttachment($file)
396
+ {
397
+ $this->_removeFromList($this->attachments, $file, "file");
398
+ return $this;
399
+ }
400
+
401
+ private function getAttachmentInfo($file, $custom_filename = null, $cid = null)
402
+ {
403
+ $info = pathinfo($file);
404
+ $info['file'] = $file;
405
+ if (!is_null($custom_filename)) {
406
+ $info['custom_filename'] = $custom_filename;
407
+ }
408
+ if ($cid !== null) {
409
+ $info['cid'] = $cid;
410
+ }
411
+
412
+ return $info;
413
+ }
414
+
415
+ public function setCategories($categories)
416
+ {
417
+ $this->smtpapi->setCategories($categories);
418
+ return $this;
419
+ }
420
+
421
+ public function setCategory($category)
422
+ {
423
+ $this->smtpapi->setCategory($category);
424
+ return $this;
425
+ }
426
+
427
+ public function addCategory($category)
428
+ {
429
+ $this->smtpapi->addCategory($category);
430
+ return $this;
431
+ }
432
+
433
+ public function removeCategory($category)
434
+ {
435
+ $this->smtpapi->removeCategory($category);
436
+ return $this;
437
+ }
438
+
439
+ public function setSubstitutions($key_value_pairs)
440
+ {
441
+ $this->smtpapi->setSubstitutions($key_value_pairs);
442
+ return $this;
443
+ }
444
+
445
+ public function addSubstitution($from_value, array $to_values)
446
+ {
447
+ $this->smtpapi->addSubstitution($from_value, $to_values);
448
+ return $this;
449
+ }
450
+
451
+ public function setSections(array $key_value_pairs)
452
+ {
453
+ $this->smtpapi->setSections($key_value_pairs);
454
+ return $this;
455
+ }
456
+
457
+ public function addSection($from_value, $to_value)
458
+ {
459
+ $this->smtpapi->addSection($from_value, $to_value);
460
+ return $this;
461
+ }
462
+
463
+ public function setUniqueArgs(array $key_value_pairs)
464
+ {
465
+ $this->smtpapi->setUniqueArgs($key_value_pairs);
466
+ return $this;
467
+ }
468
+
469
+ ## synonym method
470
+ public function setUniqueArguments(array $key_value_pairs)
471
+ {
472
+ $this->smtpapi->setUniqueArgs($key_value_pairs);
473
+ return $this;
474
+ }
475
+
476
+ public function addUniqueArg($key, $value)
477
+ {
478
+ $this->smtpapi->addUniqueArg($key, $value);
479
+ return $this;
480
+ }
481
+
482
+ ## synonym method
483
+ public function addUniqueArgument($key, $value)
484
+ {
485
+ $this->smtpapi->addUniqueArg($key, $value);
486
+ return $this;
487
+ }
488
+
489
+ public function setFilters($filter_settings)
490
+ {
491
+ $this->smtpapi->setFilters($filter_settings);
492
+ return $this;
493
+ }
494
+
495
+ ## synonym method
496
+ public function setFilterSettings($filter_settings)
497
+ {
498
+ $this->smtpapi->setFilters($filter_settings);
499
+ return $this;
500
+ }
501
+
502
+ public function addFilter($filter_name, $parameter_name, $parameter_value)
503
+ {
504
+ $this->smtpapi->addFilter($filter_name, $parameter_name, $parameter_value);
505
+ return $this;
506
+ }
507
+
508
+ ## synonym method
509
+ public function addFilterSetting($filter_name, $parameter_name, $parameter_value)
510
+ {
511
+ $this->smtpapi->addFilter($filter_name, $parameter_name, $parameter_value);
512
+ return $this;
513
+ }
514
+
515
+ public function getHeaders()
516
+ {
517
+ return $this->headers;
518
+ }
519
+
520
+ public function getHeadersJson()
521
+ {
522
+ if (count($this->getHeaders()) <= 0) {
523
+ return "{}";
524
+ }
525
+ return json_encode($this->getHeaders(), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
526
+ }
527
+
528
+ public function setHeaders($key_value_pairs)
529
+ {
530
+ $this->headers = $key_value_pairs;
531
+ return $this;
532
+ }
533
+
534
+ public function addHeader($key, $value)
535
+ {
536
+ $this->headers[$key] = $value;
537
+ return $this;
538
+ }
539
+
540
+ public function removeHeader($key)
541
+ {
542
+ unset($this->headers[$key]);
543
+ return $this;
544
+ }
545
+
546
+ public function getSmtpapi()
547
+ {
548
+ return $this->smtpapi;
549
+ }
550
+
551
+ public function toWebFormat()
552
+ {
553
+ $web = array(
554
+ 'to' => $this->to,
555
+ 'from' => $this->getFrom(),
556
+ 'x-smtpapi' => $this->smtpapi->jsonString(),
557
+ 'subject' => $this->getSubject(),
558
+ 'text' => $this->getText(),
559
+ 'html' => $this->getHtml(),
560
+ 'headers' => $this->getHeadersJson(),
561
+ );
562
+
563
+ if ($this->getToNames()) { $web['toname'] = $this->getToNames(); }
564
+ if ($this->getCcs()) { $web['cc'] = $this->getCcs(); }
565
+ if ($this->getCcNames()) { $web['ccname'] = $this->getCcNames(); }
566
+ if ($this->getBccs()) { $web['bcc'] = $this->getBccs(); }
567
+ if ($this->getBccNames()) { $web['bccname'] = $this->getBccNames(); }
568
+ if ($this->getFromName()) { $web['fromname'] = $this->getFromName(); }
569
+ if ($this->getReplyTo()) { $web['replyto'] = $this->getReplyTo(); }
570
+ if ($this->getDate()) { $web['date'] = $this->getDate(); }
571
+ if ($this->smtpapi->to && (count($this->smtpapi->to) > 0)) { $web['to'] = ""; }
572
+
573
+ $web = $this->updateMissingTo($web);
574
+
575
+ if ($this->getAttachments()) {
576
+ foreach($this->getAttachments() as $f) {
577
+ $file = $f['file'];
578
+ $extension = null;
579
+ if (array_key_exists('extension', $f)) {
580
+ $extension = $f['extension'];
581
+ };
582
+ $filename = $f['filename'];
583
+ $full_filename = $filename;
584
+
585
+ if (isset($extension)) {
586
+ $full_filename = $filename.'.'.$extension;
587
+ }
588
+ if (array_key_exists('custom_filename', $f)) {
589
+ $full_filename = $f['custom_filename'];
590
+ }
591
+
592
+ if (array_key_exists('cid', $f)) {
593
+ $web['content['.$full_filename.']'] = $f['cid'];
594
+ }
595
+
596
+ $contents = '@' . $file;
597
+
598
+ // Guzzle handles this for us.
599
+ // http://guzzle3.readthedocs.org/en/latest/http-client/request.html#post-requests
600
+ // if (class_exists('CurlFile', false)) { // php >= 5.5
601
+ // $contents = new \CurlFile($file, $extension, $filename);
602
+ // }
603
+
604
+ $web['files['.$full_filename.']'] = $contents;
605
+ };
606
+ }
607
+
608
+ return $web;
609
+ }
610
+
611
+ /**
612
+ * There needs to be at least 1 to address, or else the mail won't send.
613
+ * This method modifies the data that will be sent via either Rest
614
+ */
615
+ public function updateMissingTo($data)
616
+ {
617
+ if ($this->smtpapi->to && (count($this->smtpapi->to) > 0)) {
618
+ $data['to'] = $this->getFrom();
619
+ }
620
+ return $data;
621
+ }
622
+ }
vendor/sendgrid-php/lib/SendGrid/Exception.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace SendGrid;
4
+
5
+ /**
6
+ * An exception thrown when SendGrid does not return a 200
7
+ */
8
+ class Exception extends \Exception
9
+ {
10
+ public function getErrors()
11
+ {
12
+ return json_decode($this->message)->errors;
13
+ }
14
+ }
vendor/sendgrid-php/lib/SendGrid/Response.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace SendGrid;
4
+
5
+ class Response
6
+ {
7
+
8
+ public
9
+ $code,
10
+ $headers,
11
+ $raw_body,
12
+ $body;
13
+
14
+ public function __construct($code, $headers, $raw_body, $body)
15
+ {
16
+ $this->code = $code;
17
+ $this->headers = $headers;
18
+ $this->raw_body = $raw_body;
19
+ $this->body = $body;
20
+ }
21
+
22
+ public function getCode()
23
+ {
24
+ return $this->code;
25
+ }
26
+
27
+ public function getHeaders()
28
+ {
29
+ return $this->headers;
30
+ }
31
+
32
+ public function getRawBody()
33
+ {
34
+ return $this->raw_body;
35
+ }
36
+
37
+ public function getBody()
38
+ {
39
+ return $this->body;
40
+ }
41
+ }
vendor/sendgrid-php/vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitf00fa89c87d9f3f7ac92a9126860de7f::getLoader();
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit036e1056143d73408b319054a8c60539::getLoader();
vendor/sendgrid-php/vendor/composer/ClassLoader.php CHANGED
@@ -54,11 +54,14 @@ class ClassLoader
54
  private $useIncludePath = false;
55
  private $classMap = array();
56
 
 
 
57
  public function getPrefixes()
58
  {
59
  if (!empty($this->prefixesPsr0)) {
60
  return call_user_func_array('array_merge', $this->prefixesPsr0);
61
  }
 
62
  return array();
63
  }
64
 
@@ -247,6 +250,27 @@ class ClassLoader
247
  return $this->useIncludePath;
248
  }
249
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
  /**
251
  * Registers this instance as an autoloader.
252
  *
@@ -298,6 +322,9 @@ class ClassLoader
298
  if (isset($this->classMap[$class])) {
299
  return $this->classMap[$class];
300
  }
 
 
 
301
 
302
  $file = $this->findFileWithExtension($class, '.php');
303
 
54
  private $useIncludePath = false;
55
  private $classMap = array();
56
 
57
+ private $classMapAuthoritative = false;
58
+
59
  public function getPrefixes()
60
  {
61
  if (!empty($this->prefixesPsr0)) {
62
  return call_user_func_array('array_merge', $this->prefixesPsr0);
63
  }
64
+
65
  return array();
66
  }
67
 
250
  return $this->useIncludePath;
251
  }
252
 
253
+ /**
254
+ * Turns off searching the prefix and fallback directories for classes
255
+ * that have not been registered with the class map.
256
+ *
257
+ * @param bool $classMapAuthoritative
258
+ */
259
+ public function setClassMapAuthoritative($classMapAuthoritative)
260
+ {
261
+ $this->classMapAuthoritative = $classMapAuthoritative;
262
+ }
263
+
264
+ /**
265
+ * Should class lookup fail if not found in the current class map?
266
+ *
267
+ * @return bool
268
+ */
269
+ public function isClassMapAuthoritative()
270
+ {
271
+ return $this->classMapAuthoritative;
272
+ }
273
+
274
  /**
275
  * Registers this instance as an autoloader.
276
  *
322
  if (isset($this->classMap[$class])) {
323
  return $this->classMap[$class];
324
  }
325
+ if ($this->classMapAuthoritative) {
326
+ return false;
327
+ }
328
 
329
  $file = $this->findFileWithExtension($class, '.php');
330
 
vendor/sendgrid-php/vendor/composer/autoload_namespaces.php CHANGED
@@ -6,6 +6,9 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
9
  'Smtpapi' => array($vendorDir . '/sendgrid/smtpapi/lib'),
10
  'SendGrid' => array($baseDir . '/lib'),
 
 
11
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
10
  'Smtpapi' => array($vendorDir . '/sendgrid/smtpapi/lib'),
11
  'SendGrid' => array($baseDir . '/lib'),
12
+ 'Guzzle\\Tests' => array($vendorDir . '/guzzle/guzzle/tests'),
13
+ 'Guzzle' => array($vendorDir . '/guzzle/guzzle/src'),
14
  );
vendor/sendgrid-php/vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitf00fa89c87d9f3f7ac92a9126860de7f
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInitf00fa89c87d9f3f7ac92a9126860de7f
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInitf00fa89c87d9f3f7ac92a9126860de7f', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInitf00fa89c87d9f3f7ac92a9126860de7f', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
@@ -44,7 +44,7 @@ class ComposerAutoloaderInitf00fa89c87d9f3f7ac92a9126860de7f
44
  }
45
  }
46
 
47
- function composerRequiref00fa89c87d9f3f7ac92a9126860de7f($file)
48
  {
49
  require $file;
50
  }
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit036e1056143d73408b319054a8c60539
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit036e1056143d73408b319054a8c60539', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit036e1056143d73408b319054a8c60539', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
44
  }
45
  }
46
 
47
+ function composerRequire036e1056143d73408b319054a8c60539($file)
48
  {
49
  require $file;
50
  }
vendor/sendgrid-php/vendor/composer/installed.json CHANGED
@@ -1,17 +1,17 @@
1
  [
2
  {
3
  "name": "sendgrid/smtpapi",
4
- "version": "0.1.0",
5
- "version_normalized": "0.1.0.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/sendgrid/smtpapi-php.git",
9
- "reference": "7d964a32e07732bb2d6d4098c502c712befcd8b5"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/sendgrid/smtpapi-php/zipball/7d964a32e07732bb2d6d4098c502c712befcd8b5",
14
- "reference": "7d964a32e07732bb2d6d4098c502c712befcd8b5",
15
  "shasum": ""
16
  },
17
  "require": {
@@ -23,9 +23,9 @@
23
  "require-dev": {
24
  "phpunit/phpunit": "3.7.*"
25
  },
26
- "time": "2014-12-17 20:38:56",
27
  "type": "library",
28
- "installation-source": "dist",
29
  "autoload": {
30
  "psr-0": {
31
  "Smtpapi": "lib/"
@@ -48,5 +48,163 @@
48
  "smtpapi",
49
  "xsmtp"
50
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  }
52
  ]
1
  [
2
  {
3
  "name": "sendgrid/smtpapi",
4
+ "version": "0.5.0",
5
+ "version_normalized": "0.5.0.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/sendgrid/smtpapi-php.git",
9
+ "reference": "05ccf57bad5d1524e479b6dc0a2dfade88b3fbe5"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/sendgrid/smtpapi-php/zipball/05ccf57bad5d1524e479b6dc0a2dfade88b3fbe5",
14
+ "reference": "05ccf57bad5d1524e479b6dc0a2dfade88b3fbe5",
15
  "shasum": ""
16
  },
17
  "require": {
23
  "require-dev": {
24
  "phpunit/phpunit": "3.7.*"
25
  },
26
+ "time": "2015-04-14 02:37:45",
27
  "type": "library",
28
+ "installation-source": "source",
29
  "autoload": {
30
  "psr-0": {
31
  "Smtpapi": "lib/"
48
  "smtpapi",
49
  "xsmtp"
50
  ]
51
+ },
52
+ {
53
+ "name": "symfony/event-dispatcher",
54
+ "version": "v2.6.6",
55
+ "version_normalized": "2.6.6.0",
56
+ "target-dir": "Symfony/Component/EventDispatcher",
57
+ "source": {
58
+ "type": "git",
59
+ "url": "https://github.com/symfony/EventDispatcher.git",
60
+ "reference": "70f7c8478739ad21e3deef0d977b38c77f1fb284"
61
+ },
62
+ "dist": {
63
+ "type": "zip",
64
+ "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/70f7c8478739ad21e3deef0d977b38c77f1fb284",
65
+ "reference": "70f7c8478739ad21e3deef0d977b38c77f1fb284",
66
+ "shasum": ""
67
+ },
68
+ "require": {
69
+ "php": ">=5.3.3"
70
+ },
71
+ "require-dev": {
72
+ "psr/log": "~1.0",
73
+ "symfony/config": "~2.0,>=2.0.5",
74
+ "symfony/dependency-injection": "~2.6",
75
+ "symfony/expression-language": "~2.6",
76
+ "symfony/phpunit-bridge": "~2.7",
77
+ "symfony/stopwatch": "~2.3"
78
+ },
79
+ "suggest": {
80
+ "symfony/dependency-injection": "",
81
+ "symfony/http-kernel": ""
82
+ },
83
+ "time": "2015-03-13 17:37:22",
84
+ "type": "library",
85
+ "extra": {
86
+ "branch-alias": {
87
+ "dev-master": "2.6-dev"
88
+ }
89
+ },
90
+ "installation-source": "source",
91
+ "autoload": {
92
+ "psr-0": {
93
+ "Symfony\\Component\\EventDispatcher\\": ""
94
+ }
95
+ },
96
+ "notification-url": "https://packagist.org/downloads/",
97
+ "license": [
98
+ "MIT"
99
+ ],
100
+ "authors": [
101
+ {
102
+ "name": "Symfony Community",
103
+ "homepage": "http://symfony.com/contributors"
104
+ },
105
+ {
106
+ "name": "Fabien Potencier",
107
+ "email": "fabien@symfony.com"
108
+ }
109
+ ],
110
+ "description": "Symfony EventDispatcher Component",
111
+ "homepage": "http://symfony.com"
112
+ },
113
+ {
114
+ "name": "guzzle/guzzle",
115
+ "version": "v3.9.3",
116
+ "version_normalized": "3.9.3.0",
117
+ "source": {
118
+ "type": "git",
119
+ "url": "https://github.com/guzzle/guzzle3.git",
120
+ "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9"
121
+ },
122
+ "dist": {
123
+ "type": "zip",
124
+ "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9",
125
+ "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9",
126
+ "shasum": ""
127
+ },
128
+ "require": {
129
+ "ext-curl": "*",
130
+ "php": ">=5.3.3",
131
+ "symfony/event-dispatcher": "~2.1"
132
+ },
133
+ "replace": {
134
+ "guzzle/batch": "self.version",
135
+ "guzzle/cache": "self.version",
136
+ "guzzle/common": "self.version",
137
+ "guzzle/http": "self.version",
138
+ "guzzle/inflection": "self.version",
139
+ "guzzle/iterator": "self.version",
140
+ "guzzle/log": "self.version",
141
+ "guzzle/parser": "self.version",
142
+ "guzzle/plugin": "self.version",
143
+ "guzzle/plugin-async": "self.version",
144
+ "guzzle/plugin-backoff": "self.version",
145
+ "guzzle/plugin-cache": "self.version",
146
+ "guzzle/plugin-cookie": "self.version",
147
+ "guzzle/plugin-curlauth": "self.version",
148
+ "guzzle/plugin-error-response": "self.version",
149
+ "guzzle/plugin-history": "self.version",
150
+ "guzzle/plugin-log": "self.version",
151
+ "guzzle/plugin-md5": "self.version",
152
+ "guzzle/plugin-mock": "self.version",
153
+ "guzzle/plugin-oauth": "self.version",
154
+ "guzzle/service": "self.version",
155
+ "guzzle/stream": "self.version"
156
+ },
157
+ "require-dev": {
158
+ "doctrine/cache": "~1.3",
159
+ "monolog/monolog": "~1.0",
160
+ "phpunit/phpunit": "3.7.*",
161
+ "psr/log": "~1.0",
162
+ "symfony/class-loader": "~2.1",
163
+ "zendframework/zend-cache": "2.*,<2.3",
164
+ "zendframework/zend-log": "2.*,<2.3"
165
+ },
166
+ "suggest": {
167
+ "guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated."
168
+ },
169
+ "time": "2015-03-18 18:23:50",
170
+ "type": "library",
171
+ "extra": {
172
+ "branch-alias": {
173
+ "dev-master": "3.9-dev"
174
+ }
175
+ },
176
+ "installation-source": "source",
177
+ "autoload": {
178
+ "psr-0": {
179
+ "Guzzle": "src/",
180
+ "Guzzle\\Tests": "tests/"
181
+ }
182
+ },
183
+ "notification-url": "https://packagist.org/downloads/",
184
+ "license": [
185
+ "MIT"
186
+ ],
187
+ "authors": [
188
+ {
189
+ "name": "Michael Dowling",
190
+ "email": "mtdowling@gmail.com",
191
+ "homepage": "https://github.com/mtdowling"
192
+ },
193
+ {
194
+ "name": "Guzzle Community",
195
+ "homepage": "https://github.com/guzzle/guzzle/contributors"
196
+ }
197
+ ],
198
+ "description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle",
199
+ "homepage": "http://guzzlephp.org/",
200
+ "keywords": [
201
+ "client",
202
+ "curl",
203
+ "framework",
204
+ "http",
205
+ "http client",
206
+ "rest",
207
+ "web service"
208
+ ]
209
  }
210
  ]
vendor/sendgrid-php/vendor/guzzle/guzzle/CHANGELOG.md ADDED
@@ -0,0 +1,751 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # CHANGELOG
2
+
3
+ ## 3.9.3 - 2015-03-18
4
+
5
+ * Ensuring Content-Length is not stripped from a request when it is `0`.
6
+ * Added more information to stream wrapper exceptions.
7
+ * Message parser will no longer throw warnings for malformed messages.
8
+ * Giving a valid cache TTL when max-age is 0.
9
+
10
+ ## 3.9.2 - 2014-09-10
11
+
12
+ * Retrying "Connection died, retrying a fresh connect" curl errors.
13
+ * Automatically extracting the cacert from the phar in client constructor.
14
+ * Added EntityBody support for OPTIONS requests.
15
+
16
+ ## 3.9.1 - 2014-05-07
17
+
18
+ * Added a fix to ReadLimitEntityBody to ensure it doesn't infinitely loop.
19
+ * Added a fix to the stream checksum function so that when the first read
20
+ returns a falsey value, it still continues to consume the stream until EOF.
21
+
22
+ ## 3.9.0 - 2014-04-23
23
+
24
+ * `null`, `false`, and `"_guzzle_blank_"` all now serialize as an empty value
25
+ with no trailing "=". See dc1d824277.
26
+ * No longer performing an MD5 check on the cacert each time the phar is used,
27
+ but rather copying the cacert to the temp directory.
28
+ * `"0"` can now be added as a URL path
29
+ * Deleting cookies that are set to empty
30
+ * If-Modified-Since is no longer unnecessarily added to the CachePlugin
31
+ * Cookie path matching now follows RFC 6265 s5.1.4
32
+ * Updated service descriptions are now added to a service client's composite
33
+ factory.
34
+ * MockPlugin now throws an exception if the queue is empty.
35
+ * Properly parsing URLs that start with "http" but are not absolute
36
+ * Added the ability to configure the curl_multi_select timeout setting
37
+ * OAuth parameters are now sorted using lexicographical byte value ordering
38
+ * Fixing invalid usage of an out of range PHP feature in the ErrorResponsePlugin
39
+
40
+ ## 3.8.1 -2014-01-28
41
+
42
+ * Bug: Always using GET requests when redirecting from a 303 response
43
+ * Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in
44
+ `Guzzle\Http\ClientInterface::setSslVerification()`
45
+ * Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL
46
+ * Bug: The body of a request can now be set to `"0"`
47
+ * Sending PHP stream requests no longer forces `HTTP/1.0`
48
+ * Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of
49
+ each sub-exception
50
+ * Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than
51
+ clobbering everything).
52
+ * Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators)
53
+ * Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`.
54
+ For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`.
55
+ * Now properly escaping the regular expression delimiter when matching Cookie domains.
56
+ * Network access is now disabled when loading XML documents
57
+
58
+ ## 3.8.0 - 2013-12-05
59
+
60
+ * Added the ability to define a POST name for a file
61
+ * JSON response parsing now properly walks additionalProperties
62
+ * cURL error code 18 is now retried automatically in the BackoffPlugin
63
+ * Fixed a cURL error when URLs contain fragments
64
+ * Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were
65
+ CurlExceptions
66
+ * CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e)
67
+ * Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS`
68
+ * Fixed a bug that was encountered when parsing empty header parameters
69
+ * UriTemplate now has a `setRegex()` method to match the docs
70
+ * The `debug` request parameter now checks if it is truthy rather than if it exists
71
+ * Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin
72
+ * Added the ability to combine URLs using strict RFC 3986 compliance
73
+ * Command objects can now return the validation errors encountered by the command
74
+ * Various fixes to cache revalidation (#437 and 29797e5)
75
+ * Various fixes to the AsyncPlugin
76
+ * Cleaned up build scripts
77
+
78
+ ## 3.7.4 - 2013-10-02
79
+
80
+ * Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430)
81
+ * Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp
82
+ (see https://github.com/aws/aws-sdk-php/issues/147)
83
+ * Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots
84
+ * Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420)
85
+ * Updated the bundled cacert.pem (#419)
86
+ * OauthPlugin now supports adding authentication to headers or query string (#425)
87
+
88
+ ## 3.7.3 - 2013-09-08
89
+
90
+ * Added the ability to get the exception associated with a request/command when using `MultiTransferException` and
91
+ `CommandTransferException`.
92
+ * Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description
93
+ * Schemas are only injected into response models when explicitly configured.
94
+ * No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of
95
+ an EntityBody.
96
+ * Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator.
97
+ * Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`.
98
+ * Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody()
99
+ * Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin
100
+ * Bug fix: Visiting XML attributes first before visting XML children when serializing requests
101
+ * Bug fix: Properly parsing headers that contain commas contained in quotes
102
+ * Bug fix: mimetype guessing based on a filename is now case-insensitive
103
+
104
+ ## 3.7.2 - 2013-08-02
105
+
106
+ * Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander
107
+ See https://github.com/guzzle/guzzle/issues/371
108
+ * Bug fix: Cookie domains are now matched correctly according to RFC 6265
109
+ See https://github.com/guzzle/guzzle/issues/377
110
+ * Bug fix: GET parameters are now used when calculating an OAuth signature
111
+ * Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted
112
+ * `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched
113
+ * `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input.
114
+ See https://github.com/guzzle/guzzle/issues/379
115
+ * Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See
116
+ https://github.com/guzzle/guzzle/pull/380
117
+ * cURL multi cleanup and optimizations
118
+
119
+ ## 3.7.1 - 2013-07-05
120
+
121
+ * Bug fix: Setting default options on a client now works
122
+ * Bug fix: Setting options on HEAD requests now works. See #352
123
+ * Bug fix: Moving stream factory before send event to before building the stream. See #353
124
+ * Bug fix: Cookies no longer match on IP addresses per RFC 6265
125
+ * Bug fix: Correctly parsing header parameters that are in `<>` and quotes
126
+ * Added `cert` and `ssl_key` as request options
127
+ * `Host` header can now diverge from the host part of a URL if the header is set manually
128
+ * `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter
129
+ * OAuth parameters are only added via the plugin if they aren't already set
130
+ * Exceptions are now thrown when a URL cannot be parsed
131
+ * Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails
132
+ * Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin
133
+
134
+ ## 3.7.0 - 2013-06-10
135
+
136
+ * See UPGRADING.md for more information on how to upgrade.
137
+ * Requests now support the ability to specify an array of $options when creating a request to more easily modify a
138
+ request. You can pass a 'request.options' configuration setting to a client to apply default request options to
139
+ every request created by a client (e.g. default query string variables, headers, curl options, etc).
140
+ * Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`.
141
+ See `Guzzle\Http\StaticClient::mount`.
142
+ * Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests
143
+ created by a command (e.g. custom headers, query string variables, timeout settings, etc).
144
+ * Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the
145
+ headers of a response
146
+ * Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key
147
+ (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`)
148
+ * ServiceBuilders now support storing and retrieving arbitrary data
149
+ * CachePlugin can now purge all resources for a given URI
150
+ * CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource
151
+ * CachePlugin now uses the Vary header to determine if a resource is a cache hit
152
+ * `Guzzle\Http\Message\Response` now implements `\Serializable`
153
+ * Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters
154
+ * `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable
155
+ * Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()`
156
+ * Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size
157
+ * `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message
158
+ * Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older
159
+ Symfony users can still use the old version of Monolog.
160
+ * Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`.
161
+ Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`.
162
+ * Several performance improvements to `Guzzle\Common\Collection`
163
+ * Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`:
164
+ createRequest, head, delete, put, patch, post, options, prepareRequest
165
+ * Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()`
166
+ * Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface`
167
+ * Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to
168
+ `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a
169
+ resource, string, or EntityBody into the $options parameter to specify the download location of the response.
170
+ * Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a
171
+ default `array()`
172
+ * Added `Guzzle\Stream\StreamInterface::isRepeatable`
173
+ * Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use
174
+ $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or
175
+ $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`.
176
+ * Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`.
177
+ * Removed `Guzzle\Http\ClientInterface::expandTemplate()`
178
+ * Removed `Guzzle\Http\ClientInterface::setRequestFactory()`
179
+ * Removed `Guzzle\Http\ClientInterface::getCurlMulti()`
180
+ * Removed `Guzzle\Http\Message\RequestInterface::canCache`
181
+ * Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`
182
+ * Removed `Guzzle\Http\Message\RequestInterface::isRedirect`
183
+ * Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods.
184
+ * You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting
185
+ `Guzzle\Common\Version::$emitWarnings` to true.
186
+ * Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use
187
+ `$request->getResponseBody()->isRepeatable()` instead.
188
+ * Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use
189
+ `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
190
+ * Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use
191
+ `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
192
+ * Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.
193
+ * Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.
194
+ * Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated
195
+ * Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand.
196
+ These will work through Guzzle 4.0
197
+ * Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params].
198
+ * Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client.
199
+ * Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`.
200
+ * Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`.
201
+ * Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.
202
+ * Marked `Guzzle\Common\Collection::inject()` as deprecated.
203
+ * Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');`
204
+ * CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a
205
+ CacheStorageInterface. These two objects and interface will be removed in a future version.
206
+ * Always setting X-cache headers on cached responses
207
+ * Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin
208
+ * `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface
209
+ $request, Response $response);`
210
+ * `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`
211
+ * `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`
212
+ * Added `CacheStorageInterface::purge($url)`
213
+ * `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin
214
+ $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,
215
+ CanCacheStrategyInterface $canCache = null)`
216
+ * Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`
217
+
218
+ ## 3.6.0 - 2013-05-29
219
+
220
+ * ServiceDescription now implements ToArrayInterface
221
+ * Added command.hidden_params to blacklist certain headers from being treated as additionalParameters
222
+ * Guzzle can now correctly parse incomplete URLs
223
+ * Mixed casing of headers are now forced to be a single consistent casing across all values for that header.
224
+ * Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution
225
+ * Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().
226
+ * Specific header implementations can be created for complex headers. When a message creates a header, it uses a
227
+ HeaderFactory which can map specific headers to specific header classes. There is now a Link header and
228
+ CacheControl header implementation.
229
+ * Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate
230
+ * Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti()
231
+ * Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in
232
+ Guzzle\Http\Curl\RequestMediator
233
+ * Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.
234
+ * Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface
235
+ * Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders()
236
+ * Removed Guzzle\Parser\ParserRegister::get(). Use getParser()
237
+ * Removed Guzzle\Parser\ParserRegister::set(). Use registerParser().
238
+ * All response header helper functions return a string rather than mixing Header objects and strings inconsistently
239
+ * Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc are managed by Guzzle
240
+ directly via interfaces
241
+ * Removed the injecting of a request object onto a response object. The methods to get and set a request still exist
242
+ but are a no-op until removed.
243
+ * Most classes that used to require a ``Guzzle\Service\Command\CommandInterface` typehint now request a
244
+ `Guzzle\Service\Command\ArrayCommandInterface`.
245
+ * Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response
246
+ on a request while the request is still being transferred
247
+ * The ability to case-insensitively search for header values
248
+ * Guzzle\Http\Message\Header::hasExactHeader
249
+ * Guzzle\Http\Message\Header::raw. Use getAll()
250
+ * Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object
251
+ instead.
252
+ * `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess
253
+ * Added the ability to cast Model objects to a string to view debug information.
254
+
255
+ ## 3.5.0 - 2013-05-13
256
+
257
+ * Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times
258
+ * Bug: Better cleanup of one-time events accross the board (when an event is meant to fire once, it will now remove
259
+ itself from the EventDispatcher)
260
+ * Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values
261
+ * Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too
262
+ * Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a
263
+ non-existent key
264
+ * Bug: All __call() method arguments are now required (helps with mocking frameworks)
265
+ * Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference
266
+ to help with refcount based garbage collection of resources created by sending a request
267
+ * Deprecating ZF1 cache and log adapters. These will be removed in the next major version.
268
+ * Deprecating `Response::getPreviousResponse()` (method signature still exists, but it'sdeprecated). Use the
269
+ HistoryPlugin for a history.
270
+ * Added a `responseBody` alias for the `response_body` location
271
+ * Refactored internals to no longer rely on Response::getRequest()
272
+ * HistoryPlugin can now be cast to a string
273
+ * HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests
274
+ and responses that are sent over the wire
275
+ * Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects
276
+
277
+ ## 3.4.3 - 2013-04-30
278
+
279
+ * Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response
280
+ * Added a check to re-extract the temp cacert bundle from the phar before sending each request
281
+
282
+ ## 3.4.2 - 2013-04-29
283
+
284
+ * Bug fix: Stream objects now work correctly with "a" and "a+" modes
285
+ * Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present
286
+ * Bug fix: AsyncPlugin no longer forces HEAD requests
287
+ * Bug fix: DateTime timezones are now properly handled when using the service description schema formatter
288
+ * Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails
289
+ * Setting a response on a request will write to the custom request body from the response body if one is specified
290
+ * LogPlugin now writes to php://output when STDERR is undefined
291
+ * Added the ability to set multiple POST files for the same key in a single call
292
+ * application/x-www-form-urlencoded POSTs now use the utf-8 charset by default
293
+ * Added the ability to queue CurlExceptions to the MockPlugin
294
+ * Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send)
295
+ * Configuration loading now allows remote files
296
+
297
+ ## 3.4.1 - 2013-04-16
298
+
299
+ * Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti
300
+ handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost.
301
+ * Exceptions are now properly grouped when sending requests in parallel
302
+ * Redirects are now properly aggregated when a multi transaction fails
303
+ * Redirects now set the response on the original object even in the event of a failure
304
+ * Bug fix: Model names are now properly set even when using $refs
305
+ * Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax
306
+ * Added support for oauth_callback in OAuth signatures
307
+ * Added support for oauth_verifier in OAuth signatures
308
+ * Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection
309
+
310
+ ## 3.4.0 - 2013-04-11
311
+
312
+ * Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289
313
+ * Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289
314
+ * Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263
315
+ * Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264.
316
+ * Bug fix: Added `number` type to service descriptions.
317
+ * Bug fix: empty parameters are removed from an OAuth signature
318
+ * Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header
319
+ * Bug fix: Fixed "array to string" error when validating a union of types in a service description
320
+ * Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream
321
+ * Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin.
322
+ * Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs.
323
+ * The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections.
324
+ * Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if
325
+ the Content-Type can be determined based on the entity body or the path of the request.
326
+ * Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder.
327
+ * Added support for a PSR-3 LogAdapter.
328
+ * Added a `command.after_prepare` event
329
+ * Added `oauth_callback` parameter to the OauthPlugin
330
+ * Added the ability to create a custom stream class when using a stream factory
331
+ * Added a CachingEntityBody decorator
332
+ * Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized.
333
+ * The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar.
334
+ * You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies
335
+ * POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This
336
+ means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use
337
+ POST fields or files (the latter is only used when emulating a form POST in the browser).
338
+ * Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest
339
+
340
+ ## 3.3.1 - 2013-03-10
341
+
342
+ * Added the ability to create PHP streaming responses from HTTP requests
343
+ * Bug fix: Running any filters when parsing response headers with service descriptions
344
+ * Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing
345
+ * Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across
346
+ response location visitors.
347
+ * Bug fix: Removed the possibility of creating configuration files with circular dependencies
348
+ * RequestFactory::create() now uses the key of a POST file when setting the POST file name
349
+ * Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set
350
+
351
+ ## 3.3.0 - 2013-03-03
352
+
353
+ * A large number of performance optimizations have been made
354
+ * Bug fix: Added 'wb' as a valid write mode for streams
355
+ * Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned
356
+ * Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()`
357
+ * BC: Removed `Guzzle\Http\Utils` class
358
+ * BC: Setting a service description on a client will no longer modify the client's command factories.
359
+ * BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using
360
+ the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'
361
+ * BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to
362
+ lowercase
363
+ * Operation parameter objects are now lazy loaded internally
364
+ * Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses
365
+ * Added support for instantiating responseType=class responseClass classes. Classes must implement
366
+ `Guzzle\Service\Command\ResponseClassInterface`
367
+ * Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These
368
+ additional properties also support locations and can be used to parse JSON responses where the outermost part of the
369
+ JSON is an array
370
+ * Added support for nested renaming of JSON models (rename sentAs to name)
371
+ * CachePlugin
372
+ * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error
373
+ * Debug headers can now added to cached response in the CachePlugin
374
+
375
+ ## 3.2.0 - 2013-02-14
376
+
377
+ * CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients.
378
+ * URLs with no path no longer contain a "/" by default
379
+ * Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url.
380
+ * BadResponseException no longer includes the full request and response message
381
+ * Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface
382
+ * Adding getResponseBody() to Guzzle\Http\Message\RequestInterface
383
+ * Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription
384
+ * Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list
385
+ * xmlEncoding can now be customized for the XML declaration of a XML service description operation
386
+ * Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value
387
+ aggregation and no longer uses callbacks
388
+ * The URL encoding implementation of Guzzle\Http\QueryString can now be customized
389
+ * Bug fix: Filters were not always invoked for array service description parameters
390
+ * Bug fix: Redirects now use a target response body rather than a temporary response body
391
+ * Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded
392
+ * Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives
393
+
394
+ ## 3.1.2 - 2013-01-27
395
+
396
+ * Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the
397
+ response body. For example, the XmlVisitor now parses the XML response into an array in the before() method.
398
+ * Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent
399
+ * CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444)
400
+ * Fixed a bug where redirect responses were not chained correctly using getPreviousResponse()
401
+ * Setting default headers on a client after setting the user-agent will not erase the user-agent setting
402
+
403
+ ## 3.1.1 - 2013-01-20
404
+
405
+ * Adding wildcard support to Guzzle\Common\Collection::getPath()
406
+ * Adding alias support to ServiceBuilder configs
407
+ * Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface
408
+
409
+ ## 3.1.0 - 2013-01-12
410
+
411
+ * BC: CurlException now extends from RequestException rather than BadResponseException
412
+ * BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse()
413
+ * Added getData to ServiceDescriptionInterface
414
+ * Added context array to RequestInterface::setState()
415
+ * Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http
416
+ * Bug: Adding required content-type when JSON request visitor adds JSON to a command
417
+ * Bug: Fixing the serialization of a service description with custom data
418
+ * Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing
419
+ an array of successful and failed responses
420
+ * Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection
421
+ * Added Guzzle\Http\IoEmittingEntityBody
422
+ * Moved command filtration from validators to location visitors
423
+ * Added `extends` attributes to service description parameters
424
+ * Added getModels to ServiceDescriptionInterface
425
+
426
+ ## 3.0.7 - 2012-12-19
427
+
428
+ * Fixing phar detection when forcing a cacert to system if null or true
429
+ * Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()`
430
+ * Cleaning up `Guzzle\Common\Collection::inject` method
431
+ * Adding a response_body location to service descriptions
432
+
433
+ ## 3.0.6 - 2012-12-09
434
+
435
+ * CurlMulti performance improvements
436
+ * Adding setErrorResponses() to Operation
437
+ * composer.json tweaks
438
+
439
+ ## 3.0.5 - 2012-11-18
440
+
441
+ * Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin
442
+ * Bug: Response body can now be a string containing "0"
443
+ * Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert
444
+ * Bug: QueryString::fromString now properly parses query string parameters that contain equal signs
445
+ * Added support for XML attributes in service description responses
446
+ * DefaultRequestSerializer now supports array URI parameter values for URI template expansion
447
+ * Added better mimetype guessing to requests and post files
448
+
449
+ ## 3.0.4 - 2012-11-11
450
+
451
+ * Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value
452
+ * Bug: Cookies can now be added that have a name, domain, or value set to "0"
453
+ * Bug: Using the system cacert bundle when using the Phar
454
+ * Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures
455
+ * Enhanced cookie jar de-duplication
456
+ * Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added
457
+ * Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies
458
+ * Added the ability to create any sort of hash for a stream rather than just an MD5 hash
459
+
460
+ ## 3.0.3 - 2012-11-04
461
+
462
+ * Implementing redirects in PHP rather than cURL
463
+ * Added PECL URI template extension and using as default parser if available
464
+ * Bug: Fixed Content-Length parsing of Response factory
465
+ * Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams.
466
+ * Adding ToArrayInterface throughout library
467
+ * Fixing OauthPlugin to create unique nonce values per request
468
+
469
+ ## 3.0.2 - 2012-10-25
470
+
471
+ * Magic methods are enabled by default on clients
472
+ * Magic methods return the result of a command
473
+ * Service clients no longer require a base_url option in the factory
474
+ * Bug: Fixed an issue with URI templates where null template variables were being expanded
475
+
476
+ ## 3.0.1 - 2012-10-22
477
+
478
+ * Models can now be used like regular collection objects by calling filter, map, etc
479
+ * Models no longer require a Parameter structure or initial data in the constructor
480
+ * Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator`
481
+
482
+ ## 3.0.0 - 2012-10-15
483
+
484
+ * Rewrote service description format to be based on Swagger
485
+ * Now based on JSON schema
486
+ * Added nested input structures and nested response models
487
+ * Support for JSON and XML input and output models
488
+ * Renamed `commands` to `operations`
489
+ * Removed dot class notation
490
+ * Removed custom types
491
+ * Broke the project into smaller top-level namespaces to be more component friendly
492
+ * Removed support for XML configs and descriptions. Use arrays or JSON files.
493
+ * Removed the Validation component and Inspector
494
+ * Moved all cookie code to Guzzle\Plugin\Cookie
495
+ * Magic methods on a Guzzle\Service\Client now return the command un-executed.
496
+ * Calling getResult() or getResponse() on a command will lazily execute the command if needed.
497
+ * Now shipping with cURL's CA certs and using it by default
498
+ * Added previousResponse() method to response objects
499
+ * No longer sending Accept and Accept-Encoding headers on every request
500
+ * Only sending an Expect header by default when a payload is greater than 1MB
501
+ * Added/moved client options:
502
+ * curl.blacklist to curl.option.blacklist
503
+ * Added ssl.certificate_authority
504
+ * Added a Guzzle\Iterator component
505
+ * Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin
506
+ * Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin)
507
+ * Added a more robust caching plugin
508
+ * Added setBody to response objects
509
+ * Updating LogPlugin to use a more flexible MessageFormatter
510
+ * Added a completely revamped build process
511
+ * Cleaning up Collection class and removing default values from the get method
512
+ * Fixed ZF2 cache adapters
513
+
514
+ ## 2.8.8 - 2012-10-15
515
+
516
+ * Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did
517
+
518
+ ## 2.8.7 - 2012-09-30
519
+
520
+ * Bug: Fixed config file aliases for JSON includes
521
+ * Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests
522
+ * Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload
523
+ * Bug: Hardening request and response parsing to account for missing parts
524
+ * Bug: Fixed PEAR packaging
525
+ * Bug: Fixed Request::getInfo
526
+ * Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail
527
+ * Adding the ability for the namespace Iterator factory to look in multiple directories
528
+ * Added more getters/setters/removers from service descriptions
529
+ * Added the ability to remove POST fields from OAuth signatures
530
+ * OAuth plugin now supports 2-legged OAuth
531
+
532
+ ## 2.8.6 - 2012-09-05
533
+
534
+ * Added the ability to modify and build service descriptions
535
+ * Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command
536
+ * Added a `json` parameter location
537
+ * Now allowing dot notation for classes in the CacheAdapterFactory
538
+ * Using the union of two arrays rather than an array_merge when extending service builder services and service params
539
+ * Ensuring that a service is a string before doing strpos() checks on it when substituting services for references
540
+ in service builder config files.
541
+ * Services defined in two different config files that include one another will by default replace the previously
542
+ defined service, but you can now create services that extend themselves and merge their settings over the previous
543
+ * The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like
544
+ '_default' with a default JSON configuration file.
545
+
546
+ ## 2.8.5 - 2012-08-29
547
+
548
+ * Bug: Suppressed empty arrays from URI templates
549
+ * Bug: Added the missing $options argument from ServiceDescription::factory to enable caching
550
+ * Added support for HTTP responses that do not contain a reason phrase in the start-line
551
+ * AbstractCommand commands are now invokable
552
+ * Added a way to get the data used when signing an Oauth request before a request is sent
553
+
554
+ ## 2.8.4 - 2012-08-15
555
+
556
+ * Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin
557
+ * Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable.
558
+ * Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream
559
+ * Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream
560
+ * Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5())
561
+ * Added additional response status codes
562
+ * Removed SSL information from the default User-Agent header
563
+ * DELETE requests can now send an entity body
564
+ * Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries
565
+ * Added the ability of the MockPlugin to consume mocked request bodies
566
+ * LogPlugin now exposes request and response objects in the extras array
567
+
568
+ ## 2.8.3 - 2012-07-30
569
+
570
+ * Bug: Fixed a case where empty POST requests were sent as GET requests
571
+ * Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body
572
+ * Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new
573
+ * Added multiple inheritance to service description commands
574
+ * Added an ApiCommandInterface and added ``getParamNames()`` and ``hasParam()``
575
+ * Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything
576
+ * Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles
577
+
578
+ ## 2.8.2 - 2012-07-24
579
+
580
+ * Bug: Query string values set to 0 are no longer dropped from the query string
581
+ * Bug: A Collection object is no longer created each time a call is made to ``Guzzle\Service\Command\AbstractCommand::getRequestHeaders()``
582
+ * Bug: ``+`` is now treated as an encoded space when parsing query strings
583
+ * QueryString and Collection performance improvements
584
+ * Allowing dot notation for class paths in filters attribute of a service descriptions
585
+
586
+ ## 2.8.1 - 2012-07-16
587
+
588
+ * Loosening Event Dispatcher dependency
589
+ * POST redirects can now be customized using CURLOPT_POSTREDIR
590
+
591
+ ## 2.8.0 - 2012-07-15
592
+
593
+ * BC: Guzzle\Http\Query
594
+ * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl)
595
+ * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding()
596
+ * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool)
597
+ * Changed the aggregation functions of QueryString to be static methods
598
+ * Can now use fromString() with querystrings that have a leading ?
599
+ * cURL configuration values can be specified in service descriptions using ``curl.`` prefixed parameters
600
+ * Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body
601
+ * Cookies are no longer URL decoded by default
602
+ * Bug: URI template variables set to null are no longer expanded
603
+
604
+ ## 2.7.2 - 2012-07-02
605
+
606
+ * BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser.
607
+ * BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty()
608
+ * CachePlugin now allows for a custom request parameter function to check if a request can be cached
609
+ * Bug fix: CachePlugin now only caches GET and HEAD requests by default
610
+ * Bug fix: Using header glue when transferring headers over the wire
611
+ * Allowing deeply nested arrays for composite variables in URI templates
612
+ * Batch divisors can now return iterators or arrays
613
+
614
+ ## 2.7.1 - 2012-06-26
615
+
616
+ * Minor patch to update version number in UA string
617
+ * Updating build process
618
+
619
+ ## 2.7.0 - 2012-06-25
620
+
621
+ * BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes.
622
+ * BC: Removed magic setX methods from commands
623
+ * BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method
624
+ * Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable.
625
+ * Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity)
626
+ * Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace
627
+ * Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin
628
+ * Added the ability to set POST fields and files in a service description
629
+ * Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method
630
+ * Adding a command.before_prepare event to clients
631
+ * Added BatchClosureTransfer and BatchClosureDivisor
632
+ * BatchTransferException now includes references to the batch divisor and transfer strategies
633
+ * Fixed some tests so that they pass more reliably
634
+ * Added Guzzle\Common\Log\ArrayLogAdapter
635
+
636
+ ## 2.6.6 - 2012-06-10
637
+
638
+ * BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin
639
+ * BC: Removing Guzzle\Service\Command\CommandSet
640
+ * Adding generic batching system (replaces the batch queue plugin and command set)
641
+ * Updating ZF cache and log adapters and now using ZF's composer repository
642
+ * Bug: Setting the name of each ApiParam when creating through an ApiCommand
643
+ * Adding result_type, result_doc, deprecated, and doc_url to service descriptions
644
+ * Bug: Changed the default cookie header casing back to 'Cookie'
645
+
646
+ ## 2.6.5 - 2012-06-03
647
+
648
+ * BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource()
649
+ * BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from
650
+ * BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data
651
+ * BC: Renaming methods in the CookieJarInterface
652
+ * Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations
653
+ * Making the default glue for HTTP headers ';' instead of ','
654
+ * Adding a removeValue to Guzzle\Http\Message\Header
655
+ * Adding getCookies() to request interface.
656
+ * Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber()
657
+
658
+ ## 2.6.4 - 2012-05-30
659
+
660
+ * BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class.
661
+ * BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand
662
+ * Bug: Fixing magic method command calls on clients
663
+ * Bug: Email constraint only validates strings
664
+ * Bug: Aggregate POST fields when POST files are present in curl handle
665
+ * Bug: Fixing default User-Agent header
666
+ * Bug: Only appending or prepending parameters in commands if they are specified
667
+ * Bug: Not requiring response reason phrases or status codes to match a predefined list of codes
668
+ * Allowing the use of dot notation for class namespaces when using instance_of constraint
669
+ * Added any_match validation constraint
670
+ * Added an AsyncPlugin
671
+ * Passing request object to the calculateWait method of the ExponentialBackoffPlugin
672
+ * Allowing the result of a command object to be changed
673
+ * Parsing location and type sub values when instantiating a service description rather than over and over at runtime
674
+
675
+ ## 2.6.3 - 2012-05-23
676
+
677
+ * [BC] Guzzle\Common\FromConfigInterface no longer requires any config options.
678
+ * [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields.
679
+ * You can now use an array of data when creating PUT request bodies in the request factory.
680
+ * Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable.
681
+ * [Http] Adding support for Content-Type in multipart POST uploads per upload
682
+ * [Http] Added support for uploading multiple files using the same name (foo[0], foo[1])
683
+ * Adding more POST data operations for easier manipulation of POST data.
684
+ * You can now set empty POST fields.
685
+ * The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files.
686
+ * Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate.
687
+ * CS updates
688
+
689
+ ## 2.6.2 - 2012-05-19
690
+
691
+ * [Http] Better handling of nested scope requests in CurlMulti. Requests are now always prepares in the send() method rather than the addRequest() method.
692
+
693
+ ## 2.6.1 - 2012-05-19
694
+
695
+ * [BC] Removing 'path' support in service descriptions. Use 'uri'.
696
+ * [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache.
697
+ * [BC] Removing Guzzle\Common\NullObject. Use https://github.com/mtdowling/NullObject if you need it.
698
+ * [BC] Removing Guzzle\Common\XmlElement.
699
+ * All commands, both dynamic and concrete, have ApiCommand objects.
700
+ * Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits.
701
+ * Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored.
702
+ * Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible.
703
+
704
+ ## 2.6.0 - 2012-05-15
705
+
706
+ * [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder
707
+ * [BC] Executing a Command returns the result of the command rather than the command
708
+ * [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed.
709
+ * [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args.
710
+ * [BC] Moving ResourceIterator* to Guzzle\Service\Resource
711
+ * [BC] Completely refactored ResourceIterators to iterate over a cloned command object
712
+ * [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate
713
+ * [BC] Guzzle\Guzzle is now deprecated
714
+ * Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject
715
+ * Adding Guzzle\Version class to give version information about Guzzle
716
+ * Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate()
717
+ * Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data
718
+ * ServiceDescription and ServiceBuilder are now cacheable using similar configs
719
+ * Changing the format of XML and JSON service builder configs. Backwards compatible.
720
+ * Cleaned up Cookie parsing
721
+ * Trimming the default Guzzle User-Agent header
722
+ * Adding a setOnComplete() method to Commands that is called when a command completes
723
+ * Keeping track of requests that were mocked in the MockPlugin
724
+ * Fixed a caching bug in the CacheAdapterFactory
725
+ * Inspector objects can be injected into a Command object
726
+ * Refactoring a lot of code and tests to be case insensitive when dealing with headers
727
+ * Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL
728
+ * Adding the ability to set global option overrides to service builder configs
729
+ * Adding the ability to include other service builder config files from within XML and JSON files
730
+ * Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method.
731
+
732
+ ## 2.5.0 - 2012-05-08
733
+
734
+ * Major performance improvements
735
+ * [BC] Simplifying Guzzle\Common\Collection. Please check to see if you are using features that are now deprecated.
736
+ * [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component.
737
+ * [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates. Use "{}"
738
+ * Added the ability to passed parameters to all requests created by a client
739
+ * Added callback functionality to the ExponentialBackoffPlugin
740
+ * Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies.
741
+ * Rewinding request stream bodies when retrying requests
742
+ * Exception is thrown when JSON response body cannot be decoded
743
+ * Added configurable magic method calls to clients and commands. This is off by default.
744
+ * Fixed a defect that added a hash to every parsed URL part
745
+ * Fixed duplicate none generation for OauthPlugin.
746
+ * Emitting an event each time a client is generated by a ServiceBuilder
747
+ * Using an ApiParams object instead of a Collection for parameters of an ApiCommand
748
+ * cache.* request parameters should be renamed to params.cache.*
749
+ * Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc). See CurlHandle.
750
+ * Added the ability to disable type validation of service descriptions
751
+ * ServiceDescriptions and ServiceBuilders are now Serializable
vendor/sendgrid-php/vendor/guzzle/guzzle/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2011 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/sendgrid-php/vendor/guzzle/guzzle/README.md ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Guzzle, PHP HTTP client and webservice framework
2
+ ================================================
3
+
4
+ # This is an old version of Guzzle
5
+
6
+ This repository is for Guzzle 3.x. Guzzle 5.x, the new version of Guzzle, has
7
+ been released and is available at
8
+ [https://github.com/guzzle/guzzle](https://github.com/guzzle/guzzle). The
9
+ documentation for Guzzle version 5+ can be found at
10
+ [http://guzzlephp.org](http://guzzlephp.org).
11
+
12
+ Guzzle 3 is only maintained for bug and security fixes. Guzzle 3 will be EOL
13
+ at some point in late 2015.
14
+
15
+ ### About Guzzle 3
16
+
17
+ [![Composer Downloads](https://poser.pugx.org/guzzle/guzzle/d/total.png)](https://packagist.org/packages/guzzle/guzzle)
18
+ [![Build Status](https://secure.travis-ci.org/guzzle/guzzle3.png?branch=master)](http://travis-ci.org/guzzle/guzzle3)
19
+
20
+ - Extremely powerful API provides all the power of cURL with a simple interface.
21
+ - Truly take advantage of HTTP/1.1 with persistent connections, connection pooling, and parallel requests.
22
+ - Service description DSL allows you build awesome web service clients faster.
23
+ - Symfony2 event-based plugin system allows you to completely modify the behavior of a request.
24
+
25
+ Get answers with: [Documentation](http://guzzle3.readthedocs.org/en/latest/), [Forums](https://groups.google.com/forum/?hl=en#!forum/guzzle), IRC ([#guzzlephp](irc://irc.freenode.net/#guzzlephp) @ irc.freenode.net)
26
+
27
+ ### Installing via Composer
28
+
29
+ The recommended way to install Guzzle is through [Composer](http://getcomposer.org).
30
+
31
+ ```bash
32
+ # Install Composer
33
+ curl -sS https://getcomposer.org/installer | php
34
+
35
+ # Add Guzzle as a dependency
36
+ php composer.phar require guzzle/guzzle:~3.9
37
+ ```
38
+
39
+ After installing, you need to require Composer's autoloader:
40
+
41
+ ```php
42
+ require 'vendor/autoload.php';
43
+ ```
44
+ ## Known Issues
45
+
46
+ 1. Problem following a specific redirect: https://github.com/guzzle/guzzle/issues/385.
47
+ This has been fixed in Guzzle 4/5.
48
+ 2. Root XML attributes not serialized in a service description: https://github.com/guzzle/guzzle3/issues/5.
49
+ This has been fixed in Guzzle 4/5.
50
+ 3. Accept-Encoding not preserved when following redirect: https://github.com/guzzle/guzzle3/issues/9
51
+ Fixed in Guzzle 4/5.
52
+ 4. String "Array" Transmitted w/ PostFiles and Duplicate Aggregator: https://github.com/guzzle/guzzle3/issues/10
53
+ Fixed in Guzzle 4/5.
54
+ 5. Recursive model references with array items: https://github.com/guzzle/guzzle3/issues/13
55
+ Fixed in Guzzle 4/5
56
+ 6. String "Array" Transmitted w/ PostFiles and Duplicate Aggregator: https://github.com/guzzle/guzzle3/issues/10
57
+ Fixed in Guzzle 4/5.
vendor/sendgrid-php/vendor/guzzle/guzzle/UPGRADING.md ADDED
@@ -0,0 +1,537 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Guzzle Upgrade Guide
2
+ ====================
3
+
4
+ 3.6 to 3.7
5
+ ----------
6
+
7
+ ### Deprecations
8
+
9
+ - You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.:
10
+
11
+ ```php
12
+ \Guzzle\Common\Version::$emitWarnings = true;
13
+ ```
14
+
15
+ The following APIs and options have been marked as deprecated:
16
+
17
+ - Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead.
18
+ - Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
19
+ - Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
20
+ - Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.
21
+ - Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.
22
+ - Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated
23
+ - Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client.
24
+ - Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.
25
+ - Marked `Guzzle\Common\Collection::inject()` as deprecated.
26
+ - Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use
27
+ `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or
28
+ `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));`
29
+
30
+ 3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational
31
+ request methods. When paired with a client's configuration settings, these options allow you to specify default settings
32
+ for various aspects of a request. Because these options make other previous configuration options redundant, several
33
+ configuration options and methods of a client and AbstractCommand have been deprecated.
34
+
35
+ - Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`.
36
+ - Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`.
37
+ - Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')`
38
+ - Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0
39
+
40
+ $command = $client->getCommand('foo', array(
41
+ 'command.headers' => array('Test' => '123'),
42
+ 'command.response_body' => '/path/to/file'
43
+ ));
44
+
45
+ // Should be changed to:
46
+
47
+ $command = $client->getCommand('foo', array(
48
+ 'command.request_options' => array(
49
+ 'headers' => array('Test' => '123'),
50
+ 'save_as' => '/path/to/file'
51
+ )
52
+ ));
53
+
54
+ ### Interface changes
55
+
56
+ Additions and changes (you will need to update any implementations or subclasses you may have created):
57
+
58
+ - Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`:
59
+ createRequest, head, delete, put, patch, post, options, prepareRequest
60
+ - Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()`
61
+ - Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface`
62
+ - Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to
63
+ `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a
64
+ resource, string, or EntityBody into the $options parameter to specify the download location of the response.
65
+ - Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a
66
+ default `array()`
67
+ - Added `Guzzle\Stream\StreamInterface::isRepeatable`
68
+ - Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods.
69
+
70
+ The following methods were removed from interfaces. All of these methods are still available in the concrete classes
71
+ that implement them, but you should update your code to use alternative methods:
72
+
73
+ - Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use
74
+ `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or
75
+ `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or
76
+ `$client->setDefaultOption('headers/{header_name}', 'value')`. or
77
+ `$client->setDefaultOption('headers', array('header_name' => 'value'))`.
78
+ - Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`.
79
+ - Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail.
80
+ - Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail.
81
+ - Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail.
82
+ - Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin.
83
+ - Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin.
84
+ - Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin.
85
+
86
+ ### Cache plugin breaking changes
87
+
88
+ - CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a
89
+ CacheStorageInterface. These two objects and interface will be removed in a future version.
90
+ - Always setting X-cache headers on cached responses
91
+ - Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin
92
+ - `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface
93
+ $request, Response $response);`
94
+ - `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`
95
+ - `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`
96
+ - Added `CacheStorageInterface::purge($url)`
97
+ - `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin
98
+ $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,
99
+ CanCacheStrategyInterface $canCache = null)`
100
+ - Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`
101
+
102
+ 3.5 to 3.6
103
+ ----------
104
+
105
+ * Mixed casing of headers are now forced to be a single consistent casing across all values for that header.
106
+ * Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution
107
+ * Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().
108
+ For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader().
109
+ Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request.
110
+ * Specific header implementations can be created for complex headers. When a message creates a header, it uses a
111
+ HeaderFactory which can map specific headers to specific header classes. There is now a Link header and
112
+ CacheControl header implementation.
113
+ * Moved getLinks() from Response to just be used on a Link header object.
114
+
115
+ If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the
116
+ HeaderInterface (e.g. toArray(), getAll(), etc).
117
+
118
+ ### Interface changes
119
+
120
+ * Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate
121
+ * Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti()
122
+ * Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in
123
+ Guzzle\Http\Curl\RequestMediator
124
+ * Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.
125
+ * Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface
126
+ * Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders()
127
+
128
+ ### Removed deprecated functions
129
+
130
+ * Removed Guzzle\Parser\ParserRegister::get(). Use getParser()
131
+ * Removed Guzzle\Parser\ParserRegister::set(). Use registerParser().
132
+
133
+ ### Deprecations
134
+
135
+ * The ability to case-insensitively search for header values
136
+ * Guzzle\Http\Message\Header::hasExactHeader
137
+ * Guzzle\Http\Message\Header::raw. Use getAll()
138
+ * Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object
139
+ instead.
140
+
141
+ ### Other changes
142
+
143
+ * All response header helper functions return a string rather than mixing Header objects and strings inconsistently
144
+ * Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc are managed by Guzzle
145
+ directly via interfaces
146
+ * Removed the injecting of a request object onto a response object. The methods to get and set a request still exist
147
+ but are a no-op until removed.
148
+ * Most classes that used to require a ``Guzzle\Service\Command\CommandInterface` typehint now request a
149
+ `Guzzle\Service\Command\ArrayCommandInterface`.
150
+ * Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response
151
+ on a request while the request is still being transferred
152
+ * `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess
153
+
154
+ 3.3 to 3.4
155
+ ----------
156
+
157
+ Base URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs.
158
+
159
+ 3.2 to 3.3
160
+ ----------
161
+
162
+ ### Response::getEtag() quote stripping removed
163
+
164
+ `Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header
165
+
166
+ ### Removed `Guzzle\Http\Utils`
167
+
168
+ The `Guzzle\Http\Utils` class was removed. This class was only used for testing.
169
+
170
+ ### Stream wrapper and type
171
+
172
+ `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to lowercase.
173
+
174
+ ### curl.emit_io became emit_io
175
+
176
+ Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the
177
+ 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'
178
+
179
+ 3.1 to 3.2
180
+ ----------
181
+
182
+ ### CurlMulti is no longer reused globally
183
+
184
+ Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added
185
+ to a single client can pollute requests dispatched from other clients.
186
+
187
+ If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the
188
+ ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is
189
+ created.
190
+
191
+ ```php
192
+ $multi = new Guzzle\Http\Curl\CurlMulti();
193
+ $builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json');
194
+ $builder->addListener('service_builder.create_client', function ($event) use ($multi) {
195
+ $event['client']->setCurlMulti($multi);
196
+ }
197
+ });
198
+ ```
199
+
200
+ ### No default path
201
+
202
+ URLs no longer have a default path value of '/' if no path was specified.
203
+
204
+ Before:
205
+
206
+ ```php
207
+ $request = $client->get('http://www.foo.com');
208
+ echo $request->getUrl();
209
+ // >> http://www.foo.com/
210
+ ```
211
+
212
+ After:
213
+
214
+ ```php
215
+ $request = $client->get('http://www.foo.com');
216
+ echo $request->getUrl();
217
+ // >> http://www.foo.com
218
+ ```
219
+
220
+ ### Less verbose BadResponseException
221
+
222
+ The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and
223
+ response information. You can, however, get access to the request and response object by calling `getRequest()` or
224
+ `getResponse()` on the exception object.
225
+
226
+ ### Query parameter aggregation
227
+
228
+ Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a
229
+ setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is
230
+ responsible for handling the aggregation of multi-valued query string variables into a flattened hash.
231
+
232
+ 2.8 to 3.x
233
+ ----------
234
+
235
+ ### Guzzle\Service\Inspector
236
+
237
+ Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig`
238
+
239
+ **Before**
240
+
241
+ ```php
242
+ use Guzzle\Service\Inspector;
243
+
244
+ class YourClient extends \Guzzle\Service\Client
245
+ {
246
+ public static function factory($config = array())
247
+ {
248
+ $default = array();
249
+ $required = array('base_url', 'username', 'api_key');
250
+ $config = Inspector::fromConfig($config, $default, $required);
251
+
252
+ $client = new self(
253
+ $config->get('base_url'),
254
+ $config->get('username'),
255
+ $config->get('api_key')
256
+ );
257
+ $client->setConfig($config);
258
+
259
+ $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));
260
+
261
+ return $client;
262
+ }
263
+ ```
264
+
265
+ **After**
266
+
267
+ ```php
268
+ use Guzzle\Common\Collection;
269
+
270
+ class YourClient extends \Guzzle\Service\Client
271
+ {
272
+ public static function factory($config = array())
273
+ {
274
+ $default = array();
275
+ $required = array('base_url', 'username', 'api_key');
276
+ $config = Collection::fromConfig($config, $default, $required);
277
+
278
+ $client = new self(
279
+ $config->get('base_url'),
280
+ $config->get('username'),
281
+ $config->get('api_key')
282
+ );
283
+ $client->setConfig($config);
284
+
285
+ $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));
286
+
287
+ return $client;
288
+ }
289
+ ```
290
+
291
+ ### Convert XML Service Descriptions to JSON
292
+
293
+ **Before**
294
+
295
+ ```xml
296
+ <?xml version="1.0" encoding="UTF-8"?>
297
+ <client>
298
+ <commands>
299
+ <!-- Groups -->
300
+ <command name="list_groups" method="GET" uri="groups.json">
301
+ <doc>Get a list of groups</doc>
302
+ </command>
303
+ <command name="search_groups" method="GET" uri='search.json?query="{{query}} type:group"'>
304
+ <doc>Uses a search query to get a list of groups</doc>
305
+ <param name="query" type="string" required="true" />
306
+ </command>
307
+ <command name="create_group" method="POST" uri="groups.json">
308
+ <doc>Create a group</doc>
309
+ <param name="data" type="array" location="body" filters="json_encode" doc="Group JSON"/>
310
+ <param name="Content-Type" location="header" static="application/json"/>
311
+ </command>
312
+ <command name="delete_group" method="DELETE" uri="groups/{{id}}.json">
313
+ <doc>Delete a group by ID</doc>
314
+ <param name="id" type="integer" required="true"/>
315
+ </command>
316
+ <command name="get_group" method="GET" uri="groups/{{id}}.json">
317
+ <param name="id" type="integer" required="true"/>
318
+ </command>
319
+ <command name="update_group" method="PUT" uri="groups/{{id}}.json">
320
+ <doc>Update a group</doc>
321
+ <param name="id" type="integer" required="true"/>
322
+ <param name="data" type="array" location="body" filters="json_encode" doc="Group JSON"/>
323
+ <param name="Content-Type" location="header" static="application/json"/>
324
+ </command>
325
+ </commands>
326
+ </client>
327
+ ```
328
+
329
+ **After**
330
+
331
+ ```json
332
+ {
333
+ "name": "Zendesk REST API v2",
334
+ "apiVersion": "2012-12-31",
335
+ "description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users",
336
+ "operations": {
337
+ "list_groups": {
338
+ "httpMethod":"GET",
339
+ "uri": "groups.json",
340
+ "summary": "Get a list of groups"
341
+ },
342
+ "search_groups":{
343
+ "httpMethod":"GET",
344
+ "uri": "search.json?query=\"{query} type:group\"",
345
+ "summary": "Uses a search query to get a list of groups",
346
+ "parameters":{
347
+ "query":{
348
+ "location": "uri",
349
+ "description":"Zendesk Search Query",
350
+ "type": "string",
351
+ "required": true
352
+ }
353
+ }
354
+ },
355
+ "create_group": {
356
+ "httpMethod":"POST",
357
+ "uri": "groups.json",
358
+ "summary": "Create a group",
359
+ "parameters":{
360
+ "data": {
361
+ "type": "array",
362
+ "location": "body",
363
+ "description":"Group JSON",
364
+ "filters": "json_encode",
365
+ "required": true
366
+ },
367
+ "Content-Type":{
368
+ "type": "string",
369
+ "location":"header",
370
+ "static": "application/json"
371
+ }
372
+ }
373
+ },
374
+ "delete_group": {
375
+ "httpMethod":"DELETE",
376
+ "uri": "groups/{id}.json",
377
+ "summary": "Delete a group",
378
+ "parameters":{
379
+ "id":{
380
+ "location": "uri",
381
+ "description":"Group to delete by ID",
382
+ "type": "integer",
383
+ "required": true
384
+ }
385
+ }
386
+ },
387
+ "get_group": {
388
+ "httpMethod":"GET",
389
+ "uri": "groups/{id}.json",
390
+ "summary": "Get a ticket",
391
+ "parameters":{
392
+ "id":{
393
+ "location": "uri",
394
+ "description":"Group to get by ID",
395
+ "type": "integer",
396
+ "required": true
397
+ }
398
+ }
399
+ },
400
+ "update_group": {
401
+ "httpMethod":"PUT",
402
+ "uri": "groups/{id}.json",
403
+ "summary": "Update a group",
404
+ "parameters":{
405
+ "id": {
406
+ "location": "uri",
407
+ "description":"Group to update by ID",
408
+ "type": "integer",
409
+ "required": true
410
+ },
411
+ "data": {
412
+ "type": "array",
413
+ "location": "body",
414
+ "description":"Group JSON",
415
+ "filters": "json_encode",
416
+ "required": true
417
+ },
418
+ "Content-Type":{
419
+ "type": "string",
420
+ "location":"header",
421
+ "static": "application/json"
422
+ }
423
+ }
424
+ }
425
+ }
426
+ ```
427
+
428
+ ### Guzzle\Service\Description\ServiceDescription
429
+
430
+ Commands are now called Operations
431
+
432
+ **Before**
433
+
434
+ ```php
435
+ use Guzzle\Service\Description\ServiceDescription;
436
+
437
+ $sd = new ServiceDescription();
438
+ $sd->getCommands(); // @returns ApiCommandInterface[]
439
+ $sd->hasCommand($name);
440
+ $sd->getCommand($name); // @returns ApiCommandInterface|null
441
+ $sd->addCommand($command); // @param ApiCommandInterface $command
442
+ ```
443
+
444
+ **After**
445
+
446
+ ```php
447
+ use Guzzle\Service\Description\ServiceDescription;
448
+
449
+ $sd = new ServiceDescription();
450
+ $sd->getOperations(); // @returns OperationInterface[]
451
+ $sd->hasOperation($name);
452
+ $sd->getOperation($name); // @returns OperationInterface|null
453
+ $sd->addOperation($operation); // @param OperationInterface $operation
454
+ ```
455
+
456
+ ### Guzzle\Common\Inflection\Inflector
457
+
458
+ Namespace is now `Guzzle\Inflection\Inflector`
459
+
460
+ ### Guzzle\Http\Plugin
461
+
462
+ Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below.
463
+
464
+ ### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log
465
+
466
+ Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively.
467
+
468
+ **Before**
469
+
470
+ ```php
471
+ use Guzzle\Common\Log\ClosureLogAdapter;
472
+ use Guzzle\Http\Plugin\LogPlugin;
473
+
474
+ /** @var \Guzzle\Http\Client */
475
+ $client;
476
+
477
+ // $verbosity is an integer indicating desired message verbosity level
478
+ $client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE);
479
+ ```
480
+
481
+ **After**
482
+
483
+ ```php
484
+ use Guzzle\Log\ClosureLogAdapter;
485
+ use Guzzle\Log\MessageFormatter;
486
+ use Guzzle\Plugin\Log\LogPlugin;
487
+
488
+ /** @var \Guzzle\Http\Client */
489
+ $client;
490
+
491
+ // $format is a string indicating desired message format -- @see MessageFormatter
492
+ $client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT);
493
+ ```
494
+
495
+ ### Guzzle\Http\Plugin\CurlAuthPlugin
496
+
497
+ Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`.
498
+
499
+ ### Guzzle\Http\Plugin\ExponentialBackoffPlugin
500
+
501
+ Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes.
502
+
503
+ **Before**
504
+
505
+ ```php
506
+ use Guzzle\Http\Plugin\ExponentialBackoffPlugin;
507
+
508
+ $backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge(
509
+ ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429)
510
+ ));
511
+
512
+ $client->addSubscriber($backoffPlugin);
513
+ ```
514
+
515
+ **After**
516
+
517
+ ```php
518
+ use Guzzle\Plugin\Backoff\BackoffPlugin;
519
+ use Guzzle\Plugin\Backoff\HttpBackoffStrategy;
520
+
521
+ // Use convenient factory method instead -- see implementation for ideas of what
522
+ // you can do with chaining backoff strategies
523
+ $backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge(
524
+ HttpBackoffStrategy::getDefaultFailureCodes(), array(429)
525
+ ));
526
+ $client->addSubscriber($backoffPlugin);
527
+ ```
528
+
529
+ ### Known Issues
530
+
531
+ #### [BUG] Accept-Encoding header behavior changed unintentionally.
532
+
533
+ (See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e)
534
+
535
+ In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to
536
+ properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen.
537
+ See issue #217 for a workaround, or use a version containing the fix.
vendor/sendgrid-php/vendor/guzzle/guzzle/build.xml ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project name="guzzle" default="test">
3
+ <!-- set local values, like git location -->
4
+ <property file="phing/build.properties.dist" override="true" />
5
+ <property file="phing/build.properties" override="true" />
6
+
7
+ <property name="dir.output" value="${project.basedir}/build/artifacts" />
8
+ <property name="dir.imports" value="${project.basedir}/phing/imports" />
9
+ <property name="dir.bin" value="${project.basedir}/bin" />
10
+ <property name="repo.dir" value="${project.basedir}" />
11
+
12
+ <import file="${dir.imports}/dependencies.xml"/>
13
+ <import file="${dir.imports}/deploy.xml"/>
14
+
15
+ <target name="composer-lint" description="lint-check composer.json only">
16
+ <composerlint dir="${project.basedir}/src" file="{$project.basedir}/composer.json" />
17
+ </target>
18
+
19
+ <target name="test" description="Run unit tests">
20
+ <exec passthru="true" command="vendor/bin/phpunit" checkReturn="true" />
21
+ </target>
22
+
23
+ <target name="build-init" description="Initialize local phing properties">
24
+ <copy file="phing/build.properties.dist" tofile="phing/build.properties" overwrite="false" />
25
+ </target>
26
+
27
+ <target name="clean">
28
+ <delete dir="${dir.output}"/>
29
+ <delete dir="${project.basedir}/build/pearwork"/>
30
+ </target>
31
+
32
+ <target name="prepare" depends="clean,build-init">
33
+ <mkdir dir="${dir.output}"/>
34
+ <mkdir dir="${dir.output}/logs" />
35
+ </target>
36
+
37
+ <target name="coverage" depends="prepare">
38
+ <exec passthru="true" command="vendor/bin/phpunit --coverage-html=${dir.output}/coverage" />
39
+ </target>
40
+
41
+ <target name="view-coverage">
42
+ <exec passthru="true" command="open ${dir.output}/coverage/index.html" />
43
+ </target>
44
+
45
+ </project>
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/Makefile ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Makefile for Sphinx documentation
2
+ #
3
+
4
+ # You can set these variables from the command line.
5
+ SPHINXOPTS =
6
+ SPHINXBUILD = sphinx-build
7
+ PAPER =
8
+ BUILDDIR = _build
9
+
10
+ # Internal variables.
11
+ PAPEROPT_a4 = -D latex_paper_size=a4
12
+ PAPEROPT_letter = -D latex_paper_size=letter
13
+ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
14
+ # the i18n builder cannot share the environment and doctrees with the others
15
+ I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
16
+
17
+ .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
18
+
19
+ help:
20
+ @echo "Please use \`make <target>' where <target> is one of"
21
+ @echo " html to make standalone HTML files"
22
+ @echo " dirhtml to make HTML files named index.html in directories"
23
+ @echo " singlehtml to make a single large HTML file"
24
+ @echo " pickle to make pickle files"
25
+ @echo " json to make JSON files"
26
+ @echo " htmlhelp to make HTML files and a HTML help project"
27
+ @echo " qthelp to make HTML files and a qthelp project"
28
+ @echo " devhelp to make HTML files and a Devhelp project"
29
+ @echo " epub to make an epub"
30
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
31
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
32
+ @echo " text to make text files"
33
+ @echo " man to make manual pages"
34
+ @echo " texinfo to make Texinfo files"
35
+ @echo " info to make Texinfo files and run them through makeinfo"
36
+ @echo " gettext to make PO message catalogs"
37
+ @echo " changes to make an overview of all changed/added/deprecated items"
38
+ @echo " linkcheck to check all external links for integrity"
39
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
40
+
41
+ clean:
42
+ -rm -rf $(BUILDDIR)/*
43
+
44
+ html:
45
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
46
+ @echo
47
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
48
+
49
+ dirhtml:
50
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
51
+ @echo
52
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
53
+
54
+ singlehtml:
55
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
56
+ @echo
57
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
58
+
59
+ pickle:
60
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
61
+ @echo
62
+ @echo "Build finished; now you can process the pickle files."
63
+
64
+ json:
65
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
66
+ @echo
67
+ @echo "Build finished; now you can process the JSON files."
68
+
69
+ htmlhelp:
70
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
71
+ @echo
72
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
73
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
74
+
75
+ qthelp:
76
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
77
+ @echo
78
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
79
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
80
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Guzzle.qhcp"
81
+ @echo "To view the help file:"
82
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Guzzle.qhc"
83
+
84
+ devhelp:
85
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
86
+ @echo
87
+ @echo "Build finished."
88
+ @echo "To view the help file:"
89
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/Guzzle"
90
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Guzzle"
91
+ @echo "# devhelp"
92
+
93
+ epub:
94
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
95
+ @echo
96
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
97
+
98
+ latex:
99
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
100
+ @echo
101
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
102
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
103
+ "(use \`make latexpdf' here to do that automatically)."
104
+
105
+ latexpdf:
106
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
107
+ @echo "Running LaTeX files through pdflatex..."
108
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf
109
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
110
+
111
+ text:
112
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
113
+ @echo
114
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
115
+
116
+ man:
117
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
118
+ @echo
119
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
120
+
121
+ texinfo:
122
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
123
+ @echo
124
+ @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
125
+ @echo "Run \`make' in that directory to run these through makeinfo" \
126
+ "(use \`make info' here to do that automatically)."
127
+
128
+ info:
129
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
130
+ @echo "Running Texinfo files through makeinfo..."
131
+ make -C $(BUILDDIR)/texinfo info
132
+ @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
133
+
134
+ gettext:
135
+ $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
136
+ @echo
137
+ @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
138
+
139
+ changes:
140
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
141
+ @echo
142
+ @echo "The overview file is in $(BUILDDIR)/changes."
143
+
144
+ linkcheck:
145
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
146
+ @echo
147
+ @echo "Link check complete; look for any errors in the above output " \
148
+ "or in $(BUILDDIR)/linkcheck/output.txt."
149
+
150
+ doctest:
151
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
152
+ @echo "Testing of doctests in the sources finished, look at the " \
153
+ "results in $(BUILDDIR)/doctest/output.txt."
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_downloads/guzzle-schema-1.0.json ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "additionalProperties": true,
3
+ "name": {
4
+ "type": "string",
5
+ "description": "Name of the web service"
6
+ },
7
+ "apiVersion": {
8
+ "type": ["string", "number"],
9
+ "description": "Version identifier that the service description is compatible with"
10
+ },
11
+ "baseUrl": {
12
+ "type": "string",
13
+ "description": "Base URL of the web service. Any relative URI specified in an operation will be merged with the baseUrl using the process defined in RFC 2396"
14
+ },
15
+ "basePath": {
16
+ "type": "string",
17
+ "description": "Alias of baseUrl"
18
+ },
19
+ "_description": {
20
+ "type": "string",
21
+ "description": "Short summary of the web service. This is actually called 'description' but this JSON schema wont validate using just description."
22
+ },
23
+ "operations": {
24
+ "description": "Operations of the web service",
25
+ "type": "object",
26
+ "properties": {
27
+ "extends": {
28
+ "type": "string",
29
+ "description": "Extend from another operation by name. The parent operation must be defined before the child."
30
+ },
31
+ "httpMethod": {
32
+ "type": "string",
33
+ "description": "HTTP method used with the operation (e.g. GET, POST, PUT, DELETE, PATCH, etc)"
34
+ },
35
+ "uri": {
36
+ "type": "string",
37
+ "description": "URI of the operation. The uri attribute can contain URI templates. The variables of the URI template are parameters of the operation with a location value of uri"
38
+ },
39
+ "summary": {
40
+ "type": "string",
41
+ "description": "Short summary of what the operation does"
42
+ },
43
+ "class": {
44
+ "type": "string",
45
+ "description": "Custom class to instantiate instead of the default Guzzle\\Service\\Command\\OperationCommand"
46
+ },
47
+ "responseClass": {
48
+ "type": "string",
49
+ "description": "This is what is returned from the method. Can be a primitive, class name, or model name."
50
+ },
51
+ "responseNotes": {
52
+ "type": "string",
53
+ "description": "A description of the response returned by the operation"
54
+ },
55
+ "responseType": {
56
+ "type": "string",
57
+ "description": "The type of response that the operation creates. If not specified, this value will be automatically inferred based on whether or not there is a model matching the name, if a matching class name is found, or set to 'primitive' by default.",
58
+ "enum": [ "primitive", "class", "model", "documentation" ]
59
+ },
60
+ "deprecated": {
61
+ "type": "boolean",
62
+ "description": "Whether or not the operation is deprecated"
63
+ },
64
+ "errorResponses": {
65
+ "description": "Errors that could occur while executing the operation",
66
+ "type": "array",
67
+ "items": {
68
+ "type": "object",
69
+ "properties": {
70
+ "code": {
71
+ "type": "number",
72
+ "description": "HTTP response status code of the error"
73
+ },
74
+ "reason": {
75
+ "type": "string",
76
+ "description": "Response reason phrase or description of the error"
77
+ },
78
+ "class": {
79
+ "type": "string",
80
+ "description": "A custom exception class that would be thrown if the error is encountered"
81
+ }
82
+ }
83
+ }
84
+ },
85
+ "data": {
86
+ "type": "object",
87
+ "additionalProperties": "true"
88
+ },
89
+ "parameters": {
90
+ "$ref": "parameters",
91
+ "description": "Parameters of the operation. Parameters are used to define how input data is serialized into a HTTP request."
92
+ },
93
+ "additionalParameters": {
94
+ "$ref": "parameters",
95
+ "description": "Validation and serialization rules for any parameter supplied to the operation that was not explicitly defined."
96
+ }
97
+ }
98
+ },
99
+ "models": {
100
+ "description": "Schema models that can be referenced throughout the service description. Models can be used to define how an HTTP response is parsed into a Guzzle\\Service\\Resource\\Model object.",
101
+ "type": "object",
102
+ "properties": {
103
+ "$ref": "parameters",
104
+ "description": "Parameters of the model. When a model is referenced in a responseClass attribute of an operation, parameters define how a HTTP response message is parsed into a Guzzle\\Service\\Resource\\Model."
105
+ }
106
+ },
107
+ "includes": {
108
+ "description": "Service description files to include and extend from (can be a .json, .js, or .php file)",
109
+ "type": "array",
110
+ "items": {
111
+ "type": "string",
112
+ "pattern": ".+\\.(js|json|php)$"
113
+ }
114
+ },
115
+ "definitions": {
116
+ "parameters": {
117
+ "extends": "http://json-schema.org/schema",
118
+ "id": "parameters",
119
+ "name": {
120
+ "type": "string",
121
+ "description": "Unique name of the parameter"
122
+ },
123
+ "type": {
124
+ "type": ["string", "array"],
125
+ "description": "Type of variable (string, number, integer, boolean, object, array, numeric, null, any). Types are using for validation and determining the structure of a parameter. You can use a union type by providing an array of simple types. If one of the union types matches the provided value, then the value is valid."
126
+ },
127
+ "instanceOf": {
128
+ "type": "string",
129
+ "description": "When the type is an object, you can specify the class that the object must implement"
130
+ },
131
+ "required": {
132
+ "type": "boolean",
133
+ "description": "Whether or not the parameter is required"
134
+ },
135
+ "default": {
136
+ "description": "Default value to use if no value is supplied"
137
+ },
138
+ "static": {
139
+ "type": "bool",
140
+ "description": "Set to true to specify that the parameter value cannot be changed from the default setting"
141
+ },
142
+ "description": {
143
+ "type": "string",
144
+ "description": "Documentation of the parameter"
145
+ },
146
+ "location": {
147
+ "type": "string",
148
+ "description": "The location of a request used to apply a parameter. Custom locations can be registered with a command, but the defaults are uri, query, statusCode, reasonPhrase, header, body, json, xml, postField, postFile, responseBody"
149
+ },
150
+ "sentAs": {
151
+ "type": "string",
152
+ "description": "Specifies how the data being modeled is sent over the wire. For example, you may wish to include certain headers in a response model that have a normalized casing of FooBar, but the actual header is x-foo-bar. In this case, sentAs would be set to x-foo-bar."
153
+ },
154
+ "filters": {
155
+ "type": "array",
156
+ "description": "Array of static method names to to run a parameter value through. Each value in the array must be a string containing the full class path to a static method or an array of complex filter information. You can specify static methods of classes using the full namespace class name followed by ‘::’ (e.g. FooBar::baz()). Some filters require arguments in order to properly filter a value. For complex filters, use a hash containing a ‘method’ key pointing to a static method, and an ‘args’ key containing an array of positional arguments to pass to the method. Arguments can contain keywords that are replaced when filtering a value: '@value‘ is replaced with the value being validated, '@api‘ is replaced with the Parameter object.",
157
+ "items": {
158
+ "type": ["string", {
159
+ "object": {
160
+ "properties": {
161
+ "method": {
162
+ "type": "string",
163
+ "description": "PHP function to call",
164
+ "required": true
165
+ },
166
+ "args": {
167
+ "type": "array"
168
+ }
169
+ }
170
+ }
171
+ }]
172
+ }
173
+ }
174
+ }
175
+ }
176
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_static/guzzle-icon.png ADDED
Binary file
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_static/homepage.css ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Hero unit on homepage */
2
+
3
+ .hero-unit h1 {
4
+ font-size: 49px;
5
+ margin-bottom: 12px;
6
+ }
7
+
8
+ .hero-unit {
9
+ padding: 40px;
10
+ }
11
+
12
+ .hero-unit p {
13
+ font-size: 17px;
14
+ }
15
+
16
+ .masthead img {
17
+ float: left;
18
+ margin-right: 17px;
19
+ }
20
+
21
+ .hero-unit ul li {
22
+ margin-left: 220px;
23
+ }
24
+
25
+ .hero-unit .buttons {
26
+ text-align: center;
27
+ }
28
+
29
+ .jumbotron {
30
+ position: relative;
31
+ padding: 40px 0;
32
+ color: #fff;
33
+ text-shadow: 0 1px 3px rgba(0,0,0,.4), 0 0 30px rgba(0,0,0,.075);
34
+ background: #00312F;
35
+ background: -moz-linear-gradient(45deg, #002F31 0%, #335A6D 100%);
36
+ background: -webkit-gradient(linear, left bottom, right top, color-stop(0%,#00312D), color-stop(100%,#33566D));
37
+ background: -webkit-linear-gradient(45deg, #020031 0%,#334F6D 100%);
38
+ background: -o-linear-gradient(45deg, #002D31 0%,#334D6D 100%);
39
+ background: -ms-linear-gradient(45deg, #002F31 0%,#33516D 100%);
40
+ background: linear-gradient(45deg, #020031 0%,#33516D 100%);
41
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#020031', endColorstr='#6d3353',GradientType=1 );
42
+ -webkit-box-shadow: inset 0 3px 7px rgba(0, 0, 0, .2), inset 0 -3px 7px rgba(0, 0, 0, .2);
43
+ -moz-box-shadow: inset 0 3px 7px rgba(0,0,0,.2), inset 0 -3px 7px rgba(0,0,0,.2);
44
+ box-shadow: inset 0 3px 7px rgba(0, 0, 0, .2), inset 0 -3px 7px rgba(0, 0, 0, .2);
45
+ }
46
+
47
+ .jumbotron h1 {
48
+ font-size: 80px;
49
+ font-weight: bold;
50
+ letter-spacing: -1px;
51
+ line-height: 1;
52
+ }
53
+
54
+ .jumbotron p {
55
+ font-size: 24px;
56
+ font-weight: 300;
57
+ line-height: 1.25;
58
+ margin-bottom: 30px;
59
+ }
60
+
61
+ .masthead {
62
+ padding: 40px 0 30px;
63
+ margin-bottom: 0;
64
+ color: #fff;
65
+ margin-top: -19px;
66
+ }
67
+
68
+ .masthead h1 {
69
+ display: none;
70
+ }
71
+
72
+ .masthead p {
73
+ font-size: 40px;
74
+ font-weight: 200;
75
+ line-height: 1.25;
76
+ margin: 12px 0 0 0;
77
+ }
78
+
79
+ .masthead .btn {
80
+ padding: 19px 24px;
81
+ font-size: 24px;
82
+ font-weight: 200;
83
+ border: 0;
84
+ }
85
+
86
+ /* Social bar on homepage */
87
+
88
+ .social {
89
+ padding: 2px 0;
90
+ text-align: center;
91
+ background-color: #f5f5f5;
92
+ border-top: 1px solid #fff;
93
+ border-bottom: 1px solid #ddd;
94
+ margin: 0 0 20px 0;
95
+ }
96
+
97
+ .social ul {
98
+ margin-top: 0;
99
+ }
100
+
101
+ .social-buttons {
102
+ margin-left: 0;
103
+ margin-bottom: 0;
104
+ padding-left: 0;
105
+ list-style: none;
106
+ }
107
+
108
+ .social-buttons li {
109
+ display: inline-block;
110
+ padding: 5px 8px;
111
+ line-height: 1;
112
+ *display: inline;
113
+ *zoom: 1;
114
+ }
115
+
116
+ .center-announcement {
117
+ padding: 10px;
118
+ background-color: rgb(238, 243, 255);
119
+ border-radius: 8px;
120
+ text-align: center;
121
+ margin: 24px 0;
122
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_static/logo.png ADDED
Binary file
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_static/prettify.css ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .com {
2
+ color: #93A1A1;
3
+ }
4
+ .lit {
5
+ color: #195F91;
6
+ }
7
+ .pun, .opn, .clo {
8
+ color: #93A1A1;
9
+ }
10
+ .fun {
11
+ color: #DC322F;
12
+ }
13
+ .str, .atv {
14
+ color: #DD1144;
15
+ }
16
+ .kwd, .linenums .tag {
17
+ color: #1E347B;
18
+ }
19
+ .typ, .atn, .dec, .var {
20
+ color: teal;
21
+ }
22
+ .pln {
23
+ color: #48484C;
24
+ }
25
+ .prettyprint {
26
+ background-color: #F7F7F9;
27
+ border: 1px solid #E1E1E8;
28
+ padding: 8px;
29
+ }
30
+ .prettyprint.linenums {
31
+ box-shadow: 40px 0 0 #FBFBFC inset, 41px 0 0 #ECECF0 inset;
32
+ }
33
+ ol.linenums {
34
+ margin: 0 0 0 33px;
35
+ }
36
+ ol.linenums li {
37
+ color: #BEBEC5;
38
+ line-height: 18px;
39
+ padding-left: 12px;
40
+ text-shadow: 0 1px 0 #FFFFFF;
41
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_static/prettify.js ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
2
+ (function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
3
+ [],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
4
+ f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
5
+ (j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
6
+ {b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
7
+ t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
8
+ "string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
9
+ l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
10
+ q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
11
+ q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
12
+ "");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
13
+ a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
14
+ for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
15
+ m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
16
+ a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
17
+ j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
18
+ "catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
19
+ H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
20
+ J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
21
+ I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
22
+ ["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
23
+ /^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
24
+ ["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
25
+ hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
26
+ !k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
27
+ 250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
28
+ PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_templates/index.html ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/javascript" src="{{ pathto('_static/prettify.js', 1) }}"></script>
2
+ <link rel="stylesheet" type="text/css" href="{{ pathto('_static/prettify.css', 1) }}" />
3
+ <link rel="stylesheet" type="text/css" href="{{ pathto('_static/homepage.css', 1) }}" />
4
+
5
+ <div class="jumbotron masthead">
6
+ <div class="container">
7
+ <img src="{{ pathto('_static/logo.png', 1) }}" alt="guzzle" width="199" height="260" />
8
+ <h1>Guzzle</h1>
9
+ <p>Guzzle is a PHP HTTP client<br />&amp; framework for building RESTful web service clients.</p>
10
+ <p>
11
+ <a class="btn btn-primary btn-lg" href="https://github.com/guzzle/guzzle">View Guzzle on GitHub</a>
12
+ <a class="btn btn-default btn-lg" href="{{ pathto('docs') }}">Read the docs</a>
13
+ </p>
14
+ </div>
15
+ </div>
16
+
17
+ <div class="social">
18
+ <ul class="social-buttons">
19
+ <li>
20
+ <iframe src="http://ghbtns.com/github-btn.html?user=guzzle&repo=guzzle&type=watch&count=true"
21
+ allowtransparency="true" frameborder="0" scrolling="0" width="110" height="20"></iframe>
22
+ </li>
23
+ <li>
24
+ <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://guzzlephp.org" data-text="Guzzle, PHP HTTP client &amp; framework for building RESTful web service clients" data-via="mtdowling">Tweet</a>
25
+ <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="http://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
26
+ </li>
27
+ <li>
28
+ <a href="https://twitter.com/mtdowling" class="twitter-follow-button" data-show-count="false">Follow @mtdowling</a>
29
+ <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="http://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
30
+ </li>
31
+ </ul>
32
+ </div>
33
+
34
+ <div class="container">
35
+
36
+ <h1>Introducing Guzzle</h1>
37
+
38
+ <p>Guzzle takes the pain out of sending HTTP requests and the redundancy out of creating web service clients. It's
39
+ a framework that includes the tools needed to create a robust web service client, including:
40
+ Service descriptions for defining the inputs and outputs of an API, resource iterators for traversing
41
+ paginated resources, batching for sending a large number of requests as efficiently as possible.</p>
42
+
43
+ <ul>
44
+ <li>All the power of cURL with a simple interface.</li>
45
+ <li>Persistent connections and parallel requests.</li>
46
+ <li>Streams request and response bodies</li>
47
+ <li><a href="{{ pathto('webservice-client/guzzle-service-descriptions') }}">Service descriptions</a> for quickly building clients.</li>
48
+ <li>Powered by the Symfony2 EventDispatcher.</li>
49
+ <li>Use all of the code or only <a href="https://packagist.org/packages/guzzle/">specific components</a>.</li>
50
+ <li><a href="{{ pathto('plugins/plugins-overview') }}">Plugins</a> for caching, logging, OAuth, mocks, and more</li>
51
+ <li>Includes a custom node.js webserver to <a href="{{ pathto('testing/unit-testing') }}">test your clients</a>.</li>
52
+ </ul>
53
+
54
+ <div class="center-announcement">
55
+ Guzzle is now part of Drupal 8 core and powers the official <a href="https://github.com/aws/aws-sdk-php">AWS SDK for PHP</a>
56
+ </div>
57
+
58
+ <h2>GitHub Example</h2>
59
+
60
+ <pre class="prettyprint">&lt;?php
61
+ require_once 'vendor/autoload.php';
62
+ use Guzzle\Http\Client;
63
+
64
+ // Create a client and provide a base URL
65
+ $client = new Client('https://api.github.com');
66
+ // Create a request with basic Auth
67
+ $request = $client->get('/user')->setAuth('user', 'pass');
68
+ // Send the request and get the response
69
+ $response = $request->send();
70
+ echo $response->getBody();
71
+ // >>> {"type":"User", ...
72
+ echo $response->getHeader('Content-Length');
73
+ // >>> 792
74
+ </pre>
75
+
76
+ <h2>Twitter Example</h2>
77
+ <pre class="prettyprint">&lt;?php
78
+ // Create a client to work with the Twitter API
79
+ $client = new Client('https://api.twitter.com/{version}', array(
80
+ 'version' => '1.1'
81
+ ));
82
+
83
+ // Sign all requests with the OauthPlugin
84
+ $client->addSubscriber(new Guzzle\Plugin\Oauth\OauthPlugin(array(
85
+ 'consumer_key' => '***',
86
+ 'consumer_secret' => '***',
87
+ 'token' => '***',
88
+ 'token_secret' => '***'
89
+ )));
90
+
91
+ echo $client->get('statuses/user_timeline.json')->send()->getBody();
92
+ // >>> {"public_gists":6,"type":"User" ...
93
+
94
+ // Create a tweet using POST
95
+ $request = $client->post('statuses/update.json', null, array(
96
+ 'status' => 'Tweeted with Guzzle, http://guzzlephp.org'
97
+ ));
98
+
99
+ // Send the request and parse the JSON response into an array
100
+ $data = $request->send()->json();
101
+ echo $data['text'];
102
+ // >>> Tweeted with Guzzle, http://t.co/kngJMfRk
103
+ </pre>
104
+ </div>
105
+
106
+ <script type="text/javascript">prettyPrint();</script>
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_templates/leftbar.html ADDED
File without changes
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/_templates/nav_links.html ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <li><a href="{{ pathto('docs') }}">Docs</a></li>
2
+ <li><a href="http://guzzlephp.org/api/index.html">API</a></li>
3
+ <li><a href="https://github.com/guzzle/guzzle">GitHub</a></li>
4
+ <li><a href="https://groups.google.com/forum/?hl=en#!forum/guzzle">Forum</a></li>
5
+ <li><a href="irc:irc.freenode.com/#guzzlephp">IRC</a></li>
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/batching/batching.rst ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ========
2
+ Batching
3
+ ========
4
+
5
+ Guzzle provides a fairly generic and very customizable batching framework that allows developers to efficiently
6
+ transfer requests in parallel.
7
+
8
+ Sending requests and commands in parallel
9
+ -----------------------------------------
10
+
11
+ You can send HTTP requests in parallel by passing an array of ``Guzzle\Http\Message\RequestInterface`` objects to
12
+ ``Guzzle\Http\Client::send()``:
13
+
14
+ .. code-block:: php
15
+
16
+ $responses = $client->send(array(
17
+ $client->get('http://www.example.com/foo'),
18
+ $client->get('http://www.example.com/baz')
19
+ $client->get('http://www.example.com/bar')
20
+ ));
21
+
22
+ You can send commands in parallel by passing an array of ``Guzzle\Service\Command\CommandInterface`` objects
23
+ ``Guzzle\Service\Client::execute()``:
24
+
25
+ .. code-block:: php
26
+
27
+ $commands = $client->execute(array(
28
+ $client->getCommand('foo'),
29
+ $client->getCommand('baz'),
30
+ $client->getCommand('bar')
31
+ ));
32
+
33
+ These approaches work well for most use-cases. When you need more control over the requests that are sent in
34
+ parallel or you need to send a large number of requests, you need to use the functionality provided in the
35
+ ``Guzzle\Batch`` namespace.
36
+
37
+ Batching overview
38
+ -----------------
39
+
40
+ The batch object, ``Guzzle\Batch\Batch``, is a queue. You add requests to the queue until you are ready to transfer
41
+ all of the requests. In order to efficiently transfer the items in the queue, the batch object delegates the
42
+ responsibility of dividing the queue into manageable parts to a divisor (``Guzzle\Batch\BatchDivisorInterface``).
43
+ The batch object then iterates over each array of items created by the divisor and sends them to the batch object's
44
+ ``Guzzle\Batch\BatchTransferInterface``.
45
+
46
+ .. code-block:: php
47
+
48
+ use Guzzle\Batch\Batch;
49
+ use Guzzle\Http\BatchRequestTransfer;
50
+
51
+ // BatchRequestTransfer acts as both the divisor and transfer strategy
52
+ $transferStrategy = new BatchRequestTransfer(10);
53
+ $divisorStrategy = $transferStrategy;
54
+
55
+ $batch = new Batch($transferStrategy, $divisorStrategy);
56
+
57
+ // Add some requests to the batch queue
58
+ $batch->add($request1)
59
+ ->add($request2)
60
+ ->add($request3);
61
+
62
+ // Flush the queue and retrieve the flushed items
63
+ $arrayOfTransferredRequests = $batch->flush();
64
+
65
+ .. note::
66
+
67
+ You might find that your transfer strategy will need to act as both the divisor and transfer strategy.
68
+
69
+ Using the BatchBuilder
70
+ ----------------------
71
+
72
+ The ``Guzzle\Batch\BatchBuilder`` makes it easier to create batch objects. The batch builder also provides an easier
73
+ way to add additional behaviors to your batch object.
74
+
75
+ Transferring requests
76
+ ~~~~~~~~~~~~~~~~~~~~~
77
+
78
+ The ``Guzzle\Http\BatchRequestTransfer`` class efficiently transfers HTTP requests in parallel by grouping batches of
79
+ requests by the curl_multi handle that is used to transfer the requests.
80
+
81
+ .. code-block:: php
82
+
83
+ use Guzzle\Batch\BatchBuilder;
84
+
85
+ $batch = BatchBuilder::factory()
86
+ ->transferRequests(10)
87
+ ->build();
88
+
89
+ Transferring commands
90
+ ~~~~~~~~~~~~~~~~~~~~~
91
+
92
+ The ``Guzzle\Service\Command\BatchCommandTransfer`` class efficiently transfers service commands by grouping commands
93
+ by the client that is used to transfer them. You can add commands to a batch object that are transferred by different
94
+ clients, and the batch will handle the rest.
95
+
96
+ .. code-block:: php
97
+
98
+ use Guzzle\Batch\BatchBuilder;
99
+
100
+ $batch = BatchBuilder::factory()
101
+ ->transferCommands(10)
102
+ ->build();
103
+
104
+ $batch->add($client->getCommand('foo'))
105
+ ->add($client->getCommand('baz'))
106
+ ->add($client->getCommand('bar'));
107
+
108
+ $commands = $batch->flush();
109
+
110
+ Batch behaviors
111
+ ---------------
112
+
113
+ You can add various behaviors to your batch that allow for more customizable transfers.
114
+
115
+ Automatically flushing a queue
116
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
117
+
118
+ Use the ``Guzzle\Batch\FlushingBatch`` decorator when you want to pump a large number of items into a batch queue and
119
+ have the queue automatically flush when the size of the queue reaches a certain threshold.
120
+
121
+ .. code-block:: php
122
+
123
+ use Guzzle\Batch\BatchBuilder;
124
+
125
+ $batch = BatchBuilder::factory()
126
+ ->transferRequests(10)
127
+ ->autoFlushAt(10)
128
+ ->build();
129
+
130
+ Batch builder method: ``autoFlushAt($threshold)``
131
+
132
+ Notifying on flush
133
+ ~~~~~~~~~~~~~~~~~~
134
+
135
+ Use the ``Guzzle\Batch\NotifyingBatch`` decorator if you want a function to be notified each time the batch queue is
136
+ flushed. This is useful when paired with the flushing batch decorator. Pass a callable to the ``notify()`` method of
137
+ a batch builder to use this decorator with the builder.
138
+
139
+ .. code-block:: php
140
+
141
+ use Guzzle\Batch\BatchBuilder;
142
+
143
+ $batch = BatchBuilder::factory()
144
+ ->transferRequests(10)
145
+ ->autoFlushAt(10)
146
+ ->notify(function (array $transferredItems) {
147
+ echo 'Transferred ' . count($transferredItems) . "items\n";
148
+ })
149
+ ->build();
150
+
151
+ Batch builder method:: ``notify(callable $callback)``
152
+
153
+ Keeping a history
154
+ ~~~~~~~~~~~~~~~~~
155
+
156
+ Use the ``Guzzle\Batch\HistoryBatch`` decorator if you want to maintain a history of all the items transferred with
157
+ the batch queue.
158
+
159
+ .. code-block:: php
160
+
161
+ use Guzzle\Batch\BatchBuilder;
162
+
163
+ $batch = BatchBuilder::factory()
164
+ ->transferRequests(10)
165
+ ->keepHistory()
166
+ ->build();
167
+
168
+ After transferring items, you can use the ``getHistory()`` of a batch to retrieve an array of transferred items. Be
169
+ sure to periodically clear the history using ``clearHistory()``.
170
+
171
+ Batch builder method: ``keepHistory()``
172
+
173
+ Exception buffering
174
+ ~~~~~~~~~~~~~~~~~~~
175
+
176
+ Use the ``Guzzle\Batch\ExceptionBufferingBatch`` decorator to buffer exceptions during a transfer so that you can
177
+ transfer as many items as possible then deal with the errored batches after the transfer completes. After transfer,
178
+ use the ``getExceptions()`` method of a batch to retrieve an array of
179
+ ``Guzzle\Batch\Exception\BatchTransferException`` objects. You can use these exceptions to attempt to retry the
180
+ failed batches. Be sure to clear the buffered exceptions when you are done with them by using the
181
+ ``clearExceptions()`` method.
182
+
183
+ Batch builder method: ``bufferExceptions()``
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/conf.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys, os
2
+ from sphinx.highlighting import lexers
3
+ from pygments.lexers.web import PhpLexer
4
+
5
+ lexers['php'] = PhpLexer(startinline=True, linenos=1)
6
+ lexers['php-annotations'] = PhpLexer(startinline=True, linenos=1)
7
+ primary_domain = 'php'
8
+
9
+ # -- General configuration -----------------------------------------------------
10
+
11
+ extensions = []
12
+ templates_path = ['_templates']
13
+ source_suffix = '.rst'
14
+ master_doc = 'index'
15
+
16
+ project = u'Guzzle'
17
+ copyright = u'2012, Michael Dowling'
18
+ version = '3.0.0'
19
+ release = '3.0.0'
20
+
21
+ exclude_patterns = ['_build']
22
+
23
+ # -- Options for HTML output ---------------------------------------------------
24
+
25
+ # The name for this set of Sphinx documents. If None, it defaults to
26
+ # "<project> v<release> documentation".
27
+ html_title = "Guzzle documentation"
28
+ html_short_title = "Guzzle"
29
+
30
+ # Add any paths that contain custom static files (such as style sheets) here,
31
+ # relative to this directory. They are copied after the builtin static files,
32
+ # so a file named "default.css" will overwrite the builtin "default.css".
33
+ html_static_path = ['_static']
34
+
35
+ # Custom sidebar templates, maps document names to template names.
36
+ html_sidebars = {
37
+ '**': ['localtoc.html', 'leftbar.html', 'searchbox.html']
38
+ }
39
+
40
+ # Output file base name for HTML help builder.
41
+ htmlhelp_basename = 'Guzzledoc'
42
+
43
+ # -- Guzzle Sphinx theme setup ------------------------------------------------
44
+
45
+ sys.path.insert(0, '/Users/dowling/projects/guzzle_sphinx_theme')
46
+
47
+ import guzzle_sphinx_theme
48
+ html_translator_class = 'guzzle_sphinx_theme.HTMLTranslator'
49
+ html_theme_path = guzzle_sphinx_theme.html_theme_path()
50
+ html_theme = 'guzzle_sphinx_theme'
51
+
52
+ # Guzzle theme options (see theme.conf for more information)
53
+ html_theme_options = {
54
+ "index_template": "index.html",
55
+ "project_nav_name": "Guzzle",
56
+ "github_user": "guzzle",
57
+ "github_repo": "guzzle",
58
+ "disqus_comments_shortname": "guzzle",
59
+ "google_analytics_account": "UA-22752917-1"
60
+ }
61
+
62
+ # -- Options for LaTeX output --------------------------------------------------
63
+
64
+ latex_elements = {}
65
+
66
+ # Grouping the document tree into LaTeX files. List of tuples
67
+ # (source start file, target name, title, author, documentclass [howto/manual]).
68
+ latex_documents = [
69
+ ('index', 'Guzzle.tex', u'Guzzle Documentation',
70
+ u'Michael Dowling', 'manual'),
71
+ ]
72
+
73
+ # -- Options for manual page output --------------------------------------------
74
+
75
+ # One entry per manual page. List of tuples
76
+ # (source start file, name, description, authors, manual section).
77
+ man_pages = [
78
+ ('index', 'guzzle', u'Guzzle Documentation',
79
+ [u'Michael Dowling'], 1)
80
+ ]
81
+
82
+ # If true, show URL addresses after external links.
83
+ #man_show_urls = False
84
+
85
+ # -- Options for Texinfo output ------------------------------------------------
86
+
87
+ # Grouping the document tree into Texinfo files. List of tuples
88
+ # (source start file, target name, title, author,
89
+ # dir menu entry, description, category)
90
+ texinfo_documents = [
91
+ ('index', 'Guzzle', u'Guzzle Documentation',
92
+ u'Michael Dowling', 'Guzzle', 'One line description of project.',
93
+ 'Miscellaneous'),
94
+ ]
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/docs.rst ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .. title:: Guzzle | PHP HTTP client and framework for consuming RESTful web services
2
+
3
+ ====================
4
+ Guzzle Documentation
5
+ ====================
6
+
7
+ Getting started
8
+ ---------------
9
+
10
+ .. toctree::
11
+ :maxdepth: 1
12
+
13
+ getting-started/overview
14
+ getting-started/installation
15
+ getting-started/faq
16
+
17
+ The HTTP client
18
+ ---------------
19
+
20
+ .. toctree::
21
+ :maxdepth: 2
22
+
23
+ http-client/client
24
+ http-client/request
25
+ http-client/response
26
+ http-client/entity-bodies
27
+ http-client/http-redirects
28
+ http-client/uri-templates
29
+
30
+ Plugins
31
+ -------
32
+
33
+ .. toctree::
34
+ :maxdepth: 1
35
+
36
+ plugins/plugins-overview
37
+ plugins/creating-plugins
38
+ plugins/async-plugin
39
+ plugins/backoff-plugin
40
+ plugins/cache-plugin
41
+ plugins/cookie-plugin
42
+ plugins/curl-auth-plugin
43
+ plugins/history-plugin
44
+ plugins/log-plugin
45
+ plugins/md5-validator-plugin
46
+ plugins/mock-plugin
47
+ plugins/oauth-plugin
48
+
49
+ The web service client
50
+ ----------------------
51
+
52
+ .. toctree::
53
+ :maxdepth: 1
54
+
55
+ webservice-client/webservice-client
56
+ webservice-client/using-the-service-builder
57
+ webservice-client/guzzle-service-descriptions
58
+ batching/batching
59
+ iterators/resource-iterators
60
+ iterators/guzzle-iterators
61
+
62
+ Testing
63
+ -------
64
+
65
+ .. toctree::
66
+ :maxdepth: 2
67
+
68
+ testing/unit-testing
69
+
70
+ API Docs
71
+ --------
72
+
73
+ `Read the API docs <http://guzzlephp.org/api/index.html>`_
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/getting-started/faq.rst ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ===
2
+ FAQ
3
+ ===
4
+
5
+ What should I do if I get this error: Fatal error: Maximum function nesting level of '100' reached, aborting!
6
+ -------------------------------------------------------------------------------------------------------------
7
+
8
+ You could run into this error if you have the XDebug extension installed and you execute a lot of requests in
9
+ callbacks. This error message comes specifically from the XDebug extension. PHP itself does not have a function
10
+ nesting limit. Change this setting in your php.ini to increase the limit::
11
+
12
+ xdebug.max_nesting_level = 1000
13
+
14
+ [`source <http://stackoverflow.com/a/4293870/151504>`_]
15
+
16
+ How can I speed up my client?
17
+ -----------------------------
18
+
19
+ There are several things you can do to speed up your client:
20
+
21
+ 1. Utilize a C based HTTP message parser (e.g. ``Guzzle\Parser\Message\PeclHttpMessageParser``)
22
+ 2. Disable operation validation by setting the ``command.disable_validation`` option to true on a command
23
+
24
+ Why am I getting a 417 error response?
25
+ --------------------------------------
26
+
27
+ This can occur for a number of reasons, but if you are sending PUT, POST, or PATCH requests with an
28
+ ``Expect: 100-Continue`` header, a server that does not support this header will return a 417 response. You can work
29
+ around this by calling ``$request->removeHeader('Expect');`` after setting the entity body of a request.
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/getting-started/installation.rst ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ============
2
+ Installation
3
+ ============
4
+
5
+ Requirements
6
+ ------------
7
+
8
+ #. PHP 5.3.3+ compiled with the cURL extension
9
+ #. A recent version of cURL 7.16.2+ compiled with OpenSSL and zlib
10
+
11
+ Installing Guzzle
12
+ -----------------
13
+
14
+ Composer
15
+ ~~~~~~~~
16
+
17
+ The recommended way to install Guzzle is with `Composer <http://getcomposer.org>`_. Composer is a dependency
18
+ management tool for PHP that allows you to declare the dependencies your project needs and installs them into your
19
+ project.
20
+
21
+ .. code-block:: bash
22
+
23
+ # Install Composer
24
+ curl -sS https://getcomposer.org/installer | php
25
+
26
+ # Add Guzzle as a dependency
27
+ php composer.phar require guzzle/guzzle:~3.9
28
+
29
+ After installing, you need to require Composer's autoloader:
30
+
31
+ .. code-block:: php
32
+
33
+ require 'vendor/autoload.php';
34
+
35
+ You can find out more on how to install Composer, configure autoloading, and other best-practices for defining
36
+ dependencies at `getcomposer.org <http://getcomposer.org>`_.
37
+
38
+ Using only specific parts of Guzzle
39
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
40
+
41
+ While you can always just rely on ``guzzle/guzzle``, Guzzle provides several smaller parts of Guzzle as individual
42
+ packages available through Composer.
43
+
44
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
45
+ | Package name | Description |
46
+ +===============================================================================================+==========================================+
47
+ | `guzzle/common <https://packagist.org/packages/guzzle/common>`_ | Provides ``Guzzle\Common`` |
48
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
49
+ | `guzzle/http <https://packagist.org/packages/guzzle/http>`_ | Provides ``Guzzle\Http`` |
50
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
51
+ | `guzzle/parser <https://packagist.org/packages/guzzle/parser>`_ | Provides ``Guzzle\Parser`` |
52
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
53
+ | `guzzle/batch <https://packagist.org/packages/guzzle/batch>`_ | Provides ``Guzzle\Batch`` |
54
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
55
+ | `guzzle/cache <https://packagist.org/packages/guzzle/cache>`_ | Provides ``Guzzle\Cache`` |
56
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
57
+ | `guzzle/inflection <https://packagist.org/packages/guzzle/inflection>`_ | Provides ``Guzzle\Inflection`` |
58
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
59
+ | `guzzle/iterator <https://packagist.org/packages/guzzle/iterator>`_ | Provides ``Guzzle\Iterator`` |
60
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
61
+ | `guzzle/log <https://packagist.org/packages/guzzle/log>`_ | Provides ``Guzzle\Log`` |
62
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
63
+ | `guzzle/plugin <https://packagist.org/packages/guzzle/plugin>`_ | Provides ``Guzzle\Plugin`` (all plugins) |
64
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
65
+ | `guzzle/plugin-async <https://packagist.org/packages/guzzle/plugin-async>`_ | Provides ``Guzzle\Plugin\Async`` |
66
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
67
+ | `guzzle/plugin-backoff <https://packagist.org/packages/guzzle/plugin-backoff>`_ | Provides ``Guzzle\Plugin\BackoffPlugin`` |
68
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
69
+ | `guzzle/plugin-cache <https://packagist.org/packages/guzzle/plugin-cache>`_ | Provides ``Guzzle\Plugin\Cache`` |
70
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
71
+ | `guzzle/plugin-cookie <https://packagist.org/packages/guzzle/plugin-cookie>`_ | Provides ``Guzzle\Plugin\Cookie`` |
72
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
73
+ | `guzzle/plugin-error-response <https://packagist.org/packages/guzzle/plugin-error-response>`_ | Provides ``Guzzle\Plugin\ErrorResponse`` |
74
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
75
+ | `guzzle/plugin-history <https://packagist.org/packages/guzzle/plugin-history>`_ | Provides ``Guzzle\Plugin\History`` |
76
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
77
+ | `guzzle/plugin-log <https://packagist.org/packages/guzzle/plugin-log>`_ | Provides ``Guzzle\Plugin\Log`` |
78
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
79
+ | `guzzle/plugin-md5 <https://packagist.org/packages/guzzle/plugin-md5>`_ | Provides ``Guzzle\Plugin\Md5`` |
80
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
81
+ | `guzzle/plugin-mock <https://packagist.org/packages/guzzle/plugin-mock>`_ | Provides ``Guzzle\Plugin\Mock`` |
82
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
83
+ | `guzzle/plugin-oauth <https://packagist.org/packages/guzzle/plugin-oauth>`_ | Provides ``Guzzle\Plugin\Oauth`` |
84
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
85
+ | `guzzle/service <https://packagist.org/packages/guzzle/service>`_ | Provides ``Guzzle\Service`` |
86
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
87
+ | `guzzle/stream <https://packagist.org/packages/guzzle/stream>`_ | Provides ``Guzzle\Stream`` |
88
+ +-----------------------------------------------------------------------------------------------+------------------------------------------+
89
+
90
+ Bleeding edge
91
+ ^^^^^^^^^^^^^
92
+
93
+ During your development, you can keep up with the latest changes on the master branch by setting the version
94
+ requirement for Guzzle to ``dev-master``.
95
+
96
+ .. code-block:: js
97
+
98
+ {
99
+ "require": {
100
+ "guzzle/guzzle": "dev-master"
101
+ }
102
+ }
103
+
104
+ PEAR
105
+ ~~~~
106
+
107
+ Guzzle can be installed through PEAR:
108
+
109
+ .. code-block:: bash
110
+
111
+ pear channel-discover guzzlephp.org/pear
112
+ pear install guzzle/guzzle
113
+
114
+ You can install a specific version of Guzzle by providing a version number suffix:
115
+
116
+ .. code-block:: bash
117
+
118
+ pear install guzzle/guzzle-3.9.0
119
+
120
+ Contributing to Guzzle
121
+ ----------------------
122
+
123
+ In order to contribute, you'll need to checkout the source from GitHub and install Guzzle's dependencies using
124
+ Composer:
125
+
126
+ .. code-block:: bash
127
+
128
+ git clone https://github.com/guzzle/guzzle.git
129
+ cd guzzle && curl -s http://getcomposer.org/installer | php && ./composer.phar install --dev
130
+
131
+ Guzzle is unit tested with PHPUnit. You will need to create your own phpunit.xml file in order to run the unit tests
132
+ (or just copy phpunit.xml.dist to phpunit.xml). Run the tests using the vendored PHPUnit binary:
133
+
134
+ .. code-block:: bash
135
+
136
+ vendor/bin/phpunit
137
+
138
+ You'll need to install node.js v0.5.0 or newer in order to test the cURL implementation.
139
+
140
+ Framework integrations
141
+ ----------------------
142
+
143
+ Using Guzzle with Symfony
144
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
145
+
146
+ Bundles are available on GitHub:
147
+
148
+ - `DdeboerGuzzleBundle <https://github.com/ddeboer/GuzzleBundle>`_ for Guzzle 2
149
+ - `MisdGuzzleBundle <https://github.com/misd-service-development/guzzle-bundle>`_ for Guzzle 3
150
+
151
+ Using Guzzle with Silex
152
+ ~~~~~~~~~~~~~~~~~~~~~~~
153
+
154
+ A `Guzzle Silex service provider <https://github.com/guzzle/guzzle-silex-extension>`_ is available on GitHub.
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/getting-started/overview.rst ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ =================
2
+ Welcome to Guzzle
3
+ =================
4
+
5
+ What is Guzzle?
6
+ ~~~~~~~~~~~~~~~
7
+
8
+ Guzzle is a PHP HTTP client and framework for building web service clients. Guzzle takes the pain out of sending HTTP
9
+ requests and the redundancy out of creating web service clients.
10
+
11
+ Features at a glance
12
+ --------------------
13
+
14
+ - All the power of cURL with a simple interface.
15
+ - Persistent connections and parallel requests.
16
+ - Streams request and response bodies
17
+ - Service descriptions for quickly building clients.
18
+ - Powered by the Symfony2 EventDispatcher.
19
+ - Use all of the code or only specific components.
20
+ - Plugins for caching, logging, OAuth, mocks, and more
21
+ - Includes a custom node.js webserver to test your clients.
22
+ - Service descriptions for defining the inputs and outputs of an API
23
+ - Resource iterators for traversing paginated resources
24
+ - Batching for sending a large number of requests as efficiently as possible
25
+
26
+ .. code-block:: php
27
+
28
+ // Really simple using a static facade
29
+ Guzzle\Http\StaticClient::mount();
30
+ $response = Guzzle::get('http://guzzlephp.org');
31
+
32
+ // More control using a client class
33
+ $client = new \Guzzle\Http\Client('http://guzzlephp.org');
34
+ $request = $client->get('/');
35
+ $response = $request->send();
36
+
37
+ License
38
+ -------
39
+
40
+ Licensed using the `MIT license <http://opensource.org/licenses/MIT>`_.
41
+
42
+ Copyright (c) 2013 Michael Dowling <https://github.com/mtdowling>
43
+
44
+ Permission is hereby granted, free of charge, to any person obtaining a copy
45
+ of this software and associated documentation files (the "Software"), to deal
46
+ in the Software without restriction, including without limitation the rights
47
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
48
+ copies of the Software, and to permit persons to whom the Software is
49
+ furnished to do so, subject to the following conditions:
50
+
51
+ The above copyright notice and this permission notice shall be included in
52
+ all copies or substantial portions of the Software.
53
+
54
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
55
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
56
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
57
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
58
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
59
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
60
+ THE SOFTWARE.
61
+
62
+ Contributing
63
+ ------------
64
+
65
+ Guidelines
66
+ ~~~~~~~~~~
67
+
68
+ This is still a work in progress, but there are only a few rules:
69
+
70
+ 1. Guzzle follows PSR-0, PSR-1, and PSR-2
71
+ 2. All pull requests must include unit tests to ensure the change works as expected and to prevent future regressions
72
+
73
+ Reporting a security vulnerability
74
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75
+
76
+ We want to ensure that Guzzle is a secure HTTP client library for everyone. If you've discovered a security
77
+ vulnerability in Guzzle, we appreciate your help in disclosing it to us in a
78
+ `responsible manner <http://en.wikipedia.org/wiki/Responsible_disclosure>`_.
79
+
80
+ Publicly disclosing a vulnerability can put the entire community at risk. If you've discovered a security concern,
81
+ please email us at security@guzzlephp.org. We'll work with you to make sure that we understand the scope of the issue,
82
+ and that we fully address your concern. We consider correspondence sent to security@guzzlephp.org our highest priority,
83
+ and work to address any issues that arise as quickly as possible.
84
+
85
+ After a security vulnerability has been corrected, a security hotfix release will be deployed as soon as possible.
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/client.rst ADDED
@@ -0,0 +1,569 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ======================
2
+ The Guzzle HTTP client
3
+ ======================
4
+
5
+ Guzzle gives PHP developers complete control over HTTP requests while utilizing HTTP/1.1 best practices. Guzzle's HTTP
6
+ functionality is a robust framework built on top of the `PHP libcurl bindings <http://www.php.net/curl>`_.
7
+
8
+ The three main parts of the Guzzle HTTP client are:
9
+
10
+ +--------------+-------------------------------------------------------------------------------------------------------+
11
+ | Clients | ``Guzzle\Http\Client`` (creates and sends requests, associates a response with a request) |
12
+ +--------------+-------------------------------------------------------------------------------------------------------+
13
+ | Requests | ``Guzzle\Http\Message\Request`` (requests with no body), |
14
+ | | ``Guzzle\Http\Message\EntityEnclosingRequest`` (requests with a body) |
15
+ +--------------+-------------------------------------------------------------------------------------------------------+
16
+ | Responses | ``Guzzle\Http\Message\Response`` |
17
+ +--------------+-------------------------------------------------------------------------------------------------------+
18
+
19
+ Creating a Client
20
+ -----------------
21
+
22
+ Clients create requests, send requests, and set responses on a request object. When instantiating a client object,
23
+ you can pass an optional "base URL" and optional array of configuration options. A base URL is a
24
+ :doc:`URI template <uri-templates>` that contains the URL of a remote server. When creating requests with a relative
25
+ URL, the base URL of a client will be merged into the request's URL.
26
+
27
+ .. code-block:: php
28
+
29
+ use Guzzle\Http\Client;
30
+
31
+ // Create a client and provide a base URL
32
+ $client = new Client('https://api.github.com');
33
+
34
+ $request = $client->get('/user');
35
+ $request->setAuth('user', 'pass');
36
+ echo $request->getUrl();
37
+ // >>> https://api.github.com/user
38
+
39
+ // You must send a request in order for the transfer to occur
40
+ $response = $request->send();
41
+
42
+ echo $response->getBody();
43
+ // >>> {"type":"User", ...
44
+
45
+ echo $response->getHeader('Content-Length');
46
+ // >>> 792
47
+
48
+ $data = $response->json();
49
+ echo $data['type'];
50
+ // >>> User
51
+
52
+ Base URLs
53
+ ~~~~~~~~~
54
+
55
+ Notice that the URL provided to the client's ``get()`` method is relative. Relative URLs will always merge into the
56
+ base URL of the client. There are a few rules that control how the URLs are merged.
57
+
58
+ .. tip::
59
+
60
+ Guzzle follows `RFC 3986 <http://tools.ietf.org/html/rfc3986#section-5.2>`_ when merging base URLs and
61
+ relative URLs.
62
+
63
+ In the above example, we passed ``/user`` to the ``get()`` method of the client. This is a relative URL, so it will
64
+ merge into the base URL of the client-- resulting in the derived URL of ``https://api.github.com/users``.
65
+
66
+ ``/user`` is a relative URL but uses an absolute path because it contains the leading slash. Absolute paths will
67
+ overwrite any existing path of the base URL. If an absolute path is provided (e.g. ``/path/to/something``), then the
68
+ path specified in the base URL of the client will be replaced with the absolute path, and the query string provided
69
+ by the relative URL will replace the query string of the base URL.
70
+
71
+ Omitting the leading slash and using relative paths will add to the path of the base URL of the client. So using a
72
+ client base URL of ``https://api.twitter.com/v1.1`` and creating a GET request with ``statuses/user_timeline.json``
73
+ will result in a URL of ``https://api.twitter.com/v1.1/statuses/user_timeline.json``. If a relative path and a query
74
+ string are provided, then the relative path will be appended to the base URL path, and the query string provided will
75
+ be merged into the query string of the base URL.
76
+
77
+ If an absolute URL is provided (e.g. ``http://httpbin.org/ip``), then the request will completely use the absolute URL
78
+ as-is without merging in any of the URL parts specified in the base URL.
79
+
80
+ Configuration options
81
+ ~~~~~~~~~~~~~~~~~~~~~
82
+
83
+ The second argument of the client's constructor is an array of configuration data. This can include URI template data
84
+ or special options that alter the client's behavior:
85
+
86
+ +-------------------------------+-------------------------------------------------------------------------------------+
87
+ | ``request.options`` | Associative array of :ref:`Request options <request-options>` to apply to every |
88
+ | | request created by the client. |
89
+ +-------------------------------+-------------------------------------------------------------------------------------+
90
+ | ``redirect.disable`` | Disable HTTP redirects for every request created by the client. |
91
+ +-------------------------------+-------------------------------------------------------------------------------------+
92
+ | ``curl.options`` | Associative array of cURL options to apply to every request created by the client. |
93
+ | | if either the key or value of an entry in the array is a string, Guzzle will |
94
+ | | attempt to find a matching defined cURL constant automatically (e.g. |
95
+ | | "CURLOPT_PROXY" will be converted to the constant ``CURLOPT_PROXY``). |
96
+ +-------------------------------+-------------------------------------------------------------------------------------+
97
+ | ``ssl.certificate_authority`` | Set to true to use the Guzzle bundled SSL certificate bundle (this is used by |
98
+ | | default, 'system' to use the bundle on your system, a string pointing to a file to |
99
+ | | use a specific certificate file, a string pointing to a directory to use multiple |
100
+ | | certificates, or ``false`` to disable SSL validation (not recommended). |
101
+ | | |
102
+ | | When using Guzzle inside of a phar file, the bundled SSL certificate will be |
103
+ | | extracted to your system's temp folder, and each time a client is created an MD5 |
104
+ | | check will be performed to ensure the integrity of the certificate. |
105
+ +-------------------------------+-------------------------------------------------------------------------------------+
106
+ | ``command.params`` | When using a ``Guzzle\Service\Client`` object, this is an associative array of |
107
+ | | default options to set on each command created by the client. |
108
+ +-------------------------------+-------------------------------------------------------------------------------------+
109
+
110
+ Here's an example showing how to set various configuration options, including default headers to send with each request,
111
+ default query string parameters to add to each request, a default auth scheme for each request, and a proxy to use for
112
+ each request. Values can be injected into the client's base URL using variables from the configuration array.
113
+
114
+ .. code-block:: php
115
+
116
+ use Guzzle\Http\Client;
117
+
118
+ $client = new Client('https://api.twitter.com/{version}', array(
119
+ 'version' => 'v1.1',
120
+ 'request.options' => array(
121
+ 'headers' => array('Foo' => 'Bar'),
122
+ 'query' => array('testing' => '123'),
123
+ 'auth' => array('username', 'password', 'Basic|Digest|NTLM|Any'),
124
+ 'proxy' => 'tcp://localhost:80'
125
+ )
126
+ ));
127
+
128
+ Setting a custom User-Agent
129
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
130
+
131
+ The default Guzzle User-Agent header is ``Guzzle/<Guzzle_Version> curl/<curl_version> PHP/<PHP_VERSION>``. You can
132
+ customize the User-Agent header of a client by calling the ``setUserAgent()`` method of a Client object.
133
+
134
+ .. code-block:: php
135
+
136
+ // Completely override the default User-Agent
137
+ $client->setUserAgent('Test/123');
138
+
139
+ // Prepend a string to the default User-Agent
140
+ $client->setUserAgent('Test/123', true);
141
+
142
+ Creating requests with a client
143
+ -------------------------------
144
+
145
+ A Client object exposes several methods used to create Request objects:
146
+
147
+ * Create a custom HTTP request: ``$client->createRequest($method, $uri, array $headers, $body, $options)``
148
+ * Create a GET request: ``$client->get($uri, array $headers, $options)``
149
+ * Create a HEAD request: ``$client->head($uri, array $headers, $options)``
150
+ * Create a DELETE request: ``$client->delete($uri, array $headers, $body, $options)``
151
+ * Create a POST request: ``$client->post($uri, array $headers, $postBody, $options)``
152
+ * Create a PUT request: ``$client->put($uri, array $headers, $body, $options)``
153
+ * Create a PATCH request: ``$client->patch($uri, array $headers, $body, $options)``
154
+
155
+ .. code-block:: php
156
+
157
+ use Guzzle\Http\Client;
158
+
159
+ $client = new Client('http://baseurl.com/api/v1');
160
+
161
+ // Create a GET request using Relative to base URL
162
+ // URL of the request: http://baseurl.com/api/v1/path?query=123&value=abc)
163
+ $request = $client->get('path?query=123&value=abc');
164
+ $response = $request->send();
165
+
166
+ // Create HEAD request using a relative URL with an absolute path
167
+ // URL of the request: http://baseurl.com/path?query=123&value=abc
168
+ $request = $client->head('/path?query=123&value=abc');
169
+ $response = $request->send();
170
+
171
+ // Create a DELETE request using an absolute URL
172
+ $request = $client->delete('http://www.example.com/path?query=123&value=abc');
173
+ $response = $request->send();
174
+
175
+ // Create a PUT request using the contents of a PHP stream as the body
176
+ // Specify custom HTTP headers
177
+ $request = $client->put('http://www.example.com/upload', array(
178
+ 'X-Header' => 'My Header'
179
+ ), fopen('http://www.test.com/', 'r'));
180
+ $response = $request->send();
181
+
182
+ // Create a POST request and add the POST files manually
183
+ $request = $client->post('http://localhost:8983/solr/update')
184
+ ->addPostFiles(array('file' => '/path/to/documents.xml'));
185
+ $response = $request->send();
186
+
187
+ // Check if a resource supports the DELETE method
188
+ $supportsDelete = $client->options('/path')->send()->isMethodAllowed('DELETE');
189
+ $response = $request->send();
190
+
191
+ Client objects create Request objects using a request factory (``Guzzle\Http\Message\RequestFactoryInterface``).
192
+ You can inject a custom request factory into the Client using ``$client->setRequestFactory()``, but you can typically
193
+ rely on a Client's default request factory.
194
+
195
+ Static clients
196
+ --------------
197
+
198
+ You can use Guzzle's static client facade to more easily send simple HTTP requests.
199
+
200
+ .. code-block:: php
201
+
202
+ // Mount the client so that you can access it at \Guzzle
203
+ Guzzle\Http\StaticClient::mount();
204
+ $response = Guzzle::get('http://guzzlephp.org');
205
+
206
+ Each request method of the static client (e.g. ``get()``, ``post()`, ``put()``, etc) accepts an associative array of request
207
+ options to apply to the request.
208
+
209
+ .. code-block:: php
210
+
211
+ $response = Guzzle::post('http://test.com', array(
212
+ 'headers' => array('X-Foo' => 'Bar'),
213
+ 'body' => array('Test' => '123'),
214
+ 'timeout' => 10
215
+ ));
216
+
217
+ .. _request-options:
218
+
219
+ Request options
220
+ ---------------
221
+
222
+ Request options can be specified when creating a request or in the ``request.options`` parameter of a client. These
223
+ options can control various aspects of a request including: headers to send, query string data, where the response
224
+ should be downloaded, proxies, auth, etc.
225
+
226
+ headers
227
+ ~~~~~~~
228
+
229
+ Associative array of headers to apply to the request. When specified in the ``$options`` argument of a client creational
230
+ method (e.g. ``get()``, ``post()``, etc), the headers in the ``$options`` array will overwrite headers specified in the
231
+ ``$headers`` array.
232
+
233
+ .. code-block:: php
234
+
235
+ $request = $client->get($url, array(), array(
236
+ 'headers' => array('X-Foo' => 'Bar')
237
+ ));
238
+
239
+ Headers can be specified on a client to add default headers to every request sent by a client.
240
+
241
+ .. code-block:: php
242
+
243
+ $client = new Guzzle\Http\Client();
244
+
245
+ // Set a single header using path syntax
246
+ $client->setDefaultOption('headers/X-Foo', 'Bar');
247
+
248
+ // Set all headers
249
+ $client->setDefaultOption('headers', array('X-Foo' => 'Bar'));
250
+
251
+ .. note::
252
+
253
+ In addition to setting request options when creating requests or using the ``setDefaultOption()`` method, any
254
+ default client request option can be set using a client's config object:
255
+
256
+ .. code-block:: php
257
+
258
+ $client->getConfig()->setPath('request.options/headers/X-Foo', 'Bar');
259
+
260
+ query
261
+ ~~~~~
262
+
263
+ Associative array of query string parameters to the request. When specified in the ``$options`` argument of a client
264
+ creational method, the query string parameters in the ``$options`` array will overwrite query string parameters
265
+ specified in the `$url`.
266
+
267
+ .. code-block:: php
268
+
269
+ $request = $client->get($url, array(), array(
270
+ 'query' => array('abc' => '123')
271
+ ));
272
+
273
+ Query string parameters can be specified on a client to add default query string parameters to every request sent by a
274
+ client.
275
+
276
+ .. code-block:: php
277
+
278
+ $client = new Guzzle\Http\Client();
279
+
280
+ // Set a single query string parameter using path syntax
281
+ $client->setDefaultOption('query/abc', '123');
282
+
283
+ // Set an array of default query string parameters
284
+ $client->setDefaultOption('query', array('abc' => '123'));
285
+
286
+ body
287
+ ~~~~
288
+
289
+ Sets the body of a request. The value supplied to the body option can be a ``Guzzle\Http\EntityBodyInterface``, string,
290
+ fopen resource, or array when sending POST requests. When a ``body`` request option is supplied, the option value will
291
+ overwrite the ``$body`` argument of a client creational method.
292
+
293
+ auth
294
+ ~~~~
295
+
296
+ Specifies and array of HTTP authorization parameters parameters to use with the request. The array must contain the
297
+ username in index [0], the password in index [1], and can optionally contain the authentication type in index [2].
298
+ The available authentication types are: "Basic" (default), "Digest", "NTLM", or "Any".
299
+
300
+ .. code-block:: php
301
+
302
+ $request = $client->get($url, array(), array(
303
+ 'auth' => array('username', 'password', 'Digest')
304
+ ));
305
+
306
+ // You can add auth headers to every request of a client
307
+ $client->setDefaultOption('auth', array('username', 'password', 'Digest'));
308
+
309
+ cookies
310
+ ~~~~~~~
311
+
312
+ Specifies an associative array of cookies to add to the request.
313
+
314
+ allow_redirects
315
+ ~~~~~~~~~~~~~~~
316
+
317
+ Specifies whether or not the request should follow redirects. Requests will follow redirects by default. Set
318
+ ``allow_redirects`` to ``false`` to disable redirects.
319
+
320
+ save_to
321
+ ~~~~~~~
322
+
323
+ The ``save_to`` option specifies where the body of a response is downloaded. You can pass the path to a file, an fopen
324
+ resource, or a ``Guzzle\Http\EntityBodyInterface`` object.
325
+
326
+ See :ref:`Changing where a response is downloaded <request-set-response-body>` for more information on setting the
327
+ `save_to` option.
328
+
329
+ events
330
+ ~~~~~~
331
+
332
+ The `events` option makes it easy to attach listeners to the various events emitted by a request object. The `events`
333
+ options must be an associative array mapping an event name to a Closure or array the contains a Closure and the
334
+ priority of the event.
335
+
336
+ .. code-block:: php
337
+
338
+ $request = $client->get($url, array(), array(
339
+ 'events' => array(
340
+ 'request.before_send' => function (\Guzzle\Common\Event $e) {
341
+ echo 'About to send ' . $e['request'];
342
+ }
343
+ )
344
+ ));
345
+
346
+ // Using the static client:
347
+ Guzzle::get($url, array(
348
+ 'events' => array(
349
+ 'request.before_send' => function (\Guzzle\Common\Event $e) {
350
+ echo 'About to send ' . $e['request'];
351
+ }
352
+ )
353
+ ));
354
+
355
+ plugins
356
+ ~~~~~~~
357
+
358
+ The `plugins` options makes it easy to attach an array of plugins to a request.
359
+
360
+ .. code-block:: php
361
+
362
+ // Using the static client:
363
+ Guzzle::get($url, array(
364
+ 'plugins' => array(
365
+ new Guzzle\Plugin\Cache\CachePlugin(),
366
+ new Guzzle\Plugin\Cookie\CookiePlugin()
367
+ )
368
+ ));
369
+
370
+ exceptions
371
+ ~~~~~~~~~~
372
+
373
+ The `exceptions` option can be used to disable throwing exceptions for unsuccessful HTTP response codes
374
+ (e.g. 404, 500, etc). Set `exceptions` to false to not throw exceptions.
375
+
376
+ params
377
+ ~~~~~~
378
+
379
+ The `params` options can be used to specify an associative array of data parameters to add to a request. Note that
380
+ these are not query string parameters.
381
+
382
+ timeout / connect_timeout
383
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
384
+
385
+ You can specify the maximum number of seconds to allow for an entire transfer to take place before timing out using
386
+ the `timeout` request option. You can specify the maximum number of seconds to wait while trying to connect using the
387
+ `connect_timeout` request option. Set either of these options to 0 to wait indefinitely.
388
+
389
+ .. code-block:: php
390
+
391
+ $request = $client->get('http://www.example.com', array(), array(
392
+ 'timeout' => 20,
393
+ 'connect_timeout' => 1.5
394
+ ));
395
+
396
+ verify
397
+ ~~~~~~
398
+
399
+ Set to true to enable SSL certificate validation (the default), false to disable SSL certificate validation, or supply
400
+ the path to a CA bundle to enable verification using a custom certificate.
401
+
402
+ cert
403
+ ~~~~
404
+
405
+ The `cert` option lets you specify a PEM formatted SSL client certificate to use with servers that require one. If the
406
+ certificate requires a password, provide an array with the password as the second item.
407
+
408
+ This would typically be used in conjunction with the `ssl_key` option.
409
+
410
+ .. code-block:: php
411
+
412
+ $request = $client->get('https://www.example.com', array(), array(
413
+ 'cert' => '/etc/pki/client_certificate.pem'
414
+ )
415
+
416
+ $request = $client->get('https://www.example.com', array(), array(
417
+ 'cert' => array('/etc/pki/client_certificate.pem', 's3cr3tp455w0rd')
418
+ )
419
+
420
+ ssl_key
421
+ ~~~~~~~
422
+
423
+ The `ssl_key` option lets you specify a file containing your PEM formatted private key, optionally protected by a password.
424
+ Note: your password is sensitive, keep the PHP script containing it safe.
425
+
426
+ This would typically be used in conjunction with the `cert` option.
427
+
428
+ .. code-block:: php
429
+
430
+ $request = $client->get('https://www.example.com', array(), array(
431
+ 'ssl_key' => '/etc/pki/private_key.pem'
432
+ )
433
+
434
+ $request = $client->get('https://www.example.com', array(), array(
435
+ 'ssl_key' => array('/etc/pki/private_key.pem', 's3cr3tp455w0rd')
436
+ )
437
+
438
+ proxy
439
+ ~~~~~
440
+
441
+ The `proxy` option is used to specify an HTTP proxy (e.g. `http://username:password@192.168.16.1:10`).
442
+
443
+ debug
444
+ ~~~~~
445
+
446
+ The `debug` option is used to show verbose cURL output for a transfer.
447
+
448
+ stream
449
+ ~~~~~~
450
+
451
+ When using a static client, you can set the `stream` option to true to return a `Guzzle\Stream\Stream` object that can
452
+ be used to pull data from a stream as needed (rather than have cURL download the entire contents of a response to a
453
+ stream all at once).
454
+
455
+ .. code-block:: php
456
+
457
+ $stream = Guzzle::get('http://guzzlephp.org', array('stream' => true));
458
+ while (!$stream->feof()) {
459
+ echo $stream->readLine();
460
+ }
461
+
462
+ Sending requests
463
+ ----------------
464
+
465
+ Requests can be sent by calling the ``send()`` method of a Request object, but you can also send requests using the
466
+ ``send()`` method of a Client.
467
+
468
+ .. code-block:: php
469
+
470
+ $request = $client->get('http://www.amazon.com');
471
+ $response = $client->send($request);
472
+
473
+ Sending requests in parallel
474
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
475
+
476
+ The Client's ``send()`` method accept a single ``Guzzle\Http\Message\RequestInterface`` object or an array of
477
+ RequestInterface objects. When an array is specified, the requests will be sent in parallel.
478
+
479
+ Sending many HTTP requests serially (one at a time) can cause an unnecessary delay in a script's execution. Each
480
+ request must complete before a subsequent request can be sent. By sending requests in parallel, a pool of HTTP
481
+ requests can complete at the speed of the slowest request in the pool, significantly reducing the amount of time
482
+ needed to execute multiple HTTP requests. Guzzle provides a wrapper for the curl_multi functions in PHP.
483
+
484
+ Here's an example of sending three requests in parallel using a client object:
485
+
486
+ .. code-block:: php
487
+
488
+ use Guzzle\Common\Exception\MultiTransferException;
489
+
490
+ try {
491
+ $responses = $client->send(array(
492
+ $client->get('http://www.google.com/'),
493
+ $client->head('http://www.google.com/'),
494
+ $client->get('https://www.github.com/')
495
+ ));
496
+ } catch (MultiTransferException $e) {
497
+
498
+ echo "The following exceptions were encountered:\n";
499
+ foreach ($e as $exception) {
500
+ echo $exception->getMessage() . "\n";
501
+ }
502
+
503
+ echo "The following requests failed:\n";
504
+ foreach ($e->getFailedRequests() as $request) {
505
+ echo $request . "\n\n";
506
+ }
507
+
508
+ echo "The following requests succeeded:\n";
509
+ foreach ($e->getSuccessfulRequests() as $request) {
510
+ echo $request . "\n\n";
511
+ }
512
+ }
513
+
514
+ If the requests succeed, an array of ``Guzzle\Http\Message\Response`` objects are returned. A single request failure
515
+ will not cause the entire pool of requests to fail. Any exceptions thrown while transferring a pool of requests will
516
+ be aggregated into a ``Guzzle\Common\Exception\MultiTransferException`` exception.
517
+
518
+ Plugins and events
519
+ ------------------
520
+
521
+ Guzzle provides easy to use request plugins that add behavior to requests based on signal slot event notifications
522
+ powered by the
523
+ `Symfony2 Event Dispatcher component <http://symfony.com/doc/2.0/components/event_dispatcher/introduction.html>`_. Any
524
+ event listener or subscriber attached to a Client object will automatically be attached to each request created by the
525
+ client.
526
+
527
+ Using the same cookie session for each request
528
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
529
+
530
+ Attach a ``Guzzle\Plugin\Cookie\CookiePlugin`` to a client which will in turn add support for cookies to every request
531
+ created by a client, and each request will use the same cookie session:
532
+
533
+ .. code-block:: php
534
+
535
+ use Guzzle\Plugin\Cookie\CookiePlugin;
536
+ use Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar;
537
+
538
+ // Create a new cookie plugin
539
+ $cookiePlugin = new CookiePlugin(new ArrayCookieJar());
540
+
541
+ // Add the cookie plugin to the client
542
+ $client->addSubscriber($cookiePlugin);
543
+
544
+ .. _client-events:
545
+
546
+ Events emitted from a client
547
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
548
+
549
+ A ``Guzzle\Http\Client`` object emits the following events:
550
+
551
+ +------------------------------+--------------------------------------------+------------------------------------------+
552
+ | Event name | Description | Event data |
553
+ +==============================+============================================+==========================================+
554
+ | client.create_request | Called when a client creates a request | * client: The client |
555
+ | | | * request: The created request |
556
+ +------------------------------+--------------------------------------------+------------------------------------------+
557
+
558
+ .. code-block:: php
559
+
560
+ use Guzzle\Common\Event;
561
+ use Guzzle\Http\Client;
562
+
563
+ $client = new Client();
564
+
565
+ // Add a listener that will echo out requests as they are created
566
+ $client->getEventDispatcher()->addListener('client.create_request', function (Event $e) {
567
+ echo 'Client object: ' . spl_object_hash($e['client']) . "\n";
568
+ echo "Request object: {$e['request']}\n";
569
+ });
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/entity-bodies.rst ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ===========================
2
+ Request and response bodies
3
+ ===========================
4
+
5
+ `Entity body <http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html>`_ is the term used for the body of an HTTP
6
+ message. The entity body of requests and responses is inherently a
7
+ `PHP stream <http://php.net/manual/en/book.stream.php>`_ in Guzzle. The body of the request can be either a string or
8
+ a PHP stream which are converted into a ``Guzzle\Http\EntityBody`` object using its factory method. When using a
9
+ string, the entity body is stored in a `temp PHP stream <http://www.php.net/manual/en/wrappers.php.php>`_. The use of
10
+ temp PHP streams helps to protect your application from running out of memory when sending or receiving large entity
11
+ bodies in your messages. When more than 2MB of data is stored in a temp stream, it automatically stores the data on
12
+ disk rather than in memory.
13
+
14
+ EntityBody objects provide a great deal of functionality: compression, decompression, calculate the Content-MD5,
15
+ calculate the Content-Length (when the resource is repeatable), guessing the Content-Type, and more. Guzzle doesn't
16
+ need to load an entire entity body into a string when sending or retrieving data; entity bodies are streamed when
17
+ being uploaded and downloaded.
18
+
19
+ Here's an example of gzip compressing a text file then sending the file to a URL:
20
+
21
+ .. code-block:: php
22
+
23
+ use Guzzle\Http\EntityBody;
24
+
25
+ $body = EntityBody::factory(fopen('/path/to/file.txt', 'r+'));
26
+ echo $body->read(1024);
27
+ $body->seek(0, SEEK_END);
28
+ $body->write('foo');
29
+ echo $body->ftell();
30
+ $body->rewind();
31
+
32
+ // Send a request using the body
33
+ $response = $client->put('http://localhost:8080/uploads', null, $body)->send();
34
+
35
+ The body of the request can be specified in the ``Client::put()`` or ``Client::post()`` method, or, you can specify
36
+ the body of the request by calling the ``setBody()`` method of any
37
+ ``Guzzle\Http\Message\EntityEnclosingRequestInterface`` object.
38
+
39
+ Compression
40
+ -----------
41
+
42
+ You can compress the contents of an EntityBody object using the ``compress()`` method. The compress method accepts a
43
+ filter that must match to one of the supported
44
+ `PHP stream filters <http://www.php.net/manual/en/filters.compression.php>`_ on your system (e.g. `zlib.deflate`,
45
+ ``bzip2.compress``, etc). Compressing an entity body will stream the entire entity body through a stream compression
46
+ filter into a temporary PHP stream. You can uncompress an entity body using the ``uncompress()`` method and passing
47
+ the PHP stream filter to use when decompressing the stream (e.g. ``zlib.inflate``).
48
+
49
+ .. code-block:: php
50
+
51
+ use Guzzle\Http\EntityBody;
52
+
53
+ $body = EntityBody::factory(fopen('/tmp/test.txt', 'r+'));
54
+ echo $body->getSize();
55
+ // >>> 1048576
56
+
57
+ // Compress using the default zlib.deflate filter
58
+ $body->compress();
59
+ echo $body->getSize();
60
+ // >>> 314572
61
+
62
+ // Decompress the stream
63
+ $body->uncompress();
64
+ echo $body->getSize();
65
+ // >>> 1048576
66
+
67
+ Decorators
68
+ ----------
69
+
70
+ Guzzle provides several EntityBody decorators that can be used to add functionality to an EntityBody at runtime.
71
+
72
+ IoEmittingEntityBody
73
+ ~~~~~~~~~~~~~~~~~~~~
74
+
75
+ This decorator will emit events when data is read from a stream or written to a stream. Add an event subscriber to the
76
+ entity body's ``body.read`` or ``body.write`` methods to receive notifications when data data is transferred.
77
+
78
+ .. code-block:: php
79
+
80
+ use Guzzle\Common\Event;
81
+ use Guzzle\Http\EntityBody;
82
+ use Guzzle\Http\IoEmittingEntityBody;
83
+
84
+ $original = EntityBody::factory(fopen('/tmp/test.txt', 'r+'));
85
+ $body = new IoEmittingEntityBody($original);
86
+
87
+ // Listen for read events
88
+ $body->getEventDispatcher()->addListener('body.read', function (Event $e) {
89
+ // Grab data from the event
90
+ $entityBody = $e['body'];
91
+ // Amount of data retrieved from the body
92
+ $lengthOfData = $e['length'];
93
+ // The actual data that was read
94
+ $data = $e['read'];
95
+ });
96
+
97
+ // Listen for write events
98
+ $body->getEventDispatcher()->addListener('body.write', function (Event $e) {
99
+ // Grab data from the event
100
+ $entityBody = $e['body'];
101
+ // The data that was written
102
+ $data = $e['write'];
103
+ // The actual amount of data that was written
104
+ $data = $e['read'];
105
+ });
106
+
107
+ ReadLimitEntityBody
108
+ ~~~~~~~~~~~~~~~~~~~
109
+
110
+ The ReadLimitEntityBody decorator can be used to transfer a subset or slice of an existing EntityBody object. This can
111
+ be useful for breaking a large file into smaller pieces to be sent in chunks (e.g. Amazon S3's multipart upload API).
112
+
113
+ .. code-block:: php
114
+
115
+ use Guzzle\Http\EntityBody;
116
+ use Guzzle\Http\ReadLimitEntityBody;
117
+
118
+ $original = EntityBody::factory(fopen('/tmp/test.txt', 'r+'));
119
+ echo $original->getSize();
120
+ // >>> 1048576
121
+
122
+ // Limit the size of the body to 1024 bytes and start reading from byte 2048
123
+ $body = new ReadLimitEntityBody($original, 1024, 2048);
124
+ echo $body->getSize();
125
+ // >>> 1024
126
+ echo $body->ftell();
127
+ // >>> 0
128
+
129
+ CachingEntityBody
130
+ ~~~~~~~~~~~~~~~~~
131
+
132
+ The CachingEntityBody decorator is used to allow seeking over previously read bytes on non-seekable read streams. This
133
+ can be useful when transferring a non-seekable entity body fails due to needing to rewind the stream (for example,
134
+ resulting from a redirect). Data that is read from the remote stream will be buffered in a PHP temp stream so that
135
+ previously read bytes are cached first in memory, then on disk.
136
+
137
+ .. code-block:: php
138
+
139
+ use Guzzle\Http\EntityBody;
140
+ use Guzzle\Http\CachingEntityBody;
141
+
142
+ $original = EntityBody::factory(fopen('http://www.google.com', 'r'));
143
+ $body = new CachingEntityBody($original);
144
+
145
+ $body->read(1024);
146
+ echo $body->ftell();
147
+ // >>> 1024
148
+
149
+ $body->seek(0);
150
+ echo $body->ftell();
151
+ // >>> 0
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/http-redirects.rst ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ==============
2
+ HTTP redirects
3
+ ==============
4
+
5
+ By default, Guzzle will automatically follow redirects using the non-RFC compliant implementation used by most web
6
+ browsers. This means that redirects for POST requests are followed by a GET request. You can force RFC compliance by
7
+ enabling the strict mode on a request's parameter object:
8
+
9
+ .. code-block:: php
10
+
11
+ // Set per request
12
+ $request = $client->post();
13
+ $request->getParams()->set('redirect.strict', true);
14
+
15
+ // You can set globally on a client so all requests use strict redirects
16
+ $client->getConfig()->set('request.params', array(
17
+ 'redirect.strict' => true
18
+ ));
19
+
20
+ By default, Guzzle will redirect up to 5 times before throwing a ``Guzzle\Http\Exception\TooManyRedirectsException``.
21
+ You can raise or lower this value using the ``redirect.max`` parameter of a request object:
22
+
23
+ .. code-block:: php
24
+
25
+ $request->getParams()->set('redirect.max', 2);
26
+
27
+ Redirect history
28
+ ----------------
29
+
30
+ You can get the number of redirects of a request using the resulting response object's ``getRedirectCount()`` method.
31
+ Similar to cURL's ``effective_url`` property, Guzzle provides the effective URL, or the last redirect URL that returned
32
+ the request, in a response's ``getEffectiveUrl()`` method.
33
+
34
+ When testing or debugging, it is often useful to see a history of redirects for a particular request. This can be
35
+ achieved using the HistoryPlugin.
36
+
37
+ .. code-block:: php
38
+
39
+ $request = $client->get('/');
40
+ $history = new Guzzle\Plugin\History\HistoryPlugin();
41
+ $request->addSubscriber($history);
42
+ $response = $request->send();
43
+
44
+ // Get the last redirect URL or the URL of the request that received
45
+ // this response
46
+ echo $response->getEffectiveUrl();
47
+
48
+ // Get the number of redirects
49
+ echo $response->getRedirectCount();
50
+
51
+ // Iterate over each sent request and response
52
+ foreach ($history->getAll() as $transaction) {
53
+ // Request object
54
+ echo $transaction['request']->getUrl() . "\n";
55
+ // Response object
56
+ echo $transaction['response']->getEffectiveUrl() . "\n";
57
+ }
58
+
59
+ // Or, simply cast the HistoryPlugin to a string to view each request and response
60
+ echo $history;
61
+
62
+ Disabling redirects
63
+ -------------------
64
+
65
+ You can disable redirects on a client by passing a configuration option in the client's constructor:
66
+
67
+ .. code-block:: php
68
+
69
+ $client = new Client(null, array('redirect.disable' => true));
70
+
71
+ You can also disable redirects per request:
72
+
73
+ .. code-block:: php
74
+
75
+ $request = $client->get($url, array(), array('allow_redirects' => false));
76
+
77
+ Redirects and non-repeatable streams
78
+ ------------------------------------
79
+
80
+ If you are redirected when sending data from a non-repeatable stream and some of the data has been read off of the
81
+ stream, then you will get a ``Guzzle\Http\Exception\CouldNotRewindStreamException``. You can get around this error by
82
+ adding a custom rewind method to the entity body object being sent in the request.
83
+
84
+ .. code-block:: php
85
+
86
+ $request = $client->post(
87
+ 'http://httpbin.com/redirect/2',
88
+ null,
89
+ fopen('http://httpbin.com/get', 'r')
90
+ );
91
+
92
+ // Add a custom function that can be used to rewind the stream
93
+ // (reopen in this example)
94
+ $request->getBody()->setRewindFunction(function ($body) {
95
+ $body->setStream(fopen('http://httpbin.com/get', 'r'));
96
+ return true;
97
+ );
98
+
99
+ $response = $client->send();
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/request.rst ADDED
@@ -0,0 +1,667 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ =====================
2
+ Using Request objects
3
+ =====================
4
+
5
+ HTTP request messages
6
+ ---------------------
7
+
8
+ Request objects are all about building an HTTP message. Each part of an HTTP request message can be set individually
9
+ using methods on the request object or set in bulk using the ``setUrl()`` method. Here's the format of an HTTP request
10
+ with each part of the request referencing the method used to change it::
11
+
12
+ PUT(a) /path(b)?query=123(c) HTTP/1.1(d)
13
+ X-Header(e): header
14
+ Content-Length(e): 4
15
+
16
+ data(f)
17
+
18
+ +-------------------------+---------------------------------------------------------------------------------+
19
+ | a. **Method** | The request method can only be set when instantiating a request |
20
+ +-------------------------+---------------------------------------------------------------------------------+
21
+ | b. **Path** | ``$request->setPath('/path');`` |
22
+ +-------------------------+---------------------------------------------------------------------------------+
23
+ | c. **Query** | ``$request->getQuery()->set('query', '123');`` |
24
+ +-------------------------+---------------------------------------------------------------------------------+
25
+ | d. **Protocol version** | ``$request->setProtocolVersion('1.1');`` |
26
+ +-------------------------+---------------------------------------------------------------------------------+
27
+ | e. **Header** | ``$request->setHeader('X-Header', 'header');`` |
28
+ +-------------------------+---------------------------------------------------------------------------------+
29
+ | f. **Entity Body** | ``$request->setBody('data'); // Only available with PUT, POST, PATCH, DELETE`` |
30
+ +-------------------------+---------------------------------------------------------------------------------+
31
+
32
+ Creating requests with a client
33
+ -------------------------------
34
+
35
+ Client objects are responsible for creating HTTP request objects.
36
+
37
+ GET requests
38
+ ~~~~~~~~~~~~
39
+
40
+ `GET requests <http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3>`_ are the most common form of HTTP
41
+ requests. When you visit a website in your browser, the HTML of the website is downloaded using a GET request. GET
42
+ requests are idempotent requests that are typically used to download content (an entity) identified by a request URL.
43
+
44
+ .. code-block:: php
45
+
46
+ use Guzzle\Http\Client;
47
+
48
+ $client = new Client();
49
+
50
+ // Create a request that has a query string and an X-Foo header
51
+ $request = $client->get('http://www.amazon.com?a=1', array('X-Foo' => 'Bar'));
52
+
53
+ // Send the request and get the response
54
+ $response = $request->send();
55
+
56
+ You can change where the body of a response is downloaded on any request using the
57
+ ``$request->setResponseBody(string|EntityBodyInterface|resource)`` method of a request. You can also set the ``save_to``
58
+ option of a request:
59
+
60
+ .. code-block:: php
61
+
62
+ // Send the response body to a file
63
+ $request = $client->get('http://test.com', array(), array('save_to' => '/path/to/file'));
64
+
65
+ // Send the response body to an fopen resource
66
+ $request = $client->get('http://test.com', array(), array('save_to' => fopen('/path/to/file', 'w')));
67
+
68
+ HEAD requests
69
+ ~~~~~~~~~~~~~
70
+
71
+ `HEAD requests <http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4>`_ work exactly like GET requests except
72
+ that they do not actually download the response body (entity) of the response message. HEAD requests are useful for
73
+ retrieving meta information about an entity identified by a Request-URI.
74
+
75
+ .. code-block:: php
76
+
77
+ $client = new Guzzle\Http\Client();
78
+ $request = $client->head('http://www.amazon.com');
79
+ $response = $request->send();
80
+ echo $response->getContentLength();
81
+ // >>> Will output the Content-Length header value
82
+
83
+ DELETE requests
84
+ ~~~~~~~~~~~~~~~
85
+
86
+ A `DELETE method <http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.7>`_ requests that the origin server
87
+ delete the resource identified by the Request-URI.
88
+
89
+ .. code-block:: php
90
+
91
+ $client = new Guzzle\Http\Client();
92
+ $request = $client->delete('http://example.com');
93
+ $response = $request->send();
94
+
95
+ POST requests
96
+ ~~~~~~~~~~~~~
97
+
98
+ While `POST requests <http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5>`_ can be used for a number of
99
+ reasons, POST requests are often used when submitting HTML form data to a website. POST requests can include an entity
100
+ body in the HTTP request.
101
+
102
+ POST requests in Guzzle are sent with an ``application/x-www-form-urlencoded`` Content-Type header if POST fields are
103
+ present but no files are being sent in the POST. If files are specified in the POST request, then the Content-Type
104
+ header will become ``multipart/form-data``.
105
+
106
+ The ``post()`` method of a client object accepts four arguments: the URL, optional headers, post fields, and an array of
107
+ request options. To send files in the POST request, prepend the ``@`` symbol to the array value (just like you would if
108
+ you were using the PHP ``curl_setopt`` function).
109
+
110
+ Here's how to create a multipart/form-data POST request containing files and fields:
111
+
112
+ .. code-block:: php
113
+
114
+ $request = $client->post('http://httpbin.org/post', array(), array(
115
+ 'custom_field' => 'my custom value',
116
+ 'file_field' => '@/path/to/file.xml'
117
+ ));
118
+
119
+ $response = $request->send();
120
+
121
+ .. note::
122
+
123
+ Remember to **always** sanitize user input when sending POST requests:
124
+
125
+ .. code-block:: php
126
+
127
+ // Prevent users from accessing sensitive files by sanitizing input
128
+ $_POST = array('firstname' => '@/etc/passwd');
129
+ $request = $client->post('http://www.example.com', array(), array (
130
+ 'firstname' => str_replace('@', '', $_POST['firstname'])
131
+ ));
132
+
133
+ You can alternatively build up the contents of a POST request.
134
+
135
+ .. code-block:: php
136
+
137
+ $request = $client->post('http://httpbin.org/post')
138
+ ->setPostField('custom_field', 'my custom value')
139
+ ->addPostFile('file', '/path/to/file.xml');
140
+
141
+ $response = $request->send();
142
+
143
+ Raw POST data
144
+ ^^^^^^^^^^^^^
145
+
146
+ POST requests can also contain raw POST data that is not related to HTML forms.
147
+
148
+ .. code-block:: php
149
+
150
+ $request = $client->post('http://httpbin.org/post', array(), 'this is the body');
151
+ $response = $request->send();
152
+
153
+ You can set the body of POST request using the ``setBody()`` method of the
154
+ ``Guzzle\Http\Message\EntityEnclosingRequest`` object. This method accepts a string, a resource returned from
155
+ ``fopen``, or a ``Guzzle\Http\EntityBodyInterface`` object.
156
+
157
+ .. code-block:: php
158
+
159
+ $request = $client->post('http://httpbin.org/post');
160
+ // Set the body of the POST to stream the contents of /path/to/large_body.txt
161
+ $request->setBody(fopen('/path/to/large_body.txt', 'r'));
162
+ $response = $request->send();
163
+
164
+ PUT requests
165
+ ~~~~~~~~~~~~
166
+
167
+ The `PUT method <http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6>`_ requests that the enclosed entity be
168
+ stored under the supplied Request-URI. PUT requests are similar to POST requests in that they both can send an entity
169
+ body in the request message.
170
+
171
+ The body of a PUT request (any any ``Guzzle\Http\Message\EntityEnclosingRequestInterface`` object) is always stored as
172
+ a ``Guzzle\Http\Message\EntityBodyInterface`` object. This allows a great deal of flexibility when sending data to a
173
+ remote server. For example, you can stream the contents of a stream returned by fopen, stream the contents of a
174
+ callback function, or simply send a string of data.
175
+
176
+ .. code-block:: php
177
+
178
+ $request = $client->put('http://httpbin.org/put', array(), 'this is the body');
179
+ $response = $request->send();
180
+
181
+ Just like with POST, PATH, and DELETE requests, you can set the body of a PUT request using the ``setBody()`` method.
182
+
183
+ .. code-block:: php
184
+
185
+ $request = $client->put('http://httpbin.org/put');
186
+ $request->setBody(fopen('/path/to/large_body.txt', 'r'));
187
+ $response = $request->send();
188
+
189
+ PATCH requests
190
+ ~~~~~~~~~~~~~~
191
+
192
+ `PATCH requests <http://tools.ietf.org/html/rfc5789>`_ are used to modify a resource.
193
+
194
+ .. code-block:: php
195
+
196
+ $request = $client->patch('http://httpbin.org', array(), 'this is the body');
197
+ $response = $request->send();
198
+
199
+ OPTIONS requests
200
+ ~~~~~~~~~~~~~~~~
201
+
202
+ The `OPTIONS method <http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.2>`_ represents a request for
203
+ information about the communication options available on the request/response chain identified by the Request-URI.
204
+
205
+ .. code-block:: php
206
+
207
+ $request = $client->options('http://httpbin.org');
208
+ $response = $request->send();
209
+
210
+ // Check if the PUT method is supported by this resource
211
+ var_export($response->isMethodAllows('PUT'));
212
+
213
+ Custom requests
214
+ ~~~~~~~~~~~~~~~
215
+
216
+ You can create custom HTTP requests that use non-standard HTTP methods using the ``createRequest()`` method of a
217
+ client object.
218
+
219
+ .. code-block:: php
220
+
221
+ $request = $client->createRequest('COPY', 'http://example.com/foo', array(
222
+ 'Destination' => 'http://example.com/bar',
223
+ 'Overwrite' => 'T'
224
+ ));
225
+ $response = $request->send();
226
+
227
+ Query string parameters
228
+ -----------------------
229
+
230
+ Query string parameters of a request are owned by a request's ``Guzzle\Http\Query`` object that is accessible by
231
+ calling ``$request->getQuery()``. The Query class extends from ``Guzzle\Common\Collection`` and allows you to set one
232
+ or more query string parameters as key value pairs. You can set a parameter on a Query object using the
233
+ ``set($key, $value)`` method or access the query string object like an associative array. Any previously specified
234
+ value for a key will be overwritten when using ``set()``. Use ``add($key, $value)`` to add a value to query string
235
+ object, and in the event of a collision with an existing value at a specific key, the value will be converted to an
236
+ array that contains all of the previously set values.
237
+
238
+ .. code-block:: php
239
+
240
+ $request = new Guzzle\Http\Message\Request('GET', 'http://www.example.com?foo=bar&abc=123');
241
+
242
+ $query = $request->getQuery();
243
+ echo "{$query}\n";
244
+ // >>> foo=bar&abc=123
245
+
246
+ $query->remove('abc');
247
+ echo "{$query}\n";
248
+ // >>> foo=bar
249
+
250
+ $query->set('foo', 'baz');
251
+ echo "{$query}\n";
252
+ // >>> foo=baz
253
+
254
+ $query->add('foo', 'bar');
255
+ echo "{$query}\n";
256
+ // >>> foo%5B0%5D=baz&foo%5B1%5D=bar
257
+
258
+ Whoah! What happened there? When ``foo=bar`` was added to the existing ``foo=baz`` query string parameter, the
259
+ aggregator associated with the Query object was used to help convert multi-value query string parameters into a string.
260
+ Let's disable URL-encoding to better see what's happening.
261
+
262
+ .. code-block:: php
263
+
264
+ $query->useUrlEncoding(false);
265
+ echo "{$query}\n";
266
+ // >>> foo[0]=baz&foo[1]=bar
267
+
268
+ .. note::
269
+
270
+ URL encoding can be disabled by passing false, enabled by passing true, set to use RFC 1738 by passing
271
+ ``Query::FORM_URLENCODED`` (internally uses PHP's ``urlencode`` function), or set to RFC 3986 by passing
272
+ ``Query::RFC_3986`` (this is the default and internally uses PHP's ``rawurlencode`` function).
273
+
274
+ As you can see, the multiple values were converted into query string parameters following the default PHP convention of
275
+ adding numerically indexed square bracket suffixes to each key (``foo[0]=baz&foo[1]=bar``). The strategy used to convert
276
+ multi-value parameters into a string can be customized using the ``setAggregator()`` method of the Query class. Guzzle
277
+ ships with the following query string aggregators by default:
278
+
279
+ 1. ``Guzzle\Http\QueryAggregator\PhpAggregator``: Aggregates using PHP style brackets (e.g. ``foo[0]=baz&foo[1]=bar``)
280
+ 2. ``Guzzle\Http\QueryAggregator\DuplicateAggregator``: Performs no aggregation and allows for key value pairs to be
281
+ repeated in a URL (e.g. ``foo=baz&foo=bar``)
282
+ 3. ``Guzzle\Http\QueryAggregator\CommaAggregator``: Aggregates using commas (e.g. ``foo=baz,bar``)
283
+
284
+ .. _http-message-headers:
285
+
286
+ HTTP Message Headers
287
+ --------------------
288
+
289
+ HTTP message headers are case insensitive, multiple occurrences of any header can be present in an HTTP message
290
+ (whether it's valid or not), and some servers require specific casing of particular headers. Because of this, request
291
+ and response headers are stored in ``Guzzle\Http\Message\Header`` objects. The Header object can be cast as a string,
292
+ counted, or iterated to retrieve each value from the header. Casting a Header object to a string will return all of
293
+ the header values concatenated together using a glue string (typically ", ").
294
+
295
+ A request (and response) object have several methods that allow you to retrieve and modify headers.
296
+
297
+ * ``getHeaders()``: Get all of the headers of a message as a ``Guzzle\Http\Message\Header\HeaderCollection`` object.
298
+ * ``getHeader($header)``: Get a specific header from a message. If the header exists, you'll get a
299
+ ``Guzzle\Http\Message\Header`` object. If the header does not exist, this methods returns ``null``.
300
+ * ``hasHeader($header)``: Returns true or false based on if the message has a particular header.
301
+ * ``setHeader($header, $value)``: Set a header value and overwrite any previously set value for this header.
302
+ * ``addHeader($header, $value)``: Add a header with a particular name. If a previous value was already set by the same,
303
+ then the header will contain multiple values.
304
+ * ``removeHeader($header)``: Remove a header by name from the message.
305
+
306
+ .. code-block:: php
307
+
308
+ $request = new Request('GET', 'http://httpbin.com/cookies');
309
+ // addHeader will set and append to any existing header values
310
+ $request->addHeader('Foo', 'bar');
311
+ $request->addHeader('foo', 'baz');
312
+ // setHeader overwrites any existing values
313
+ $request->setHeader('Test', '123');
314
+
315
+ // Request headers can be cast as a string
316
+ echo $request->getHeader('Foo');
317
+ // >>> bar, baz
318
+ echo $request->getHeader('Test');
319
+ // >>> 123
320
+
321
+ // You can count the number of headers of a particular case insensitive name
322
+ echo count($request->getHeader('foO'));
323
+ // >>> 2
324
+
325
+ // You can iterate over Header objects
326
+ foreach ($request->getHeader('foo') as $header) {
327
+ echo $header . "\n";
328
+ }
329
+
330
+ // You can get all of the request headers as a Guzzle\Http\Message\Header\HeaderCollection object
331
+ $headers = $request->getHeaders();
332
+
333
+ // Missing headers return NULL
334
+ var_export($request->getHeader('Missing'));
335
+ // >>> null
336
+
337
+ // You can see all of the different variations of a header by calling raw() on the Header
338
+ var_export($request->getHeader('foo')->raw());
339
+
340
+ Setting the body of a request
341
+ -----------------------------
342
+
343
+ Requests that can send a body (e.g. PUT, POST, DELETE, PATCH) are instances of
344
+ ``Guzzle\Http\Message\EntityEnclosingRequestInterface``. Entity enclosing requests contain several methods that allow
345
+ you to specify the body to send with a request.
346
+
347
+ Use the ``setBody()`` method of a request to set the body that will be sent with a request. This method accepts a
348
+ string, a resource returned by ``fopen()``, an array, or an instance of ``Guzzle\Http\EntityBodyInterface``. The body
349
+ will then be streamed from the underlying ``EntityBodyInterface`` object owned by the request. When setting the body
350
+ of the request, you can optionally specify a Content-Type header and whether or not to force the request to use
351
+ chunked Transfer-Encoding.
352
+
353
+ .. code-block:: php
354
+
355
+ $request = $client->put('/user.json');
356
+ $request->setBody('{"foo":"baz"}', 'application/json');
357
+
358
+ Content-Type header
359
+ ~~~~~~~~~~~~~~~~~~~
360
+
361
+ Guzzle will automatically add a Content-Type header to a request if the Content-Type can be guessed based on the file
362
+ extension of the payload being sent or the file extension present in the path of a request.
363
+
364
+ .. code-block:: php
365
+
366
+ $request = $client->put('/user.json', array(), '{"foo":"bar"}');
367
+ // The Content-Type was guessed based on the path of the request
368
+ echo $request->getHeader('Content-Type');
369
+ // >>> application/json
370
+
371
+ $request = $client->put('/user.json');
372
+ $request->setBody(fopen('/tmp/user_data.json', 'r'));
373
+ // The Content-Type was guessed based on the path of the entity body
374
+ echo $request->getHeader('Content-Type');
375
+ // >>> application/json
376
+
377
+ Transfer-Encoding: chunked header
378
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
379
+
380
+ When sending HTTP requests that contain a payload, you must let the remote server know how to determine when the entire
381
+ message has been sent. This usually is done by supplying a ``Content-Length`` header that tells the origin server the
382
+ size of the body that is to be sent. In some cases, the size of the payload being sent in a request cannot be known
383
+ before initiating the transfer. In these cases (when using HTTP/1.1), you can use the ``Transfer-Encoding: chunked``
384
+ header.
385
+
386
+ If the Content-Length cannot be determined (i.e. using a PHP ``http://`` stream), then Guzzle will automatically add
387
+ the ``Transfer-Encoding: chunked`` header to the request.
388
+
389
+ .. code-block:: php
390
+
391
+ $request = $client->put('/user.json');
392
+ $request->setBody(fopen('http://httpbin.org/get', 'r'));
393
+
394
+ // The Content-Length could not be determined
395
+ echo $request->getHeader('Transfer-Encoding');
396
+ // >>> chunked
397
+
398
+ See :doc:`/http-client/entity-bodies` for more information on entity bodies.
399
+
400
+ Expect: 100-Continue header
401
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
402
+
403
+ The ``Expect: 100-Continue`` header is used to help a client prevent sending a large payload to a server that will
404
+ reject the request. This allows clients to fail fast rather than waste bandwidth sending an erroneous payload. Guzzle
405
+ will automatically add the ``Expect: 100-Continue`` header to a request when the size of the payload exceeds 1MB or if
406
+ the body of the request is not seekable (this helps to prevent errors when a non-seekable body request is redirected).
407
+
408
+ .. note::
409
+
410
+ If you find that your larger requests are taking too long to complete, you should first check if the
411
+ ``Expect: 100-Continue`` header is being sent with the request. Some servers do not respond well to this header,
412
+ which causes cURL to sleep for `1 second <http://curl.haxx.se/mail/lib-2010-01/0182.html>`_.
413
+
414
+ POST fields and files
415
+ ~~~~~~~~~~~~~~~~~~~~~
416
+
417
+ Any entity enclosing request can send POST style fields and files. This includes POST, PUT, PATCH, and DELETE requests.
418
+ Any request that has set POST fields or files will use cURL's POST message functionality.
419
+
420
+ .. code-block:: php
421
+
422
+ $request = $client->post('/post');
423
+ // Set an overwrite any previously specified value
424
+ $request->setPostField('foo', 'bar');
425
+ // Append a value to any existing values
426
+ $request->getPostFields()->add('foo', 'baz');
427
+ // Remove a POST field by name
428
+ $request->removePostField('fizz');
429
+
430
+ // Add a file to upload (forces multipart/form-data)
431
+ $request->addPostFile('my_file', '/path/to/file', 'plain/text');
432
+ // Remove a POST file by POST key name
433
+ $request->removePostFile('my_other_file');
434
+
435
+ .. tip::
436
+
437
+ Adding a large number of POST fields to a POST request is faster if you use the ``addPostFields()`` method so that
438
+ you can add and process multiple fields with a single call. Adding multiple POST files is also faster using
439
+ ``addPostFiles()``.
440
+
441
+ Working with cookies
442
+ --------------------
443
+
444
+ Cookies can be modified and retrieved from a request using the following methods:
445
+
446
+ .. code-block:: php
447
+
448
+ $request->addCookie($name, $value);
449
+ $request->removeCookie($name);
450
+ $value = $request->getCookie($name);
451
+ $valueArray = $request->getCookies();
452
+
453
+ Use the :doc:`cookie plugin </plugins/cookie-plugin>` if you need to reuse cookies between requests.
454
+
455
+ .. _request-set-response-body:
456
+
457
+ Changing where a response is downloaded
458
+ ----------------------------------------
459
+
460
+ When a request is sent, the body of the response will be stored in a PHP temp stream by default. You can change the
461
+ location in which the response will be downloaded using ``$request->setResponseBody($body)`` or the ``save_to`` request
462
+ option. This can be useful for downloading the contents of a URL to a specific file.
463
+
464
+ Here's an example of using request options:
465
+
466
+ .. code-block:: php
467
+
468
+ $request = $this->client->get('http://example.com/large.mov', array(), array(
469
+ 'save_to' => '/tmp/large_file.mov'
470
+ ));
471
+ $request->send();
472
+ var_export(file_exists('/tmp/large_file.mov'));
473
+ // >>> true
474
+
475
+ Here's an example of using ``setResponseBody()``:
476
+
477
+ .. code-block:: php
478
+
479
+ $body = fopen('/tmp/large_file.mov', 'w');
480
+ $request = $this->client->get('http://example.com/large.mov');
481
+ $request->setResponseBody($body);
482
+
483
+ // You can more easily specify the name of a file to save the contents
484
+ // of the response to by passing a string to ``setResponseBody()``.
485
+
486
+ $request = $this->client->get('http://example.com/large.mov');
487
+ $request->setResponseBody('/tmp/large_file.mov');
488
+
489
+ Custom cURL options
490
+ -------------------
491
+
492
+ Most of the functionality implemented in the libcurl bindings has been simplified and abstracted by Guzzle. Developers
493
+ who need access to `cURL specific functionality <http://www.php.net/curl_setopt>`_ can still add cURL handle
494
+ specific behavior to Guzzle HTTP requests by modifying the cURL options collection of a request:
495
+
496
+ .. code-block:: php
497
+
498
+ $request->getCurlOptions()->set(CURLOPT_LOW_SPEED_LIMIT, 200);
499
+
500
+ Other special options that can be set in the ``curl.options`` array include:
501
+
502
+ +-------------------------+---------------------------------------------------------------------------------+
503
+ | debug | Adds verbose cURL output to a temp stream owned by the cURL handle object |
504
+ +-------------------------+---------------------------------------------------------------------------------+
505
+ | progress | Instructs cURL to emit events when IO events occur. This allows you to be |
506
+ | | notified when bytes are transferred over the wire by subscribing to a request's |
507
+ | | ``curl.callback.read``, ``curl.callback.write``, and ``curl.callback.progress`` |
508
+ | | events. |
509
+ +-------------------------+---------------------------------------------------------------------------------+
510
+
511
+ Request options
512
+ ---------------
513
+
514
+ Requests options can be specified when creating a request or in the ``request.options`` parameter of a client. These
515
+ options can control various aspects of a request including: headers to send, query string data, where the response
516
+ should be downloaded, proxies, auth, etc.
517
+
518
+ .. code-block:: php
519
+
520
+ $request = $client->get($url, $headers, array('proxy' => 'http://proxy.com'));
521
+
522
+ See :ref:`Request options <request-options>` for more information.
523
+
524
+ Working with errors
525
+ -------------------
526
+
527
+ HTTP errors
528
+ ~~~~~~~~~~~
529
+
530
+ Requests that receive a 4xx or 5xx response will throw a ``Guzzle\Http\Exception\BadResponseException``. More
531
+ specifically, 4xx errors throw a ``Guzzle\Http\Exception\ClientErrorResponseException``, and 5xx errors throw a
532
+ ``Guzzle\Http\Exception\ServerErrorResponseException``. You can catch the specific exceptions or just catch the
533
+ BadResponseException to deal with either type of error. Here's an example of catching a generic BadResponseException:
534
+
535
+ .. code-block:: php
536
+
537
+ try {
538
+ $response = $client->get('/not_found.xml')->send();
539
+ } catch (Guzzle\Http\Exception\BadResponseException $e) {
540
+ echo 'Uh oh! ' . $e->getMessage();
541
+ echo 'HTTP request URL: ' . $e->getRequest()->getUrl() . "\n";
542
+ echo 'HTTP request: ' . $e->getRequest() . "\n";
543
+ echo 'HTTP response status: ' . $e->getResponse()->getStatusCode() . "\n";
544
+ echo 'HTTP response: ' . $e->getResponse() . "\n";
545
+ }
546
+
547
+ Throwing an exception when a 4xx or 5xx response is encountered is the default behavior of Guzzle requests. This
548
+ behavior can be overridden by adding an event listener with a higher priority than -255 that stops event propagation.
549
+ You can subscribe to ``request.error`` to receive notifications any time an unsuccessful response is received.
550
+
551
+ You can change the response that will be associated with the request by calling ``setResponse()`` on the
552
+ ``$event['request']`` object passed into your listener, or by changing the ``$event['response']`` value of the
553
+ ``Guzzle\Common\Event`` object that is passed to your listener. Transparently changing the response associated with a
554
+ request by modifying the event allows you to retry failed requests without complicating the code that uses the client.
555
+ This might be useful for sending requests to a web service that has expiring auth tokens. When a response shows that
556
+ your token has expired, you can get a new token, retry the request with the new token, and return the successful
557
+ response to the user.
558
+
559
+ Here's an example of retrying a request using updated authorization credentials when a 401 response is received,
560
+ overriding the response of the original request with the new response, and still allowing the default exception
561
+ behavior to be called when other non-200 response status codes are encountered:
562
+
563
+ .. code-block:: php
564
+
565
+ // Add custom error handling to any request created by this client
566
+ $client->getEventDispatcher()->addListener('request.error', function(Event $event) {
567
+
568
+ if ($event['response']->getStatusCode() == 401) {
569
+
570
+ $newRequest = $event['request']->clone();
571
+ $newRequest->setHeader('X-Auth-Header', MyApplication::getNewAuthToken());
572
+ $newResponse = $newRequest->send();
573
+
574
+ // Set the response object of the request without firing more events
575
+ $event['response'] = $newResponse;
576
+
577
+ // You can also change the response and fire the normal chain of
578
+ // events by calling $event['request']->setResponse($newResponse);
579
+
580
+ // Stop other events from firing when you override 401 responses
581
+ $event->stopPropagation();
582
+ }
583
+
584
+ });
585
+
586
+ cURL errors
587
+ ~~~~~~~~~~~
588
+
589
+ Connection problems and cURL specific errors can also occur when transferring requests using Guzzle. When Guzzle
590
+ encounters cURL specific errors while transferring a single request, a ``Guzzle\Http\Exception\CurlException`` is
591
+ thrown with an informative error message and access to the cURL error message.
592
+
593
+ A ``Guzzle\Http\Exception\MultiTransferException`` exception is thrown when a cURL specific error occurs while
594
+ transferring multiple requests in parallel. You can then iterate over all of the exceptions encountered during the
595
+ transfer.
596
+
597
+ Plugins and events
598
+ ------------------
599
+
600
+ Guzzle request objects expose various events that allow you to hook in custom logic. A request object owns a
601
+ ``Symfony\Component\EventDispatcher\EventDispatcher`` object that can be accessed by calling
602
+ ``$request->getEventDispatcher()``. You can use the event dispatcher to add listeners (a simple callback function) or
603
+ event subscribers (classes that listen to specific events of a dispatcher). You can add event subscribers to a request
604
+ directly by just calling ``$request->addSubscriber($mySubscriber);``.
605
+
606
+ .. _request-events:
607
+
608
+ Events emitted from a request
609
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
610
+
611
+ A ``Guzzle\Http\Message\Request`` and ``Guzzle\Http\Message\EntityEnclosingRequest`` object emit the following events:
612
+
613
+ +------------------------------+--------------------------------------------+------------------------------------------+
614
+ | Event name | Description | Event data |
615
+ +==============================+============================================+==========================================+
616
+ | request.before_send | About to send request | * request: Request to be sent |
617
+ +------------------------------+--------------------------------------------+------------------------------------------+
618
+ | request.sent | Sent the request | * request: Request that was sent |
619
+ | | | * response: Received response |
620
+ +------------------------------+--------------------------------------------+------------------------------------------+
621
+ | request.complete | Completed a full HTTP transaction | * request: Request that was sent |
622
+ | | | * response: Received response |
623
+ +------------------------------+--------------------------------------------+------------------------------------------+
624
+ | request.success | Completed a successful request | * request: Request that was sent |
625
+ | | | * response: Received response |
626
+ +------------------------------+--------------------------------------------+------------------------------------------+
627
+ | request.error | Completed an unsuccessful request | * request: Request that was sent |
628
+ | | | * response: Received response |
629
+ +------------------------------+--------------------------------------------+------------------------------------------+
630
+ | request.exception | An unsuccessful response was | * request: Request |
631
+ | | received. | * response: Received response |
632
+ | | | * exception: BadResponseException |
633
+ +------------------------------+--------------------------------------------+------------------------------------------+
634
+ | request.receive.status_line | Received the start of a response | * line: Full response start line |
635
+ | | | * status_code: Status code |
636
+ | | | * reason_phrase: Reason phrase |
637
+ | | | * previous_response: (e.g. redirect) |
638
+ +------------------------------+--------------------------------------------+------------------------------------------+
639
+ | curl.callback.progress | cURL progress event (only dispatched when | * handle: CurlHandle |
640
+ | | ``emit_io`` is set on a request's curl | * download_size: Total download size |
641
+ | | options) | * downloaded: Bytes downloaded |
642
+ | | | * upload_size: Total upload bytes |
643
+ | | | * uploaded: Bytes uploaded |
644
+ +------------------------------+--------------------------------------------+------------------------------------------+
645
+ | curl.callback.write | cURL event called when data is written to | * request: Request |
646
+ | | an outgoing stream | * write: Data being written |
647
+ +------------------------------+--------------------------------------------+------------------------------------------+
648
+ | curl.callback.read | cURL event called when data is written to | * request: Request |
649
+ | | an incoming stream | * read: Data being read |
650
+ +------------------------------+--------------------------------------------+------------------------------------------+
651
+
652
+ Creating a request event listener
653
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
654
+
655
+ Here's an example that listens to the ``request.complete`` event of a request and prints the request and response.
656
+
657
+ .. code-block:: php
658
+
659
+ use Guzzle\Common\Event;
660
+
661
+ $request = $client->get('http://www.google.com');
662
+
663
+ // Echo out the response that was received
664
+ $request->getEventDispatcher()->addListener('request.complete', function (Event $e) {
665
+ echo $e['request'] . "\n\n";
666
+ echo $e['response'];
667
+ });
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/response.rst ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ======================
2
+ Using Response objects
3
+ ======================
4
+
5
+ Sending a request will return a ``Guzzle\Http\Message\Response`` object. You can view the raw HTTP response message by
6
+ casting the Response object to a string. Casting the response to a string will return the entity body of the response
7
+ as a string too, so this might be an expensive operation if the entity body is stored in a file or network stream. If
8
+ you only want to see the response headers, you can call ``getRawHeaders()``.
9
+
10
+ Response status line
11
+ --------------------
12
+
13
+ The different parts of a response's `status line <http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1>`_
14
+ (the first line of the response HTTP message) are easily retrievable.
15
+
16
+ .. code-block:: php
17
+
18
+ $response = $client->get('http://www.amazon.com')->send();
19
+
20
+ echo $response->getStatusCode(); // >>> 200
21
+ echo $response->getReasonPhrase(); // >>> OK
22
+ echo $response->getProtocol(); // >>> HTTP
23
+ echo $response->getProtocolVersion(); // >>> 1.1
24
+
25
+ You can determine the type of the response using several helper methods:
26
+
27
+ .. code-block:: php
28
+
29
+ $response->isSuccessful(); // true
30
+ $response->isInformational();
31
+ $response->isRedirect();
32
+ $response->isClientError();
33
+ $response->isServerError();
34
+
35
+ Response headers
36
+ ----------------
37
+
38
+ The Response object contains helper methods for retrieving common response headers. These helper methods normalize the
39
+ variations of HTTP response headers.
40
+
41
+ .. code-block:: php
42
+
43
+ $response->getCacheControl();
44
+ $response->getContentType();
45
+ $response->getContentLength();
46
+ $response->getContentEncoding();
47
+ $response->getContentMd5();
48
+ $response->getEtag();
49
+ // etc... There are methods for every known response header
50
+
51
+ You can interact with the Response headers using the same exact methods used to interact with Request headers. See
52
+ :ref:`http-message-headers` for more information.
53
+
54
+ .. code-block:: php
55
+
56
+ echo $response->getHeader('Content-Type');
57
+ echo $response->getHeader('Content-Length');
58
+ echo $response->getHeaders()['Content-Type']; // PHP 5.4
59
+
60
+ Response body
61
+ -------------
62
+
63
+ The entity body object of a response can be retrieved by calling ``$response->getBody()``. The response EntityBody can
64
+ be cast to a string, or you can pass ``true`` to this method to retrieve the body as a string.
65
+
66
+ .. code-block:: php
67
+
68
+ $request = $client->get('http://www.amazon.com');
69
+ $response = $request->send();
70
+ echo $response->getBody();
71
+
72
+ See :doc:`/http-client/entity-bodies` for more information on entity bodies.
73
+
74
+ JSON Responses
75
+ ~~~~~~~~~~~~~~
76
+
77
+ You can easily parse and use a JSON response as an array using the ``json()`` method of a response. This method will
78
+ always return an array if the response is valid JSON or if the response body is empty. You will get an exception if you
79
+ call this method and the response is not valid JSON.
80
+
81
+ .. code-block:: php
82
+
83
+ $data = $response->json();
84
+ echo gettype($data);
85
+ // >>> array
86
+
87
+ XML Responses
88
+ ~~~~~~~~~~~~~
89
+
90
+ You can easily parse and use a XML response as SimpleXMLElement object using the ``xml()`` method of a response. This
91
+ method will always return a SimpleXMLElement object if the response is valid XML or if the response body is empty. You
92
+ will get an exception if you call this method and the response is not valid XML.
93
+
94
+ .. code-block:: php
95
+
96
+ $xml = $response->xml();
97
+ echo $xml->foo;
98
+ // >>> Bar!
99
+
100
+ Streaming responses
101
+ -------------------
102
+
103
+ Some web services provide streaming APIs that allow a client to keep a HTTP request open for an extended period of
104
+ time while polling and reading. Guzzle provides a simple way to convert HTTP request messages into
105
+ ``Guzzle\Stream\Stream`` objects so that you can send the initial headers of a request, read the response headers, and
106
+ pull in the response body manually as needed.
107
+
108
+ Here's an example using the Twitter Streaming API to track the keyword "bieber":
109
+
110
+ .. code-block:: php
111
+
112
+ use Guzzle\Http\Client;
113
+ use Guzzle\Stream\PhpStreamRequestFactory;
114
+
115
+ $client = new Client('https://stream.twitter.com/1');
116
+
117
+ $request = $client->post('statuses/filter.json', null, array(
118
+ 'track' => 'bieber'
119
+ ));
120
+
121
+ $request->setAuth('myusername', 'mypassword');
122
+
123
+ $factory = new PhpStreamRequestFactory();
124
+ $stream = $factory->fromRequest($request);
125
+
126
+ // Read until the stream is closed
127
+ while (!$stream->feof()) {
128
+ // Read a line from the stream
129
+ $line = $stream->readLine();
130
+ // JSON decode the line of data
131
+ $data = json_decode($line, true);
132
+ }
133
+
134
+ You can use the ``stream`` request option when using a static client to more easily create a streaming response.
135
+
136
+ .. code-block:: php
137
+
138
+ $stream = Guzzle::get('http://guzzlephp.org', array('stream' => true));
139
+ while (!$stream->feof()) {
140
+ echo $stream->readLine();
141
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/http-client/uri-templates.rst ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ =============
2
+ URI templates
3
+ =============
4
+
5
+ The ``$uri`` passed to one of the client's request creational methods or the base URL of a client can utilize URI
6
+ templates. Guzzle supports the entire `URI templates RFC <http://tools.ietf.org/html/rfc6570>`_. URI templates add a
7
+ special syntax to URIs that replace template place holders with user defined variables.
8
+
9
+ Every request created by a Guzzle HTTP client passes through a URI template so that URI template expressions are
10
+ automatically expanded:
11
+
12
+ .. code-block:: php
13
+
14
+ $client = new Guzzle\Http\Client('https://example.com/', array('a' => 'hi'));
15
+ $request = $client->get('/{a}');
16
+
17
+ Because of URI template expansion, the URL of the above request will become ``https://example.com/hi``. Notice that
18
+ the template was expanded using configuration variables of the client. You can pass in custom URI template variables
19
+ by passing the URI of your request as an array where the first index of the array is the URI template and the second
20
+ index of the array are template variables that are merged into the client's configuration variables.
21
+
22
+ .. code-block:: php
23
+
24
+ $request = $client->get(array('/test{?a,b}', array('b' => 'there')));
25
+
26
+ The URL for this request will become ``https://test.com?a=hi&b=there``. URI templates aren't limited to just simple
27
+ variable replacements; URI templates can provide an enormous amount of flexibility when creating request URIs.
28
+
29
+ .. code-block:: php
30
+
31
+ $request = $client->get(array('http://example.com{+path}{/segments*}{?query,data*}', array(
32
+ 'path' => '/foo/bar',
33
+ 'segments' => array('one', 'two'),
34
+ 'query' => 'test',
35
+ 'data' => array(
36
+ 'more' => 'value'
37
+ )
38
+ )));
39
+
40
+ The resulting URL would become ``http://example.com/foo/bar/one/two?query=test&more=value``.
41
+
42
+ By default, URI template expressions are enclosed in an opening and closing brace (e.g. ``{var}``). If you are working
43
+ with a web service that actually uses braces (e.g. Solr), then you can specify a custom regular expression to use to
44
+ match URI template expressions.
45
+
46
+ .. code-block:: php
47
+
48
+ $client->getUriTemplate()->setRegex('/\<\$(.+)\>/');
49
+ $client->get('/<$a>');
50
+
51
+ You can learn about all of the different features of URI templates by reading the
52
+ `URI templates RFC <http://tools.ietf.org/html/rfc6570>`_.
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/index.rst ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ .. title:: Guzzle | PHP HTTP client and framework for consuming RESTful web services
2
+ .. toctree::
3
+ :hidden:
4
+
5
+ docs.rst
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/iterators/guzzle-iterators.rst ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ================
2
+ Guzzle iterators
3
+ ================
4
+
5
+ Guzzle provides several SPL iterators that can be used with other SPL iterators, including Guzzle resource iterators.
6
+ Guzzle's ``guzzle/iterator`` component can also be used independently of the rest of Guzzle through Packagist and
7
+ Composer: https://packagist.org/packages/guzzle/iterator
8
+
9
+ ChunkedIterator
10
+ ---------------
11
+
12
+ Pulls out multiple values from an inner iterator and yields and array of values for each outer iteration -- essentially
13
+ pulling out chunks of values from the inner iterator.
14
+
15
+ .. code-block:: php
16
+
17
+ use Guzzle\Iterator\ChunkedIterator;
18
+
19
+ $inner = new ArrayIterator(range(0, 8));
20
+ $chunkedIterator = new ChunkedIterator($inner, 2);
21
+
22
+ foreach ($chunkedIterator as $chunk) {
23
+ echo implode(', ', $chunk) . "\n";
24
+ }
25
+
26
+ // >>> 0, 1
27
+ // >>> 2, 3
28
+ // >>> 4, 5
29
+ // >>> 6, 7
30
+ // >>> 8
31
+
32
+ FilterIterator
33
+ --------------
34
+
35
+ This iterator is used to filter values out of the inner iterator. This iterator can be used when PHP 5.4's
36
+ CallbackFilterIterator is not available.
37
+
38
+ .. code-block:: php
39
+
40
+ use Guzzle\Iterator\FilterIterator;
41
+
42
+ $inner = new ArrayIterator(range(1, 10));
43
+ $filterIterator = new FilterIterator($inner, function ($value) {
44
+ return $value % 2;
45
+ });
46
+
47
+ foreach ($filterIterator as $value) {
48
+ echo $value . "\n";
49
+ }
50
+
51
+ // >>> 2
52
+ // >>> 4
53
+ // >>> 6
54
+ // >>> 8
55
+ // >>> 10
56
+
57
+ MapIterator
58
+ -----------
59
+
60
+ This iterator modifies the values of the inner iterator before yielding.
61
+
62
+ .. code-block:: php
63
+
64
+ use Guzzle\Iterator\MapIterator;
65
+
66
+ $inner = new ArrayIterator(range(0, 3));
67
+
68
+ $mapIterator = new MapIterator($inner, function ($value) {
69
+ return $value * 10;
70
+ });
71
+
72
+ foreach ($mapIterator as $value) {
73
+ echo $value . "\n";
74
+ }
75
+
76
+ // >>> 0
77
+ // >>> 10
78
+ // >>> 20
79
+ // >>> 30
80
+
81
+ MethodProxyIterator
82
+ -------------------
83
+
84
+ This decorator is useful when you need to expose a specific method from an inner iterator that might be wrapper
85
+ by one or more iterator decorators. This decorator proxies missing method calls to each inner iterator until one
86
+ of the inner iterators can fulfill the call.
87
+
88
+ .. code-block:: php
89
+
90
+ use Guzzle\Iterator\MethodProxyIterator;
91
+
92
+ $inner = new \ArrayIterator();
93
+ $proxy = new MethodProxyIterator($inner);
94
+
95
+ // Proxy method calls to the ArrayIterator
96
+ $proxy->append('a');
97
+ $proxy->append('b');
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/iterators/resource-iterators.rst ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ==================
2
+ Resource iterators
3
+ ==================
4
+
5
+ Web services often implement pagination in their responses which requires the end-user to issue a series of consecutive
6
+ requests in order to fetch all of the data they asked for. Users of your web service client should not be responsible
7
+ for implementing the logic involved in iterating through pages of results. Guzzle provides a simple resource iterator
8
+ foundation to make it easier on web service client developers to offer a useful abstraction layer.
9
+
10
+ Getting an iterator from a client
11
+ ---------------------------------
12
+
13
+ ResourceIteratorInterface Guzzle\Service\Client::getIterator($command [, array $commandOptions, array $iteratorOptions ])
14
+
15
+ The ``getIterator`` method of a ``Guzzle\Service\ClientInterface`` object provides a convenient interface for
16
+ instantiating a resource iterator for a specific command. This method implicitly uses a
17
+ ``Guzzle\Service\Resource\ResourceIteratorFactoryInterface`` object to create resource iterators. Pass an
18
+ instantiated command object or the name of a command in the first argument. When passing the name of a command, the
19
+ command factory of the client will create the command by name using the ``$commandOptions`` array. The third argument
20
+ may be used to pass an array of options to the constructor of the instantiated ``ResourceIteratorInterface`` object.
21
+
22
+ .. code-block:: php
23
+
24
+ $iterator = $client->getIterator('get_users');
25
+
26
+ foreach ($iterator as $user) {
27
+ echo $user['name'] . ' age ' . $user['age'] . PHP_EOL;
28
+ }
29
+
30
+ The above code sample might execute a single request or a thousand requests. As a consumer of a web service, I don't
31
+ care. I just want to iterate over all of the users.
32
+
33
+ Iterator options
34
+ ~~~~~~~~~~~~~~~~
35
+
36
+ The two universal options that iterators should support are ``limit`` and ``page_size``. Using the ``limit`` option
37
+ tells the resource iterator to attempt to limit the total number of iterated resources to a specific amount. Keep in
38
+ mind that this is not always possible due to limitations that may be inherent to a web service. The ``page_size``
39
+ option is used to tell a resource iterator how many resources to request per page of results. Much like the ``limit``
40
+ option, you can not rely on getting back exactly the number of resources your specify in the ``page_size`` option.
41
+
42
+ .. note::
43
+
44
+ The ``limit`` and ``page_size`` options can also be specified on an iterator using the ``setLimit($limit)`` and
45
+ ``setPageSize($pageSize)`` methods.
46
+
47
+ Resolving iterator class names
48
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
49
+
50
+ The default resource iterator factory of a client object expects that your iterators are stored under the ``Model``
51
+ folder of your client and that an iterator is names after the CamelCase name of a command followed by the word
52
+ "Iterator". For example, if you wanted to create an iterator for the ``get_users`` command, then your iterator class
53
+ would be ``Model\GetUsersIterator`` and would be stored in ``Model/GetUsersIterator.php``.
54
+
55
+ Creating an iterator
56
+ --------------------
57
+
58
+ While not required, resource iterators in Guzzle typically iterate using a ``Guzzle\Service\Command\CommandInterface``
59
+ object. ``Guzzle\Service\Resource\ResourceIterator``, the default iterator implementation that you should extend,
60
+ accepts a command object and array of iterator options in its constructor. The command object passed to the resource
61
+ iterator is expected to be ready to execute and not previously executed. The resource iterator keeps a reference of
62
+ this command and clones the original command each time a subsequent request needs to be made to fetch more data.
63
+
64
+ Implement the sendRequest method
65
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
66
+
67
+ The most important thing (and usually the only thing) you need to do when creating a resource iterator is to implement
68
+ the ``sendRequest()`` method of the resource iterator. The ``sendRequest()`` method is called when you begin
69
+ iterating or if there are no resources left to iterate and it you expect to retrieve more resources by making a
70
+ subsequent request. The ``$this->command`` property of the resource iterator is updated with a cloned copy of the
71
+ original command object passed into the constructor of the iterator. Use this command object to issue your subsequent
72
+ requests.
73
+
74
+ The ``sendRequest()`` method must return an array of the resources you retrieved from making the subsequent call.
75
+ Returning an empty array will stop the iteration. If you suspect that your web service client will occasionally return
76
+ an empty result set but still requires further iteration, then you must implement a sort of loop in your
77
+ ``sendRequest()`` method that will continue to issue subsequent requests until your reach the end of the paginated
78
+ result set or until additional resources are retrieved from the web service.
79
+
80
+ Update the nextToken property
81
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
82
+
83
+ Beyond fetching more results, the ``sendRequest()`` method is responsible for updating the ``$this->nextToken``
84
+ property of the iterator. Setting this property to anything other than null tells the iterator that issuing a
85
+ subsequent request using the nextToken value will probably return more results. You must continually update this
86
+ value in your ``sendRequest()`` method as each response is received from the web service.
87
+
88
+ Example iterator
89
+ ----------------
90
+
91
+ Let's say you want to implement a resource iterator for the ``get_users`` command of your web service. The
92
+ ``get_users`` command receives a response that contains a list of users, and if there are more pages of results to
93
+ retrieve, returns a value called ``next_user``. This return value is known as the **next token** and should be used to
94
+ issue subsequent requests.
95
+
96
+ Assume the response to a ``get_users`` command returns JSON data that looks like this:
97
+
98
+ .. code-block:: javascript
99
+
100
+ {
101
+ "users": [
102
+ { "name": "Craig Johnson", "age": 10 },
103
+ { "name": "Tom Barker", "age": 20 },
104
+ { "name": "Bob Mitchell", "age": 74 }
105
+ ],
106
+ "next_user": "Michael Dowling"
107
+ }
108
+
109
+ Assume that because there is a ``next_user`` value, there will be more users if a subsequent request is issued. If the
110
+ ``next_user`` value is missing or null, then we know there are no more results to fetch. Let's implement a resource
111
+ iterator for this command.
112
+
113
+ .. code-block:: php
114
+
115
+ namespace MyService\Model;
116
+
117
+ use Guzzle\Service\Resource\ResourceIterator;
118
+
119
+ /**
120
+ * Iterate over a get_users command
121
+ */
122
+ class GetUsersIterator extends ResourceIterator
123
+ {
124
+ protected function sendRequest()
125
+ {
126
+ // If a next token is set, then add it to the command
127
+ if ($this->nextToken) {
128
+ $this->command->set('next_user', $this->nextToken);
129
+ }
130
+
131
+ // Execute the command and parse the result
132
+ $result = $this->command->execute();
133
+
134
+ // Parse the next token
135
+ $this->nextToken = isset($result['next_user']) ? $result['next_user'] : false;
136
+
137
+ return $result['users'];
138
+ }
139
+ }
140
+
141
+ As you can see, it's pretty simple to implement an iterator. There are a few things that you should notice from this
142
+ example:
143
+
144
+ 1. You do not need to create a new command in the ``sendRequest()`` method. A new command object is cloned from the
145
+ original command passed into the constructor of the iterator before the ``sendRequest()`` method is called.
146
+ Remember that the resource iterator expects a command that has not been executed.
147
+ 2. When the ``sendRequest()`` method is first called, you will not have a ``$this->nextToken`` value, so always check
148
+ before setting it on a command. Notice that the next token is being updated each time a request is sent.
149
+ 3. After fetching more resources from the service, always return an array of resources.
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/async-plugin.rst ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ============
2
+ Async plugin
3
+ ============
4
+
5
+ The AsyncPlugin allows you to send requests that do not wait on a response. This is handled through cURL by utilizing
6
+ the progress event. When a request has sent all of its data to the remote server, Guzzle adds a 1ms timeout on the
7
+ request and instructs cURL to not download the body of the response. The async plugin then catches the exception and
8
+ adds a mock response to the request, along with an X-Guzzle-Async header to let you know that the response was not
9
+ fully downloaded.
10
+
11
+ .. code-block:: php
12
+
13
+ use Guzzle\Http\Client;
14
+ use Guzzle\Plugin\Async\AsyncPlugin;
15
+
16
+ $client = new Client('http://www.example.com');
17
+ $client->addSubscriber(new AsyncPlugin());
18
+ $response = $client->get()->send();
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/backoff-plugin.rst ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ====================
2
+ Backoff retry plugin
3
+ ====================
4
+
5
+ The ``Guzzle\Plugin\Backoff\BackoffPlugin`` automatically retries failed HTTP requests using custom backoff strategies:
6
+
7
+ .. code-block:: php
8
+
9
+ use Guzzle\Http\Client;
10
+ use Guzzle\Plugin\Backoff\BackoffPlugin;
11
+
12
+ $client = new Client('http://www.test.com/');
13
+ // Use a static factory method to get a backoff plugin using the exponential backoff strategy
14
+ $backoffPlugin = BackoffPlugin::getExponentialBackoff();
15
+
16
+ // Add the backoff plugin to the client object
17
+ $client->addSubscriber($backoffPlugin);
18
+
19
+ The BackoffPlugin's constructor accepts a ``Guzzle\Plugin\Backoff\BackoffStrategyInterface`` object that is used to
20
+ determine when a retry should be issued and how long to delay between retries. The above code example shows how to
21
+ attach a BackoffPlugin to a client that is pre-configured to retry failed 500 and 503 responses using truncated
22
+ exponential backoff (emulating the behavior of Guzzle 2's ExponentialBackoffPlugin).
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/cache-plugin.rst ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ =================
2
+ HTTP Cache plugin
3
+ =================
4
+
5
+ Guzzle can leverage HTTP's caching specifications using the ``Guzzle\Plugin\Cache\CachePlugin``. The CachePlugin
6
+ provides a private transparent proxy cache that caches HTTP responses. The caching logic, based on
7
+ `RFC 2616 <http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html>`_, uses HTTP headers to control caching behavior,
8
+ cache lifetime, and supports Vary, ETag, and Last-Modified based revalidation:
9
+
10
+ .. code-block:: php
11
+
12
+ use Guzzle\Http\Client;
13
+ use Doctrine\Common\Cache\FilesystemCache;
14
+ use Guzzle\Cache\DoctrineCacheAdapter;
15
+ use Guzzle\Plugin\Cache\CachePlugin;
16
+ use Guzzle\Plugin\Cache\DefaultCacheStorage;
17
+
18
+ $client = new Client('http://www.test.com/');
19
+
20
+ $cachePlugin = new CachePlugin(array(
21
+ 'storage' => new DefaultCacheStorage(
22
+ new DoctrineCacheAdapter(
23
+ new FilesystemCache('/path/to/cache/files')
24
+ )
25
+ )
26
+ ));
27
+
28
+ // Add the cache plugin to the client object
29
+ $client->addSubscriber($cachePlugin);
30
+ $client->get('http://www.wikipedia.org/')->send();
31
+
32
+ // The next request will revalidate against the origin server to see if it
33
+ // has been modified. If a 304 response is received the response will be
34
+ // served from cache
35
+ $client->get('http://www.wikipedia.org/')->send();
36
+
37
+ The cache plugin intercepts GET and HEAD requests before they are actually transferred to the origin server. The cache
38
+ plugin then generates a hash key based on the request method and URL, and checks to see if a response exists in the cache. If
39
+ a response exists in the cache, the cache adapter then checks to make sure that the caching rules associated with the response
40
+ satisfy the request, and ensures that response still fresh. If the response is acceptable for the request any required
41
+ revalidation, then the cached response is served instead of contacting the origin server.
42
+
43
+ Vary
44
+ ----
45
+
46
+ Cache keys are derived from a request method and a request URL. Multiple responses can map to the same cache key and
47
+ stored in Guzzle's underlying cache storage object. You should use the ``Vary`` HTTP header to tell the cache storage
48
+ object that the cache response must have been cached for a request that matches the headers specified in the Vary header
49
+ of the request. This allows you to have specific cache entries for the same request URL but variations in a request's
50
+ headers determine which cache entry is served. Please see the http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44
51
+ for more information.
52
+
53
+ Cache options
54
+ -------------
55
+
56
+ There are several options you can add to requests or clients to modify the behavior of the cache plugin.
57
+
58
+ Override cache TTL
59
+ ~~~~~~~~~~~~~~~~~~
60
+
61
+ You can override the number of seconds a cacheable response is stored in the cache by setting the
62
+ ``cache.override_ttl`` parameter on the params object of a request:
63
+
64
+ .. code-block:: php
65
+
66
+ // If the response to the request is cacheable, then the response will be cached for 100 seconds
67
+ $request->getParams()->set('cache.override_ttl', 100);
68
+
69
+ If a response doesn't specify any freshness policy, it will be kept in cache for 3600 seconds by default.
70
+
71
+ Custom caching decision
72
+ ~~~~~~~~~~~~~~~~~~~~~~~
73
+
74
+ If the service you are interacting with does not return caching headers or returns responses that are normally
75
+ something that would not be cached, you can set a custom ``can_cache`` object on the constructor of the CachePlugin
76
+ and provide a ``Guzzle\Plugin\Cache\CanCacheInterface`` object. You can use the
77
+ ``Guzzle\Plugin\Cache\CallbackCanCacheStrategy`` to easily make a caching decision based on an HTTP request and
78
+ response.
79
+
80
+ Revalidation options
81
+ ~~~~~~~~~~~~~~~~~~~~
82
+
83
+ You can change the revalidation behavior of a request using the ``cache.revalidate`` parameter. Setting this
84
+ parameter to ``never`` will ensure that a revalidation request is never sent, and the response is always served from
85
+ the origin server. Setting this parameter to ``skip`` will never revalidate and uses the response stored in the cache.
86
+
87
+ Normalizing requests for caching
88
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
89
+
90
+ Use the ``cache.key_filter`` parameter if you wish to strip certain query string parameters from your
91
+ request before creating a unique hash for the request. This parameter can be useful if your requests have query
92
+ string values that cause each request URL to be unique (thus preventing a cache hit). The ``cache.key_filter``
93
+ format is simply a comma separated list of query string values to remove from the URL when creating a cache key.
94
+ For example, here we are saying that the ``a`` and ``q`` query string variables should be ignored when generating a
95
+ cache key for the request:
96
+
97
+ .. code-block:: php
98
+
99
+ $request->getParams()->set('cache.key_filter', 'a, q');
100
+
101
+ Other options
102
+ ~~~~~~~~~~~~~
103
+
104
+ There are many other options available to the CachePlugin that can meet almost any caching requirement, including
105
+ custom revalidation implementations, custom cache key generators, custom caching decision strategies, and custom
106
+ cache storage objects. Take a look the constructor of ``Guzzle\Plugin\Cache\CachePlugin`` for more information.
107
+
108
+ Setting Client-wide cache settings
109
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
110
+
111
+ You can specify cache settings for every request created by a client by adding cache settings to the configuration
112
+ options of a client.
113
+
114
+ .. code-block:: php
115
+
116
+ $client = new Guzzle\Http\Client('http://www.test.com', array(
117
+ 'request.params' => array(
118
+ 'cache.override_ttl' => 3600,
119
+ 'params.cache.revalidate' => 'never'
120
+ )
121
+ ));
122
+
123
+ echo $client->get('/')->getParams()->get('cache.override_ttl');
124
+ // >>> 3600
125
+
126
+ echo $client->get('/')->getParams()->get('cache.revalidate');
127
+ // >>> never
128
+
129
+ Cache revalidation
130
+ ------------------
131
+
132
+ If the cache plugin determines that a response to a GET request needs revalidation, a conditional GET is transferred
133
+ to the origin server. If the origin server returns a 304 response, then a response containing the merged headers of
134
+ the cached response with the new response and the entity body of the cached response is returned. Custom revalidation
135
+ strategies can be injected into a CachePlugin if needed.
136
+
137
+ Cache adapters
138
+ --------------
139
+
140
+ Guzzle doesn't try to reinvent the wheel when it comes to caching or logging. Plenty of other frameworks have
141
+ excellent solutions in place that you are probably already using in your applications. Guzzle uses adapters for
142
+ caching and logging. The cache plugin requires a cache adapter so that is can store responses in a cache. Guzzle
143
+ currently supports cache adapters for `Doctrine 2.0 <http://www.doctrine-project.org/>`_ and the
144
+ `Zend Framework <http://framework.zend.com>`_.
145
+
146
+ Doctrine cache adapter
147
+ ~~~~~~~~~~~~~~~~~~~~~~
148
+
149
+ .. code-block:: php
150
+
151
+ use Doctrine\Common\Cache\ArrayCache;
152
+ use Guzzle\Cache\DoctrineCacheAdapter;
153
+ use Guzzle\Plugin\Cache\CachePlugin;
154
+
155
+ $backend = new ArrayCache();
156
+ $adapter = new DoctrineCacheAdapter($backend);
157
+ $cache = new CachePlugin($adapter);
158
+
159
+ Zend Framework cache adapter
160
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
161
+
162
+ .. code-block:: php
163
+
164
+ use Guzzle\Cache\ZendCacheAdapter;
165
+ use Zend\Cache\Backend\TestBackend;
166
+
167
+ $backend = new TestBackend();
168
+ $adapter = new ZendCacheAdapter($backend);
169
+ $cache = new CachePlugin($adapter);
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/cookie-plugin.rst ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ =============
2
+ Cookie plugin
3
+ =============
4
+
5
+ Some web services require a Cookie in order to maintain a session. The ``Guzzle\Plugin\Cookie\CookiePlugin`` will add
6
+ cookies to requests and parse cookies from responses using a CookieJar object:
7
+
8
+ .. code-block:: php
9
+
10
+ use Guzzle\Http\Client;
11
+ use Guzzle\Plugin\Cookie\CookiePlugin;
12
+ use Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar;
13
+
14
+ $cookiePlugin = new CookiePlugin(new ArrayCookieJar());
15
+
16
+ // Add the cookie plugin to a client
17
+ $client = new Client('http://www.test.com/');
18
+ $client->addSubscriber($cookiePlugin);
19
+
20
+ // Send the request with no cookies and parse the returned cookies
21
+ $client->get('http://www.yahoo.com/')->send();
22
+
23
+ // Send the request again, noticing that cookies are being sent
24
+ $request = $client->get('http://www.yahoo.com/');
25
+ $request->send();
26
+
27
+ echo $request;
28
+
29
+ You can disable cookies per-request by setting the ``cookies.disable`` value to true on a request's params object.
30
+
31
+ .. code-block:: php
32
+
33
+ $request->getParams()->set('cookies.disable', true);
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/creating-plugins.rst ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ================
2
+ Creating plugins
3
+ ================
4
+
5
+ .. highlight:: php
6
+
7
+ Guzzle is extremely extensible because of the behavioral modifications that can be added to requests, clients, and
8
+ commands using an event system. Before and after the majority of actions are taken in the library, an event is emitted
9
+ with the name of the event and context surrounding the event. Observers can subscribe to a subject and modify the
10
+ subject based on the events received. Guzzle's event system utilizes the Symfony2 EventDispatcher and is the backbone
11
+ of its plugin architecture.
12
+
13
+ Overview
14
+ --------
15
+
16
+ Plugins must implement the ``Symfony\Component\EventDispatcher\EventSubscriberInterface`` interface. The
17
+ ``EventSubscriberInterface`` requires that your class implements a static method, ``getSubscribedEvents()``, that
18
+ returns an associative array mapping events to methods on the object. See the
19
+ `Symfony2 documentation <http://symfony.com/doc/2.0/book/internals.html#the-event-dispatcher>`_ for more information.
20
+
21
+ Plugins can be attached to any subject, or object in Guzzle that implements that
22
+ ``Guzzle\Common\HasDispatcherInterface``.
23
+
24
+ Subscribing to a subject
25
+ ~~~~~~~~~~~~~~~~~~~~~~~~
26
+
27
+ You can subscribe an instantiated observer to an event by calling ``addSubscriber`` on a subject.
28
+
29
+ .. code-block:: php
30
+
31
+ $testPlugin = new TestPlugin();
32
+ $client->addSubscriber($testPlugin);
33
+
34
+ You can also subscribe to only specific events using a closure::
35
+
36
+ $client->getEventDispatcher()->addListener('request.create', function(Event $event) {
37
+ echo $event->getName();
38
+ echo $event['request'];
39
+ });
40
+
41
+ ``Guzzle\Common\Event`` objects are passed to notified functions. The Event object has a ``getName()`` method which
42
+ return the name of the emitted event and may contain contextual information that can be accessed like an array.
43
+
44
+ Knowing what events to listen to
45
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
46
+
47
+ Any class that implements the ``Guzzle\Common\HasDispatcherInterface`` must implement a static method,
48
+ ``getAllEvents()``, that returns an array of the events that are emitted from the object. You can browse the source
49
+ to see each event, or you can call the static method directly in your code to get a list of available events.
50
+
51
+ Event hooks
52
+ -----------
53
+
54
+ * :ref:`client-events`
55
+ * :ref:`service-client-events`
56
+ * :ref:`request-events`
57
+ * ``Guzzle\Http\Curl\CurlMulti``:
58
+ * :ref:`service-builder-events`
59
+
60
+ Examples of the event system
61
+ ----------------------------
62
+
63
+ Simple Echo plugin
64
+ ~~~~~~~~~~~~~~~~~~
65
+
66
+ This simple plugin prints a string containing the request that is about to be sent by listening to the
67
+ ``request.before_send`` event::
68
+
69
+ use Symfony\Component\EventDispatcher\EventSubscriberInterface;
70
+
71
+ class EchoPlugin implements EventSubscriberInterface
72
+ {
73
+ public static function getSubscribedEvents()
74
+ {
75
+ return array('request.before_send' => 'onBeforeSend');
76
+ }
77
+
78
+ public function onBeforeSend(Guzzle\Common\Event $event)
79
+ {
80
+ echo 'About to send a request: ' . $event['request'] . "\n";
81
+ }
82
+ }
83
+
84
+ $client = new Guzzle\Service\Client('http://www.test.com/');
85
+
86
+ // Create the plugin and add it as an event subscriber
87
+ $plugin = new EchoPlugin();
88
+ $client->addSubscriber($plugin);
89
+
90
+ // Send a request and notice that the request is printed to the screen
91
+ $client->get('/')->send();
92
+
93
+ Running the above code will print a string containing the HTTP request that is about to be sent.
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/curl-auth-plugin.rst ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ==========================
2
+ cURL authentication plugin
3
+ ==========================
4
+
5
+ .. warning::
6
+
7
+ The CurlAuthPlugin is deprecated. You should use the `auth` parameter of a client to add authorization headers to
8
+ every request created by a client.
9
+
10
+ .. code-block:: php
11
+
12
+ $client->setDefaultOption('auth', array('username', 'password', 'Basic|Digest|NTLM|Any'));
13
+
14
+ If your web service client requires basic authorization, then you can use the CurlAuthPlugin to easily add an
15
+ Authorization header to each request sent by the client.
16
+
17
+ .. code-block:: php
18
+
19
+ use Guzzle\Http\Client;
20
+ use Guzzle\Plugin\CurlAuth\CurlAuthPlugin;
21
+
22
+ $client = new Client('http://www.test.com/');
23
+
24
+ // Add the auth plugin to the client object
25
+ $authPlugin = new CurlAuthPlugin('username', 'password');
26
+ $client->addSubscriber($authPlugin);
27
+
28
+ $response = $client->get('projects/1/people')->send();
29
+ $xml = new SimpleXMLElement($response->getBody(true));
30
+ foreach ($xml->person as $person) {
31
+ echo $person->email . "\n";
32
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/history-plugin.rst ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ==============
2
+ History plugin
3
+ ==============
4
+
5
+ The history plugin tracks all of the requests and responses sent through a request or client. This plugin can be
6
+ useful for crawling or unit testing. By default, the history plugin stores up to 10 requests and responses.
7
+
8
+ .. code-block:: php
9
+
10
+ use Guzzle\Http\Client;
11
+ use Guzzle\Plugin\History\HistoryPlugin;
12
+
13
+ $client = new Client('http://www.test.com/');
14
+
15
+ // Add the history plugin to the client object
16
+ $history = new HistoryPlugin();
17
+ $history->setLimit(5);
18
+ $client->addSubscriber($history);
19
+
20
+ $client->get('http://www.yahoo.com/')->send();
21
+
22
+ echo $history->getLastRequest();
23
+ echo $history->getLastResponse();
24
+ echo count($history);
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/log-plugin.rst ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ==========
2
+ Log plugin
3
+ ==========
4
+
5
+ Use the ``Guzzle\Plugin\Log\LogPlugin`` to view all data sent over the wire, including entity bodies and redirects.
6
+
7
+ .. code-block:: php
8
+
9
+ use Guzzle\Http\Client;
10
+ use Guzzle\Log\Zf1LogAdapter;
11
+ use Guzzle\Plugin\Log\LogPlugin;
12
+ use Guzzle\Log\MessageFormatter;
13
+
14
+ $client = new Client('http://www.test.com/');
15
+
16
+ $adapter = new Zf1LogAdapter(
17
+ new \Zend_Log(new \Zend_Log_Writer_Stream('php://output'))
18
+ );
19
+ $logPlugin = new LogPlugin($adapter, MessageFormatter::DEBUG_FORMAT);
20
+
21
+ // Attach the plugin to the client, which will in turn be attached to all
22
+ // requests generated by the client
23
+ $client->addSubscriber($logPlugin);
24
+
25
+ $response = $client->get('http://google.com')->send();
26
+
27
+ The code sample above wraps a ``Zend_Log`` object using a ``Guzzle\Log\Zf1LogAdapter``. After attaching the plugin to
28
+ the client, all data sent over the wire will be logged to stdout.
29
+
30
+ The first argument of the LogPlugin's constructor accepts a ``Guzzle\Log\LogAdapterInterface`` object. This object is
31
+ an adapter that allows you to use the logging capabilities of your favorite log implementation. The second argument of
32
+ the constructor accepts a ``Guzzle\Log\MessageFormatter`` or a log messaged format string. The format string uses
33
+ variable substitution and allows you to define the log data that is important to your application. The different
34
+ variables that can be injected are as follows:
35
+
36
+ ================== ====================================================================================
37
+ Variable Substitution
38
+ ================== ====================================================================================
39
+ {request} Full HTTP request message
40
+ {response} Full HTTP response message
41
+ {ts} Timestamp
42
+ {host} Host of the request
43
+ {method} Method of the request
44
+ {url} URL of the request
45
+ {host} Host of the request
46
+ {protocol} Request protocol
47
+ {version} Protocol version
48
+ {resource} Resource of the request (path + query + fragment)
49
+ {port} Port of the request
50
+ {hostname} Hostname of the machine that sent the request
51
+ {code} Status code of the response (if available)
52
+ {phrase} Reason phrase of the response (if available)
53
+ {curl_error} Curl error message (if available)
54
+ {curl_code} Curl error code (if available)
55
+ {curl_stderr} Curl standard error (if available)
56
+ {connect_time} Time in seconds it took to establish the connection (if available)
57
+ {total_time} Total transaction time in seconds for last transfer (if available)
58
+ {req_header_*} Replace `*` with the lowercased name of a request header to add to the message
59
+ {res_header_*} Replace `*` with the lowercased name of a response header to add to the message
60
+ {req_body} Request body
61
+ {res_body} Response body
62
+ ================== ====================================================================================
63
+
64
+ The LogPlugin has a helper method that can be used when debugging that will output the full HTTP request and
65
+ response of a transaction:
66
+
67
+ .. code-block:: php
68
+
69
+ $client->addSubscriber(LogPlugin::getDebugPlugin());
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/md5-validator-plugin.rst ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ====================
2
+ MD5 validator plugin
3
+ ====================
4
+
5
+ Entity bodies can sometimes be modified over the wire due to a faulty TCP transport or misbehaving proxy. If an HTTP
6
+ response contains a Content-MD5 header, then a MD5 hash of the entity body of a response can be compared against the
7
+ Content-MD5 header of the response to determine if the response was delivered intact. The
8
+ ``Guzzle\Plugin\Md5\Md5ValidatorPlugin`` will throw an ``UnexpectedValueException`` if the calculated MD5 hash does
9
+ not match the Content-MD5 header value:
10
+
11
+ .. code-block:: php
12
+
13
+ use Guzzle\Http\Client;
14
+ use Guzzle\Plugin\Md5\Md5ValidatorPlugin;
15
+
16
+ $client = new Client('http://www.test.com/');
17
+
18
+ $md5Plugin = new Md5ValidatorPlugin();
19
+
20
+ // Add the md5 plugin to the client object
21
+ $client->addSubscriber($md5Plugin);
22
+
23
+ $request = $client->get('http://www.yahoo.com/');
24
+ $request->send();
25
+
26
+ Calculating the MD5 hash of a large entity body or an entity body that was transferred using a Content-Encoding is an
27
+ expensive operation. When working in high performance applications, you might consider skipping the MD5 hash
28
+ validation for entity bodies bigger than a certain size or Content-Encoded entity bodies
29
+ (see ``Guzzle\Plugin\Md5\Md5ValidatorPlugin`` for more information).
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/mock-plugin.rst ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ===========
2
+ Mock plugin
3
+ ===========
4
+
5
+ The mock plugin is useful for testing Guzzle clients. The mock plugin allows you to queue an array of responses that
6
+ will satisfy requests sent from a client by consuming the request queue in FIFO order.
7
+
8
+ .. code-block:: php
9
+
10
+ use Guzzle\Http\Client;
11
+ use Guzzle\Plugin\Mock\MockPlugin;
12
+ use Guzzle\Http\Message\Response;
13
+
14
+ $client = new Client('http://www.test.com/');
15
+
16
+ $mock = new MockPlugin();
17
+ $mock->addResponse(new Response(200))
18
+ ->addResponse(new Response(404));
19
+
20
+ // Add the mock plugin to the client object
21
+ $client->addSubscriber($mock);
22
+
23
+ // The following request will receive a 200 response from the plugin
24
+ $client->get('http://www.example.com/')->send();
25
+
26
+ // The following request will receive a 404 response from the plugin
27
+ $client->get('http://www.test.com/')->send();
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/oauth-plugin.rst ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ============
2
+ OAuth plugin
3
+ ============
4
+
5
+ Guzzle ships with an OAuth 1.0 plugin that can sign requests using a consumer key, consumer secret, OAuth token,
6
+ and OAuth secret. Here's an example showing how to send an authenticated request to the Twitter REST API:
7
+
8
+ .. code-block:: php
9
+
10
+ use Guzzle\Http\Client;
11
+ use Guzzle\Plugin\Oauth\OauthPlugin;
12
+
13
+ $client = new Client('http://api.twitter.com/1');
14
+ $oauth = new OauthPlugin(array(
15
+ 'consumer_key' => 'my_key',
16
+ 'consumer_secret' => 'my_secret',
17
+ 'token' => 'my_token',
18
+ 'token_secret' => 'my_token_secret'
19
+ ));
20
+ $client->addSubscriber($oauth);
21
+
22
+ $response = $client->get('statuses/public_timeline.json')->send();
23
+
24
+ If you need to use a custom signing method, you can pass a ``signature_method`` configuration option in the
25
+ constructor of the OAuth plugin. The ``signature_method`` option must be a callable variable that accepts a string to
26
+ sign and signing key and returns a signed string.
27
+
28
+ .. note::
29
+
30
+ You can omit the ``token`` and ``token_secret`` options to use two-legged OAuth.
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/plugins-list.rst.inc ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ * :doc:`/plugins/async-plugin`
2
+ * :doc:`/plugins/backoff-plugin`
3
+ * :doc:`/plugins/cache-plugin`
4
+ * :doc:`/plugins/cookie-plugin`
5
+ * :doc:`/plugins/history-plugin`
6
+ * :doc:`/plugins/log-plugin`
7
+ * :doc:`/plugins/md5-validator-plugin`
8
+ * :doc:`/plugins/mock-plugin`
9
+ * :doc:`/plugins/oauth-plugin`
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/plugins/plugins-overview.rst ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ======================
2
+ Plugin system overview
3
+ ======================
4
+
5
+ The workflow of sending a request and parsing a response is driven by Guzzle's event system, which is powered by the
6
+ `Symfony2 Event Dispatcher component <http://symfony.com/doc/current/components/event_dispatcher/introduction.html>`_.
7
+
8
+ Any object in Guzzle that emits events will implement the ``Guzzle\Common\HasEventDispatcher`` interface. You can add
9
+ event subscribers directly to these objects using the ``addSubscriber()`` method, or you can grab the
10
+ ``Symfony\Component\EventDispatcher\EventDispatcher`` object owned by the object using ``getEventDispatcher()`` and
11
+ add a listener or event subscriber.
12
+
13
+ Adding event subscribers to clients
14
+ -----------------------------------
15
+
16
+ Any event subscriber or event listener attached to the EventDispatcher of a ``Guzzle\Http\Client`` or
17
+ ``Guzzle\Service\Client`` object will automatically be attached to all request objects created by the client. This
18
+ allows you to attach, for example, a HistoryPlugin to a client object, and from that point on, every request sent
19
+ through that client will utilize the HistoryPlugin.
20
+
21
+ .. code-block:: php
22
+
23
+ use Guzzle\Plugin\History\HistoryPlugin;
24
+ use Guzzle\Service\Client;
25
+
26
+ $client = new Client();
27
+
28
+ // Create a history plugin and attach it to the client
29
+ $history = new HistoryPlugin();
30
+ $client->addSubscriber($history);
31
+
32
+ // Create and send a request. This request will also utilize the HistoryPlugin
33
+ $client->get('http://httpbin.org')->send();
34
+
35
+ // Echo out the last sent request by the client
36
+ echo $history->getLastRequest();
37
+
38
+ .. tip::
39
+
40
+ :doc:`Create event subscribers <creating-plugins>`, or *plugins*, to implement reusable logic that can be
41
+ shared across clients. Event subscribers are also easier to test than anonymous functions.
42
+
43
+ Pre-Built plugins
44
+ -----------------
45
+
46
+ Guzzle provides easy to use request plugins that add behavior to requests based on signal slot event notifications
47
+ powered by the Symfony2 Event Dispatcher component.
48
+
49
+ * :doc:`async-plugin`
50
+ * :doc:`backoff-plugin`
51
+ * :doc:`cache-plugin`
52
+ * :doc:`cookie-plugin`
53
+ * :doc:`curl-auth-plugin`
54
+ * :doc:`history-plugin`
55
+ * :doc:`log-plugin`
56
+ * :doc:`md5-validator-plugin`
57
+ * :doc:`mock-plugin`
58
+ * :doc:`oauth-plugin`
59
+
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
1
+ Sphinx>=1.2b1
2
+ guzzle_sphinx_theme>=0.5.0
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/webservice-client/guzzle-service-descriptions.rst ADDED
@@ -0,0 +1,619 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ===========================
2
+ Guzzle service descriptions
3
+ ===========================
4
+
5
+ Guzzle allows you to serialize HTTP requests and parse HTTP responses using a DSL called a service descriptions.
6
+ Service descriptions define web service APIs by documenting each operation, the operation's parameters, validation
7
+ options for each parameter, an operation's response, how the response is parsed, and any errors that can be raised for
8
+ an operation. Writing a service description for a web service allows you to more quickly consume a web service than
9
+ writing concrete commands for each web service operation.
10
+
11
+ Guzzle service descriptions can be representing using a PHP array or JSON document. Guzzle's service descriptions are
12
+ heavily inspired by `Swagger <http://swagger.wordnik.com/>`_.
13
+
14
+ Service description schema
15
+ ==========================
16
+
17
+ A Guzzle Service description must match the following JSON schema document. This document can also serve as a guide when
18
+ implementing a Guzzle service description.
19
+
20
+ Download the schema here: :download:`Guzzle JSON schema document </_downloads/guzzle-schema-1.0.json>`
21
+
22
+ .. class:: overflow-height-500px
23
+
24
+ .. literalinclude:: ../_downloads/guzzle-schema-1.0.json
25
+ :language: json
26
+
27
+ Top-level attributes
28
+ --------------------
29
+
30
+ Service descriptions are comprised of the following top-level attributes:
31
+
32
+ .. code-block:: json
33
+
34
+ {
35
+ "name": "string",
36
+ "apiVersion": "string|number",
37
+ "baseUrl": "string",
38
+ "description": "string",
39
+ "operations": {},
40
+ "models": {},
41
+ "includes": ["string.php", "string.json"]
42
+ }
43
+
44
+ +-----------------------------------------+-------------------------+-----------------------------------------------------------------------------------------------------------------------+
45
+ | Property Name | Value | Description |
46
+ +=========================================+=========================+=======================================================================================================================+
47
+ | name | string | Name of the web service |
48
+ +-----------------------------------------+-------------------------+-----------------------------------------------------------------------------------------------------------------------+
49
+ | apiVersion | string|number | Version identifier that the service description is compatible with |
50
+ +-----------------------------------------+-------------------------+-----------------------------------------------------------------------------------------------------------------------+
51
+ | baseUrl or basePath | string | Base URL of the web service. Any relative URI specified in an operation will be merged with the baseUrl using the |
52
+ | | | process defined in RFC 2396. Some clients require custom logic to determine the baseUrl. In those cases, it is best |
53
+ | | | to not include a baseUrl in the service description, but rather allow the factory method of the client to configure |
54
+ | | | the client’s baseUrl. |
55
+ +-----------------------------------------+-------------------------+-----------------------------------------------------------------------------------------------------------------------+
56
+ | description | string | Short summary of the web service |
57
+ +-----------------------------------------+-------------------------+-----------------------------------------------------------------------------------------------------------------------+
58
+ | operations | object containing | Operations of the service. The key is the name of the operation and value is the attributes of the operation. |
59
+ | | :ref:`operation-schema` | |
60
+ | | | |
61
+ +-----------------------------------------+-------------------------+-----------------------------------------------------------------------------------------------------------------------+
62
+ | models | object containing | Schema models that can be referenced throughout the service description. Models can be used to define how an HTTP |
63
+ | | :ref:`model-schema` | response is parsed into a ``Guzzle\Service\Resource\Model`` object when an operation uses a ``model`` ``responseType``|
64
+ +-----------------------------------------+-------------------------+-----------------------------------------------------------------------------------------------------------------------+
65
+ | includes | array of .js, | Service description files to include and extend from (can be a .json, .js, or .php file) |
66
+ | | .json, or .php | |
67
+ | | files. | |
68
+ +-----------------------------------------+-------------------------+-----------------------------------------------------------------------------------------------------------------------+
69
+ | (any additional properties) | mixed | Any additional properties specified as top-level attributes are allowed and will be treated as arbitrary data |
70
+ +-----------------------------------------+-------------------------+-----------------------------------------------------------------------------------------------------------------------+
71
+
72
+ .. _operation-schema:
73
+
74
+ Operations
75
+ ----------
76
+
77
+ Operations are the actions that can be taken on a service. Each operation is given a unique name and has a distinct
78
+ endpoint and HTTP method. If an API has a ``DELETE /users/:id`` operation, a satisfactory operation name might be
79
+ ``DeleteUser`` with a parameter of ``id`` that is inserted into the URI.
80
+
81
+ .. class:: overflow-height-250px
82
+
83
+ .. code-block:: json
84
+
85
+ {
86
+ "operations": {
87
+ "operationName": {
88
+ "extends": "string",
89
+ "httpMethod": "GET|POST|PUT|DELETE|PATCH|string",
90
+ "uri": "string",
91
+ "summary": "string",
92
+ "class": "string",
93
+ "responseClass": "string",
94
+ "responseNotes": "string",
95
+ "type": "string",
96
+ "description": "string",
97
+ "responseType": "primitive|class|(model by name)|documentation|(string)",
98
+ "deprecated": false,
99
+ "errorResponses": [
100
+ {
101
+ "code": 500,
102
+ "reason": "Unexpected Error",
103
+ "class": "string"
104
+ }
105
+ ],
106
+ "data": {
107
+ "foo": "bar",
108
+ "baz": "bam"
109
+ },
110
+ "parameters": {}
111
+ }
112
+ }
113
+ }
114
+
115
+ .. csv-table::
116
+ :header: "Property Name", "Value", "Description"
117
+ :widths: 20, 15, 65
118
+
119
+ "extends", "string", "Extend from another operation by name. The parent operation must be defined before the child."
120
+ "httpMethod", "string", "HTTP method used with the operation (e.g. GET, POST, PUT, DELETE, PATCH, etc)"
121
+ "uri", "string", "URI of the operation. The uri attribute can contain URI templates. The variables of the URI template are parameters of the operation with a location value of uri"
122
+ "summary", "string", "Short summary of what the operation does"
123
+ "class", "string", "Custom class to instantiate instead of the default Guzzle\\Service\\Command\\OperationCommand. Using this attribute allows you to define an operation using a service description, but allows more customized logic to be implemented in user-land code."
124
+ "responseClass", "string", "Defined what is returned from the method. Can be a primitive, class name, or model name. You can specify the name of a class to return a more customized result from the operation (for example, a domain model object). When using the name of a PHP class, the class must implement ``Guzzle\Service\Command\ResponseClassInterface``."
125
+ "responseNotes", "string", "A description of the response returned by the operation"
126
+ "responseType", "string", "The type of response that the operation creates: one of primitive, class, model, or documentation. If not specified, this value will be automatically inferred based on whether or not there is a model matching the name, if a matching class name is found, or set to 'primitive' by default."
127
+ "deprecated", "boolean", "Whether or not the operation is deprecated"
128
+ "errorResponses", "array", "Errors that could occur while executing the operation. Each item of the array is an object that can contain a 'code' (HTTP response status code of the error), 'reason' (reason phrase or description of the error), and 'class' (an exception class that will be raised when this error is encountered)"
129
+ "data", "object", "Any arbitrary data to associate with the operation"
130
+ "parameters", "object containing :ref:`parameter-schema` objects", "Parameters of the operation. Parameters are used to define how input data is serialized into a HTTP request."
131
+ "additionalParameters", "A single :ref:`parameter-schema` object", "Validation and serialization rules for any parameter supplied to the operation that was not explicitly defined."
132
+
133
+ additionalParameters
134
+ ~~~~~~~~~~~~~~~~~~~~
135
+
136
+ When a webservice offers a large number of parameters that all are set in the same location (for example the query
137
+ string or a JSON document), defining each parameter individually can require a lot of time and repetition. Furthermore,
138
+ some web services allow for completely arbitrary parameters to be supplied for an operation. The
139
+ ``additionalParameters`` attribute can be used to solve both of these issues.
140
+
141
+ As an example, we can define a Twitter API operation quite easily using ``additionalParameters``. The
142
+ GetMentions operation accepts a large number of query string parameters. Defining each of these parameters
143
+ is ideal because it provide much more introspection for the client and opens the possibility to use the description with
144
+ other tools (e.g. a documentation generator). However, you can very quickly provide a "catch-all" serialization rule
145
+ that will place any custom parameters supplied to an operation the generated request's query string parameters.
146
+
147
+ .. class:: overflow-height-250px
148
+
149
+ .. code-block:: json
150
+
151
+ {
152
+ "name": "Twitter",
153
+ "apiVersion": "1.1",
154
+ "baseUrl": "https://api.twitter.com/1.1",
155
+ "operations": {
156
+ "GetMentions": {
157
+ "httpMethod": "GET",
158
+ "uri": "statuses/mentions_timeline.json",
159
+ "responseClass": "GetMentionsOutput",
160
+ "additionalParameters": {
161
+ "location": "query"
162
+ }
163
+ }
164
+ },
165
+ "models": {
166
+ "GetMentionsOutput": {
167
+ "type": "object",
168
+ "additionalProperties": {
169
+ "location": "json"
170
+ }
171
+ }
172
+ }
173
+ }
174
+
175
+ responseClass
176
+ ~~~~~~~~~~~~~
177
+
178
+ The ``responseClass`` attribute is used to define the return value of an operation (what is returned by calling the
179
+ ``getResult()`` method of a command object). The value set in the responseClass attribute can be one of "primitive"
180
+ (meaning the result with be primitive type like a string), a class name meaning the result will be an instance of a
181
+ specific user-land class, or a model name meaning the result will be a ``Guzzle\Service\Resource\Model`` object that
182
+ uses a :ref:`model schema <model-schema>` to define how the HTTP response is parsed.
183
+
184
+ .. note::
185
+
186
+ Using a class name with a ``responseClass`` will only work if it is supported by the ``class`` that is instantiated
187
+ for the operation. Keep this in mind when specifying a custom ``class`` attribute that points to a custom
188
+ ``Guzzle\Service\Command\CommandInterface`` class. The default ``class``,
189
+ ``Guzzle\Service\Command\OperationCommand``, does support setting custom ``class`` attributes.
190
+
191
+ You can specify the name of a class to return a more customized result from the operation (for example, a domain model
192
+ object). When using the name of a PHP class, the class must implement ``Guzzle\Service\Command\ResponseClassInterface``.
193
+ Here's a very simple example of implementing a custom responseClass object.
194
+
195
+ .. code-block:: json
196
+
197
+ {
198
+ "operations": {
199
+ "test": {
200
+ "responseClass": "MyApplication\\User"
201
+ }
202
+ }
203
+ }
204
+
205
+ .. code-block:: php
206
+
207
+ namespace MyApplication;
208
+
209
+ use Guzzle\Service\Command\ResponseClassInterface;
210
+ use Guzzle\Service\Command\OperationCommand;
211
+
212
+ class User implements ResponseClassInterface
213
+ {
214
+ protected $name;
215
+
216
+ public static function fromCommand(OperationCommand $command)
217
+ {
218
+ $response = $command->getResponse();
219
+ $xml = $response->xml();
220
+
221
+ return new self((string) $xml->name);
222
+ }
223
+
224
+ public function __construct($name)
225
+ {
226
+ $this->name = $name;
227
+ }
228
+ }
229
+
230
+ errorResponses
231
+ ~~~~~~~~~~~~~~
232
+
233
+ ``errorResponses`` is an array containing objects that define the errors that could occur while executing the
234
+ operation. Each item of the array is an object that can contain a 'code' (HTTP response status code of the error),
235
+ 'reason' (reason phrase or description of the error), and 'class' (an exception class that will be raised when this
236
+ error is encountered).
237
+
238
+ ErrorResponsePlugin
239
+ ^^^^^^^^^^^^^^^^^^^
240
+
241
+ Error responses are by default only used for documentation. If you don't need very complex exception logic for your web
242
+ service errors, then you can use the ``Guzzle\Plugin\ErrorResponse\ErrorResponsePlugin`` to automatically throw defined
243
+ exceptions when one of the ``errorResponse`` rules are matched. The error response plugin will listen for the
244
+ ``request.complete`` event of a request created by a command object. Every response (including a successful response) is
245
+ checked against the list of error responses for an exact match using the following order of checks:
246
+
247
+ 1. Does the errorResponse have a defined ``class``?
248
+ 2. Is the errorResponse ``code`` equal to the status code of the response?
249
+ 3. Is the errorResponse ``reason`` equal to the reason phrase of the response?
250
+ 4. Throw the exception stored in the ``class`` attribute of the errorResponse.
251
+
252
+ The ``class`` attribute must point to a class that implements
253
+ ``Guzzle\Plugin\ErrorResponse\ErrorResponseExceptionInterface``. This interface requires that an error response class
254
+ implements ``public static function fromCommand(CommandInterface $command, Response $response)``. This method must
255
+ return an object that extends from ``\Exception``. After an exception is returned, it is thrown by the plugin.
256
+
257
+ .. _parameter-schema:
258
+
259
+ Parameter schema
260
+ ----------------
261
+
262
+ Parameters in both operations and models are represented using the
263
+ `JSON schema <http://tools.ietf.org/id/draft-zyp-json-schema-04.html>`_ syntax.
264
+
265
+ .. csv-table::
266
+ :header: "Property Name", "Value", "Description"
267
+ :widths: 20, 15, 65
268
+
269
+ "name", "string", "Unique name of the parameter"
270
+ "type", "string|array", "Type of variable (string, number, integer, boolean, object, array, numeric, null, any). Types are using for validation and determining the structure of a parameter. You can use a union type by providing an array of simple types. If one of the union types matches the provided value, then the value is valid."
271
+ "instanceOf", "string", "When the type is an object, you can specify the class that the object must implement"
272
+ "required", "boolean", "Whether or not the parameter is required"
273
+ "default", "mixed", "Default value to use if no value is supplied"
274
+ "static", "boolean", "Set to true to specify that the parameter value cannot be changed from the default setting"
275
+ "description", "string", "Documentation of the parameter"
276
+ "location", "string", "The location of a request used to apply a parameter. Custom locations can be registered with a command, but the defaults are uri, query, statusCode, reasonPhrase, header, body, json, xml, postField, postFile, responseBody"
277
+ "sentAs", "string", "Specifies how the data being modeled is sent over the wire. For example, you may wish to include certain headers in a response model that have a normalized casing of FooBar, but the actual header is x-foo-bar. In this case, sentAs would be set to x-foo-bar."
278
+ "filters", "array", "Array of functions to to run a parameter value through."
279
+
280
+ filters
281
+ ~~~~~~~
282
+
283
+ Each value in the array must be a string containing the full class path to a static method or an array of complex
284
+ filter information. You can specify static methods of classes using the full namespace class name followed by
285
+ "::" (e.g. ``FooBar::baz()``). Some filters require arguments in order to properly filter a value. For complex filters,
286
+ use an object containing a ``method`` attribute pointing to a function, and an ``args`` attribute containing an
287
+ array of positional arguments to pass to the function. Arguments can contain keywords that are replaced when filtering
288
+ a value: ``@value`` is replaced with the value being filtered, and ``@api`` is replaced with the actual Parameter
289
+ object.
290
+
291
+ .. code-block:: json
292
+
293
+ {
294
+ "filters": [
295
+ "strtolower",
296
+ {
297
+ "method": "MyClass::convertString",
298
+ "args": [ "test", "@value", "@api" ]
299
+ }
300
+ ]
301
+ }
302
+
303
+ The above example will filter a parameter using ``strtolower``. It will then call the ``convertString`` static method
304
+ of ``MyClass``, passing in "test", the actual value of the parameter, and a ``Guzzle\Service\Description\Parameter``
305
+ object.
306
+
307
+ Operation parameter location attributes
308
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
309
+
310
+ The location field of top-level parameters control how a parameter is serialized when generating a request.
311
+
312
+ uri location
313
+ ^^^^^^^^^^^^
314
+
315
+ Parameters are injected into the ``uri`` attribute of the operation using
316
+ `URI-template expansion <http://tools.ietf.org/html/rfc6570>`_.
317
+
318
+ .. code-block:: json
319
+
320
+ {
321
+ "operations": {
322
+ "uriTest": {
323
+ "uri": "/test/{testValue}",
324
+ "parameters": {
325
+ "testValue": {
326
+ "location": "uri"
327
+ }
328
+ }
329
+ }
330
+ }
331
+ }
332
+
333
+ query location
334
+ ^^^^^^^^^^^^^^
335
+
336
+ Parameters are injected into the query string of a request. Query values can be nested, which would result in a PHP
337
+ style nested query string. The name of a parameter is the default name of the query string parameter added to the
338
+ request. You can override this behavior by specifying the ``sentAs`` attribute on the parameter.
339
+
340
+ .. code-block:: json
341
+
342
+ {
343
+ "operations": {
344
+ "queryTest": {
345
+ "parameters": {
346
+ "testValue": {
347
+ "location": "query",
348
+ "sentAs": "test_value"
349
+ }
350
+ }
351
+ }
352
+ }
353
+ }
354
+
355
+ header location
356
+ ^^^^^^^^^^^^^^^
357
+
358
+ Parameters are injected as headers on an HTTP request. The name of the parameter is used as the name of the header by
359
+ default. You can change the name of the header created by the parameter using the ``sentAs`` attribute.
360
+
361
+ Headers that are of type ``object`` will be added as multiple headers to a request using the key of the input array as
362
+ the header key. Setting a ``sentAs`` attribute along with a type ``object`` will use the value of ``sentAs`` as a
363
+ prefix for each header key.
364
+
365
+ body location
366
+ ^^^^^^^^^^^^^
367
+
368
+ Parameters are injected as the body of a request. The input of these parameters may be anything that can be cast to a
369
+ string or a ``Guzzle\Http\EntityBodyInterface`` object.
370
+
371
+ postField location
372
+ ^^^^^^^^^^^^^^^^^^
373
+
374
+ Parameters are inserted as POST fields in a request. Nested values may be supplied and will be represented using
375
+ PHP style nested query strings. The POST field name is the same as the parameter name by default. You can use the
376
+ ``sentAs`` parameter to override the POST field name.
377
+
378
+ postFile location
379
+ ^^^^^^^^^^^^^^^^^
380
+
381
+ Parameters are added as POST files. A postFile value may be a string pointing to a local filename or a
382
+ ``Guzzle\Http\Message\PostFileInterface`` object. The name of the POST file will be the name of the parameter by
383
+ default. You can use a custom POST file name by using the ``sentAs`` attribute.
384
+
385
+ Supports "string" and "array" types.
386
+
387
+ json location
388
+ ^^^^^^^^^^^^^
389
+
390
+ Parameters are added to the body of a request as top level keys of a JSON document. Nested values may be specified,
391
+ with any number of nested ``Guzzle\Common\ToArrayInterface`` objects. When JSON parameters are specified, the
392
+ ``Content-Type`` of the request will change to ``application/json`` if a ``Content-Type`` has not already been specified
393
+ on the request.
394
+
395
+ xml location
396
+ ^^^^^^^^^^^^
397
+
398
+ Parameters are added to the body of a request as top level nodes of an XML document. Nested values may be specified,
399
+ with any number of nested ``Guzzle\Common\ToArrayInterface`` objects. When XML parameters are specified, the
400
+ ``Content-Type`` of the request will change to ``application/xml`` if a ``Content-Type`` has not already been specified
401
+ on the request.
402
+
403
+ responseBody location
404
+ ^^^^^^^^^^^^^^^^^^^^^
405
+
406
+ Specifies the EntityBody of a response. This can be used to download the response body to a file or a custom Guzzle
407
+ EntityBody object.
408
+
409
+ No location
410
+ ^^^^^^^^^^^
411
+
412
+ If a parameter has no location attribute, then the parameter is simply used as a data value.
413
+
414
+ Other locations
415
+ ^^^^^^^^^^^^^^^
416
+
417
+ Custom locations can be registered as new locations or override default locations if needed.
418
+
419
+ .. _model-schema:
420
+
421
+ Model Schema
422
+ ------------
423
+
424
+ Models are used in service descriptions to provide generic JSON schema definitions that can be extended from or used in
425
+ ``$ref`` attributes. Models can also be referenced in a ``responseClass`` attribute to provide valuable output to an
426
+ operation. Models are JSON schema documents and use the exact syntax and attributes used in parameters.
427
+
428
+ Response Models
429
+ ~~~~~~~~~~~~~~~
430
+
431
+ Response models describe how a response is parsed into a ``Guzzle\Service\Resource\Model`` object. Response models are
432
+ always modeled as JSON schema objects. When an HTTP response is parsed using a response model, the rules specified on
433
+ each property of a response model will translate 1:1 as keys in a PHP associative array. When a ``sentAs`` attribute is
434
+ found in response model parameters, the value retrieved from the HTTP response is retrieved using the ``sentAs``
435
+ parameter but stored in the response model using the name of the parameter.
436
+
437
+ The location field of top-level parameters in a response model tell response parsers how data is retrieved from a
438
+ response.
439
+
440
+ statusCode location
441
+ ^^^^^^^^^^^^^^^^^^^
442
+
443
+ Retrieves the status code of the response.
444
+
445
+ reasonPhrase location
446
+ ^^^^^^^^^^^^^^^^^^^^^
447
+
448
+ Retrieves the reason phrase of the response.
449
+
450
+ header location
451
+ ^^^^^^^^^^^^^^^
452
+
453
+ Retrieves a header from the HTTP response.
454
+
455
+ body location
456
+ ^^^^^^^^^^^^^
457
+
458
+ Retrieves the body of an HTTP response.
459
+
460
+ json location
461
+ ^^^^^^^^^^^^^
462
+
463
+ Retrieves a top-level parameter from a JSON document contained in an HTTP response.
464
+
465
+ You can use ``additionalProperties`` if the JSON document is wrapped in an outer array. This allows you to parse the
466
+ contents of each item in the array using the parsing rules defined in the ``additionalProperties`` schema.
467
+
468
+ xml location
469
+ ^^^^^^^^^^^^
470
+
471
+ Retrieves a top-level node value from an XML document contained in an HTTP response.
472
+
473
+ Other locations
474
+ ^^^^^^^^^^^^^^^
475
+
476
+ Custom locations can be registered as new locations or override default locations if needed.
477
+
478
+ Example service description
479
+ ---------------------------
480
+
481
+ Let's say you're interacting with a web service called 'Foo' that allows for the following routes and methods::
482
+
483
+ GET/POST /users
484
+ GET/DELETE /users/:id
485
+
486
+ The following JSON service description implements this simple web service:
487
+
488
+ .. class:: overflow-height-500px
489
+
490
+ .. code-block:: json
491
+
492
+ {
493
+ "name": "Foo",
494
+ "apiVersion": "2012-10-14",
495
+ "baseUrl": "http://api.foo.com",
496
+ "description": "Foo is an API that allows you to Baz Bar",
497
+ "operations": {
498
+ "GetUsers": {
499
+ "httpMethod": "GET",
500
+ "uri": "/users",
501
+ "summary": "Gets a list of users",
502
+ "responseClass": "GetUsersOutput"
503
+ },
504
+ "CreateUser": {
505
+ "httpMethod": "POST",
506
+ "uri": "/users",
507
+ "summary": "Creates a new user",
508
+ "responseClass": "CreateUserOutput",
509
+ "parameters": {
510
+ "name": {
511
+ "location": "json",
512
+ "type": "string"
513
+ },
514
+ "age": {
515
+ "location": "json",
516
+ "type": "integer"
517
+ }
518
+ }
519
+ },
520
+ "GetUser": {
521
+ "httpMethod": "GET",
522
+ "uri": "/users/{id}",
523
+ "summary": "Retrieves a single user",
524
+ "responseClass": "GetUserOutput",
525
+ "parameters": {
526
+ "id": {
527
+ "location": "uri",
528
+ "description": "User to retrieve by ID",
529
+ "required": true
530
+ }
531
+ }
532
+ },
533
+ "DeleteUser": {
534
+ "httpMethod": "DELETE",
535
+ "uri": "/users/{id}",
536
+ "summary": "Deletes a user",
537
+ "responseClass": "DeleteUserOutput",
538
+ "parameters": {
539
+ "id": {
540
+ "location": "uri",
541
+ "description": "User to delete by ID",
542
+ "required": true
543
+ }
544
+ }
545
+ }
546
+ },
547
+ "models": {
548
+ "GetUsersOutput": {
549
+ "type": "array",
550
+ "items": {
551
+ "type": "object",
552
+ "properties": {
553
+ "name": {
554
+ "location": "json",
555
+ "type": "string"
556
+ },
557
+ "age": {
558
+ "location": "json",
559
+ "type": "integer"
560
+ }
561
+ }
562
+ }
563
+ },
564
+ "CreateUserOutput": {
565
+ "type": "object",
566
+ "properties": {
567
+ "id": {
568
+ "location": "json",
569
+ "type": "string"
570
+ },
571
+ "location": {
572
+ "location": "header",
573
+ "sentAs": "Location",
574
+ "type": "string"
575
+ }
576
+ }
577
+ },
578
+ "GetUserOutput": {
579
+ "type": "object",
580
+ "properties": {
581
+ "name": {
582
+ "location": "json",
583
+ "type": "string"
584
+ },
585
+ "age": {
586
+ "location": "json",
587
+ "type": "integer"
588
+ }
589
+ }
590
+ },
591
+ "DeleteUserOutput": {
592
+ "type": "object",
593
+ "properties": {
594
+ "status": {
595
+ "location": "statusCode",
596
+ "type": "integer"
597
+ }
598
+ }
599
+ }
600
+ }
601
+ }
602
+
603
+ If you attach this service description to a client, you would completely configure the client to interact with the
604
+ Foo web service and provide valuable response models for each operation.
605
+
606
+ .. code-block:: php
607
+
608
+ use Guzzle\Service\Description\ServiceDescription;
609
+
610
+ $description = ServiceDescription::factory('/path/to/client.json');
611
+ $client->setDescription($description);
612
+
613
+ $command = $client->getCommand('DeleteUser', array('id' => 123));
614
+ $responseModel = $client->execute($command);
615
+ echo $responseModel['status'];
616
+
617
+ .. note::
618
+
619
+ You can add the service description to your client's factory method or constructor.
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/webservice-client/using-the-service-builder.rst ADDED
@@ -0,0 +1,316 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ =======================
2
+ Using a service builder
3
+ =======================
4
+
5
+ The best way to instantiate Guzzle web service clients is to let Guzzle handle building the clients for you using a
6
+ ServiceBuilder. A ServiceBuilder is responsible for creating concrete client objects based on configuration settings
7
+ and helps to manage credentials for different environments.
8
+
9
+ You don't have to use a service builder, but they help to decouple your application from concrete classes and help to
10
+ share configuration data across multiple clients. Consider the following example. Here we are creating two clients that
11
+ require the same API public key and secret key. The clients are created using their ``factory()`` methods.
12
+
13
+ .. code-block:: php
14
+
15
+ use MyService\FooClient;
16
+ use MyService\BarClient;
17
+
18
+ $foo = FooClient::factory(array(
19
+ 'key' => 'abc',
20
+ 'secret' => '123',
21
+ 'custom' => 'and above all'
22
+ ));
23
+
24
+ $bar = BarClient::factory(array(
25
+ 'key' => 'abc',
26
+ 'secret' => '123',
27
+ 'custom' => 'listen to me'
28
+ ));
29
+
30
+ The redundant specification of the API keys can be removed using a service builder.
31
+
32
+ .. code-block:: php
33
+
34
+ use Guzzle\Service\Builder\ServiceBuilder;
35
+
36
+ $builder = ServiceBuilder::factory(array(
37
+ 'services' => array(
38
+ 'abstract_client' => array(
39
+ 'params' => array(
40
+ 'key' => 'abc',
41
+ 'secret' => '123'
42
+ )
43
+ ),
44
+ 'foo' => array(
45
+ 'extends' => 'abstract_client',
46
+ 'class' => 'MyService\FooClient',
47
+ 'params' => array(
48
+ 'custom' => 'and above all'
49
+ )
50
+ ),
51
+ 'bar' => array(
52
+ 'extends' => 'abstract_client',
53
+ 'class' => 'MyService\FooClient',
54
+ 'params' => array(
55
+ 'custom' => 'listen to me'
56
+ )
57
+ )
58
+ )
59
+ ));
60
+
61
+ $foo = $builder->get('foo');
62
+ $bar = $builder->get('bar');
63
+
64
+ You can make managing your API keys even easier by saving the service builder configuration in a JSON format in a
65
+ .json file.
66
+
67
+ Creating a service builder
68
+ --------------------------
69
+
70
+ A ServiceBuilder can source information from an array, an PHP include file that returns an array, or a JSON file.
71
+
72
+ .. code-block:: php
73
+
74
+ use Guzzle\Service\Builder\ServiceBuilder;
75
+
76
+ // Source service definitions from a JSON file
77
+ $builder = ServiceBuilder::factory('services.json');
78
+
79
+ Sourcing data from an array
80
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
81
+
82
+ Data can be source from a PHP array. The array must contain an associative ``services`` array that maps the name of a
83
+ client to the configuration information used by the service builder to create the client. Clients are given names
84
+ which are used to identify how a client is retrieved from a service builder. This can be useful for using multiple
85
+ accounts for the same service or creating development clients vs. production clients.
86
+
87
+ .. code-block:: php
88
+
89
+ $services = array(
90
+ 'includes' => array(
91
+ '/path/to/other/services.json',
92
+ '/path/to/other/php_services.php'
93
+ ),
94
+ 'services' => array(
95
+ 'abstract.foo' => array(
96
+ 'params' => array(
97
+ 'username' => 'foo',
98
+ 'password' => 'bar'
99
+ )
100
+ ),
101
+ 'bar' => array(
102
+ 'extends' => 'abstract.foo',
103
+ 'class' => 'MyClientClass',
104
+ 'params' => array(
105
+ 'other' => 'abc'
106
+ )
107
+ )
108
+ )
109
+ );
110
+
111
+ A service builder configuration array contains two top-level array keys:
112
+
113
+ +------------+---------------------------------------------------------------------------------------------------------+
114
+ | Key | Description |
115
+ +============+=========================================================================================================+
116
+ | includes | Array of paths to JSON or PHP include files to include in the configuration. |
117
+ +------------+---------------------------------------------------------------------------------------------------------+
118
+ | services | Associative array of defined services that can be created by the service builder. Each service can |
119
+ | | contain the following keys: |
120
+ | | |
121
+ | | +------------+----------------------------------------------------------------------------------------+ |
122
+ | | | Key | Description | |
123
+ | | +============+========================================================================================+ |
124
+ | | | class | The concrete class to instantiate that implements the | |
125
+ | | | | ``Guzzle\Common\FromConfigInterface``. | |
126
+ | | +------------+----------------------------------------------------------------------------------------+ |
127
+ | | | extends | The name of a previously defined service to extend from | |
128
+ | | +------------+----------------------------------------------------------------------------------------+ |
129
+ | | | params | Associative array of parameters to pass to the factory method of the service it is | |
130
+ | | | | instantiated | |
131
+ | | +------------+----------------------------------------------------------------------------------------+ |
132
+ | | | alias | An alias that can be used in addition to the array key for retrieving a client from | |
133
+ | | | | the service builder. | |
134
+ | | +------------+----------------------------------------------------------------------------------------+ |
135
+ +------------+---------------------------------------------------------------------------------------------------------+
136
+
137
+ The first client defined, ``abstract.foo``, is used as a placeholder of shared configuration values. Any service
138
+ extending abstract.foo will inherit its params. As an example, this can be useful when clients share the same username
139
+ and password.
140
+
141
+ The next client, ``bar``, extends from ``abstract.foo`` using the ``extends`` attribute referencing the client from
142
+ which to extend. Additional parameters can be merged into the original service definition when extending a parent
143
+ service.
144
+
145
+ .. important::
146
+
147
+ Each client that you intend to instantiate must specify a ``class`` attribute that references the full class name
148
+ of the client being created. The class referenced in the ``class`` parameter must implement a static ``factory()``
149
+ method that accepts an array or ``Guzzle\Common\Collection`` object and returns an instantiated object.
150
+
151
+ Sourcing from a PHP include
152
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
153
+
154
+ You can create service builder configurations using a PHP include file. This can be useful if you wish to take
155
+ advantage of an opcode cache like APC to speed up the process of loading and processing the configuration. The PHP
156
+ include file is the same format as an array, but you simply create a PHP script that returns an array and save the
157
+ file with the .php file extension.
158
+
159
+ .. code-block:: php
160
+
161
+ <?php return array('services' => '...');
162
+ // Saved as config.php
163
+
164
+ This configuration file can then be used with a service builder.
165
+
166
+ .. code-block:: php
167
+
168
+ $builder = ServiceBuilder::factory('/path/to/config.php');
169
+
170
+ Sourcing from a JSON document
171
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
172
+
173
+ You can use JSON documents to serialize your service descriptions. The JSON format uses the exact same structure as
174
+ the PHP array syntax, but it's just serialized using JSON.
175
+
176
+ .. code-block:: javascript
177
+
178
+ {
179
+ "includes": ["/path/to/other/services.json", "/path/to/other/php_services.php"],
180
+ "services": {
181
+ "abstract.foo": {
182
+ "params": {
183
+ "username": "foo",
184
+ "password": "bar"
185
+ }
186
+ },
187
+ "bar": {
188
+ "extends": "abstract.foo",
189
+ "class": "MyClientClass",
190
+ "params": {
191
+ "other": "abc"
192
+ }
193
+ }
194
+ }
195
+ }
196
+
197
+ Referencing other clients in parameters
198
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
199
+
200
+ If one of your clients depends on another client as one of its parameters, you can reference that client by name by
201
+ enclosing the client's reference key in ``{}``.
202
+
203
+ .. code-block:: javascript
204
+
205
+ {
206
+ "services": {
207
+ "token": {
208
+ "class": "My\Token\TokenFactory",
209
+ "params": {
210
+ "access_key": "xyz"
211
+ }
212
+ },
213
+ "client": {
214
+ "class": "My\Client",
215
+ "params": {
216
+ "token_client": "{token}",
217
+ "version": "1.0"
218
+ }
219
+ }
220
+ }
221
+ }
222
+
223
+ When ``client`` is constructed by the service builder, the service builder will first create the ``token`` service
224
+ and then inject the token service into ``client``'s factory method in the ``token_client`` parameter.
225
+
226
+ Retrieving clients from a service builder
227
+ -----------------------------------------
228
+
229
+ Clients are referenced using a customizable name you provide in your service definition. The ServiceBuilder is a sort
230
+ of multiton object-- it will only instantiate a client once and return that client for subsequent retrievals. Clients
231
+ are retrieved by name (the array key used in the configuration) or by the ``alias`` setting of a service.
232
+
233
+ Here's an example of retrieving a client from your ServiceBuilder:
234
+
235
+ .. code-block:: php
236
+
237
+ $client = $builder->get('foo');
238
+
239
+ // You can also use the ServiceBuilder object as an array
240
+ $client = $builder['foo'];
241
+
242
+ Creating throwaway clients
243
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
244
+
245
+ You can get a "throwaway" client (a client that is not persisted by the ServiceBuilder) by passing ``true`` in the
246
+ second argument of ``ServiceBuilder::get()``. This allows you to create a client that will not be returned by other
247
+ parts of your code that use the service builder. Instead of passing ``true``, you can pass an array of configuration
248
+ settings that will override the configuration settings specified in the service builder.
249
+
250
+ .. code-block:: php
251
+
252
+ // Get a throwaway client and overwrite the "custom" setting of the client
253
+ $foo = $builder->get('foo', array(
254
+ 'custom' => 'in this world there are rules'
255
+ ));
256
+
257
+ Getting raw configuration settings
258
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
259
+
260
+ You can get the raw configuration settings provided to the service builder for a specific service using the
261
+ ``getData($name)`` method of a service builder. This method will null if the service was not found in the service
262
+ builder or an array of configuration settings if the service was found.
263
+
264
+ .. code-block:: php
265
+
266
+ $data = $builder->getData('foo');
267
+ echo $data['key'] . "\n";
268
+ echo $data['secret'] . "\n";
269
+ echo $data['custom'] . "\n";
270
+
271
+ Adding a plugin to all clients
272
+ ------------------------------
273
+
274
+ You can add a plugin to all clients created by a service builder using the ``addGlobalPlugin($plugin)`` method of a
275
+ service builder and passing a ``Symfony\Component\EventDispatcher\EventSubscriberInterface`` object. The service builder
276
+ will then attach each global plugin to every client as it is created. This allows you to, for example, add a LogPlugin
277
+ to every request created by a service builder for easy debugging.
278
+
279
+ .. code-block:: php
280
+
281
+ use Guzzle\Plugin\Log\LogPlugin;
282
+
283
+ // Add a debug log plugin to every client as it is created
284
+ $builder->addGlobalPlugin(LogPlugin::getDebugPlugin());
285
+
286
+ $foo = $builder->get('foo');
287
+ $foo->get('/')->send();
288
+ // Should output all of the data sent over the wire
289
+
290
+ .. _service-builder-events:
291
+
292
+ Events emitted from a service builder
293
+ -------------------------------------
294
+
295
+ A ``Guzzle\Service\Builder\ServiceBuilder`` object emits the following events:
296
+
297
+ +-------------------------------+--------------------------------------------+-----------------------------------------+
298
+ | Event name | Description | Event data |
299
+ +===============================+============================================+=========================================+
300
+ | service_builder.create_client | Called when a client is created | * client: The created client object |
301
+ +-------------------------------+--------------------------------------------+-----------------------------------------+
302
+
303
+ .. code-block:: php
304
+
305
+ use Guzzle\Common\Event;
306
+ use Guzzle\Service\Builder\ServiceBuilder;
307
+
308
+ $builder = ServiceBuilder::factory('/path/to/config.json');
309
+
310
+ // Add an event listener to print out each client client as it is created
311
+ $builder->getEventDispatcher()->addListener('service_builder.create_client', function (Event $e) {
312
+ echo 'Client created: ' . get_class($e['client']) . "\n";
313
+ });
314
+
315
+ $foo = $builder->get('foo');
316
+ // Should output the class used for the "foo" client
vendor/sendgrid-php/vendor/guzzle/guzzle/docs/webservice-client/webservice-client.rst ADDED
@@ -0,0 +1,659 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ======================
2
+ The web service client
3
+ ======================
4
+
5
+ The ``Guzzle\Service`` namespace contains various abstractions that help to make it easier to interact with a web
6
+ service API, including commands, service descriptions, and resource iterators.
7
+
8
+ In this chapter, we'll build a simple `Twitter API client <https://dev.twitter.com/docs/api/1.1>`_.
9
+
10
+ Creating a client
11
+ =================
12
+
13
+ A class that extends from ``Guzzle\Service\Client`` or implements ``Guzzle\Service\ClientInterface`` must implement a
14
+ ``factory()`` method in order to be used with a :doc:`service builder <using-the-service-builder>`.
15
+
16
+ Factory method
17
+ --------------
18
+
19
+ You can use the ``factory()`` method of a client directly if you do not need a service builder.
20
+
21
+ .. code-block:: php
22
+
23
+ use mtdowling\TwitterClient;
24
+
25
+ // Create a client and pass an array of configuration data
26
+ $twitter = TwitterClient::factory(array(
27
+ 'consumer_key' => '****',
28
+ 'consumer_secret' => '****',
29
+ 'token' => '****',
30
+ 'token_secret' => '****'
31
+ ));
32
+
33
+ .. note::
34
+
35
+ If you'd like to follow along, here's how to get your Twitter API credentials:
36
+
37
+ 1. Visit https://dev.twitter.com/apps
38
+ 2. Click on an application that you've created
39
+ 3. Click on the "OAuth tool" tab
40
+ 4. Copy all of the settings under "OAuth Settings"
41
+
42
+ Implementing a factory method
43
+ -----------------------------
44
+
45
+ Creating a client and its factory method is pretty simple. You just need to implement ``Guzzle\Service\ClientInterface``
46
+ or extend from ``Guzzle\Service\Client``.
47
+
48
+ .. code-block:: php
49
+
50
+ namespace mtdowling;
51
+
52
+ use Guzzle\Common\Collection;
53
+ use Guzzle\Plugin\Oauth\OauthPlugin;
54
+ use Guzzle\Service\Client;
55
+ use Guzzle\Service\Description\ServiceDescription;
56
+
57
+ /**
58
+ * A simple Twitter API client
59
+ */
60
+ class TwitterClient extends Client
61
+ {
62
+ public static function factory($config = array())
63
+ {
64
+ // Provide a hash of default client configuration options
65
+ $default = array('base_url' => 'https://api.twitter.com/1.1');
66
+
67
+ // The following values are required when creating the client
68
+ $required = array(
69
+ 'base_url',
70
+ 'consumer_key',
71
+ 'consumer_secret',
72
+ 'token',
73
+ 'token_secret'
74
+ );
75
+
76
+ // Merge in default settings and validate the config
77
+ $config = Collection::fromConfig($config, $default, $required);
78
+
79
+ // Create a new Twitter client
80
+ $client = new self($config->get('base_url'), $config);
81
+
82
+ // Ensure that the OauthPlugin is attached to the client
83
+ $client->addSubscriber(new OauthPlugin($config->toArray()));
84
+
85
+ return $client;
86
+ }
87
+ }
88
+
89
+ Service Builder
90
+ ---------------
91
+
92
+ A service builder is used to easily create web service clients, provides a simple configuration driven approach to
93
+ creating clients, and allows you to share configuration settings across multiple clients. You can find out more about
94
+ Guzzle's service builder in :doc:`using-the-service-builder`.
95
+
96
+ .. code-block:: php
97
+
98
+ use Guzzle\Service\Builder\ServiceBuilder;
99
+
100
+ // Create a service builder and provide client configuration data
101
+ $builder = ServiceBuilder::factory('/path/to/client_config.json');
102
+
103
+ // Get the client from the service builder by name
104
+ $twitter = $builder->get('twitter');
105
+
106
+ The above example assumes you have JSON data similar to the following stored in "/path/to/client_config.json":
107
+
108
+ .. code-block:: json
109
+
110
+ {
111
+ "services": {
112
+ "twitter": {
113
+ "class": "mtdowling\\TwitterClient",
114
+ "params": {
115
+ "consumer_key": "****",
116
+ "consumer_secret": "****",
117
+ "token": "****",
118
+ "token_secret": "****"
119
+ }
120
+ }
121
+ }
122
+ }
123
+
124
+ .. note::
125
+
126
+ A service builder becomes much more valuable when using multiple web service clients in a single application or
127
+ if you need to utilize the same client with varying configuration settings (e.g. multiple accounts).
128
+
129
+ Commands
130
+ ========
131
+
132
+ Commands are a concept in Guzzle that helps to hide the underlying implementation of an API by providing an easy to use
133
+ parameter driven object for each action of an API. A command is responsible for accepting an array of configuration
134
+ parameters, serializing an HTTP request, and parsing an HTTP response. Following the
135
+ `command pattern <http://en.wikipedia.org/wiki/Command_pattern>`_, commands in Guzzle offer a greater level of
136
+ flexibility when implementing and utilizing a web service client.
137
+
138
+ Executing commands
139
+ ------------------
140
+
141
+ You must explicitly execute a command after creating a command using the ``getCommand()`` method. A command has an
142
+ ``execute()`` method that may be called, or you can use the ``execute()`` method of a client object and pass in the
143
+ command object. Calling either of these execute methods will return the result value of the command. The result value is
144
+ the result of parsing the HTTP response with the ``process()`` method.
145
+
146
+ .. code-block:: php
147
+
148
+ // Get a command from the client and pass an array of parameters
149
+ $command = $twitter->getCommand('getMentions', array(
150
+ 'count' => 5
151
+ ));
152
+
153
+ // Other parameters can be set on the command after it is created
154
+ $command['trim_user'] = false;
155
+
156
+ // Execute the command using the command object.
157
+ // The result value contains an array of JSON data from the response
158
+ $result = $command->execute();
159
+
160
+ // You can retrieve the result of the command later too
161
+ $result = $command->getResult().
162
+
163
+ Command object also contains methods that allow you to inspect the HTTP request and response that was utilized with
164
+ the command.
165
+
166
+ .. code-block:: php
167
+
168
+ $request = $command->getRequest();
169
+ $response = $command->getResponse();
170
+
171
+ .. note::
172
+
173
+ The format and notation used to retrieve commands from a client can be customized by injecting a custom command
174
+ factory, ``Guzzle\Service\Command\Factory\FactoryInterface``, on the client using ``$client->setCommandFactory()``.
175
+
176
+ Executing with magic methods
177
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
178
+
179
+ When using method missing magic methods with a command, the command will be executed right away and the result of the
180
+ command is returned.
181
+
182
+ .. code-block:: php
183
+
184
+ $jsonData = $twitter->getMentions(array(
185
+ 'count' => 5,
186
+ 'trim_user' => true
187
+ ));
188
+
189
+ Creating commands
190
+ -----------------
191
+
192
+ Commands are created using either the ``getCommand()`` method of a client or a magic missing method of a client. Using
193
+ the ``getCommand()`` method allows you to create a command without executing it, allowing for customization of the
194
+ command or the request serialized by the command.
195
+
196
+ When a client attempts to create a command, it uses the client's ``Guzzle\Service\Command\Factory\FactoryInterface``.
197
+ By default, Guzzle will utilize a command factory that first looks for a concrete class for a particular command
198
+ (concrete commands) followed by a command defined by a service description (operation commands). We'll learn more about
199
+ concrete commands and operation commands later in this chapter.
200
+
201
+ .. code-block:: php
202
+
203
+ // Get a command from the twitter client.
204
+ $command = $twitter->getCommand('getMentions');
205
+ $result = $command->execute();
206
+
207
+ Unless you've skipped ahead, running the above code will throw an exception.
208
+
209
+ PHP Fatal error: Uncaught exception 'Guzzle\Common\Exception\InvalidArgumentException' with message
210
+ 'Command was not found matching getMentions'
211
+
212
+ This exception was thrown because the "getMentions" command has not yet been implemented. Let's implement one now.
213
+
214
+ Concrete commands
215
+ ~~~~~~~~~~~~~~~~~
216
+
217
+ Commands can be created in one of two ways: create a concrete command class that extends
218
+ ``Guzzle\Service\Command\AbstractCommand`` or
219
+ :doc:`create an OperationCommand based on a service description <guzzle-service-descriptions>`. The recommended
220
+ approach is to use a service description to define your web service, but you can use concrete commands when custom
221
+ logic must be implemented for marshaling or unmarshaling a HTTP message.
222
+
223
+ Commands are the method in which you abstract away the underlying format of the requests that need to be sent to take
224
+ action on a web service. Commands in Guzzle are meant to be built by executing a series of setter methods on a command
225
+ object. Commands are only validated right before they are executed. A ``Guzzle\Service\Client`` object is responsible
226
+ for executing commands. Commands created for your web service must implement
227
+ ``Guzzle\Service\Command\CommandInterface``, but it's easier to extend the ``Guzzle\Service\Command\AbstractCommand``
228
+ class, implement the ``build()`` method, and optionally implement the ``process()`` method.
229
+
230
+ Serializing requests
231
+ ^^^^^^^^^^^^^^^^^^^^
232
+
233
+ The ``build()`` method of a command is responsible for using the arguments of the command to build and serialize a
234
+ HTTP request and set the request on the ``$request`` property of the command object. This step is usually taken care of
235
+ for you when using a service description driven command that uses the default
236
+ ``Guzzle\Service\Command\OperationCommand``. You may wish to implement the process method yourself when you aren't
237
+ using a service description or need to implement more complex request serialization.
238
+
239
+ .. important::::
240
+
241
+ When implementing a custom ``build()`` method, be sure to set the class property of ``$this->request`` to an
242
+ instantiated and ready to send request.
243
+
244
+ The following example shows how to implement the ``getMentions``
245
+ `Twitter API <https://dev.twitter.com/docs/api/1.1/get/statuses/mentions_timeline>`_ method using a concrete command.
246
+
247
+ .. code-block:: php
248
+
249
+ namespace mtdowling\Twitter\Command;
250
+
251
+ use Guzzle\Service\Command\AbstractCommand;
252
+
253
+ class GetMentions extends AbstractCommand
254
+ {
255
+ protected function build()
256
+ {
257
+ // Create the request property of the command
258
+ $this->request = $this->client->get('statuses/mentions_timeline.json');
259
+
260
+ // Grab the query object of the request because we will use it for
261
+ // serializing command parameters on the request
262
+ $query = $this->request->getQuery();
263
+
264
+ if ($this['count']) {
265
+ $query->set('count', $this['count']);
266
+ }
267
+
268
+ if ($this['since_id']) {
269
+ $query->set('since_id', $this['since_id']);
270
+ }
271
+
272
+ if ($this['max_id']) {
273
+ $query->set('max_id', $this['max_id']);
274
+ }
275
+
276
+ if ($this['trim_user'] !== null) {
277
+ $query->set('trim_user', $this['trim_user'] ? 'true' : 'false');
278
+ }
279
+
280
+ if ($this['contributor_details'] !== null) {
281
+ $query->set('contributor_details', $this['contributor_details'] ? 'true' : 'false');
282
+ }
283
+
284
+ if ($this['include_entities'] !== null) {
285
+ $query->set('include_entities', $this['include_entities'] ? 'true' : 'false');
286
+ }
287
+ }
288
+ }
289
+
290
+ By default, a client will attempt to find concrete command classes under the ``Command`` namespace of a client. First
291
+ the client will attempt to find an exact match for the name of the command to the name of the command class. If an
292
+ exact match is not found, the client will calculate a class name using inflection. This is calculated based on the
293
+ folder hierarchy of a command and converting the CamelCased named commands into snake_case. Here are some examples on
294
+ how the command names are calculated:
295
+
296
+ #. ``Foo\Command\JarJar`` **->** jar_jar
297
+ #. ``Foo\Command\Test`` **->** test
298
+ #. ``Foo\Command\People\GetCurrentPerson`` **->** people.get_current_person
299
+
300
+ Notice how any sub-namespace beneath ``Command`` is converted from ``\`` to ``.`` (a period). CamelCasing is converted
301
+ to lowercased snake_casing (e.g. JarJar == jar_jar).
302
+
303
+ Parsing responses
304
+ ^^^^^^^^^^^^^^^^^
305
+
306
+ The ``process()`` method of a command is responsible for converting an HTTP response into something more useful. For
307
+ example, a service description operation that has specified a model object in the ``responseClass`` attribute of the
308
+ operation will set a ``Guzzle\Service\Resource\Model`` object as the result of the command. This behavior can be
309
+ completely modified as needed-- even if you are using operations and responseClass models. Simply implement a custom
310
+ ``process()`` method that sets the ``$this->result`` class property to whatever you choose. You can reuse parts of the
311
+ default Guzzle response parsing functionality or get inspiration from existing code by using
312
+ ``Guzzle\Service\Command\OperationResponseParser`` and ``Guzzle\Service\Command\DefaultResponseParser`` classes.
313
+
314
+ If you do not implement a custom ``process()`` method and are not using a service description, then Guzzle will attempt
315
+ to guess how a response should be processed based on the Content-Type header of the response. Because the Twitter API
316
+ sets a ``Content-Type: application/json`` header on this response, we do not need to implement any custom response
317
+ parsing.
318
+
319
+ Operation commands
320
+ ~~~~~~~~~~~~~~~~~~
321
+
322
+ Operation commands are commands in which the serialization of an HTTP request and the parsing of an HTTP response are
323
+ driven by a Guzzle service description. Because request serialization, validation, and response parsing are
324
+ described using a DSL, creating operation commands is a much faster process than writing concrete commands.
325
+
326
+ Creating operation commands for our Twitter client can remove a great deal of redundancy from the previous concrete
327
+ command, and allows for a deeper runtime introspection of the API. Here's an example service description we can use to
328
+ create the Twitter API client:
329
+
330
+ .. code-block:: json
331
+
332
+ {
333
+ "name": "Twitter",
334
+ "apiVersion": "1.1",
335
+ "baseUrl": "https://api.twitter.com/1.1",
336
+ "description": "Twitter REST API client",
337
+ "operations": {
338
+ "GetMentions": {
339
+ "httpMethod": "GET",
340
+ "uri": "statuses/mentions_timeline.json",
341
+ "summary": "Returns the 20 most recent mentions for the authenticating user.",
342
+ "responseClass": "GetMentionsOutput",
343
+ "parameters": {
344
+ "count": {
345
+ "description": "Specifies the number of tweets to try and retrieve",
346
+ "type": "integer",
347
+ "location": "query"
348
+ },
349
+ "since_id": {
350
+ "description": "Returns results with an ID greater than the specified ID",
351
+ "type": "integer",
352
+ "location": "query"
353
+ },
354
+ "max_id": {
355
+ "description": "Returns results with an ID less than or equal to the specified ID.",
356
+ "type": "integer",
357
+ "location": "query"
358
+ },
359
+ "trim_user": {
360
+ "description": "Limits the amount of data returned for each user",
361
+ "type": "boolean",
362
+ "location": "query"
363
+ },
364
+ "contributor_details": {
365
+ "description": "Adds more data to contributor elements",
366
+ "type": "boolean",
367
+ "location": "query"
368
+ },
369
+ "include_entities": {
370
+ "description": "The entities node will be disincluded when set to false.",
371
+ "type": "boolean",
372
+ "location": "query"
373
+ }
374
+ }
375
+ }
376
+ },
377
+ "models": {
378
+ "GetMentionsOutput": {
379
+ "type": "object",
380
+ "additionalProperties": {
381
+ "location": "json"
382
+ }
383
+ }
384
+ }
385
+ }
386
+
387
+ If you're lazy, you can define the API in a less descriptive manner using ``additionalParameters``.
388
+ ``additionalParameters`` define the serialization and validation rules of parameters that are not explicitly defined
389
+ in a service description.
390
+
391
+ .. code-block:: json
392
+
393
+ {
394
+ "name": "Twitter",
395
+ "apiVersion": "1.1",
396
+ "baseUrl": "https://api.twitter.com/1.1",
397
+ "description": "Twitter REST API client",
398
+ "operations": {
399
+ "GetMentions": {
400
+ "httpMethod": "GET",
401
+ "uri": "statuses/mentions_timeline.json",
402
+ "summary": "Returns the 20 most recent mentions for the authenticating user.",
403
+ "responseClass": "GetMentionsOutput",
404
+ "additionalParameters": {
405
+ "location": "query"
406
+ }
407
+ }
408
+ },
409
+ "models": {
410
+ "GetMentionsOutput": {
411
+ "type": "object",
412
+ "additionalProperties": {
413
+ "location": "json"
414
+ }
415
+ }
416
+ }
417
+ }
418
+
419
+ You should attach the service description to the client at the end of the client's factory method:
420
+
421
+ .. code-block:: php
422
+
423
+ // ...
424
+ class TwitterClient extends Client
425
+ {
426
+ public static function factory($config = array())
427
+ {
428
+ // ... same code as before ...
429
+
430
+ // Set the service description
431
+ $client->setDescription(ServiceDescription::factory('path/to/twitter.json'));
432
+
433
+ return $client;
434
+ }
435
+ }
436
+
437
+ The client can now use operations defined in the service description instead of requiring you to create concrete
438
+ command classes. Feel free to delete the concrete command class we created earlier.
439
+
440
+ .. code-block:: php
441
+
442
+ $jsonData = $twitter->getMentions(array(
443
+ 'count' => 5,
444
+ 'trim_user' => true
445
+ ));
446
+
447
+ Executing commands in parallel
448
+ ------------------------------
449
+
450
+ Much like HTTP requests, Guzzle allows you to send multiple commands in parallel. You can send commands in parallel by
451
+ passing an array of command objects to a client's ``execute()`` method. The client will serialize each request and
452
+ send them all in parallel. If an error is encountered during the transfer, then a
453
+ ``Guzzle\Service\Exception\CommandTransferException`` is thrown, which allows you to retrieve a list of commands that
454
+ succeeded and a list of commands that failed.
455
+
456
+ .. code-block:: php
457
+
458
+ use Guzzle\Service\Exception\CommandTransferException;
459
+
460
+ $commands = array();
461
+ $commands[] = $twitter->getCommand('getMentions');
462
+ $commands[] = $twitter->getCommand('otherCommandName');
463
+ // etc...
464
+
465
+ try {
466
+ $result = $client->execute($commands);
467
+ foreach ($result as $command) {
468
+ echo $command->getName() . ': ' . $command->getResponse()->getStatusCode() . "\n";
469
+ }
470
+ } catch (CommandTransferException $e) {
471
+ // Get an array of the commands that succeeded
472
+ foreach ($e->getSuccessfulCommands() as $command) {
473
+ echo $command->getName() . " succeeded\n";
474
+ }
475
+ // Get an array of the commands that failed
476
+ foreach ($e->getFailedCommands() as $command) {
477
+ echo $command->getName() . " failed\n";
478
+ }
479
+ }
480
+
481
+ .. note::
482
+
483
+ All commands executed from a client using an array must originate from the same client.
484
+
485
+ Special command options
486
+ -----------------------
487
+
488
+ Guzzle exposes several options that help to control how commands are validated, serialized, and parsed.
489
+ Command options can be specified when creating a command or in the ``command.params`` parameter in the
490
+ ``Guzzle\Service\Client``.
491
+
492
+ =========================== ============================================================================================
493
+ command.request_options Option used to add :ref:`Request options <request-options>` to the request created by a
494
+ command
495
+ command.hidden_params An array of the names of parameters ignored by the ``additionalParameters`` parameter schema
496
+ command.disable_validation Set to true to disable JSON schema validation of the command's input parameters
497
+ command.response_processing Determines how the default response parser will parse the command. One of "raw" no parsing,
498
+ "model" (the default method used to parse commands using response models defined in service
499
+ descriptions)
500
+ command.headers (deprecated) Option used to specify custom headers. Use ``command.request_options`` instead
501
+ command.on_complete (deprecated) Option used to add an onComplete method to a command. Use
502
+ ``command.after_send`` event instead
503
+ command.response_body (deprecated) Option used to change the entity body used to store a response.
504
+ Use ``command.request_options`` instead
505
+ =========================== ============================================================================================
506
+
507
+ Advanced client configuration
508
+ =============================
509
+
510
+ Default command parameters
511
+ --------------------------
512
+
513
+ When creating a client object, you can specify default command parameters to pass into all commands. Any key value pair
514
+ present in the ``command.params`` settings of a client will be added as default parameters to any command created
515
+ by the client.
516
+
517
+ .. code-block:: php
518
+
519
+ $client = new Guzzle\Service\Client(array(
520
+ 'command.params' => array(
521
+ 'default_1' => 'foo',
522
+ 'another' => 'bar'
523
+ )
524
+ ));
525
+
526
+ Magic methods
527
+ -------------
528
+
529
+ Client objects will, by default, attempt to create and execute commands when a missing method is invoked on a client.
530
+ This powerful concept applies to both concrete commands and operation commands powered by a service description. This
531
+ makes it appear to the end user that you have defined actual methods on a client object, when in fact, the methods are
532
+ invoked using PHP's magic ``__call`` method.
533
+
534
+ The ``__call`` method uses the ``getCommand()`` method of a client, which uses the client's internal
535
+ ``Guzzle\Service\Command\Factory\FactoryInterface`` object. The default command factory allows you to instantiate
536
+ operations defined in a client's service description. The method in which a client determines which command to
537
+ execute is defined as follows:
538
+
539
+ 1. The client will first try to find a literal match for an operation in the service description.
540
+ 2. If the literal match is not found, the client will try to uppercase the first character of the operation and find
541
+ the match again.
542
+ 3. If a match is still not found, the command factory will inflect the method name from CamelCase to snake_case and
543
+ attempt to find a matching command.
544
+ 4. If a command still does not match, an exception is thrown.
545
+
546
+ .. code-block:: php
547
+
548
+ // Use the magic method
549
+ $result = $twitter->getMentions();
550
+
551
+ // This is exactly the same as:
552
+ $result = $twitter->getCommand('getMentions')->execute();
553
+
554
+ You can disable magic methods on a client by passing ``false`` to the ``enableMagicMethod()`` method.
555
+
556
+ Custom command factory
557
+ ----------------------
558
+
559
+ A client by default uses the ``Guzzle\Service\Command\Factory\CompositeFactory`` which allows multiple command
560
+ factories to attempt to create a command by a certain name. The default CompositeFactory uses a ``ConcreteClassFactory``
561
+ and a ``ServiceDescriptionFactory`` if a service description is specified on a client. You can specify a custom
562
+ command factory if your client requires custom command creation logic using the ``setCommandFactory()`` method of
563
+ a client.
564
+
565
+ Custom resource Iterator factory
566
+ --------------------------------
567
+
568
+ Resource iterators can be retrieved from a client using the ``getIterator($name)`` method of a client. This method uses
569
+ a client's internal ``Guzzle\Service\Resource\ResourceIteratorFactoryInterface`` object. A client by default uses a
570
+ ``Guzzle\Service\Resource\ResourceIteratorClassFactory`` to attempt to find concrete classes that implement resource
571
+ iterators. The default factory will first look for matching iterators in the ``Iterator`` subdirectory of the client
572
+ followed by the ``Model`` subdirectory of a client. Use the ``setResourceIteratorFactory()`` method of a client to
573
+ specify a custom resource iterator factory.
574
+
575
+ Plugins and events
576
+ ==================
577
+
578
+ ``Guzzle\Service\Client`` exposes various events that allow you to hook in custom logic. A client object owns a
579
+ ``Symfony\Component\EventDispatcher\EventDispatcher`` object that can be accessed by calling
580
+ ``$client->getEventDispatcher()``. You can use the event dispatcher to add listeners (a simple callback function) or
581
+ event subscribers (classes that listen to specific events of a dispatcher).
582
+
583
+ .. _service-client-events:
584
+
585
+ Events emitted from a Service Client
586
+ ------------------------------------
587
+
588
+ A ``Guzzle\Service\Client`` object emits the following events:
589
+
590
+ +------------------------------+--------------------------------------------+------------------------------------------+
591
+ | Event name | Description | Event data |
592
+ +==============================+============================================+==========================================+
593
+ | client.command.create | The client created a command object | * client: Client object |
594
+ | | | * command: Command object |
595
+ +------------------------------+--------------------------------------------+------------------------------------------+
596
+ | command.before_prepare | Before a command is validated and built. | * command: Command being prepared |
597
+ | | This is also before a request is created. | |
598
+ +------------------------------+--------------------------------------------+------------------------------------------+
599
+ | command.after_prepare | After a command instantiates and | * command: Command that was prepared |
600
+ | | configures its request object. | |
601
+ +------------------------------+--------------------------------------------+------------------------------------------+
602
+ | command.before_send | The client is about to execute a prepared | * command: Command to execute |
603
+ | | command | |
604
+ +------------------------------+--------------------------------------------+------------------------------------------+
605
+ | command.after_send | The client successfully completed | * command: The command that was executed |
606
+ | | executing a command | |
607
+ +------------------------------+--------------------------------------------+------------------------------------------+
608
+ | command.parse_response | Called when ``responseType`` is ``class`` | * command: The command with a response |
609
+ | | and the response is about to be parsed. | about to be parsed. |
610
+ +------------------------------+--------------------------------------------+------------------------------------------+
611
+
612
+ .. code-block:: php
613
+
614
+ use Guzzle\Common\Event;
615
+ use Guzzle\Service\Client;
616
+
617
+ $client = new Client();
618
+
619
+ // create an event listener that operates on request objects
620
+ $client->getEventDispatcher()->addListener('command.after_prepare', function (Event $event) {
621
+ $command = $event['command'];
622
+ $request = $command->getRequest();
623
+
624
+ // do something with request
625
+ });
626
+
627
+ .. code-block:: php
628
+
629
+ use Guzzle\Common\Event;
630
+ use Guzzle\Common\Client;
631
+ use Symfony\Component\EventDispatcher\EventSubscriberInterface;
632
+
633
+ class EventSubscriber implements EventSubscriberInterface
634
+ {
635
+ public static function getSubscribedEvents()
636
+ {
637
+ return array(
638
+ 'client.command.create' => 'onCommandCreate',
639
+ 'command.parse_response' => 'onParseResponse'
640
+ );
641
+ }
642
+
643
+ public function onCommandCreate(Event $event)
644
+ {
645
+ $client = $event['client'];
646
+ $command = $event['command'];
647
+ // operate on client and command
648
+ }
649
+
650
+ public function onParseResponse(Event $event)
651
+ {
652
+ $command = $event['command'];
653
+ // operate on the command
654
+ }
655
+ }
656
+
657
+ $client = new Client();
658
+
659
+ $client->addSubscriber(new EventSubscriber());
vendor/sendgrid-php/vendor/guzzle/guzzle/phar-stub.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Phar::mapPhar('guzzle.phar');
4
+
5
+ require_once 'phar://guzzle.phar/vendor/symfony/class-loader/Symfony/Component/ClassLoader/UniversalClassLoader.php';
6
+
7
+ $classLoader = new Symfony\Component\ClassLoader\UniversalClassLoader();
8
+ $classLoader->registerNamespaces(array(
9
+ 'Guzzle' => 'phar://guzzle.phar/src',
10
+ 'Symfony\\Component\\EventDispatcher' => 'phar://guzzle.phar/vendor/symfony/event-dispatcher',
11
+ 'Doctrine' => 'phar://guzzle.phar/vendor/doctrine/common/lib',
12
+ 'Monolog' => 'phar://guzzle.phar/vendor/monolog/monolog/src'
13
+ ));
14
+ $classLoader->register();
15
+
16
+ __HALT_COMPILER();
vendor/sendgrid-php/vendor/guzzle/guzzle/phing/build.properties.dist ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # you may need to update this if you're working on a fork.
2
+ guzzle.remote=git@github.com:guzzle/guzzle.git
3
+
4
+ # github credentials -- only used by GitHub API calls to create subtree repos
5
+ github.basicauth=username:password
6
+ # for the subtree split and testing
7
+ github.org=guzzle
8
+
9
+ # your git path
10
+ cmd.git=git
11
+
12
+ # your composer command
13
+ cmd.composer=composer
14
+
15
+ # test server start
16
+ cmd.testserver=node
vendor/sendgrid-php/vendor/guzzle/guzzle/phing/imports/dependencies.xml ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project basedir="../../" default="install-dependencies">
3
+
4
+ <property name="cmd.composer" value="" />
5
+ <property name="cmd.git" value="" />
6
+ <property name="cmd.testserver" value="" />
7
+
8
+ <!--
9
+ Our custom tasks
10
+ -->
11
+ <taskdef name="composerlint" classname="phing.tasks.ComposerLintTask" />
12
+ <taskdef name="guzzlesubsplit" classname="phing.tasks.GuzzleSubSplitTask" />
13
+ <taskdef name="guzzlepear" classname="phing.tasks.GuzzlePearPharPackageTask" />
14
+
15
+ <target name="find-git">
16
+ <if>
17
+ <contains string="${cmd.git}" substring="git" />
18
+ <then>
19
+ <echo>using git at ${cmd.git}</echo>
20
+ </then>
21
+ <else>
22
+ <exec command="which git" outputProperty="cmd.git" />
23
+ <echo>found git at ${cmd.git}</echo>
24
+ </else>
25
+ </if>
26
+ </target>
27
+
28
+ <target name="clean-dependencies">
29
+ <delete dir="${project.basedir}/vendor"/>
30
+ <delete file="${project.basedir}/composer.lock" />
31
+ </target>
32
+
33
+ </project>
vendor/sendgrid-php/vendor/guzzle/guzzle/phing/imports/deploy.xml ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project basedir="../../" default="deploy">
3
+
4
+ <property name="git.status" value=""/>
5
+ <property name="git.currentbranch" value=""/>
6
+ <target name="check-git-branch-status">
7
+ <exec command="git status -s -b" outputProperty="git.currentbranch" />
8
+ <echo msg="${git.currentbranch}"/>
9
+ <if>
10
+ <contains string="${git.currentbranch}" substring="${head}"/>
11
+ <then>
12
+ <echo>On branch ${head}</echo>
13
+ </then>
14
+ <else>
15
+ <fail message="-Dhead=${head} arg did not match ${git.currentbranch}"/>
16
+ </else>
17
+ </if>
18
+ <exec command="git status -s" outputProperty="git.status" />
19
+ <if>
20
+ <equals arg1="${git.status}" arg2="" trim="true"/>
21
+ <then>
22
+ <echo>working directory clean</echo>
23
+ </then>
24
+ <else>
25
+ <echo>${git.status}</echo>
26
+ <fail message="Working directory isn't clean." />
27
+ </else>
28
+ </if>
29
+ </target>
30
+
31
+ <property name="version.changelog" value=""/>
32
+ <property name="version.version" value=""/>
33
+ <target name="check-changelog-version">
34
+ <exec executable="fgrep" outputProperty="version.changelog">
35
+ <arg value="${new.version} ("/>
36
+ <arg value="${project.basedir}/CHANGELOG.md"/>
37
+ </exec>
38
+ <if>
39
+ <equals arg1="${version.changelog}" arg2="" trim="true"/>
40
+ <then>
41
+ <fail message="${new.version} not mentioned in CHANGELOG"/>
42
+ </then>
43
+ </if>
44
+
45
+ <exec executable="fgrep" outputProperty="version.version">
46
+ <arg value="const VERSION = '${new.version}'"/>
47
+ <arg value="${project.basedir}/src/Guzzle/Common/Version.php"/>
48
+ </exec>
49
+ <if>
50
+ <equals arg1="${version.version}" arg2="" trim="true"/>
51
+ <then>
52
+ <fail message="${new.version} not mentioned in Guzzle\Common\Version"/>
53
+ </then>
54
+ </if>
55
+
56
+ <echo>ChangeLog Match: ${version.changelog}</echo>
57
+ <echo>Guzzle\Common\Version Match: ${version.version}</echo>
58
+ </target>
59
+
60
+ <target name="help" description="HELP AND REMINDERS about what you can do with this project">
61
+ <echo>releasing: phing -Dnew.version=3.0.x -Dhead=master release</echo>
62
+ <echo>--</echo>
63
+ <exec command="phing -l" passthru="true"/>
64
+ </target>
65
+
66
+ <target name="release" depends="check-changelog-version,check-git-branch-status"
67
+ description="tag, subtree split, package, deploy: Use: phing -Dnew.version=[TAG] -Dhead=[BRANCH] release">
68
+ <if>
69
+ <isset property="new.version" />
70
+ <then>
71
+ <if>
72
+ <contains string="${new.version}" substring="v" casesensitive="false" />
73
+ <then>
74
+ <fail message="Please specify version as [0-9].[0-9].[0-9]. (I'll add v for you.)"/>
75
+ </then>
76
+ <else>
77
+
78
+ <echo>BEGINNING RELEASE FOR ${new.version}</echo>
79
+
80
+ <!-- checkout the specified branch -->
81
+ <!-- <gitcheckout repository="${repo.dir}" branchname="${head}" gitPath="${cmd.git}" /> -->
82
+ <!-- Ensure that the tag exists -->
83
+ <!-- push the tag up so subsplit will get it -->
84
+ <!--gitpush repository="${repo.dir}" tags="true" gitPath="${cmd.git}" /-->
85
+
86
+ <!-- now do the subsplits -->
87
+ <guzzlesubsplit
88
+ repository="${repo.dir}"
89
+ remote="${guzzle.remote}"
90
+ heads="${head}"
91
+ tags="v${new.version}"
92
+ base="src"
93
+ subIndicatorFile="composer.json"
94
+ gitPath="${cmd.git}" />
95
+
96
+ <!-- Copy .md files into the PEAR package -->
97
+ <copy file="${repo.dir}/LICENSE" tofile=".subsplit/src/Guzzle/LICENSE.md" />
98
+ <copy file="${repo.dir}/README.md" tofile=".subsplit/src/Guzzle/README.md" />
99
+ <copy file="${repo.dir}/CHANGELOG.md" tofile=".subsplit/src/Guzzle/CHANGELOG.md" />
100
+
101
+ <!-- and now the pear packages -->
102
+ <guzzlepear
103
+ version="${new.version}"
104
+ makephar="true"
105
+ />
106
+ </else>
107
+
108
+ </if>
109
+ </then>
110
+
111
+ <else>
112
+ <echo>Tip: to create a new release, do: phing -Dnew.version=[TAG] -Dhead=[BRANCH] release</echo>
113
+ </else>
114
+
115
+ </if>
116
+ </target>
117
+
118
+ <target name="pear-channel">
119
+ <guzzlepear version="${new.version}" deploy="true" makephar="true" />
120
+ </target>
121
+
122
+ <target name="package-phar" description="Create a phar with an autoloader">
123
+ <pharpackage
124
+ destfile="${dir.output}/guzzle.phar"
125
+ basedir="${project.basedir}/.subsplit"
126
+ stub="phar-stub.php"
127
+ signature="md5">
128
+ <fileset dir="${project.basedir}/.subsplit">
129
+ <include name="src/**/*.php" />
130
+ <include name="src/**/*.pem" />
131
+ <include name="vendor/symfony/class-loader/Symfony/Component/ClassLoader/UniversalClassLoader.php" />
132
+ <include name="vendor/symfony/event-dispatcher/**/*.php" />
133
+ <include name="vendor/doctrine/common/lib/Doctrine/Common/Cache/*.php" />
134
+ <include name="vendor/monolog/monolog/src/**/*.php" />
135
+ </fileset>
136
+ <metadata>
137
+ <element name="author" value="Michael Dowling" />
138
+ </metadata>
139
+ </pharpackage>
140
+ </target>
141
+
142
+ </project>
vendor/sendgrid-php/vendor/guzzle/guzzle/phing/tasks/ComposerLintTask.php ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Phing task for composer validation.
4
+ *
5
+ * @copyright 2012 Clay Loveless <clay@php.net>
6
+ * @license http://claylo.mit-license.org/2012/ MIT License
7
+ */
8
+
9
+ require_once 'phing/Task.php';
10
+
11
+ class ComposerLintTask extends Task
12
+ {
13
+ protected $dir = null;
14
+ protected $file = null;
15
+ protected $passthru = false;
16
+ protected $composer = null;
17
+
18
+ /**
19
+ * The setter for the dir
20
+ *
21
+ * @param string $str Directory to crawl recursively for composer files
22
+ */
23
+ public function setDir($str)
24
+ {
25
+ $this->dir = $str;
26
+ }
27
+
28
+ /**
29
+ * The setter for the file
30
+ *
31
+ * @param string $str Individual file to validate
32
+ */
33
+ public function setFile($str)
34
+ {
35
+ $this->file = $str;
36
+ }
37
+
38
+ /**
39
+ * Whether to use PHP's passthru() function instead of exec()
40
+ *
41
+ * @param boolean $passthru If passthru shall be used
42
+ */
43
+ public function setPassthru($passthru)
44
+ {
45
+ $this->passthru = (bool) $passthru;
46
+ }
47
+
48
+ /**
49
+ * Composer to execute. If unset, will attempt composer.phar in project
50
+ * basedir, and if that fails, will attempt global composer
51
+ * installation.
52
+ *
53
+ * @param string $str Individual file to validate
54
+ */
55
+ public function setComposer($str)
56
+ {
57
+ $this->file = $str;
58
+ }
59
+
60
+ /**
61
+ * The init method: do init steps
62
+ */
63
+ public function init()
64
+ {
65
+ // nothing needed here
66
+ }
67
+
68
+ /**
69
+ * The main entry point
70
+ */
71
+ public function main()
72
+ {
73
+ if ($this->composer === null) {
74
+ $this->findComposer();
75
+ }
76
+
77
+ $files = array();
78
+ if (!empty($this->file) && file_exists($this->file)) {
79
+ $files[] = $this->file;
80
+ }
81
+
82
+ if (!empty($this->dir)) {
83
+ $found = $this->findFiles();
84
+ foreach ($found as $file) {
85
+ $files[] = $this->dir . DIRECTORY_SEPARATOR . $file;
86
+ }
87
+ }
88
+
89
+ foreach ($files as $file) {
90
+
91
+ $cmd = $this->composer . ' validate ' . $file;
92
+ $cmd = escapeshellcmd($cmd);
93
+
94
+ if ($this->passthru) {
95
+ $retval = null;
96
+ passthru($cmd, $retval);
97
+ if ($retval == 1) {
98
+ throw new BuildException('invalid composer.json');
99
+ }
100
+ } else {
101
+ $out = array();
102
+ $retval = null;
103
+ exec($cmd, $out, $retval);
104
+ if ($retval == 1) {
105
+ $err = join("\n", $out);
106
+ throw new BuildException($err);
107
+ } else {
108
+ $this->log($out[0]);
109
+ }
110
+ }
111
+
112
+ }
113
+
114
+ }
115
+
116
+ /**
117
+ * Find the composer.json files using Phing's directory scanner
118
+ *
119
+ * @return array
120
+ */
121
+ protected function findFiles()
122
+ {
123
+ $ds = new DirectoryScanner();
124
+ $ds->setBasedir($this->dir);
125
+ $ds->setIncludes(array('**/composer.json'));
126
+ $ds->scan();
127
+ return $ds->getIncludedFiles();
128
+ }
129
+
130
+ /**
131
+ * Find composer installation
132
+ *
133
+ */
134
+ protected function findComposer()
135
+ {
136
+ $basedir = $this->project->getBasedir();
137
+ $php = $this->project->getProperty('php.interpreter');
138
+
139
+ if (file_exists($basedir . '/composer.phar')) {
140
+ $this->composer = "$php $basedir/composer.phar";
141
+ } else {
142
+ $out = array();
143
+ exec('which composer', $out);
144
+ if (empty($out)) {
145
+ throw new BuildException(
146
+ 'Could not determine composer location.'
147
+ );
148
+ }
149
+ $this->composer = $out[0];
150
+ }
151
+ }
152
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This file is part of Guzzle's build process.
4
+ *
5
+ * @copyright 2012 Clay Loveless <clay@php.net>
6
+ * @license http://claylo.mit-license.org/2012/ MIT License
7
+ */
8
+
9
+ require_once 'phing/Task.php';
10
+ require_once 'PEAR/PackageFileManager2.php';
11
+ require_once 'PEAR/PackageFileManager/File.php';
12
+ require_once 'PEAR/Packager.php';
13
+
14
+ class GuzzlePearPharPackageTask extends Task
15
+ {
16
+ private $version;
17
+ private $deploy = true;
18
+ private $makephar = true;
19
+
20
+ private $subpackages = array();
21
+
22
+ public function setVersion($str)
23
+ {
24
+ $this->version = $str;
25
+ }
26
+
27
+ public function getVersion()
28
+ {
29
+ return $this->version;
30
+ }
31
+
32
+ public function setDeploy($deploy)
33
+ {
34
+ $this->deploy = (bool) $deploy;
35
+ }
36
+
37
+ public function getDeploy()
38
+ {
39
+ return $this->deploy;
40
+ }
41
+
42
+ public function setMakephar($makephar)
43
+ {
44
+ $this->makephar = (bool) $makephar;
45
+ }
46
+
47
+ public function getMakephar()
48
+ {
49
+ return $this->makephar;
50
+ }
51
+
52
+ private $basedir;
53
+ private $guzzleinfo;
54
+ private $changelog_release_date;
55
+ private $changelog_notes = '-';
56
+
57
+ public function main()
58
+ {
59
+ $this->basedir = $this->getProject()->getBasedir();
60
+
61
+ if (!is_dir((string) $this->basedir.'/.subsplit')) {
62
+ throw new BuildException('PEAR packaging requires .subsplit directory');
63
+ }
64
+
65
+ // main composer file
66
+ $composer_file = file_get_contents((string) $this->basedir.'/.subsplit/composer.json');
67
+ $this->guzzleinfo = json_decode($composer_file, true);
68
+
69
+ // make sure we have a target
70
+ $pearwork = (string) $this->basedir . '/build/pearwork';
71
+ if (!is_dir($pearwork)) {
72
+ mkdir($pearwork, 0777, true);
73
+ }
74
+ $pearlogs = (string) $this->basedir . '/build/artifacts/logs';
75
+ if (!is_dir($pearlogs)) {
76
+ mkdir($pearlogs, 0777, true);
77
+ }
78
+
79
+ $version = $this->getVersion();
80
+ $this->grabChangelog();
81
+ if ($version[0] == '2') {
82
+ $this->log('building single PEAR package');
83
+ $this->buildSinglePackage();
84
+ } else {
85
+ // $this->log("building PEAR subpackages");
86
+ // $this->createSubPackages();
87
+ // $this->log("building PEAR bundle package");
88
+ $this->buildSinglePackage();
89
+ }
90
+
91
+ if ($this->getMakephar()) {
92
+ $this->log("building PHAR");
93
+ $this->getProject()->executeTarget('package-phar');
94
+ }
95
+
96
+ if ($this->getDeploy()) {
97
+ $this->doDeployment();
98
+ }
99
+ }
100
+
101
+ public function doDeployment()
102
+ {
103
+ $basedir = (string) $this->basedir;
104
+ $this->log('beginning PEAR/PHAR deployment');
105
+
106
+ chdir($basedir . '/build/pearwork');
107
+ if (!is_dir('./channel')) {
108
+ mkdir('./channel');
109
+ }
110
+
111
+ // Pull the PEAR channel down locally
112
+ passthru('aws s3 sync s3://pear.guzzlephp.org ./channel');
113
+
114
+ // add PEAR packages
115
+ foreach (scandir('./') as $file) {
116
+ if (substr($file, -4) == '.tgz') {
117
+ passthru('pirum add ./channel ' . $file);
118
+ }
119
+ }
120
+
121
+ // if we have a new phar, add it
122
+ if ($this->getMakephar() && file_exists($basedir . '/build/artifacts/guzzle.phar')) {
123
+ rename($basedir . '/build/artifacts/guzzle.phar', './channel/guzzle.phar');
124
+ }
125
+
126
+ // Sync up with the S3 bucket
127
+ chdir($basedir . '/build/pearwork/channel');
128
+ passthru('aws s3 sync . s3://pear.guzzlephp.org');
129
+ }
130
+
131
+ public function buildSinglePackage()
132
+ {
133
+ $v = $this->getVersion();
134
+ $apiversion = $v[0] . '.0.0';
135
+
136
+ $opts = array(
137
+ 'packagedirectory' => (string) $this->basedir . '/.subsplit/src/',
138
+ 'filelistgenerator' => 'file',
139
+ 'ignore' => array('*composer.json'),
140
+ 'baseinstalldir' => '/',
141
+ 'packagefile' => 'package.xml'
142
+ //'outputdirectory' => (string) $this->basedir . '/build/pearwork/'
143
+ );
144
+ $pfm = new PEAR_PackageFileManager2();
145
+ $pfm->setOptions($opts);
146
+ $pfm->addRole('md', 'doc');
147
+ $pfm->addRole('pem', 'php');
148
+ $pfm->setPackage('Guzzle');
149
+ $pfm->setSummary("Object-oriented PHP HTTP Client for PHP 5.3+");
150
+ $pfm->setDescription($this->guzzleinfo['description']);
151
+ $pfm->setPackageType('php');
152
+ $pfm->setChannel('guzzlephp.org/pear');
153
+ $pfm->setAPIVersion($apiversion);
154
+ $pfm->setReleaseVersion($this->getVersion());
155
+ $pfm->setAPIStability('stable');
156
+ $pfm->setReleaseStability('stable');
157
+ $pfm->setNotes($this->changelog_notes);
158
+ $pfm->setPackageType('php');
159
+ $pfm->setLicense('MIT', 'http://github.com/guzzle/guzzle/blob/master/LICENSE');
160
+ $pfm->addMaintainer('lead', 'mtdowling', 'Michael Dowling', 'mtdowling@gmail.com', 'yes');
161
+ $pfm->setDate($this->changelog_release_date);
162
+ $pfm->generateContents();
163
+
164
+ $phpdep = $this->guzzleinfo['require']['php'];
165
+ $phpdep = str_replace('>=', '', $phpdep);
166
+ $pfm->setPhpDep($phpdep);
167
+ $pfm->addExtensionDep('required', 'curl');
168
+ $pfm->setPearinstallerDep('1.4.6');
169
+ $pfm->addPackageDepWithChannel('required', 'EventDispatcher', 'pear.symfony.com', '2.1.0');
170
+ if (!empty($this->subpackages)) {
171
+ foreach ($this->subpackages as $package) {
172
+ $pkg = dirname($package);
173
+ $pkg = str_replace('/', '_', $pkg);
174
+ $pfm->addConflictingPackageDepWithChannel($pkg, 'guzzlephp.org/pear', false, $apiversion);
175
+ }
176
+ }
177
+
178
+ ob_start();
179
+ $startdir = getcwd();
180
+ chdir((string) $this->basedir . '/build/pearwork');
181
+
182
+ echo "DEBUGGING GENERATED PACKAGE FILE\n";
183
+ $result = $pfm->debugPackageFile();
184
+ if ($result) {
185
+ $out = $pfm->writePackageFile();
186
+ echo "\n\n\nWRITE PACKAGE FILE RESULT:\n";
187
+ var_dump($out);
188
+ // load up package file and build package
189
+ $packager = new PEAR_Packager();
190
+ echo "\n\n\nBUILDING PACKAGE FROM PACKAGE FILE:\n";
191
+ $dest_package = $packager->package($opts['packagedirectory'].'package.xml');
192
+ var_dump($dest_package);
193
+ } else {
194
+ echo "\n\n\nDEBUGGING RESULT:\n";
195
+ var_dump($result);
196
+ }
197
+ echo "removing package.xml";
198
+ unlink($opts['packagedirectory'].'package.xml');
199
+ $log = ob_get_clean();
200
+ file_put_contents((string) $this->basedir . '/build/artifacts/logs/pear_package.log', $log);
201
+ chdir($startdir);
202
+ }
203
+
204
+ public function createSubPackages()
205
+ {
206
+ $this->findComponents();
207
+
208
+ foreach ($this->subpackages as $package) {
209
+ $baseinstalldir = dirname($package);
210
+ $dir = (string) $this->basedir.'/.subsplit/src/' . $baseinstalldir;
211
+ $composer_file = file_get_contents((string) $this->basedir.'/.subsplit/src/'. $package);
212
+ $package_info = json_decode($composer_file, true);
213
+ $this->log('building ' . $package_info['target-dir'] . ' subpackage');
214
+ $this->buildSubPackage($dir, $baseinstalldir, $package_info);
215
+ }
216
+ }
217
+
218
+ public function buildSubPackage($dir, $baseinstalldir, $info)
219
+ {
220
+ $package = str_replace('/', '_', $baseinstalldir);
221
+ $opts = array(
222
+ 'packagedirectory' => $dir,
223
+ 'filelistgenerator' => 'file',
224
+ 'ignore' => array('*composer.json', '*package.xml'),
225
+ 'baseinstalldir' => '/' . $info['target-dir'],
226
+ 'packagefile' => 'package.xml'
227
+ );
228
+ $pfm = new PEAR_PackageFileManager2();
229
+ $pfm->setOptions($opts);
230
+ $pfm->setPackage($package);
231
+ $pfm->setSummary($info['description']);
232
+ $pfm->setDescription($info['description']);
233
+ $pfm->setPackageType('php');
234
+ $pfm->setChannel('guzzlephp.org/pear');
235
+ $pfm->setAPIVersion('3.0.0');
236
+ $pfm->setReleaseVersion($this->getVersion());
237
+ $pfm->setAPIStability('stable');
238
+ $pfm->setReleaseStability('stable');
239
+ $pfm->setNotes($this->changelog_notes);
240
+ $pfm->setPackageType('php');
241
+ $pfm->setLicense('MIT', 'http://github.com/guzzle/guzzle/blob/master/LICENSE');
242
+ $pfm->addMaintainer('lead', 'mtdowling', 'Michael Dowling', 'mtdowling@gmail.com', 'yes');
243
+ $pfm->setDate($this->changelog_release_date);
244
+ $pfm->generateContents();
245
+
246
+ $phpdep = $this->guzzleinfo['require']['php'];
247
+ $phpdep = str_replace('>=', '', $phpdep);
248
+ $pfm->setPhpDep($phpdep);
249
+ $pfm->setPearinstallerDep('1.4.6');
250
+
251
+ foreach ($info['require'] as $type => $version) {
252
+ if ($type == 'php') {
253
+ continue;
254
+ }
255
+ if ($type == 'symfony/event-dispatcher') {
256
+ $pfm->addPackageDepWithChannel('required', 'EventDispatcher', 'pear.symfony.com', '2.1.0');
257
+ }
258
+ if ($type == 'ext-curl') {
259
+ $pfm->addExtensionDep('required', 'curl');
260
+ }
261
+ if (substr($type, 0, 6) == 'guzzle') {
262
+ $gdep = str_replace('/', ' ', $type);
263
+ $gdep = ucwords($gdep);
264
+ $gdep = str_replace(' ', '_', $gdep);
265
+ $pfm->addPackageDepWithChannel('required', $gdep, 'guzzlephp.org/pear', $this->getVersion());
266
+ }
267
+ }
268
+
269
+ // can't have main Guzzle package AND sub-packages
270
+ $pfm->addConflictingPackageDepWithChannel('Guzzle', 'guzzlephp.org/pear', false, $apiversion);
271
+
272
+ ob_start();
273
+ $startdir = getcwd();
274
+ chdir((string) $this->basedir . '/build/pearwork');
275
+
276
+ echo "DEBUGGING GENERATED PACKAGE FILE\n";
277
+ $result = $pfm->debugPackageFile();
278
+ if ($result) {
279
+ $out = $pfm->writePackageFile();
280
+ echo "\n\n\nWRITE PACKAGE FILE RESULT:\n";
281
+ var_dump($out);
282
+ // load up package file and build package
283
+ $packager = new PEAR_Packager();
284
+ echo "\n\n\nBUILDING PACKAGE FROM PACKAGE FILE:\n";
285
+ $dest_package = $packager->package($opts['packagedirectory'].'/package.xml');
286
+ var_dump($dest_package);
287
+ } else {
288
+ echo "\n\n\nDEBUGGING RESULT:\n";
289
+ var_dump($result);
290
+ }
291
+ echo "removing package.xml";
292
+ unlink($opts['packagedirectory'].'/package.xml');
293
+ $log = ob_get_clean();
294
+ file_put_contents((string) $this->basedir . '/build/artifacts/logs/pear_package_'.$package.'.log', $log);
295
+ chdir($startdir);
296
+ }
297
+
298
+ public function findComponents()
299
+ {
300
+ $ds = new DirectoryScanner();
301
+ $ds->setBasedir((string) $this->basedir.'/.subsplit/src');
302
+ $ds->setIncludes(array('**/composer.json'));
303
+ $ds->scan();
304
+ $files = $ds->getIncludedFiles();
305
+ $this->subpackages = $files;
306
+ }
307
+
308
+ public function grabChangelog()
309
+ {
310
+ $cl = file((string) $this->basedir.'/.subsplit/CHANGELOG.md');
311
+ $notes = '';
312
+ $in_version = false;
313
+ $release_date = null;
314
+
315
+ foreach ($cl as $line) {
316
+ $line = trim($line);
317
+ if (preg_match('/^\* '.$this->getVersion().' \(([0-9\-]+)\)$/', $line, $matches)) {
318
+ $release_date = $matches[1];
319
+ $in_version = true;
320
+ continue;
321
+ }
322
+ if ($in_version && empty($line) && empty($notes)) {
323
+ continue;
324
+ }
325
+ if ($in_version && ! empty($line)) {
326
+ $notes .= $line."\n";
327
+ }
328
+ if ($in_version && empty($line) && !empty($notes)) {
329
+ $in_version = false;
330
+ }
331
+ }
332
+ $this->changelog_release_date = $release_date;
333
+
334
+ if (! empty($notes)) {
335
+ $this->changelog_notes = $notes;
336
+ }
337
+ }
338
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php ADDED
@@ -0,0 +1,385 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Phing wrapper around git subsplit.
4
+ *
5
+ * @see https://github.com/dflydev/git-subsplit
6
+ * @copyright 2012 Clay Loveless <clay@php.net>
7
+ * @license http://claylo.mit-license.org/2012/ MIT License
8
+ */
9
+
10
+ require_once 'phing/tasks/ext/git/GitBaseTask.php';
11
+
12
+ // base - base of tree to split out
13
+ // subIndicatorFile - composer.json, package.xml?
14
+ class GuzzleSubSplitTask extends GitBaseTask
15
+ {
16
+ /**
17
+ * What git repository to pull from and publish to
18
+ */
19
+ protected $remote = null;
20
+
21
+ /**
22
+ * Publish for comma-separated heads instead of all heads
23
+ */
24
+ protected $heads = null;
25
+
26
+ /**
27
+ * Publish for comma-separated tags instead of all tags
28
+ */
29
+ protected $tags = null;
30
+
31
+ /**
32
+ * Base of the tree RELATIVE TO .subsplit working dir
33
+ */
34
+ protected $base = null;
35
+
36
+ /**
37
+ * The presence of this file will indicate that the directory it resides
38
+ * in is at the top level of a split.
39
+ */
40
+ protected $subIndicatorFile = 'composer.json';
41
+
42
+ /**
43
+ * Do everything except actually send the update.
44
+ */
45
+ protected $dryRun = null;
46
+
47
+ /**
48
+ * Do not sync any heads.
49
+ */
50
+ protected $noHeads = false;
51
+
52
+ /**
53
+ * Do not sync any tags.
54
+ */
55
+ protected $noTags = false;
56
+
57
+ /**
58
+ * The splits we found in the heads
59
+ */
60
+ protected $splits;
61
+
62
+ public function setRemote($str)
63
+ {
64
+ $this->remote = $str;
65
+ }
66
+
67
+ public function getRemote()
68
+ {
69
+ return $this->remote;
70
+ }
71
+
72
+ public function setHeads($str)
73
+ {
74
+ $this->heads = explode(',', $str);
75
+ }
76
+
77
+ public function getHeads()
78
+ {
79
+ return $this->heads;
80
+ }
81
+
82
+ public function setTags($str)
83
+ {
84
+ $this->tags = explode(',', $str);
85
+ }
86
+
87
+ public function getTags()
88
+ {
89
+ return $this->tags;
90
+ }
91
+
92
+ public function setBase($str)
93
+ {
94
+ $this->base = $str;
95
+ }
96
+
97
+ public function getBase()
98
+ {
99
+ return $this->base;
100
+ }
101
+
102
+ public function setSubIndicatorFile($str)
103
+ {
104
+ $this->subIndicatorFile = $str;
105
+ }
106
+
107
+ public function getSubIndicatorFile()
108
+ {
109
+ return $this->subIndicatorFile;
110
+ }
111
+
112
+ public function setDryRun($bool)
113
+ {
114
+ $this->dryRun = (bool) $bool;
115
+ }
116
+
117
+ public function getDryRun()
118
+ {
119
+ return $this->dryRun;
120
+ }
121
+
122
+ public function setNoHeads($bool)
123
+ {
124
+ $this->noHeads = (bool) $bool;
125
+ }
126
+
127
+ public function getNoHeads()
128
+ {
129
+ return $this->noHeads;
130
+ }
131
+
132
+ public function setNoTags($bool)
133
+ {
134
+ $this->noTags = (bool) $bool;
135
+ }
136
+
137
+ public function getNoTags()
138
+ {
139
+ return $this->noTags;
140
+ }
141
+
142
+ /**
143
+ * GitClient from VersionControl_Git
144
+ */
145
+ protected $client = null;
146
+
147
+ /**
148
+ * The main entry point
149
+ */
150
+ public function main()
151
+ {
152
+ $repo = $this->getRepository();
153
+ if (empty($repo)) {
154
+ throw new BuildException('"repository" is a required parameter');
155
+ }
156
+
157
+ $remote = $this->getRemote();
158
+ if (empty($remote)) {
159
+ throw new BuildException('"remote" is a required parameter');
160
+ }
161
+
162
+ chdir($repo);
163
+ $this->client = $this->getGitClient(false, $repo);
164
+
165
+ // initalized yet?
166
+ if (!is_dir('.subsplit')) {
167
+ $this->subsplitInit();
168
+ } else {
169
+ // update
170
+ $this->subsplitUpdate();
171
+ }
172
+
173
+ // find all splits based on heads requested
174
+ $this->findSplits();
175
+
176
+ // check that GitHub has the repos
177
+ $this->verifyRepos();
178
+
179
+ // execute the subsplits
180
+ $this->publish();
181
+ }
182
+
183
+ public function publish()
184
+ {
185
+ $this->log('DRY RUN ONLY FOR NOW');
186
+ $base = $this->getBase();
187
+ $base = rtrim($base, '/') . '/';
188
+ $org = $this->getOwningTarget()->getProject()->getProperty('github.org');
189
+
190
+ $splits = array();
191
+
192
+ $heads = $this->getHeads();
193
+ foreach ($heads as $head) {
194
+ foreach ($this->splits[$head] as $component => $meta) {
195
+ $splits[] = $base . $component . ':git@github.com:'. $org.'/'.$meta['repo'];
196
+ }
197
+
198
+ $cmd = 'git subsplit publish ';
199
+ $cmd .= escapeshellarg(implode(' ', $splits));
200
+
201
+ if ($this->getNoHeads()) {
202
+ $cmd .= ' --no-heads';
203
+ } else {
204
+ $cmd .= ' --heads='.$head;
205
+ }
206
+
207
+ if ($this->getNoTags()) {
208
+ $cmd .= ' --no-tags';
209
+ } else {
210
+ if ($this->getTags()) {
211
+ $cmd .= ' --tags=' . escapeshellarg(implode(' ', $this->getTags()));
212
+ }
213
+ }
214
+
215
+ passthru($cmd);
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Runs `git subsplit update`
221
+ */
222
+ public function subsplitUpdate()
223
+ {
224
+ $repo = $this->getRepository();
225
+ $this->log('git-subsplit update...');
226
+ $cmd = $this->client->getCommand('subsplit');
227
+ $cmd->addArgument('update');
228
+ try {
229
+ $cmd->execute();
230
+ } catch (Exception $e) {
231
+ throw new BuildException('git subsplit update failed'. $e);
232
+ }
233
+ chdir($repo . '/.subsplit');
234
+ passthru('php ../composer.phar update --dev');
235
+ chdir($repo);
236
+ }
237
+
238
+ /**
239
+ * Runs `git subsplit init` based on the remote repository.
240
+ */
241
+ public function subsplitInit()
242
+ {
243
+ $remote = $this->getRemote();
244
+ $cmd = $this->client->getCommand('subsplit');
245
+ $this->log('running git-subsplit init ' . $remote);
246
+
247
+ $cmd->setArguments(array(
248
+ 'init',
249
+ $remote
250
+ ));
251
+
252
+ try {
253
+ $output = $cmd->execute();
254
+ } catch (Exception $e) {
255
+ throw new BuildException('git subsplit init failed'. $e);
256
+ }
257
+ $this->log(trim($output), Project::MSG_INFO);
258
+ $repo = $this->getRepository();
259
+ chdir($repo . '/.subsplit');
260
+ passthru('php ../composer.phar install --dev');
261
+ chdir($repo);
262
+ }
263
+
264
+ /**
265
+ * Find the composer.json files using Phing's directory scanner
266
+ *
267
+ * @return array
268
+ */
269
+ protected function findSplits()
270
+ {
271
+ $this->log("checking heads for subsplits");
272
+ $repo = $this->getRepository();
273
+ $base = $this->getBase();
274
+
275
+ $splits = array();
276
+ $heads = $this->getHeads();
277
+
278
+ if (!empty($base)) {
279
+ $base = '/' . ltrim($base, '/');
280
+ } else {
281
+ $base = '/';
282
+ }
283
+
284
+ chdir($repo . '/.subsplit');
285
+ foreach ($heads as $head) {
286
+ $splits[$head] = array();
287
+
288
+ // check each head requested *BEFORE* the actual subtree split command gets it
289
+ passthru("git checkout '$head'");
290
+ $ds = new DirectoryScanner();
291
+ $ds->setBasedir($repo . '/.subsplit' . $base);
292
+ $ds->setIncludes(array('**/'.$this->subIndicatorFile));
293
+ $ds->scan();
294
+ $files = $ds->getIncludedFiles();
295
+
296
+ // Process the files we found
297
+ foreach ($files as $file) {
298
+ $pkg = file_get_contents($repo . '/.subsplit' . $base .'/'. $file);
299
+ $pkg_json = json_decode($pkg, true);
300
+ $name = $pkg_json['name'];
301
+ $component = str_replace('/composer.json', '', $file);
302
+ // keep this for split cmd
303
+ $tmpreponame = explode('/', $name);
304
+ $reponame = $tmpreponame[1];
305
+ $splits[$head][$component]['repo'] = $reponame;
306
+ $nscomponent = str_replace('/', '\\', $component);
307
+ $splits[$head][$component]['desc'] = "[READ ONLY] Subtree split of $nscomponent: " . $pkg_json['description'];
308
+ }
309
+ }
310
+
311
+ // go back to how we found it
312
+ passthru("git checkout master");
313
+ chdir($repo);
314
+ $this->splits = $splits;
315
+ }
316
+
317
+ /**
318
+ * Based on list of repositories we determined we *should* have, talk
319
+ * to GitHub and make sure they're all there.
320
+ *
321
+ */
322
+ protected function verifyRepos()
323
+ {
324
+ $this->log('verifying GitHub target repos');
325
+ $github_org = $this->getOwningTarget()->getProject()->getProperty('github.org');
326
+ $github_creds = $this->getOwningTarget()->getProject()->getProperty('github.basicauth');
327
+
328
+ if ($github_creds == 'username:password') {
329
+ $this->log('Skipping GitHub repo checks. Update github.basicauth in build.properties to verify repos.', 1);
330
+ return;
331
+ }
332
+
333
+ $ch = curl_init('https://api.github.com/orgs/'.$github_org.'/repos?type=all');
334
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
335
+ curl_setopt($ch, CURLOPT_USERPWD, $github_creds);
336
+ // change this when we know we can use our bundled CA bundle!
337
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
338
+ $result = curl_exec($ch);
339
+ curl_close($ch);
340
+ $repos = json_decode($result, true);
341
+ $existing_repos = array();
342
+
343
+ // parse out the repos we found on GitHub
344
+ foreach ($repos as $repo) {
345
+ $tmpreponame = explode('/', $repo['full_name']);
346
+ $reponame = $tmpreponame[1];
347
+ $existing_repos[$reponame] = $repo['description'];
348
+ }
349
+
350
+ $heads = $this->getHeads();
351
+ foreach ($heads as $head) {
352
+ foreach ($this->splits[$head] as $component => $meta) {
353
+
354
+ $reponame = $meta['repo'];
355
+
356
+ if (!isset($existing_repos[$reponame])) {
357
+ $this->log("Creating missing repo $reponame");
358
+ $payload = array(
359
+ 'name' => $reponame,
360
+ 'description' => $meta['desc'],
361
+ 'homepage' => 'http://www.guzzlephp.org/',
362
+ 'private' => true,
363
+ 'has_issues' => false,
364
+ 'has_wiki' => false,
365
+ 'has_downloads' => true,
366
+ 'auto_init' => false
367
+ );
368
+ $ch = curl_init('https://api.github.com/orgs/'.$github_org.'/repos');
369
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
370
+ curl_setopt($ch, CURLOPT_USERPWD, $github_creds);
371
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
372
+ curl_setopt($ch, CURLOPT_POST, 1);
373
+ curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
374
+ // change this when we know we can use our bundled CA bundle!
375
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
376
+ $result = curl_exec($ch);
377
+ echo "Response code: ".curl_getinfo($ch, CURLINFO_HTTP_CODE)."\n";
378
+ curl_close($ch);
379
+ } else {
380
+ $this->log("Repo $reponame exists", 2);
381
+ }
382
+ }
383
+ }
384
+ }
385
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/phpunit.xml.dist ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <phpunit bootstrap="./tests/bootstrap.php"
3
+ colors="true"
4
+ processIsolation="false"
5
+ stopOnFailure="false"
6
+ syntaxCheck="false"
7
+ convertErrorsToExceptions="true"
8
+ convertNoticesToExceptions="true"
9
+ convertWarningsToExceptions="true"
10
+ testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader">
11
+
12
+ <testsuites>
13
+ <testsuite>
14
+ <directory>./tests/Guzzle/Tests</directory>
15
+ </testsuite>
16
+ </testsuites>
17
+
18
+ <logging>
19
+ <log type="junit" target="build/artifacts/logs/junit.xml" logIncompleteSkipped="false" />
20
+ </logging>
21
+
22
+ <filter>
23
+ <whitelist>
24
+ <directory suffix=".php">./src/Guzzle</directory>
25
+ <exclude>
26
+ <directory suffix="Interface.php">./src/Guzzle</directory>
27
+ <file>./src/Guzzle/Common/Exception/GuzzleException.php</file>
28
+ <file>./src/Guzzle/Http/Exception/HttpException.php</file>
29
+ <file>./src/Guzzle/Http/Exception/ServerErrorResponseException.php</file>
30
+ <file>./src/Guzzle/Http/Exception/ClientErrorResponseException.php</file>
31
+ <file>./src/Guzzle/Http/Exception/TooManyRedirectsException.php</file>
32
+ <file>./src/Guzzle/Http/Exception/CouldNotRewindStreamException.php</file>
33
+ <file>./src/Guzzle/Common/Exception/BadMethodCallException.php</file>
34
+ <file>./src/Guzzle/Common/Exception/InvalidArgumentException.php</file>
35
+ <file>./src/Guzzle/Common/Exception/RuntimeException.php</file>
36
+ <file>./src/Guzzle/Common/Exception/UnexpectedValueException.php</file>
37
+ <file>./src/Guzzle/Service/Exception/ClientNotFoundException.php</file>
38
+ <file>./src/Guzzle/Service/Exception/CommandException.php</file>
39
+ <file>./src/Guzzle/Service/Exception/DescriptionBuilderException.php</file>
40
+ <file>./src/Guzzle/Service/Exception/ServiceBuilderException.php</file>
41
+ <file>./src/Guzzle/Service/Exception/ServiceNotFoundException.php</file>
42
+ <file>./src/Guzzle/Service/Exception/ValidationException.php</file>
43
+ <file>./src/Guzzle/Service/Exception/JsonException.php</file>
44
+ </exclude>
45
+ </whitelist>
46
+ </filter>
47
+
48
+ </phpunit>
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/AbstractBatchDecorator.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ /**
6
+ * Abstract decorator used when decorating a BatchInterface
7
+ */
8
+ abstract class AbstractBatchDecorator implements BatchInterface
9
+ {
10
+ /** @var BatchInterface Decorated batch object */
11
+ protected $decoratedBatch;
12
+
13
+ /**
14
+ * @param BatchInterface $decoratedBatch BatchInterface that is being decorated
15
+ */
16
+ public function __construct(BatchInterface $decoratedBatch)
17
+ {
18
+ $this->decoratedBatch = $decoratedBatch;
19
+ }
20
+
21
+ /**
22
+ * Allow decorators to implement custom methods
23
+ *
24
+ * @param string $method Missing method name
25
+ * @param array $args Method arguments
26
+ *
27
+ * @return mixed
28
+ * @codeCoverageIgnore
29
+ */
30
+ public function __call($method, array $args)
31
+ {
32
+ return call_user_func_array(array($this->decoratedBatch, $method), $args);
33
+ }
34
+
35
+ public function add($item)
36
+ {
37
+ $this->decoratedBatch->add($item);
38
+
39
+ return $this;
40
+ }
41
+
42
+ public function flush()
43
+ {
44
+ return $this->decoratedBatch->flush();
45
+ }
46
+
47
+ public function isEmpty()
48
+ {
49
+ return $this->decoratedBatch->isEmpty();
50
+ }
51
+
52
+ /**
53
+ * Trace the decorators associated with the batch
54
+ *
55
+ * @return array
56
+ */
57
+ public function getDecorators()
58
+ {
59
+ $found = array($this);
60
+ if (method_exists($this->decoratedBatch, 'getDecorators')) {
61
+ $found = array_merge($found, $this->decoratedBatch->getDecorators());
62
+ }
63
+
64
+ return $found;
65
+ }
66
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/Batch.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ use Guzzle\Batch\Exception\BatchTransferException;
6
+
7
+ /**
8
+ * Default batch implementation used to convert queued items into smaller chunks of batches using a
9
+ * {@see BatchDivisorIterface} and transfers each batch using a {@see BatchTransferInterface}.
10
+ *
11
+ * Any exception encountered during a flush operation will throw a {@see BatchTransferException} object containing the
12
+ * batch that failed. After an exception is encountered, you can flush the batch again to attempt to finish transferring
13
+ * any previously created batches or queued items.
14
+ */
15
+ class Batch implements BatchInterface
16
+ {
17
+ /** @var \SplQueue Queue of items in the queue */
18
+ protected $queue;
19
+
20
+ /** @var array Divided batches to be transferred */
21
+ protected $dividedBatches;
22
+
23
+ /** @var BatchTransferInterface */
24
+ protected $transferStrategy;
25
+
26
+ /** @var BatchDivisorInterface */
27
+ protected $divisionStrategy;
28
+
29
+ /**
30
+ * @param BatchTransferInterface $transferStrategy Strategy used to transfer items
31
+ * @param BatchDivisorInterface $divisionStrategy Divisor used to create batches
32
+ */
33
+ public function __construct(BatchTransferInterface $transferStrategy, BatchDivisorInterface $divisionStrategy)
34
+ {
35
+ $this->transferStrategy = $transferStrategy;
36
+ $this->divisionStrategy = $divisionStrategy;
37
+ $this->queue = new \SplQueue();
38
+ $this->queue->setIteratorMode(\SplQueue::IT_MODE_DELETE);
39
+ $this->dividedBatches = array();
40
+ }
41
+
42
+ public function add($item)
43
+ {
44
+ $this->queue->enqueue($item);
45
+
46
+ return $this;
47
+ }
48
+
49
+ public function flush()
50
+ {
51
+ $this->createBatches();
52
+
53
+ $items = array();
54
+ foreach ($this->dividedBatches as $batchIndex => $dividedBatch) {
55
+ while ($dividedBatch->valid()) {
56
+ $batch = $dividedBatch->current();
57
+ $dividedBatch->next();
58
+ try {
59
+ $this->transferStrategy->transfer($batch);
60
+ $items = array_merge($items, $batch);
61
+ } catch (\Exception $e) {
62
+ throw new BatchTransferException($batch, $items, $e, $this->transferStrategy, $this->divisionStrategy);
63
+ }
64
+ }
65
+ // Keep the divided batch down to a minimum in case of a later exception
66
+ unset($this->dividedBatches[$batchIndex]);
67
+ }
68
+
69
+ return $items;
70
+ }
71
+
72
+ public function isEmpty()
73
+ {
74
+ return count($this->queue) == 0 && count($this->dividedBatches) == 0;
75
+ }
76
+
77
+ /**
78
+ * Create batches for any queued items
79
+ */
80
+ protected function createBatches()
81
+ {
82
+ if (count($this->queue)) {
83
+ if ($batches = $this->divisionStrategy->createBatches($this->queue)) {
84
+ // Convert arrays into iterators
85
+ if (is_array($batches)) {
86
+ $batches = new \ArrayIterator($batches);
87
+ }
88
+ $this->dividedBatches[] = $batches;
89
+ }
90
+ }
91
+ }
92
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchBuilder.php ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ use Guzzle\Common\Exception\InvalidArgumentException;
6
+ use Guzzle\Common\Exception\RuntimeException;
7
+
8
+ /**
9
+ * Builder used to create custom batch objects
10
+ */
11
+ class BatchBuilder
12
+ {
13
+ /** @var bool Whether or not the batch should automatically flush*/
14
+ protected $autoFlush = false;
15
+
16
+ /** @var bool Whether or not to maintain a batch history */
17
+ protected $history = false;
18
+
19
+ /** @var bool Whether or not to buffer exceptions encountered in transfer */
20
+ protected $exceptionBuffering = false;
21
+
22
+ /** @var mixed Callable to invoke each time a flush completes */
23
+ protected $afterFlush;
24
+
25
+ /** @var BatchTransferInterface Object used to transfer items in the queue */
26
+ protected $transferStrategy;
27
+
28
+ /** @var BatchDivisorInterface Object used to divide the queue into batches */
29
+ protected $divisorStrategy;
30
+
31
+ /** @var array of Mapped transfer strategies by handle name */
32
+ protected static $mapping = array(
33
+ 'request' => 'Guzzle\Batch\BatchRequestTransfer',
34
+ 'command' => 'Guzzle\Batch\BatchCommandTransfer'
35
+ );
36
+
37
+ /**
38
+ * Create a new instance of the BatchBuilder
39
+ *
40
+ * @return BatchBuilder
41
+ */
42
+ public static function factory()
43
+ {
44
+ return new self();
45
+ }
46
+
47
+ /**
48
+ * Automatically flush the batch when the size of the queue reaches a certain threshold. Adds {@see FlushingBatch}.
49
+ *
50
+ * @param $threshold Number of items to allow in the queue before a flush
51
+ *
52
+ * @return BatchBuilder
53
+ */
54
+ public function autoFlushAt($threshold)
55
+ {
56
+ $this->autoFlush = $threshold;
57
+
58
+ return $this;
59
+ }
60
+
61
+ /**
62
+ * Maintain a history of all items that have been transferred using the batch. Adds {@see HistoryBatch}.
63
+ *
64
+ * @return BatchBuilder
65
+ */
66
+ public function keepHistory()
67
+ {
68
+ $this->history = true;
69
+
70
+ return $this;
71
+ }
72
+
73
+ /**
74
+ * Buffer exceptions thrown during transfer so that you can transfer as much as possible, and after a transfer
75
+ * completes, inspect each exception that was thrown. Enables the {@see ExceptionBufferingBatch} decorator.
76
+ *
77
+ * @return BatchBuilder
78
+ */
79
+ public function bufferExceptions()
80
+ {
81
+ $this->exceptionBuffering = true;
82
+
83
+ return $this;
84
+ }
85
+
86
+ /**
87
+ * Notify a callable each time a batch flush completes. Enables the {@see NotifyingBatch} decorator.
88
+ *
89
+ * @param mixed $callable Callable function to notify
90
+ *
91
+ * @return BatchBuilder
92
+ * @throws InvalidArgumentException if the argument is not callable
93
+ */
94
+ public function notify($callable)
95
+ {
96
+ $this->afterFlush = $callable;
97
+
98
+ return $this;
99
+ }
100
+
101
+ /**
102
+ * Configures the batch to transfer batches of requests. Associates a {@see \Guzzle\Http\BatchRequestTransfer}
103
+ * object as both the transfer and divisor strategy.
104
+ *
105
+ * @param int $batchSize Batch size for each batch of requests
106
+ *
107
+ * @return BatchBuilder
108
+ */
109
+ public function transferRequests($batchSize = 50)
110
+ {
111
+ $className = self::$mapping['request'];
112
+ $this->transferStrategy = new $className($batchSize);
113
+ $this->divisorStrategy = $this->transferStrategy;
114
+
115
+ return $this;
116
+ }
117
+
118
+ /**
119
+ * Configures the batch to transfer batches commands. Associates as
120
+ * {@see \Guzzle\Service\Command\BatchCommandTransfer} as both the transfer and divisor strategy.
121
+ *
122
+ * @param int $batchSize Batch size for each batch of commands
123
+ *
124
+ * @return BatchBuilder
125
+ */
126
+ public function transferCommands($batchSize = 50)
127
+ {
128
+ $className = self::$mapping['command'];
129
+ $this->transferStrategy = new $className($batchSize);
130
+ $this->divisorStrategy = $this->transferStrategy;
131
+
132
+ return $this;
133
+ }
134
+
135
+ /**
136
+ * Specify the strategy used to divide the queue into an array of batches
137
+ *
138
+ * @param BatchDivisorInterface $divisorStrategy Strategy used to divide a batch queue into batches
139
+ *
140
+ * @return BatchBuilder
141
+ */
142
+ public function createBatchesWith(BatchDivisorInterface $divisorStrategy)
143
+ {
144
+ $this->divisorStrategy = $divisorStrategy;
145
+
146
+ return $this;
147
+ }
148
+
149
+ /**
150
+ * Specify the strategy used to transport the items when flush is called
151
+ *
152
+ * @param BatchTransferInterface $transferStrategy How items are transferred
153
+ *
154
+ * @return BatchBuilder
155
+ */
156
+ public function transferWith(BatchTransferInterface $transferStrategy)
157
+ {
158
+ $this->transferStrategy = $transferStrategy;
159
+
160
+ return $this;
161
+ }
162
+
163
+ /**
164
+ * Create and return the instantiated batch
165
+ *
166
+ * @return BatchInterface
167
+ * @throws RuntimeException if no transfer strategy has been specified
168
+ */
169
+ public function build()
170
+ {
171
+ if (!$this->transferStrategy) {
172
+ throw new RuntimeException('No transfer strategy has been specified');
173
+ }
174
+
175
+ if (!$this->divisorStrategy) {
176
+ throw new RuntimeException('No divisor strategy has been specified');
177
+ }
178
+
179
+ $batch = new Batch($this->transferStrategy, $this->divisorStrategy);
180
+
181
+ if ($this->exceptionBuffering) {
182
+ $batch = new ExceptionBufferingBatch($batch);
183
+ }
184
+
185
+ if ($this->afterFlush) {
186
+ $batch = new NotifyingBatch($batch, $this->afterFlush);
187
+ }
188
+
189
+ if ($this->autoFlush) {
190
+ $batch = new FlushingBatch($batch, $this->autoFlush);
191
+ }
192
+
193
+ if ($this->history) {
194
+ $batch = new HistoryBatch($batch);
195
+ }
196
+
197
+ return $batch;
198
+ }
199
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchClosureDivisor.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ use Guzzle\Common\Exception\InvalidArgumentException;
6
+
7
+ /**
8
+ * Divides batches using a callable
9
+ */
10
+ class BatchClosureDivisor implements BatchDivisorInterface
11
+ {
12
+ /** @var callable Method used to divide the batches */
13
+ protected $callable;
14
+
15
+ /** @var mixed $context Context passed to the callable */
16
+ protected $context;
17
+
18
+ /**
19
+ * @param callable $callable Method used to divide the batches. The method must accept an \SplQueue and return an
20
+ * array of arrays containing the divided items.
21
+ * @param mixed $context Optional context to pass to the batch divisor
22
+ *
23
+ * @throws InvalidArgumentException if the callable is not callable
24
+ */
25
+ public function __construct($callable, $context = null)
26
+ {
27
+ if (!is_callable($callable)) {
28
+ throw new InvalidArgumentException('Must pass a callable');
29
+ }
30
+
31
+ $this->callable = $callable;
32
+ $this->context = $context;
33
+ }
34
+
35
+ public function createBatches(\SplQueue $queue)
36
+ {
37
+ return call_user_func($this->callable, $queue, $this->context);
38
+ }
39
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchClosureTransfer.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ use Guzzle\Common\Exception\InvalidArgumentException;
6
+
7
+ /**
8
+ * Batch transfer strategy where transfer logic can be defined via a Closure.
9
+ * This class is to be used with {@see Guzzle\Batch\BatchInterface}
10
+ */
11
+ class BatchClosureTransfer implements BatchTransferInterface
12
+ {
13
+ /** @var callable A closure that performs the transfer */
14
+ protected $callable;
15
+
16
+ /** @var mixed $context Context passed to the callable */
17
+ protected $context;
18
+
19
+ /**
20
+ * @param mixed $callable Callable that performs the transfer. This function should accept two arguments:
21
+ * (array $batch, mixed $context).
22
+ * @param mixed $context Optional context to pass to the batch divisor
23
+ *
24
+ * @throws InvalidArgumentException
25
+ */
26
+ public function __construct($callable, $context = null)
27
+ {
28
+ if (!is_callable($callable)) {
29
+ throw new InvalidArgumentException('Argument must be callable');
30
+ }
31
+
32
+ $this->callable = $callable;
33
+ $this->context = $context;
34
+ }
35
+
36
+ public function transfer(array $batch)
37
+ {
38
+ return empty($batch) ? null : call_user_func($this->callable, $batch, $this->context);
39
+ }
40
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchCommandTransfer.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ use Guzzle\Batch\BatchTransferInterface;
6
+ use Guzzle\Batch\BatchDivisorInterface;
7
+ use Guzzle\Common\Exception\InvalidArgumentException;
8
+ use Guzzle\Service\Command\CommandInterface;
9
+ use Guzzle\Service\Exception\InconsistentClientTransferException;
10
+
11
+ /**
12
+ * Efficiently transfers multiple commands in parallel per client
13
+ * This class is to be used with {@see Guzzle\Batch\BatchInterface}
14
+ */
15
+ class BatchCommandTransfer implements BatchTransferInterface, BatchDivisorInterface
16
+ {
17
+ /** @var int Size of each command batch */
18
+ protected $batchSize;
19
+
20
+ /**
21
+ * @param int $batchSize Size of each batch
22
+ */
23
+ public function __construct($batchSize = 50)
24
+ {
25
+ $this->batchSize = $batchSize;
26
+ }
27
+
28
+ /**
29
+ * Creates batches by grouping commands by their associated client
30
+ * {@inheritdoc}
31
+ */
32
+ public function createBatches(\SplQueue $queue)
33
+ {
34
+ $groups = new \SplObjectStorage();
35
+ foreach ($queue as $item) {
36
+ if (!$item instanceof CommandInterface) {
37
+ throw new InvalidArgumentException('All items must implement Guzzle\Service\Command\CommandInterface');
38
+ }
39
+ $client = $item->getClient();
40
+ if (!$groups->contains($client)) {
41
+ $groups->attach($client, new \ArrayObject(array($item)));
42
+ } else {
43
+ $groups[$client]->append($item);
44
+ }
45
+ }
46
+
47
+ $batches = array();
48
+ foreach ($groups as $batch) {
49
+ $batches = array_merge($batches, array_chunk($groups[$batch]->getArrayCopy(), $this->batchSize));
50
+ }
51
+
52
+ return $batches;
53
+ }
54
+
55
+ public function transfer(array $batch)
56
+ {
57
+ if (empty($batch)) {
58
+ return;
59
+ }
60
+
61
+ // Get the client of the first found command
62
+ $client = reset($batch)->getClient();
63
+
64
+ // Keep a list of all commands with invalid clients
65
+ $invalid = array_filter($batch, function ($command) use ($client) {
66
+ return $command->getClient() !== $client;
67
+ });
68
+
69
+ if (!empty($invalid)) {
70
+ throw new InconsistentClientTransferException($invalid);
71
+ }
72
+
73
+ $client->execute($batch);
74
+ }
75
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchDivisorInterface.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ /**
6
+ * Interface used for dividing a queue of items into an array of batches
7
+ */
8
+ interface BatchDivisorInterface
9
+ {
10
+ /**
11
+ * Divide a queue of items into an array batches
12
+ *
13
+ * @param \SplQueue $queue Queue of items to divide into batches. Items are removed as they are iterated.
14
+ *
15
+ * @return array|\Traversable Returns an array or Traversable object that contains arrays of items to transfer
16
+ */
17
+ public function createBatches(\SplQueue $queue);
18
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchInterface.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ /**
6
+ * Interface for efficiently transferring items in a queue using batches
7
+ */
8
+ interface BatchInterface
9
+ {
10
+ /**
11
+ * Add an item to the queue
12
+ *
13
+ * @param mixed $item Item to add
14
+ *
15
+ * @return self
16
+ */
17
+ public function add($item);
18
+
19
+ /**
20
+ * Flush the batch and transfer the items
21
+ *
22
+ * @return array Returns an array flushed items
23
+ */
24
+ public function flush();
25
+
26
+ /**
27
+ * Check if the batch is empty and has further items to transfer
28
+ *
29
+ * @return bool
30
+ */
31
+ public function isEmpty();
32
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchRequestTransfer.php ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ use Guzzle\Batch\BatchTransferInterface;
6
+ use Guzzle\Batch\BatchDivisorInterface;
7
+ use Guzzle\Common\Exception\InvalidArgumentException;
8
+ use Guzzle\Http\Message\RequestInterface;
9
+
10
+ /**
11
+ * Batch transfer strategy used to efficiently transfer a batch of requests.
12
+ * This class is to be used with {@see Guzzle\Batch\BatchInterface}
13
+ */
14
+ class BatchRequestTransfer implements BatchTransferInterface, BatchDivisorInterface
15
+ {
16
+ /** @var int Size of each command batch */
17
+ protected $batchSize;
18
+
19
+ /**
20
+ * Constructor used to specify how large each batch should be
21
+ *
22
+ * @param int $batchSize Size of each batch
23
+ */
24
+ public function __construct($batchSize = 50)
25
+ {
26
+ $this->batchSize = $batchSize;
27
+ }
28
+
29
+ /**
30
+ * Creates batches of requests by grouping requests by their associated curl multi object.
31
+ * {@inheritdoc}
32
+ */
33
+ public function createBatches(\SplQueue $queue)
34
+ {
35
+ // Create batches by client objects
36
+ $groups = new \SplObjectStorage();
37
+ foreach ($queue as $item) {
38
+ if (!$item instanceof RequestInterface) {
39
+ throw new InvalidArgumentException('All items must implement Guzzle\Http\Message\RequestInterface');
40
+ }
41
+ $client = $item->getClient();
42
+ if (!$groups->contains($client)) {
43
+ $groups->attach($client, array($item));
44
+ } else {
45
+ $current = $groups[$client];
46
+ $current[] = $item;
47
+ $groups[$client] = $current;
48
+ }
49
+ }
50
+
51
+ $batches = array();
52
+ foreach ($groups as $batch) {
53
+ $batches = array_merge($batches, array_chunk($groups[$batch], $this->batchSize));
54
+ }
55
+
56
+ return $batches;
57
+ }
58
+
59
+ public function transfer(array $batch)
60
+ {
61
+ if ($batch) {
62
+ reset($batch)->getClient()->send($batch);
63
+ }
64
+ }
65
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchSizeDivisor.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ /**
6
+ * Divides batches into smaller batches under a certain size
7
+ */
8
+ class BatchSizeDivisor implements BatchDivisorInterface
9
+ {
10
+ /** @var int Size of each batch */
11
+ protected $size;
12
+
13
+ /** @param int $size Size of each batch */
14
+ public function __construct($size)
15
+ {
16
+ $this->size = $size;
17
+ }
18
+
19
+ /**
20
+ * Set the size of each batch
21
+ *
22
+ * @param int $size Size of each batch
23
+ *
24
+ * @return BatchSizeDivisor
25
+ */
26
+ public function setSize($size)
27
+ {
28
+ $this->size = $size;
29
+
30
+ return $this;
31
+ }
32
+
33
+ /**
34
+ * Get the size of each batch
35
+ *
36
+ * @return int
37
+ */
38
+ public function getSize()
39
+ {
40
+ return $this->size;
41
+ }
42
+
43
+ public function createBatches(\SplQueue $queue)
44
+ {
45
+ return array_chunk(iterator_to_array($queue, false), $this->size);
46
+ }
47
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/BatchTransferInterface.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ /**
6
+ * Interface used for transferring batches of items
7
+ */
8
+ interface BatchTransferInterface
9
+ {
10
+ /**
11
+ * Transfer an array of items
12
+ *
13
+ * @param array $batch Array of items to transfer
14
+ */
15
+ public function transfer(array $batch);
16
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/Exception/BatchTransferException.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch\Exception;
4
+
5
+ use Guzzle\Common\Exception\GuzzleException;
6
+ use Guzzle\Batch\BatchTransferInterface as TransferStrategy;
7
+ use Guzzle\Batch\BatchDivisorInterface as DivisorStrategy;
8
+
9
+ /**
10
+ * Exception thrown during a batch transfer
11
+ */
12
+ class BatchTransferException extends \Exception implements GuzzleException
13
+ {
14
+ /** @var array The batch being sent when the exception occurred */
15
+ protected $batch;
16
+
17
+ /** @var TransferStrategy The transfer strategy in use when the exception occurred */
18
+ protected $transferStrategy;
19
+
20
+ /** @var DivisorStrategy The divisor strategy in use when the exception occurred */
21
+ protected $divisorStrategy;
22
+
23
+ /** @var array Items transferred at the point in which the exception was encountered */
24
+ protected $transferredItems;
25
+
26
+ /**
27
+ * @param array $batch The batch being sent when the exception occurred
28
+ * @param array $transferredItems Items transferred at the point in which the exception was encountered
29
+ * @param \Exception $exception Exception encountered
30
+ * @param TransferStrategy $transferStrategy The transfer strategy in use when the exception occurred
31
+ * @param DivisorStrategy $divisorStrategy The divisor strategy in use when the exception occurred
32
+ */
33
+ public function __construct(
34
+ array $batch,
35
+ array $transferredItems,
36
+ \Exception $exception,
37
+ TransferStrategy $transferStrategy = null,
38
+ DivisorStrategy $divisorStrategy = null
39
+ ) {
40
+ $this->batch = $batch;
41
+ $this->transferredItems = $transferredItems;
42
+ $this->transferStrategy = $transferStrategy;
43
+ $this->divisorStrategy = $divisorStrategy;
44
+ parent::__construct(
45
+ 'Exception encountered while transferring batch: ' . $exception->getMessage(),
46
+ $exception->getCode(),
47
+ $exception
48
+ );
49
+ }
50
+
51
+ /**
52
+ * Get the batch that we being sent when the exception occurred
53
+ *
54
+ * @return array
55
+ */
56
+ public function getBatch()
57
+ {
58
+ return $this->batch;
59
+ }
60
+
61
+ /**
62
+ * Get the items transferred at the point in which the exception was encountered
63
+ *
64
+ * @return array
65
+ */
66
+ public function getTransferredItems()
67
+ {
68
+ return $this->transferredItems;
69
+ }
70
+
71
+ /**
72
+ * Get the transfer strategy
73
+ *
74
+ * @return TransferStrategy
75
+ */
76
+ public function getTransferStrategy()
77
+ {
78
+ return $this->transferStrategy;
79
+ }
80
+
81
+ /**
82
+ * Get the divisor strategy
83
+ *
84
+ * @return DivisorStrategy
85
+ */
86
+ public function getDivisorStrategy()
87
+ {
88
+ return $this->divisorStrategy;
89
+ }
90
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/ExceptionBufferingBatch.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ use Guzzle\Batch\Exception\BatchTransferException;
6
+
7
+ /**
8
+ * BatchInterface decorator used to buffer exceptions encountered during a transfer. The exceptions can then later be
9
+ * processed after a batch flush has completed.
10
+ */
11
+ class ExceptionBufferingBatch extends AbstractBatchDecorator
12
+ {
13
+ /** @var array Array of BatchTransferException exceptions */
14
+ protected $exceptions = array();
15
+
16
+ public function flush()
17
+ {
18
+ $items = array();
19
+
20
+ while (!$this->decoratedBatch->isEmpty()) {
21
+ try {
22
+ $transferredItems = $this->decoratedBatch->flush();
23
+ } catch (BatchTransferException $e) {
24
+ $this->exceptions[] = $e;
25
+ $transferredItems = $e->getTransferredItems();
26
+ }
27
+ $items = array_merge($items, $transferredItems);
28
+ }
29
+
30
+ return $items;
31
+ }
32
+
33
+ /**
34
+ * Get the buffered exceptions
35
+ *
36
+ * @return array Array of BatchTransferException objects
37
+ */
38
+ public function getExceptions()
39
+ {
40
+ return $this->exceptions;
41
+ }
42
+
43
+ /**
44
+ * Clear the buffered exceptions
45
+ */
46
+ public function clearExceptions()
47
+ {
48
+ $this->exceptions = array();
49
+ }
50
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/FlushingBatch.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ /**
6
+ * BatchInterface decorator used to add automatic flushing of the queue when the size of the queue reaches a threshold.
7
+ */
8
+ class FlushingBatch extends AbstractBatchDecorator
9
+ {
10
+ /** @var int The threshold for which to automatically flush */
11
+ protected $threshold;
12
+
13
+ /** @var int Current number of items known to be in the queue */
14
+ protected $currentTotal = 0;
15
+
16
+ /**
17
+ * @param BatchInterface $decoratedBatch BatchInterface that is being decorated
18
+ * @param int $threshold Flush when the number in queue matches the threshold
19
+ */
20
+ public function __construct(BatchInterface $decoratedBatch, $threshold)
21
+ {
22
+ $this->threshold = $threshold;
23
+ parent::__construct($decoratedBatch);
24
+ }
25
+
26
+ /**
27
+ * Set the auto-flush threshold
28
+ *
29
+ * @param int $threshold The auto-flush threshold
30
+ *
31
+ * @return FlushingBatch
32
+ */
33
+ public function setThreshold($threshold)
34
+ {
35
+ $this->threshold = $threshold;
36
+
37
+ return $this;
38
+ }
39
+
40
+ /**
41
+ * Get the auto-flush threshold
42
+ *
43
+ * @return int
44
+ */
45
+ public function getThreshold()
46
+ {
47
+ return $this->threshold;
48
+ }
49
+
50
+ public function add($item)
51
+ {
52
+ $this->decoratedBatch->add($item);
53
+ if (++$this->currentTotal >= $this->threshold) {
54
+ $this->currentTotal = 0;
55
+ $this->decoratedBatch->flush();
56
+ }
57
+
58
+ return $this;
59
+ }
60
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/HistoryBatch.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ /**
6
+ * BatchInterface decorator used to keep a history of items that were added to the batch. You must clear the history
7
+ * manually to remove items from the history.
8
+ */
9
+ class HistoryBatch extends AbstractBatchDecorator
10
+ {
11
+ /** @var array Items in the history */
12
+ protected $history = array();
13
+
14
+ public function add($item)
15
+ {
16
+ $this->history[] = $item;
17
+ $this->decoratedBatch->add($item);
18
+
19
+ return $this;
20
+ }
21
+
22
+ /**
23
+ * Get the batch history
24
+ *
25
+ * @return array
26
+ */
27
+ public function getHistory()
28
+ {
29
+ return $this->history;
30
+ }
31
+
32
+ /**
33
+ * Clear the batch history
34
+ */
35
+ public function clearHistory()
36
+ {
37
+ $this->history = array();
38
+ }
39
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Batch/NotifyingBatch.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Batch;
4
+
5
+ use Guzzle\Common\Exception\InvalidArgumentException;
6
+
7
+ /**
8
+ * BatchInterface decorator used to call a method each time flush is called
9
+ */
10
+ class NotifyingBatch extends AbstractBatchDecorator
11
+ {
12
+ /** @var mixed Callable to call */
13
+ protected $callable;
14
+
15
+ /**
16
+ * @param BatchInterface $decoratedBatch Batch object to decorate
17
+ * @param mixed $callable Callable to call
18
+ *
19
+ * @throws InvalidArgumentException
20
+ */
21
+ public function __construct(BatchInterface $decoratedBatch, $callable)
22
+ {
23
+ if (!is_callable($callable)) {
24
+ throw new InvalidArgumentException('The passed argument is not callable');
25
+ }
26
+
27
+ $this->callable = $callable;
28
+ parent::__construct($decoratedBatch);
29
+ }
30
+
31
+ public function flush()
32
+ {
33
+ $items = $this->decoratedBatch->flush();
34
+ call_user_func($this->callable, $items);
35
+
36
+ return $items;
37
+ }
38
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/AbstractCacheAdapter.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Cache;
4
+
5
+ /**
6
+ * Abstract cache adapter
7
+ */
8
+ abstract class AbstractCacheAdapter implements CacheAdapterInterface
9
+ {
10
+ protected $cache;
11
+
12
+ /**
13
+ * Get the object owned by the adapter
14
+ *
15
+ * @return mixed
16
+ */
17
+ public function getCacheObject()
18
+ {
19
+ return $this->cache;
20
+ }
21
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterFactory.php ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Cache;
4
+
5
+ use Doctrine\Common\Cache\Cache;
6
+ use Guzzle\Common\Version;
7
+ use Guzzle\Common\Exception\InvalidArgumentException;
8
+ use Guzzle\Common\Exception\RuntimeException;
9
+ use Guzzle\Common\FromConfigInterface;
10
+ use Zend\Cache\Storage\StorageInterface;
11
+
12
+ /**
13
+ * Generates cache adapters from any number of known cache implementations
14
+ */
15
+ class CacheAdapterFactory implements FromConfigInterface
16
+ {
17
+ /**
18
+ * Create a Guzzle cache adapter based on an array of options
19
+ *
20
+ * @param mixed $cache Cache value
21
+ *
22
+ * @return CacheAdapterInterface
23
+ * @throws InvalidArgumentException
24
+ */
25
+ public static function fromCache($cache)
26
+ {
27
+ if (!is_object($cache)) {
28
+ throw new InvalidArgumentException('Cache must be one of the known cache objects');
29
+ }
30
+
31
+ if ($cache instanceof CacheAdapterInterface) {
32
+ return $cache;
33
+ } elseif ($cache instanceof Cache) {
34
+ return new DoctrineCacheAdapter($cache);
35
+ } elseif ($cache instanceof StorageInterface) {
36
+ return new Zf2CacheAdapter($cache);
37
+ } else {
38
+ throw new InvalidArgumentException('Unknown cache type: ' . get_class($cache));
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Create a Guzzle cache adapter based on an array of options
44
+ *
45
+ * @param array $config Array of configuration options
46
+ *
47
+ * @return CacheAdapterInterface
48
+ * @throws InvalidArgumentException
49
+ * @deprecated This will be removed in a future version
50
+ * @codeCoverageIgnore
51
+ */
52
+ public static function factory($config = array())
53
+ {
54
+ Version::warn(__METHOD__ . ' is deprecated');
55
+ if (!is_array($config)) {
56
+ throw new InvalidArgumentException('$config must be an array');
57
+ }
58
+
59
+ if (!isset($config['cache.adapter']) && !isset($config['cache.provider'])) {
60
+ $config['cache.adapter'] = 'Guzzle\Cache\NullCacheAdapter';
61
+ $config['cache.provider'] = null;
62
+ } else {
63
+ // Validate that the options are valid
64
+ foreach (array('cache.adapter', 'cache.provider') as $required) {
65
+ if (!isset($config[$required])) {
66
+ throw new InvalidArgumentException("{$required} is a required CacheAdapterFactory option");
67
+ }
68
+ if (is_string($config[$required])) {
69
+ // Convert dot notation to namespaces
70
+ $config[$required] = str_replace('.', '\\', $config[$required]);
71
+ if (!class_exists($config[$required])) {
72
+ throw new InvalidArgumentException("{$config[$required]} is not a valid class for {$required}");
73
+ }
74
+ }
75
+ }
76
+ // Instantiate the cache provider
77
+ if (is_string($config['cache.provider'])) {
78
+ $args = isset($config['cache.provider.args']) ? $config['cache.provider.args'] : null;
79
+ $config['cache.provider'] = self::createObject($config['cache.provider'], $args);
80
+ }
81
+ }
82
+
83
+ // Instantiate the cache adapter using the provider and options
84
+ if (is_string($config['cache.adapter'])) {
85
+ $args = isset($config['cache.adapter.args']) ? $config['cache.adapter.args'] : array();
86
+ array_unshift($args, $config['cache.provider']);
87
+ $config['cache.adapter'] = self::createObject($config['cache.adapter'], $args);
88
+ }
89
+
90
+ return $config['cache.adapter'];
91
+ }
92
+
93
+ /**
94
+ * Create a class using an array of constructor arguments
95
+ *
96
+ * @param string $className Class name
97
+ * @param array $args Arguments for the class constructor
98
+ *
99
+ * @return mixed
100
+ * @throws RuntimeException
101
+ * @deprecated
102
+ * @codeCoverageIgnore
103
+ */
104
+ private static function createObject($className, array $args = null)
105
+ {
106
+ try {
107
+ if (!$args) {
108
+ return new $className;
109
+ } else {
110
+ $c = new \ReflectionClass($className);
111
+ return $c->newInstanceArgs($args);
112
+ }
113
+ } catch (\Exception $e) {
114
+ throw new RuntimeException($e->getMessage(), $e->getCode(), $e);
115
+ }
116
+ }
117
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterInterface.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Cache;
4
+
5
+ /**
6
+ * Interface for cache adapters.
7
+ *
8
+ * Cache adapters allow Guzzle to utilize various frameworks for caching HTTP responses.
9
+ *
10
+ * @link http://www.doctrine-project.org/ Inspired by Doctrine 2
11
+ */
12
+ interface CacheAdapterInterface
13
+ {
14
+ /**
15
+ * Test if an entry exists in the cache.
16
+ *
17
+ * @param string $id cache id The cache id of the entry to check for.
18
+ * @param array $options Array of cache adapter options
19
+ *
20
+ * @return bool Returns TRUE if a cache entry exists for the given cache id, FALSE otherwise.
21
+ */
22
+ public function contains($id, array $options = null);
23
+
24
+ /**
25
+ * Deletes a cache entry.
26
+ *
27
+ * @param string $id cache id
28
+ * @param array $options Array of cache adapter options
29
+ *
30
+ * @return bool TRUE on success, FALSE on failure
31
+ */
32
+ public function delete($id, array $options = null);
33
+
34
+ /**
35
+ * Fetches an entry from the cache.
36
+ *
37
+ * @param string $id cache id The id of the cache entry to fetch.
38
+ * @param array $options Array of cache adapter options
39
+ *
40
+ * @return string The cached data or FALSE, if no cache entry exists for the given id.
41
+ */
42
+ public function fetch($id, array $options = null);
43
+
44
+ /**
45
+ * Puts data into the cache.
46
+ *
47
+ * @param string $id The cache id
48
+ * @param string $data The cache entry/data
49
+ * @param int|bool $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry
50
+ * @param array $options Array of cache adapter options
51
+ *
52
+ * @return bool TRUE if the entry was successfully stored in the cache, FALSE otherwise.
53
+ */
54
+ public function save($id, $data, $lifeTime = false, array $options = null);
55
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/ClosureCacheAdapter.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Cache;
4
+
5
+ /**
6
+ * Cache adapter that defers to closures for implementation
7
+ */
8
+ class ClosureCacheAdapter implements CacheAdapterInterface
9
+ {
10
+ /**
11
+ * @var array Mapping of method names to callables
12
+ */
13
+ protected $callables;
14
+
15
+ /**
16
+ * The callables array is an array mapping the actions of the cache adapter to callables.
17
+ * - contains: Callable that accepts an $id and $options argument
18
+ * - delete: Callable that accepts an $id and $options argument
19
+ * - fetch: Callable that accepts an $id and $options argument
20
+ * - save: Callable that accepts an $id, $data, $lifeTime, and $options argument
21
+ *
22
+ * @param array $callables array of action names to callable
23
+ *
24
+ * @throws \InvalidArgumentException if the callable is not callable
25
+ */
26
+ public function __construct(array $callables)
27
+ {
28
+ // Validate each key to ensure it exists and is callable
29
+ foreach (array('contains', 'delete', 'fetch', 'save') as $key) {
30
+ if (!array_key_exists($key, $callables) || !is_callable($callables[$key])) {
31
+ throw new \InvalidArgumentException("callables must contain a callable {$key} key");
32
+ }
33
+ }
34
+
35
+ $this->callables = $callables;
36
+ }
37
+
38
+ public function contains($id, array $options = null)
39
+ {
40
+ return call_user_func($this->callables['contains'], $id, $options);
41
+ }
42
+
43
+ public function delete($id, array $options = null)
44
+ {
45
+ return call_user_func($this->callables['delete'], $id, $options);
46
+ }
47
+
48
+ public function fetch($id, array $options = null)
49
+ {
50
+ return call_user_func($this->callables['fetch'], $id, $options);
51
+ }
52
+
53
+ public function save($id, $data, $lifeTime = false, array $options = null)
54
+ {
55
+ return call_user_func($this->callables['save'], $id, $data, $lifeTime, $options);
56
+ }
57
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/DoctrineCacheAdapter.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Cache;
4
+
5
+ use Doctrine\Common\Cache\Cache;
6
+
7
+ /**
8
+ * Doctrine 2 cache adapter
9
+ *
10
+ * @link http://www.doctrine-project.org/
11
+ */
12
+ class DoctrineCacheAdapter extends AbstractCacheAdapter
13
+ {
14
+ /**
15
+ * @param Cache $cache Doctrine cache object
16
+ */
17
+ public function __construct(Cache $cache)
18
+ {
19
+ $this->cache = $cache;
20
+ }
21
+
22
+ public function contains($id, array $options = null)
23
+ {
24
+ return $this->cache->contains($id);
25
+ }
26
+
27
+ public function delete($id, array $options = null)
28
+ {
29
+ return $this->cache->delete($id);
30
+ }
31
+
32
+ public function fetch($id, array $options = null)
33
+ {
34
+ return $this->cache->fetch($id);
35
+ }
36
+
37
+ public function save($id, $data, $lifeTime = false, array $options = null)
38
+ {
39
+ return $this->cache->save($id, $data, $lifeTime !== false ? $lifeTime : 0);
40
+ }
41
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/NullCacheAdapter.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Cache;
4
+
5
+ /**
6
+ * Null cache adapter
7
+ */
8
+ class NullCacheAdapter extends AbstractCacheAdapter
9
+ {
10
+ public function __construct() {}
11
+
12
+ public function contains($id, array $options = null)
13
+ {
14
+ return false;
15
+ }
16
+
17
+ public function delete($id, array $options = null)
18
+ {
19
+ return true;
20
+ }
21
+
22
+ public function fetch($id, array $options = null)
23
+ {
24
+ return false;
25
+ }
26
+
27
+ public function save($id, $data, $lifeTime = false, array $options = null)
28
+ {
29
+ return true;
30
+ }
31
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/Zf1CacheAdapter.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Cache;
4
+
5
+ use Guzzle\Common\Version;
6
+
7
+ /**
8
+ * Zend Framework 1 cache adapter
9
+ *
10
+ * @link http://framework.zend.com/manual/en/zend.cache.html
11
+ * @deprecated
12
+ * @codeCoverageIgnore
13
+ */
14
+ class Zf1CacheAdapter extends AbstractCacheAdapter
15
+ {
16
+ /**
17
+ * @param \Zend_Cache_Backend $cache Cache object to wrap
18
+ */
19
+ public function __construct(\Zend_Cache_Backend $cache)
20
+ {
21
+ Version::warn(__CLASS__ . ' is deprecated. Upgrade to ZF2 or use PsrCacheAdapter');
22
+ $this->cache = $cache;
23
+ }
24
+
25
+ public function contains($id, array $options = null)
26
+ {
27
+ return $this->cache->test($id);
28
+ }
29
+
30
+ public function delete($id, array $options = null)
31
+ {
32
+ return $this->cache->remove($id);
33
+ }
34
+
35
+ public function fetch($id, array $options = null)
36
+ {
37
+ return $this->cache->load($id);
38
+ }
39
+
40
+ public function save($id, $data, $lifeTime = false, array $options = null)
41
+ {
42
+ return $this->cache->save($data, $id, array(), $lifeTime);
43
+ }
44
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Cache/Zf2CacheAdapter.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Cache;
4
+
5
+ use Zend\Cache\Storage\StorageInterface;
6
+
7
+ /**
8
+ * Zend Framework 2 cache adapter
9
+ *
10
+ * @link http://packages.zendframework.com/docs/latest/manual/en/zend.cache.html
11
+ */
12
+ class Zf2CacheAdapter extends AbstractCacheAdapter
13
+ {
14
+ /**
15
+ * @param StorageInterface $cache Zend Framework 2 cache adapter
16
+ */
17
+ public function __construct(StorageInterface $cache)
18
+ {
19
+ $this->cache = $cache;
20
+ }
21
+
22
+ public function contains($id, array $options = null)
23
+ {
24
+ return $this->cache->hasItem($id);
25
+ }
26
+
27
+ public function delete($id, array $options = null)
28
+ {
29
+ return $this->cache->removeItem($id);
30
+ }
31
+
32
+ public function fetch($id, array $options = null)
33
+ {
34
+ return $this->cache->getItem($id);
35
+ }
36
+
37
+ public function save($id, $data, $lifeTime = false, array $options = null)
38
+ {
39
+ return $this->cache->setItem($id, $data);
40
+ }
41
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/AbstractHasDispatcher.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common;
4
+
5
+ use Symfony\Component\EventDispatcher\EventDispatcher;
6
+ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
7
+ use Symfony\Component\EventDispatcher\EventSubscriberInterface;
8
+
9
+ /**
10
+ * Class that holds an event dispatcher
11
+ */
12
+ class AbstractHasDispatcher implements HasDispatcherInterface
13
+ {
14
+ /** @var EventDispatcherInterface */
15
+ protected $eventDispatcher;
16
+
17
+ public static function getAllEvents()
18
+ {
19
+ return array();
20
+ }
21
+
22
+ public function setEventDispatcher(EventDispatcherInterface $eventDispatcher)
23
+ {
24
+ $this->eventDispatcher = $eventDispatcher;
25
+
26
+ return $this;
27
+ }
28
+
29
+ public function getEventDispatcher()
30
+ {
31
+ if (!$this->eventDispatcher) {
32
+ $this->eventDispatcher = new EventDispatcher();
33
+ }
34
+
35
+ return $this->eventDispatcher;
36
+ }
37
+
38
+ public function dispatch($eventName, array $context = array())
39
+ {
40
+ return $this->getEventDispatcher()->dispatch($eventName, new Event($context));
41
+ }
42
+
43
+ public function addSubscriber(EventSubscriberInterface $subscriber)
44
+ {
45
+ $this->getEventDispatcher()->addSubscriber($subscriber);
46
+
47
+ return $this;
48
+ }
49
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Collection.php ADDED
@@ -0,0 +1,403 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common;
4
+
5
+ use Guzzle\Common\Exception\InvalidArgumentException;
6
+ use Guzzle\Common\Exception\RuntimeException;
7
+
8
+ /**
9
+ * Key value pair collection object
10
+ */
11
+ class Collection implements \ArrayAccess, \IteratorAggregate, \Countable, ToArrayInterface
12
+ {
13
+ /** @var array Data associated with the object. */
14
+ protected $data;
15
+
16
+ /**
17
+ * @param array $data Associative array of data to set
18
+ */
19
+ public function __construct(array $data = array())
20
+ {
21
+ $this->data = $data;
22
+ }
23
+
24
+ /**
25
+ * Create a new collection from an array, validate the keys, and add default values where missing
26
+ *
27
+ * @param array $config Configuration values to apply.
28
+ * @param array $defaults Default parameters
29
+ * @param array $required Required parameter names
30
+ *
31
+ * @return self
32
+ * @throws InvalidArgumentException if a parameter is missing
33
+ */
34
+ public static function fromConfig(array $config = array(), array $defaults = array(), array $required = array())
35
+ {
36
+ $data = $config + $defaults;
37
+
38
+ if ($missing = array_diff($required, array_keys($data))) {
39
+ throw new InvalidArgumentException('Config is missing the following keys: ' . implode(', ', $missing));
40
+ }
41
+
42
+ return new self($data);
43
+ }
44
+
45
+ public function count()
46
+ {
47
+ return count($this->data);
48
+ }
49
+
50
+ public function getIterator()
51
+ {
52
+ return new \ArrayIterator($this->data);
53
+ }
54
+
55
+ public function toArray()
56
+ {
57
+ return $this->data;
58
+ }
59
+
60
+ /**
61
+ * Removes all key value pairs
62
+ *
63
+ * @return Collection
64
+ */
65
+ public function clear()
66
+ {
67
+ $this->data = array();
68
+
69
+ return $this;
70
+ }
71
+
72
+ /**
73
+ * Get all or a subset of matching key value pairs
74
+ *
75
+ * @param array $keys Pass an array of keys to retrieve only a subset of key value pairs
76
+ *
77
+ * @return array Returns an array of all matching key value pairs
78
+ */
79
+ public function getAll(array $keys = null)
80
+ {
81
+ return $keys ? array_intersect_key($this->data, array_flip($keys)) : $this->data;
82
+ }
83
+
84
+ /**
85
+ * Get a specific key value.
86
+ *
87
+ * @param string $key Key to retrieve.
88
+ *
89
+ * @return mixed|null Value of the key or NULL
90
+ */
91
+ public function get($key)
92
+ {
93
+ return isset($this->data[$key]) ? $this->data[$key] : null;
94
+ }
95
+
96
+ /**
97
+ * Set a key value pair
98
+ *
99
+ * @param string $key Key to set
100
+ * @param mixed $value Value to set
101
+ *
102
+ * @return Collection Returns a reference to the object
103
+ */
104
+ public function set($key, $value)
105
+ {
106
+ $this->data[$key] = $value;
107
+
108
+ return $this;
109
+ }
110
+
111
+ /**
112
+ * Add a value to a key. If a key of the same name has already been added, the key value will be converted into an
113
+ * array and the new value will be pushed to the end of the array.
114
+ *
115
+ * @param string $key Key to add
116
+ * @param mixed $value Value to add to the key
117
+ *
118
+ * @return Collection Returns a reference to the object.
119
+ */
120
+ public function add($key, $value)
121
+ {
122
+ if (!array_key_exists($key, $this->data)) {
123
+ $this->data[$key] = $value;
124
+ } elseif (is_array($this->data[$key])) {
125
+ $this->data[$key][] = $value;
126
+ } else {
127
+ $this->data[$key] = array($this->data[$key], $value);
128
+ }
129
+
130
+ return $this;
131
+ }
132
+
133
+ /**
134
+ * Remove a specific key value pair
135
+ *
136
+ * @param string $key A key to remove
137
+ *
138
+ * @return Collection
139
+ */
140
+ public function remove($key)
141
+ {
142
+ unset($this->data[$key]);
143
+
144
+ return $this;
145
+ }
146
+
147
+ /**
148
+ * Get all keys in the collection
149
+ *
150
+ * @return array
151
+ */
152
+ public function getKeys()
153
+ {
154
+ return array_keys($this->data);
155
+ }
156
+
157
+ /**
158
+ * Returns whether or not the specified key is present.
159
+ *
160
+ * @param string $key The key for which to check the existence.
161
+ *
162
+ * @return bool
163
+ */
164
+ public function hasKey($key)
165
+ {
166
+ return array_key_exists($key, $this->data);
167
+ }
168
+
169
+ /**
170
+ * Case insensitive search the keys in the collection
171
+ *
172
+ * @param string $key Key to search for
173
+ *
174
+ * @return bool|string Returns false if not found, otherwise returns the key
175
+ */
176
+ public function keySearch($key)
177
+ {
178
+ foreach (array_keys($this->data) as $k) {
179
+ if (!strcasecmp($k, $key)) {
180
+ return $k;
181
+ }
182
+ }
183
+
184
+ return false;
185
+ }
186
+
187
+ /**
188
+ * Checks if any keys contains a certain value
189
+ *
190
+ * @param string $value Value to search for
191
+ *
192
+ * @return mixed Returns the key if the value was found FALSE if the value was not found.
193
+ */
194
+ public function hasValue($value)
195
+ {
196
+ return array_search($value, $this->data);
197
+ }
198
+
199
+ /**
200
+ * Replace the data of the object with the value of an array
201
+ *
202
+ * @param array $data Associative array of data
203
+ *
204
+ * @return Collection Returns a reference to the object
205
+ */
206
+ public function replace(array $data)
207
+ {
208
+ $this->data = $data;
209
+
210
+ return $this;
211
+ }
212
+
213
+ /**
214
+ * Add and merge in a Collection or array of key value pair data.
215
+ *
216
+ * @param Collection|array $data Associative array of key value pair data
217
+ *
218
+ * @return Collection Returns a reference to the object.
219
+ */
220
+ public function merge($data)
221
+ {
222
+ foreach ($data as $key => $value) {
223
+ $this->add($key, $value);
224
+ }
225
+
226
+ return $this;
227
+ }
228
+
229
+ /**
230
+ * Over write key value pairs in this collection with all of the data from an array or collection.
231
+ *
232
+ * @param array|\Traversable $data Values to override over this config
233
+ *
234
+ * @return self
235
+ */
236
+ public function overwriteWith($data)
237
+ {
238
+ if (is_array($data)) {
239
+ $this->data = $data + $this->data;
240
+ } elseif ($data instanceof Collection) {
241
+ $this->data = $data->toArray() + $this->data;
242
+ } else {
243
+ foreach ($data as $key => $value) {
244
+ $this->data[$key] = $value;
245
+ }
246
+ }
247
+
248
+ return $this;
249
+ }
250
+
251
+ /**
252
+ * Returns a Collection containing all the elements of the collection after applying the callback function to each
253
+ * one. The Closure should accept three parameters: (string) $key, (string) $value, (array) $context and return a
254
+ * modified value
255
+ *
256
+ * @param \Closure $closure Closure to apply
257
+ * @param array $context Context to pass to the closure
258
+ * @param bool $static Set to TRUE to use the same class as the return rather than returning a Collection
259
+ *
260
+ * @return Collection
261
+ */
262
+ public function map(\Closure $closure, array $context = array(), $static = true)
263
+ {
264
+ $collection = $static ? new static() : new self();
265
+ foreach ($this as $key => $value) {
266
+ $collection->add($key, $closure($key, $value, $context));
267
+ }
268
+
269
+ return $collection;
270
+ }
271
+
272
+ /**
273
+ * Iterates over each key value pair in the collection passing them to the Closure. If the Closure function returns
274
+ * true, the current value from input is returned into the result Collection. The Closure must accept three
275
+ * parameters: (string) $key, (string) $value and return Boolean TRUE or FALSE for each value.
276
+ *
277
+ * @param \Closure $closure Closure evaluation function
278
+ * @param bool $static Set to TRUE to use the same class as the return rather than returning a Collection
279
+ *
280
+ * @return Collection
281
+ */
282
+ public function filter(\Closure $closure, $static = true)
283
+ {
284
+ $collection = ($static) ? new static() : new self();
285
+ foreach ($this->data as $key => $value) {
286
+ if ($closure($key, $value)) {
287
+ $collection->add($key, $value);
288
+ }
289
+ }
290
+
291
+ return $collection;
292
+ }
293
+
294
+ public function offsetExists($offset)
295
+ {
296
+ return isset($this->data[$offset]);
297
+ }
298
+
299
+ public function offsetGet($offset)
300
+ {
301
+ return isset($this->data[$offset]) ? $this->data[$offset] : null;
302
+ }
303
+
304
+ public function offsetSet($offset, $value)
305
+ {
306
+ $this->data[$offset] = $value;
307
+ }
308
+
309
+ public function offsetUnset($offset)
310
+ {
311
+ unset($this->data[$offset]);
312
+ }
313
+
314
+ /**
315
+ * Set a value into a nested array key. Keys will be created as needed to set the value.
316
+ *
317
+ * @param string $path Path to set
318
+ * @param mixed $value Value to set at the key
319
+ *
320
+ * @return self
321
+ * @throws RuntimeException when trying to setPath using a nested path that travels through a scalar value
322
+ */
323
+ public function setPath($path, $value)
324
+ {
325
+ $current =& $this->data;
326
+ $queue = explode('/', $path);
327
+ while (null !== ($key = array_shift($queue))) {
328
+ if (!is_array($current)) {
329
+ throw new RuntimeException("Trying to setPath {$path}, but {$key} is set and is not an array");
330
+ } elseif (!$queue) {
331
+ $current[$key] = $value;
332
+ } elseif (isset($current[$key])) {
333
+ $current =& $current[$key];
334
+ } else {
335
+ $current[$key] = array();
336
+ $current =& $current[$key];
337
+ }
338
+ }
339
+
340
+ return $this;
341
+ }
342
+
343
+ /**
344
+ * Gets a value from the collection using an array path (e.g. foo/baz/bar would retrieve bar from two nested arrays)
345
+ * Allows for wildcard searches which recursively combine matches up to the level at which the wildcard occurs. This
346
+ * can be useful for accepting any key of a sub-array and combining matching keys from each diverging path.
347
+ *
348
+ * @param string $path Path to traverse and retrieve a value from
349
+ * @param string $separator Character used to add depth to the search
350
+ * @param mixed $data Optional data to descend into (used when wildcards are encountered)
351
+ *
352
+ * @return mixed|null
353
+ */
354
+ public function getPath($path, $separator = '/', $data = null)
355
+ {
356
+ if ($data === null) {
357
+ $data =& $this->data;
358
+ }
359
+
360
+ $path = is_array($path) ? $path : explode($separator, $path);
361
+ while (null !== ($part = array_shift($path))) {
362
+ if (!is_array($data)) {
363
+ return null;
364
+ } elseif (isset($data[$part])) {
365
+ $data =& $data[$part];
366
+ } elseif ($part != '*') {
367
+ return null;
368
+ } else {
369
+ // Perform a wildcard search by diverging and merging paths
370
+ $result = array();
371
+ foreach ($data as $value) {
372
+ if (!$path) {
373
+ $result = array_merge_recursive($result, (array) $value);
374
+ } elseif (null !== ($test = $this->getPath($path, $separator, $value))) {
375
+ $result = array_merge_recursive($result, (array) $test);
376
+ }
377
+ }
378
+ return $result;
379
+ }
380
+ }
381
+
382
+ return $data;
383
+ }
384
+
385
+ /**
386
+ * Inject configuration settings into an input string
387
+ *
388
+ * @param string $input Input to inject
389
+ *
390
+ * @return string
391
+ * @deprecated
392
+ */
393
+ public function inject($input)
394
+ {
395
+ Version::warn(__METHOD__ . ' is deprecated');
396
+ $replace = array();
397
+ foreach ($this->data as $key => $val) {
398
+ $replace['{' . $key . '}'] = $val;
399
+ }
400
+
401
+ return strtr($input, $replace);
402
+ }
403
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Event.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common;
4
+
5
+ use Symfony\Component\EventDispatcher\Event as SymfonyEvent;
6
+
7
+ /**
8
+ * Default event for Guzzle notifications
9
+ */
10
+ class Event extends SymfonyEvent implements ToArrayInterface, \ArrayAccess, \IteratorAggregate
11
+ {
12
+ /** @var array */
13
+ private $context;
14
+
15
+ /**
16
+ * @param array $context Contextual information
17
+ */
18
+ public function __construct(array $context = array())
19
+ {
20
+ $this->context = $context;
21
+ }
22
+
23
+ public function getIterator()
24
+ {
25
+ return new \ArrayIterator($this->context);
26
+ }
27
+
28
+ public function offsetGet($offset)
29
+ {
30
+ return isset($this->context[$offset]) ? $this->context[$offset] : null;
31
+ }
32
+
33
+ public function offsetSet($offset, $value)
34
+ {
35
+ $this->context[$offset] = $value;
36
+ }
37
+
38
+ public function offsetExists($offset)
39
+ {
40
+ return isset($this->context[$offset]);
41
+ }
42
+
43
+ public function offsetUnset($offset)
44
+ {
45
+ unset($this->context[$offset]);
46
+ }
47
+
48
+ public function toArray()
49
+ {
50
+ return $this->context;
51
+ }
52
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/BadMethodCallException.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common\Exception;
4
+
5
+ class BadMethodCallException extends \BadMethodCallException implements GuzzleException {}
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/ExceptionCollection.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common\Exception;
4
+
5
+ /**
6
+ * Collection of exceptions
7
+ */
8
+ class ExceptionCollection extends \Exception implements GuzzleException, \IteratorAggregate, \Countable
9
+ {
10
+ /** @var array Array of Exceptions */
11
+ protected $exceptions = array();
12
+
13
+ /** @var string Succinct exception message not including sub-exceptions */
14
+ private $shortMessage;
15
+
16
+ public function __construct($message = '', $code = 0, \Exception $previous = null)
17
+ {
18
+ parent::__construct($message, $code, $previous);
19
+ $this->shortMessage = $message;
20
+ }
21
+
22
+ /**
23
+ * Set all of the exceptions
24
+ *
25
+ * @param array $exceptions Array of exceptions
26
+ *
27
+ * @return self
28
+ */
29
+ public function setExceptions(array $exceptions)
30
+ {
31
+ $this->exceptions = array();
32
+ foreach ($exceptions as $exception) {
33
+ $this->add($exception);
34
+ }
35
+
36
+ return $this;
37
+ }
38
+
39
+ /**
40
+ * Add exceptions to the collection
41
+ *
42
+ * @param ExceptionCollection|\Exception $e Exception to add
43
+ *
44
+ * @return ExceptionCollection;
45
+ */
46
+ public function add($e)
47
+ {
48
+ $this->exceptions[] = $e;
49
+ if ($this->message) {
50
+ $this->message .= "\n";
51
+ }
52
+
53
+ $this->message .= $this->getExceptionMessage($e, 0);
54
+
55
+ return $this;
56
+ }
57
+
58
+ /**
59
+ * Get the total number of request exceptions
60
+ *
61
+ * @return int
62
+ */
63
+ public function count()
64
+ {
65
+ return count($this->exceptions);
66
+ }
67
+
68
+ /**
69
+ * Allows array-like iteration over the request exceptions
70
+ *
71
+ * @return \ArrayIterator
72
+ */
73
+ public function getIterator()
74
+ {
75
+ return new \ArrayIterator($this->exceptions);
76
+ }
77
+
78
+ /**
79
+ * Get the first exception in the collection
80
+ *
81
+ * @return \Exception
82
+ */
83
+ public function getFirst()
84
+ {
85
+ return $this->exceptions ? $this->exceptions[0] : null;
86
+ }
87
+
88
+ private function getExceptionMessage(\Exception $e, $depth = 0)
89
+ {
90
+ static $sp = ' ';
91
+ $prefix = $depth ? str_repeat($sp, $depth) : '';
92
+ $message = "{$prefix}(" . get_class($e) . ') ' . $e->getFile() . ' line ' . $e->getLine() . "\n";
93
+
94
+ if ($e instanceof self) {
95
+ if ($e->shortMessage) {
96
+ $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->shortMessage) . "\n";
97
+ }
98
+ foreach ($e as $ee) {
99
+ $message .= "\n" . $this->getExceptionMessage($ee, $depth + 1);
100
+ }
101
+ } else {
102
+ $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->getMessage()) . "\n";
103
+ $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->getTraceAsString()) . "\n";
104
+ }
105
+
106
+ return str_replace(getcwd(), '.', $message);
107
+ }
108
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/GuzzleException.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common\Exception;
4
+
5
+ /**
6
+ * Guzzle exception
7
+ */
8
+ interface GuzzleException {}
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/InvalidArgumentException.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common\Exception;
4
+
5
+ class InvalidArgumentException extends \InvalidArgumentException implements GuzzleException {}
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/RuntimeException.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common\Exception;
4
+
5
+ class RuntimeException extends \RuntimeException implements GuzzleException {}
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/UnexpectedValueException.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common\Exception;
4
+
5
+ class UnexpectedValueException extends \UnexpectedValueException implements GuzzleException {}
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/FromConfigInterface.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common;
4
+
5
+ /**
6
+ * Interfaces that adds a factory method which is used to instantiate a class from an array of configuration options.
7
+ */
8
+ interface FromConfigInterface
9
+ {
10
+ /**
11
+ * Static factory method used to turn an array or collection of configuration data into an instantiated object.
12
+ *
13
+ * @param array|Collection $config Configuration data
14
+ *
15
+ * @return FromConfigInterface
16
+ */
17
+ public static function factory($config = array());
18
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/HasDispatcherInterface.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common;
4
+
5
+ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
6
+ use Symfony\Component\EventDispatcher\EventSubscriberInterface;
7
+
8
+ /**
9
+ * Holds an event dispatcher
10
+ */
11
+ interface HasDispatcherInterface
12
+ {
13
+ /**
14
+ * Get a list of all of the events emitted from the class
15
+ *
16
+ * @return array
17
+ */
18
+ public static function getAllEvents();
19
+
20
+ /**
21
+ * Set the EventDispatcher of the request
22
+ *
23
+ * @param EventDispatcherInterface $eventDispatcher
24
+ *
25
+ * @return self
26
+ */
27
+ public function setEventDispatcher(EventDispatcherInterface $eventDispatcher);
28
+
29
+ /**
30
+ * Get the EventDispatcher of the request
31
+ *
32
+ * @return EventDispatcherInterface
33
+ */
34
+ public function getEventDispatcher();
35
+
36
+ /**
37
+ * Helper to dispatch Guzzle events and set the event name on the event
38
+ *
39
+ * @param string $eventName Name of the event to dispatch
40
+ * @param array $context Context of the event
41
+ *
42
+ * @return Event Returns the created event object
43
+ */
44
+ public function dispatch($eventName, array $context = array());
45
+
46
+ /**
47
+ * Add an event subscriber to the dispatcher
48
+ *
49
+ * @param EventSubscriberInterface $subscriber Event subscriber
50
+ *
51
+ * @return self
52
+ */
53
+ public function addSubscriber(EventSubscriberInterface $subscriber);
54
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/ToArrayInterface.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common;
4
+
5
+ /**
6
+ * An object that can be represented as an array
7
+ */
8
+ interface ToArrayInterface
9
+ {
10
+ /**
11
+ * Get the array representation of an object
12
+ *
13
+ * @return array
14
+ */
15
+ public function toArray();
16
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Common/Version.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Common;
4
+
5
+ /**
6
+ * Guzzle version information
7
+ */
8
+ class Version
9
+ {
10
+ const VERSION = '3.9.3';
11
+
12
+ /**
13
+ * @var bool Set this value to true to enable warnings for deprecated functionality use. This should be on in your
14
+ * unit tests, but probably not in production.
15
+ */
16
+ public static $emitWarnings = false;
17
+
18
+ /**
19
+ * Emit a deprecation warning
20
+ *
21
+ * @param string $message Warning message
22
+ */
23
+ public static function warn($message)
24
+ {
25
+ if (self::$emitWarnings) {
26
+ trigger_error('Deprecation warning: ' . $message, E_USER_DEPRECATED);
27
+ }
28
+ }
29
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/AbstractEntityBodyDecorator.php ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ use Guzzle\Stream\Stream;
6
+
7
+ /**
8
+ * Abstract decorator used to wrap entity bodies
9
+ */
10
+ class AbstractEntityBodyDecorator implements EntityBodyInterface
11
+ {
12
+ /** @var EntityBodyInterface Decorated entity body */
13
+ protected $body;
14
+
15
+ /**
16
+ * @param EntityBodyInterface $body Entity body to decorate
17
+ */
18
+ public function __construct(EntityBodyInterface $body)
19
+ {
20
+ $this->body = $body;
21
+ }
22
+
23
+ public function __toString()
24
+ {
25
+ return (string) $this->body;
26
+ }
27
+
28
+ /**
29
+ * Allow decorators to implement custom methods
30
+ *
31
+ * @param string $method Missing method name
32
+ * @param array $args Method arguments
33
+ *
34
+ * @return mixed
35
+ */
36
+ public function __call($method, array $args)
37
+ {
38
+ return call_user_func_array(array($this->body, $method), $args);
39
+ }
40
+
41
+ public function close()
42
+ {
43
+ return $this->body->close();
44
+ }
45
+
46
+ public function setRewindFunction($callable)
47
+ {
48
+ $this->body->setRewindFunction($callable);
49
+
50
+ return $this;
51
+ }
52
+
53
+ public function rewind()
54
+ {
55
+ return $this->body->rewind();
56
+ }
57
+
58
+ public function compress($filter = 'zlib.deflate')
59
+ {
60
+ return $this->body->compress($filter);
61
+ }
62
+
63
+ public function uncompress($filter = 'zlib.inflate')
64
+ {
65
+ return $this->body->uncompress($filter);
66
+ }
67
+
68
+ public function getContentLength()
69
+ {
70
+ return $this->getSize();
71
+ }
72
+
73
+ public function getContentType()
74
+ {
75
+ return $this->body->getContentType();
76
+ }
77
+
78
+ public function getContentMd5($rawOutput = false, $base64Encode = false)
79
+ {
80
+ $hash = Stream::getHash($this, 'md5', $rawOutput);
81
+
82
+ return $hash && $base64Encode ? base64_encode($hash) : $hash;
83
+ }
84
+
85
+ public function getContentEncoding()
86
+ {
87
+ return $this->body->getContentEncoding();
88
+ }
89
+
90
+ public function getMetaData($key = null)
91
+ {
92
+ return $this->body->getMetaData($key);
93
+ }
94
+
95
+ public function getStream()
96
+ {
97
+ return $this->body->getStream();
98
+ }
99
+
100
+ public function setStream($stream, $size = 0)
101
+ {
102
+ $this->body->setStream($stream, $size);
103
+
104
+ return $this;
105
+ }
106
+
107
+ public function detachStream()
108
+ {
109
+ $this->body->detachStream();
110
+
111
+ return $this;
112
+ }
113
+
114
+ public function getWrapper()
115
+ {
116
+ return $this->body->getWrapper();
117
+ }
118
+
119
+ public function getWrapperData()
120
+ {
121
+ return $this->body->getWrapperData();
122
+ }
123
+
124
+ public function getStreamType()
125
+ {
126
+ return $this->body->getStreamType();
127
+ }
128
+
129
+ public function getUri()
130
+ {
131
+ return $this->body->getUri();
132
+ }
133
+
134
+ public function getSize()
135
+ {
136
+ return $this->body->getSize();
137
+ }
138
+
139
+ public function isReadable()
140
+ {
141
+ return $this->body->isReadable();
142
+ }
143
+
144
+ public function isRepeatable()
145
+ {
146
+ return $this->isSeekable() && $this->isReadable();
147
+ }
148
+
149
+ public function isWritable()
150
+ {
151
+ return $this->body->isWritable();
152
+ }
153
+
154
+ public function isConsumed()
155
+ {
156
+ return $this->body->isConsumed();
157
+ }
158
+
159
+ /**
160
+ * Alias of isConsumed()
161
+ * {@inheritdoc}
162
+ */
163
+ public function feof()
164
+ {
165
+ return $this->isConsumed();
166
+ }
167
+
168
+ public function isLocal()
169
+ {
170
+ return $this->body->isLocal();
171
+ }
172
+
173
+ public function isSeekable()
174
+ {
175
+ return $this->body->isSeekable();
176
+ }
177
+
178
+ public function setSize($size)
179
+ {
180
+ $this->body->setSize($size);
181
+
182
+ return $this;
183
+ }
184
+
185
+ public function seek($offset, $whence = SEEK_SET)
186
+ {
187
+ return $this->body->seek($offset, $whence);
188
+ }
189
+
190
+ public function read($length)
191
+ {
192
+ return $this->body->read($length);
193
+ }
194
+
195
+ public function write($string)
196
+ {
197
+ return $this->body->write($string);
198
+ }
199
+
200
+ public function readLine($maxLength = null)
201
+ {
202
+ return $this->body->readLine($maxLength);
203
+ }
204
+
205
+ public function ftell()
206
+ {
207
+ return $this->body->ftell();
208
+ }
209
+
210
+ public function getCustomData($key)
211
+ {
212
+ return $this->body->getCustomData($key);
213
+ }
214
+
215
+ public function setCustomData($key, $value)
216
+ {
217
+ $this->body->setCustomData($key, $value);
218
+
219
+ return $this;
220
+ }
221
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/CachingEntityBody.php ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ use Guzzle\Common\Exception\RuntimeException;
6
+
7
+ /**
8
+ * EntityBody decorator that can cache previously read bytes from a sequentially read tstream
9
+ */
10
+ class CachingEntityBody extends AbstractEntityBodyDecorator
11
+ {
12
+ /** @var EntityBody Remote stream used to actually pull data onto the buffer */
13
+ protected $remoteStream;
14
+
15
+ /** @var int The number of bytes to skip reading due to a write on the temporary buffer */
16
+ protected $skipReadBytes = 0;
17
+
18
+ /**
19
+ * We will treat the buffer object as the body of the entity body
20
+ * {@inheritdoc}
21
+ */
22
+ public function __construct(EntityBodyInterface $body)
23
+ {
24
+ $this->remoteStream = $body;
25
+ $this->body = new EntityBody(fopen('php://temp', 'r+'));
26
+ }
27
+
28
+ /**
29
+ * Will give the contents of the buffer followed by the exhausted remote stream.
30
+ *
31
+ * Warning: Loads the entire stream into memory
32
+ *
33
+ * @return string
34
+ */
35
+ public function __toString()
36
+ {
37
+ $pos = $this->ftell();
38
+ $this->rewind();
39
+
40
+ $str = '';
41
+ while (!$this->isConsumed()) {
42
+ $str .= $this->read(16384);
43
+ }
44
+
45
+ $this->seek($pos);
46
+
47
+ return $str;
48
+ }
49
+
50
+ public function getSize()
51
+ {
52
+ return max($this->body->getSize(), $this->remoteStream->getSize());
53
+ }
54
+
55
+ /**
56
+ * {@inheritdoc}
57
+ * @throws RuntimeException When seeking with SEEK_END or when seeking past the total size of the buffer stream
58
+ */
59
+ public function seek($offset, $whence = SEEK_SET)
60
+ {
61
+ if ($whence == SEEK_SET) {
62
+ $byte = $offset;
63
+ } elseif ($whence == SEEK_CUR) {
64
+ $byte = $offset + $this->ftell();
65
+ } else {
66
+ throw new RuntimeException(__CLASS__ . ' supports only SEEK_SET and SEEK_CUR seek operations');
67
+ }
68
+
69
+ // You cannot skip ahead past where you've read from the remote stream
70
+ if ($byte > $this->body->getSize()) {
71
+ throw new RuntimeException(
72
+ "Cannot seek to byte {$byte} when the buffered stream only contains {$this->body->getSize()} bytes"
73
+ );
74
+ }
75
+
76
+ return $this->body->seek($byte);
77
+ }
78
+
79
+ public function rewind()
80
+ {
81
+ return $this->seek(0);
82
+ }
83
+
84
+ /**
85
+ * Does not support custom rewind functions
86
+ *
87
+ * @throws RuntimeException
88
+ */
89
+ public function setRewindFunction($callable)
90
+ {
91
+ throw new RuntimeException(__CLASS__ . ' does not support custom stream rewind functions');
92
+ }
93
+
94
+ public function read($length)
95
+ {
96
+ // Perform a regular read on any previously read data from the buffer
97
+ $data = $this->body->read($length);
98
+ $remaining = $length - strlen($data);
99
+
100
+ // More data was requested so read from the remote stream
101
+ if ($remaining) {
102
+ // If data was written to the buffer in a position that would have been filled from the remote stream,
103
+ // then we must skip bytes on the remote stream to emulate overwriting bytes from that position. This
104
+ // mimics the behavior of other PHP stream wrappers.
105
+ $remoteData = $this->remoteStream->read($remaining + $this->skipReadBytes);
106
+
107
+ if ($this->skipReadBytes) {
108
+ $len = strlen($remoteData);
109
+ $remoteData = substr($remoteData, $this->skipReadBytes);
110
+ $this->skipReadBytes = max(0, $this->skipReadBytes - $len);
111
+ }
112
+
113
+ $data .= $remoteData;
114
+ $this->body->write($remoteData);
115
+ }
116
+
117
+ return $data;
118
+ }
119
+
120
+ public function write($string)
121
+ {
122
+ // When appending to the end of the currently read stream, you'll want to skip bytes from being read from
123
+ // the remote stream to emulate other stream wrappers. Basically replacing bytes of data of a fixed length.
124
+ $overflow = (strlen($string) + $this->ftell()) - $this->remoteStream->ftell();
125
+ if ($overflow > 0) {
126
+ $this->skipReadBytes += $overflow;
127
+ }
128
+
129
+ return $this->body->write($string);
130
+ }
131
+
132
+ /**
133
+ * {@inheritdoc}
134
+ * @link http://php.net/manual/en/function.fgets.php
135
+ */
136
+ public function readLine($maxLength = null)
137
+ {
138
+ $buffer = '';
139
+ $size = 0;
140
+ while (!$this->isConsumed()) {
141
+ $byte = $this->read(1);
142
+ $buffer .= $byte;
143
+ // Break when a new line is found or the max length - 1 is reached
144
+ if ($byte == PHP_EOL || ++$size == $maxLength - 1) {
145
+ break;
146
+ }
147
+ }
148
+
149
+ return $buffer;
150
+ }
151
+
152
+ public function isConsumed()
153
+ {
154
+ return $this->body->isConsumed() && $this->remoteStream->isConsumed();
155
+ }
156
+
157
+ /**
158
+ * Close both the remote stream and buffer stream
159
+ */
160
+ public function close()
161
+ {
162
+ return $this->remoteStream->close() && $this->body->close();
163
+ }
164
+
165
+ public function setStream($stream, $size = 0)
166
+ {
167
+ $this->remoteStream->setStream($stream, $size);
168
+ }
169
+
170
+ public function getContentType()
171
+ {
172
+ return $this->remoteStream->getContentType();
173
+ }
174
+
175
+ public function getContentEncoding()
176
+ {
177
+ return $this->remoteStream->getContentEncoding();
178
+ }
179
+
180
+ public function getMetaData($key = null)
181
+ {
182
+ return $this->remoteStream->getMetaData($key);
183
+ }
184
+
185
+ public function getStream()
186
+ {
187
+ return $this->remoteStream->getStream();
188
+ }
189
+
190
+ public function getWrapper()
191
+ {
192
+ return $this->remoteStream->getWrapper();
193
+ }
194
+
195
+ public function getWrapperData()
196
+ {
197
+ return $this->remoteStream->getWrapperData();
198
+ }
199
+
200
+ public function getStreamType()
201
+ {
202
+ return $this->remoteStream->getStreamType();
203
+ }
204
+
205
+ public function getUri()
206
+ {
207
+ return $this->remoteStream->getUri();
208
+ }
209
+
210
+ /**
211
+ * Always retrieve custom data from the remote stream
212
+ * {@inheritdoc}
213
+ */
214
+ public function getCustomData($key)
215
+ {
216
+ return $this->remoteStream->getCustomData($key);
217
+ }
218
+
219
+ /**
220
+ * Always set custom data on the remote stream
221
+ * {@inheritdoc}
222
+ */
223
+ public function setCustomData($key, $value)
224
+ {
225
+ $this->remoteStream->setCustomData($key, $value);
226
+
227
+ return $this;
228
+ }
229
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Client.php ADDED
@@ -0,0 +1,524 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ use Guzzle\Common\Collection;
6
+ use Guzzle\Common\AbstractHasDispatcher;
7
+ use Guzzle\Common\Exception\ExceptionCollection;
8
+ use Guzzle\Common\Exception\InvalidArgumentException;
9
+ use Guzzle\Common\Exception\RuntimeException;
10
+ use Guzzle\Common\Version;
11
+ use Guzzle\Parser\ParserRegistry;
12
+ use Guzzle\Parser\UriTemplate\UriTemplateInterface;
13
+ use Guzzle\Http\Message\RequestInterface;
14
+ use Guzzle\Http\Message\RequestFactory;
15
+ use Guzzle\Http\Message\RequestFactoryInterface;
16
+ use Guzzle\Http\Curl\CurlMultiInterface;
17
+ use Guzzle\Http\Curl\CurlMultiProxy;
18
+ use Guzzle\Http\Curl\CurlHandle;
19
+ use Guzzle\Http\Curl\CurlVersion;
20
+
21
+ /**
22
+ * HTTP client
23
+ */
24
+ class Client extends AbstractHasDispatcher implements ClientInterface
25
+ {
26
+ /** @deprecated Use [request.options][params] */
27
+ const REQUEST_PARAMS = 'request.params';
28
+
29
+ const REQUEST_OPTIONS = 'request.options';
30
+ const CURL_OPTIONS = 'curl.options';
31
+ const SSL_CERT_AUTHORITY = 'ssl.certificate_authority';
32
+ const DISABLE_REDIRECTS = RedirectPlugin::DISABLE;
33
+ const DEFAULT_SELECT_TIMEOUT = 1.0;
34
+ const MAX_HANDLES = 3;
35
+
36
+ /** @var Collection Default HTTP headers to set on each request */
37
+ protected $defaultHeaders;
38
+
39
+ /** @var string The user agent string to set on each request */
40
+ protected $userAgent;
41
+
42
+ /** @var Collection Parameter object holding configuration data */
43
+ private $config;
44
+
45
+ /** @var Url Base URL of the client */
46
+ private $baseUrl;
47
+
48
+ /** @var CurlMultiInterface CurlMulti object used internally */
49
+ private $curlMulti;
50
+
51
+ /** @var UriTemplateInterface URI template owned by the client */
52
+ private $uriTemplate;
53
+
54
+ /** @var RequestFactoryInterface Request factory used by the client */
55
+ protected $requestFactory;
56
+
57
+ public static function getAllEvents()
58
+ {
59
+ return array(self::CREATE_REQUEST);
60
+ }
61
+
62
+ /**
63
+ * @param string $baseUrl Base URL of the web service
64
+ * @param array|Collection $config Configuration settings
65
+ *
66
+ * @throws RuntimeException if cURL is not installed
67
+ */
68
+ public function __construct($baseUrl = '', $config = null)
69
+ {
70
+ if (!extension_loaded('curl')) {
71
+ // @codeCoverageIgnoreStart
72
+ throw new RuntimeException('The PHP cURL extension must be installed to use Guzzle.');
73
+ // @codeCoverageIgnoreEnd
74
+ }
75
+ $this->setConfig($config ?: new Collection());
76
+ $this->initSsl();
77
+ $this->setBaseUrl($baseUrl);
78
+ $this->defaultHeaders = new Collection();
79
+ $this->setRequestFactory(RequestFactory::getInstance());
80
+ $this->userAgent = $this->getDefaultUserAgent();
81
+ if (!$this->config[self::DISABLE_REDIRECTS]) {
82
+ $this->addSubscriber(new RedirectPlugin());
83
+ }
84
+ }
85
+
86
+ final public function setConfig($config)
87
+ {
88
+ if ($config instanceof Collection) {
89
+ $this->config = $config;
90
+ } elseif (is_array($config)) {
91
+ $this->config = new Collection($config);
92
+ } else {
93
+ throw new InvalidArgumentException('Config must be an array or Collection');
94
+ }
95
+
96
+ return $this;
97
+ }
98
+
99
+ final public function getConfig($key = false)
100
+ {
101
+ return $key ? $this->config[$key] : $this->config;
102
+ }
103
+
104
+ /**
105
+ * Set a default request option on the client that will be used as a default for each request
106
+ *
107
+ * @param string $keyOrPath request.options key (e.g. allow_redirects) or path to a nested key (e.g. headers/foo)
108
+ * @param mixed $value Value to set
109
+ *
110
+ * @return $this
111
+ */
112
+ public function setDefaultOption($keyOrPath, $value)
113
+ {
114
+ $keyOrPath = self::REQUEST_OPTIONS . '/' . $keyOrPath;
115
+ $this->config->setPath($keyOrPath, $value);
116
+
117
+ return $this;
118
+ }
119
+
120
+ /**
121
+ * Retrieve a default request option from the client
122
+ *
123
+ * @param string $keyOrPath request.options key (e.g. allow_redirects) or path to a nested key (e.g. headers/foo)
124
+ *
125
+ * @return mixed|null
126
+ */
127
+ public function getDefaultOption($keyOrPath)
128
+ {
129
+ $keyOrPath = self::REQUEST_OPTIONS . '/' . $keyOrPath;
130
+
131
+ return $this->config->getPath($keyOrPath);
132
+ }
133
+
134
+ final public function setSslVerification($certificateAuthority = true, $verifyPeer = true, $verifyHost = 2)
135
+ {
136
+ $opts = $this->config[self::CURL_OPTIONS] ?: array();
137
+
138
+ if ($certificateAuthority === true) {
139
+ // use bundled CA bundle, set secure defaults
140
+ $opts[CURLOPT_CAINFO] = __DIR__ . '/Resources/cacert.pem';
141
+ $opts[CURLOPT_SSL_VERIFYPEER] = true;
142
+ $opts[CURLOPT_SSL_VERIFYHOST] = 2;
143
+ } elseif ($certificateAuthority === false) {
144
+ unset($opts[CURLOPT_CAINFO]);
145
+ $opts[CURLOPT_SSL_VERIFYPEER] = false;
146
+ $opts[CURLOPT_SSL_VERIFYHOST] = 0;
147
+ } elseif ($verifyPeer !== true && $verifyPeer !== false && $verifyPeer !== 1 && $verifyPeer !== 0) {
148
+ throw new InvalidArgumentException('verifyPeer must be 1, 0 or boolean');
149
+ } elseif ($verifyHost !== 0 && $verifyHost !== 1 && $verifyHost !== 2) {
150
+ throw new InvalidArgumentException('verifyHost must be 0, 1 or 2');
151
+ } else {
152
+ $opts[CURLOPT_SSL_VERIFYPEER] = $verifyPeer;
153
+ $opts[CURLOPT_SSL_VERIFYHOST] = $verifyHost;
154
+ if (is_file($certificateAuthority)) {
155
+ unset($opts[CURLOPT_CAPATH]);
156
+ $opts[CURLOPT_CAINFO] = $certificateAuthority;
157
+ } elseif (is_dir($certificateAuthority)) {
158
+ unset($opts[CURLOPT_CAINFO]);
159
+ $opts[CURLOPT_CAPATH] = $certificateAuthority;
160
+ } else {
161
+ throw new RuntimeException(
162
+ 'Invalid option passed to ' . self::SSL_CERT_AUTHORITY . ': ' . $certificateAuthority
163
+ );
164
+ }
165
+ }
166
+
167
+ $this->config->set(self::CURL_OPTIONS, $opts);
168
+
169
+ return $this;
170
+ }
171
+
172
+ public function createRequest($method = 'GET', $uri = null, $headers = null, $body = null, array $options = array())
173
+ {
174
+ if (!$uri) {
175
+ $url = $this->getBaseUrl();
176
+ } else {
177
+ if (!is_array($uri)) {
178
+ $templateVars = null;
179
+ } else {
180
+ list($uri, $templateVars) = $uri;
181
+ }
182
+ if (strpos($uri, '://')) {
183
+ // Use absolute URLs as-is
184
+ $url = $this->expandTemplate($uri, $templateVars);
185
+ } else {
186
+ $url = Url::factory($this->getBaseUrl())->combine($this->expandTemplate($uri, $templateVars));
187
+ }
188
+ }
189
+
190
+ // If default headers are provided, then merge them under any explicitly provided headers for the request
191
+ if (count($this->defaultHeaders)) {
192
+ if (!$headers) {
193
+ $headers = $this->defaultHeaders->toArray();
194
+ } elseif (is_array($headers)) {
195
+ $headers += $this->defaultHeaders->toArray();
196
+ } elseif ($headers instanceof Collection) {
197
+ $headers = $headers->toArray() + $this->defaultHeaders->toArray();
198
+ }
199
+ }
200
+
201
+ return $this->prepareRequest($this->requestFactory->create($method, (string) $url, $headers, $body), $options);
202
+ }
203
+
204
+ public function getBaseUrl($expand = true)
205
+ {
206
+ return $expand ? $this->expandTemplate($this->baseUrl) : $this->baseUrl;
207
+ }
208
+
209
+ public function setBaseUrl($url)
210
+ {
211
+ $this->baseUrl = $url;
212
+
213
+ return $this;
214
+ }
215
+
216
+ public function setUserAgent($userAgent, $includeDefault = false)
217
+ {
218
+ if ($includeDefault) {
219
+ $userAgent .= ' ' . $this->getDefaultUserAgent();
220
+ }
221
+ $this->userAgent = $userAgent;
222
+
223
+ return $this;
224
+ }
225
+
226
+ /**
227
+ * Get the default User-Agent string to use with Guzzle
228
+ *
229
+ * @return string
230
+ */
231
+ public function getDefaultUserAgent()
232
+ {
233
+ return 'Guzzle/' . Version::VERSION
234
+ . ' curl/' . CurlVersion::getInstance()->get('version')
235
+ . ' PHP/' . PHP_VERSION;
236
+ }
237
+
238
+ public function get($uri = null, $headers = null, $options = array())
239
+ {
240
+ // BC compat: $options can be a string, resource, etc to specify where the response body is downloaded
241
+ return is_array($options)
242
+ ? $this->createRequest('GET', $uri, $headers, null, $options)
243
+ : $this->createRequest('GET', $uri, $headers, $options);
244
+ }
245
+
246
+ public function head($uri = null, $headers = null, array $options = array())
247
+ {
248
+ return $this->createRequest('HEAD', $uri, $headers, null, $options);
249
+ }
250
+
251
+ public function delete($uri = null, $headers = null, $body = null, array $options = array())
252
+ {
253
+ return $this->createRequest('DELETE', $uri, $headers, $body, $options);
254
+ }
255
+
256
+ public function put($uri = null, $headers = null, $body = null, array $options = array())
257
+ {
258
+ return $this->createRequest('PUT', $uri, $headers, $body, $options);
259
+ }
260
+
261
+ public function patch($uri = null, $headers = null, $body = null, array $options = array())
262
+ {
263
+ return $this->createRequest('PATCH', $uri, $headers, $body, $options);
264
+ }
265
+
266
+ public function post($uri = null, $headers = null, $postBody = null, array $options = array())
267
+ {
268
+ return $this->createRequest('POST', $uri, $headers, $postBody, $options);
269
+ }
270
+
271
+ public function options($uri = null, array $options = array())
272
+ {
273
+ return $this->createRequest('OPTIONS', $uri, $options);
274
+ }
275
+
276
+ public function send($requests)
277
+ {
278
+ if (!($requests instanceof RequestInterface)) {
279
+ return $this->sendMultiple($requests);
280
+ }
281
+
282
+ try {
283
+ /** @var $requests RequestInterface */
284
+ $this->getCurlMulti()->add($requests)->send();
285
+ return $requests->getResponse();
286
+ } catch (ExceptionCollection $e) {
287
+ throw $e->getFirst();
288
+ }
289
+ }
290
+
291
+ /**
292
+ * Set a curl multi object to be used internally by the client for transferring requests.
293
+ *
294
+ * @param CurlMultiInterface $curlMulti Multi object
295
+ *
296
+ * @return self
297
+ */
298
+ public function setCurlMulti(CurlMultiInterface $curlMulti)
299
+ {
300
+ $this->curlMulti = $curlMulti;
301
+
302
+ return $this;
303
+ }
304
+
305
+ /**
306
+ * @return CurlMultiInterface|CurlMultiProxy
307
+ */
308
+ public function getCurlMulti()
309
+ {
310
+ if (!$this->curlMulti) {
311
+ $this->curlMulti = new CurlMultiProxy(
312
+ self::MAX_HANDLES,
313
+ $this->getConfig('select_timeout') ?: self::DEFAULT_SELECT_TIMEOUT
314
+ );
315
+ }
316
+
317
+ return $this->curlMulti;
318
+ }
319
+
320
+ public function setRequestFactory(RequestFactoryInterface $factory)
321
+ {
322
+ $this->requestFactory = $factory;
323
+
324
+ return $this;
325
+ }
326
+
327
+ /**
328
+ * Set the URI template expander to use with the client
329
+ *
330
+ * @param UriTemplateInterface $uriTemplate URI template expander
331
+ *
332
+ * @return self
333
+ */
334
+ public function setUriTemplate(UriTemplateInterface $uriTemplate)
335
+ {
336
+ $this->uriTemplate = $uriTemplate;
337
+
338
+ return $this;
339
+ }
340
+
341
+ /**
342
+ * Expand a URI template while merging client config settings into the template variables
343
+ *
344
+ * @param string $template Template to expand
345
+ * @param array $variables Variables to inject
346
+ *
347
+ * @return string
348
+ */
349
+ protected function expandTemplate($template, array $variables = null)
350
+ {
351
+ $expansionVars = $this->getConfig()->toArray();
352
+ if ($variables) {
353
+ $expansionVars = $variables + $expansionVars;
354
+ }
355
+
356
+ return $this->getUriTemplate()->expand($template, $expansionVars);
357
+ }
358
+
359
+ /**
360
+ * Get the URI template expander used by the client
361
+ *
362
+ * @return UriTemplateInterface
363
+ */
364
+ protected function getUriTemplate()
365
+ {
366
+ if (!$this->uriTemplate) {
367
+ $this->uriTemplate = ParserRegistry::getInstance()->getParser('uri_template');
368
+ }
369
+
370
+ return $this->uriTemplate;
371
+ }
372
+
373
+ /**
374
+ * Send multiple requests in parallel
375
+ *
376
+ * @param array $requests Array of RequestInterface objects
377
+ *
378
+ * @return array Returns an array of Response objects
379
+ */
380
+ protected function sendMultiple(array $requests)
381
+ {
382
+ $curlMulti = $this->getCurlMulti();
383
+ foreach ($requests as $request) {
384
+ $curlMulti->add($request);
385
+ }
386
+ $curlMulti->send();
387
+
388
+ /** @var $request RequestInterface */
389
+ $result = array();
390
+ foreach ($requests as $request) {
391
+ $result[] = $request->getResponse();
392
+ }
393
+
394
+ return $result;
395
+ }
396
+
397
+ /**
398
+ * Prepare a request to be sent from the Client by adding client specific behaviors and properties to the request.
399
+ *
400
+ * @param RequestInterface $request Request to prepare for the client
401
+ * @param array $options Options to apply to the request
402
+ *
403
+ * @return RequestInterface
404
+ */
405
+ protected function prepareRequest(RequestInterface $request, array $options = array())
406
+ {
407
+ $request->setClient($this)->setEventDispatcher(clone $this->getEventDispatcher());
408
+
409
+ if ($curl = $this->config[self::CURL_OPTIONS]) {
410
+ $request->getCurlOptions()->overwriteWith(CurlHandle::parseCurlConfig($curl));
411
+ }
412
+
413
+ if ($params = $this->config[self::REQUEST_PARAMS]) {
414
+ Version::warn('request.params is deprecated. Use request.options to add default request options.');
415
+ $request->getParams()->overwriteWith($params);
416
+ }
417
+
418
+ if ($this->userAgent && !$request->hasHeader('User-Agent')) {
419
+ $request->setHeader('User-Agent', $this->userAgent);
420
+ }
421
+
422
+ if ($defaults = $this->config[self::REQUEST_OPTIONS]) {
423
+ $this->requestFactory->applyOptions($request, $defaults, RequestFactoryInterface::OPTIONS_AS_DEFAULTS);
424
+ }
425
+
426
+ if ($options) {
427
+ $this->requestFactory->applyOptions($request, $options);
428
+ }
429
+
430
+ $this->dispatch('client.create_request', array('client' => $this, 'request' => $request));
431
+
432
+ return $request;
433
+ }
434
+
435
+ /**
436
+ * Initializes SSL settings
437
+ */
438
+ protected function initSsl()
439
+ {
440
+ $authority = $this->config[self::SSL_CERT_AUTHORITY];
441
+
442
+ if ($authority === 'system') {
443
+ return;
444
+ }
445
+
446
+ if ($authority === null) {
447
+ $authority = true;
448
+ }
449
+
450
+ if ($authority === true && substr(__FILE__, 0, 7) == 'phar://') {
451
+ $authority = self::extractPharCacert(__DIR__ . '/Resources/cacert.pem');
452
+ }
453
+
454
+ $this->setSslVerification($authority);
455
+ }
456
+
457
+ /**
458
+ * @deprecated
459
+ */
460
+ public function getDefaultHeaders()
461
+ {
462
+ Version::warn(__METHOD__ . ' is deprecated. Use the request.options array to retrieve default request options');
463
+ return $this->defaultHeaders;
464
+ }
465
+
466
+ /**
467
+ * @deprecated
468
+ */
469
+ public function setDefaultHeaders($headers)
470
+ {
471
+ Version::warn(__METHOD__ . ' is deprecated. Use the request.options array to specify default request options');
472
+ if ($headers instanceof Collection) {
473
+ $this->defaultHeaders = $headers;
474
+ } elseif (is_array($headers)) {
475
+ $this->defaultHeaders = new Collection($headers);
476
+ } else {
477
+ throw new InvalidArgumentException('Headers must be an array or Collection');
478
+ }
479
+
480
+ return $this;
481
+ }
482
+
483
+ /**
484
+ * @deprecated
485
+ */
486
+ public function preparePharCacert($md5Check = true)
487
+ {
488
+ return sys_get_temp_dir() . '/guzzle-cacert.pem';
489
+ }
490
+
491
+ /**
492
+ * Copies the phar cacert from a phar into the temp directory.
493
+ *
494
+ * @param string $pharCacertPath Path to the phar cacert. For example:
495
+ * 'phar://aws.phar/Guzzle/Http/Resources/cacert.pem'
496
+ *
497
+ * @return string Returns the path to the extracted cacert file.
498
+ * @throws \RuntimeException Throws if the phar cacert cannot be found or
499
+ * the file cannot be copied to the temp dir.
500
+ */
501
+ public static function extractPharCacert($pharCacertPath)
502
+ {
503
+ // Copy the cacert.pem file from the phar if it is not in the temp
504
+ // folder.
505
+ $certFile = sys_get_temp_dir() . '/guzzle-cacert.pem';
506
+
507
+ if (!file_exists($pharCacertPath)) {
508
+ throw new \RuntimeException("Could not find $pharCacertPath");
509
+ }
510
+
511
+ if (!file_exists($certFile) ||
512
+ filesize($certFile) != filesize($pharCacertPath)
513
+ ) {
514
+ if (!copy($pharCacertPath, $certFile)) {
515
+ throw new \RuntimeException(
516
+ "Could not copy {$pharCacertPath} to {$certFile}: "
517
+ . var_export(error_get_last(), true)
518
+ );
519
+ }
520
+ }
521
+
522
+ return $certFile;
523
+ }
524
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/ClientInterface.php ADDED
@@ -0,0 +1,223 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ use Guzzle\Common\HasDispatcherInterface;
6
+ use Guzzle\Common\Collection;
7
+ use Guzzle\Common\Exception\InvalidArgumentException;
8
+ use Guzzle\Http\Message\EntityEnclosingRequestInterface;
9
+ use Guzzle\Http\Message\RequestInterface;
10
+
11
+ /**
12
+ * Client interface for send HTTP requests
13
+ */
14
+ interface ClientInterface extends HasDispatcherInterface
15
+ {
16
+ const CREATE_REQUEST = 'client.create_request';
17
+
18
+ /** @var string RFC 1123 HTTP-Date */
19
+ const HTTP_DATE = 'D, d M Y H:i:s \G\M\T';
20
+
21
+ /**
22
+ * Set the configuration object to use with the client
23
+ *
24
+ * @param array|Collection $config Parameters that define how the client behaves
25
+ *
26
+ * @return self
27
+ */
28
+ public function setConfig($config);
29
+
30
+ /**
31
+ * Get a configuration setting or all of the configuration settings. The Collection result of this method can be
32
+ * modified to change the configuration settings of a client.
33
+ *
34
+ * A client should honor the following special values:
35
+ *
36
+ * - request.options: Associative array of default RequestFactory options to apply to each request
37
+ * - request.params: Associative array of request parameters (data values) to apply to each request
38
+ * - curl.options: Associative array of cURL configuration settings to apply to each request
39
+ * - ssl.certificate_authority: Path a CAINFO, CAPATH, true to use strict defaults, or false to disable verification
40
+ * - redirect.disable: Set to true to disable redirects
41
+ *
42
+ * @param bool|string $key Configuration value to retrieve. Set to FALSE to retrieve all values of the client.
43
+ * The object return can be modified, and modifications will affect the client's config.
44
+ * @return mixed|Collection
45
+ * @see \Guzzle\Http\Message\RequestFactoryInterface::applyOptions for a full list of request.options options
46
+ */
47
+ public function getConfig($key = false);
48
+
49
+ /**
50
+ * Create and return a new {@see RequestInterface} configured for the client.
51
+ *
52
+ * Use an absolute path to override the base path of the client, or a relative path to append to the base path of
53
+ * the client. The URI can contain the query string as well. Use an array to provide a URI template and additional
54
+ * variables to use in the URI template expansion.
55
+ *
56
+ * @param string $method HTTP method. Defaults to GET
57
+ * @param string|array $uri Resource URI.
58
+ * @param array|Collection $headers HTTP headers
59
+ * @param string|resource|array|EntityBodyInterface $body Entity body of request (POST/PUT) or response (GET)
60
+ * @param array $options Array of options to apply to the request
61
+ *
62
+ * @return RequestInterface
63
+ * @throws InvalidArgumentException if a URI array is passed that does not contain exactly two elements: the URI
64
+ * followed by template variables
65
+ */
66
+ public function createRequest(
67
+ $method = RequestInterface::GET,
68
+ $uri = null,
69
+ $headers = null,
70
+ $body = null,
71
+ array $options = array()
72
+ );
73
+
74
+ /**
75
+ * Create a GET request for the client
76
+ *
77
+ * @param string|array $uri Resource URI
78
+ * @param array|Collection $headers HTTP headers
79
+ * @param array $options Options to apply to the request. For BC compatibility, you can also pass a
80
+ * string to tell Guzzle to download the body of the response to a particular
81
+ * location. Use the 'body' option instead for forward compatibility.
82
+ * @return RequestInterface
83
+ * @see Guzzle\Http\ClientInterface::createRequest()
84
+ */
85
+ public function get($uri = null, $headers = null, $options = array());
86
+
87
+ /**
88
+ * Create a HEAD request for the client
89
+ *
90
+ * @param string|array $uri Resource URI
91
+ * @param array|Collection $headers HTTP headers
92
+ * @param array $options Options to apply to the request
93
+ *
94
+ * @return RequestInterface
95
+ * @see Guzzle\Http\ClientInterface::createRequest()
96
+ */
97
+ public function head($uri = null, $headers = null, array $options = array());
98
+
99
+ /**
100
+ * Create a DELETE request for the client
101
+ *
102
+ * @param string|array $uri Resource URI
103
+ * @param array|Collection $headers HTTP headers
104
+ * @param string|resource|EntityBodyInterface $body Body to send in the request
105
+ * @param array $options Options to apply to the request
106
+ *
107
+ * @return EntityEnclosingRequestInterface
108
+ * @see Guzzle\Http\ClientInterface::createRequest()
109
+ */
110
+ public function delete($uri = null, $headers = null, $body = null, array $options = array());
111
+
112
+ /**
113
+ * Create a PUT request for the client
114
+ *
115
+ * @param string|array $uri Resource URI
116
+ * @param array|Collection $headers HTTP headers
117
+ * @param string|resource|EntityBodyInterface $body Body to send in the request
118
+ * @param array $options Options to apply to the request
119
+ *
120
+ * @return EntityEnclosingRequestInterface
121
+ * @see Guzzle\Http\ClientInterface::createRequest()
122
+ */
123
+ public function put($uri = null, $headers = null, $body = null, array $options = array());
124
+
125
+ /**
126
+ * Create a PATCH request for the client
127
+ *
128
+ * @param string|array $uri Resource URI
129
+ * @param array|Collection $headers HTTP headers
130
+ * @param string|resource|EntityBodyInterface $body Body to send in the request
131
+ * @param array $options Options to apply to the request
132
+ *
133
+ * @return EntityEnclosingRequestInterface
134
+ * @see Guzzle\Http\ClientInterface::createRequest()
135
+ */
136
+ public function patch($uri = null, $headers = null, $body = null, array $options = array());
137
+
138
+ /**
139
+ * Create a POST request for the client
140
+ *
141
+ * @param string|array $uri Resource URI
142
+ * @param array|Collection $headers HTTP headers
143
+ * @param array|Collection|string|EntityBodyInterface $postBody POST body. Can be a string, EntityBody, or
144
+ * associative array of POST fields to send in the body of the
145
+ * request. Prefix a value in the array with the @ symbol to
146
+ * reference a file.
147
+ * @param array $options Options to apply to the request
148
+ *
149
+ * @return EntityEnclosingRequestInterface
150
+ * @see Guzzle\Http\ClientInterface::createRequest()
151
+ */
152
+ public function post($uri = null, $headers = null, $postBody = null, array $options = array());
153
+
154
+ /**
155
+ * Create an OPTIONS request for the client
156
+ *
157
+ * @param string|array $uri Resource URI
158
+ * @param array $options Options to apply to the request
159
+ *
160
+ * @return RequestInterface
161
+ * @see Guzzle\Http\ClientInterface::createRequest()
162
+ */
163
+ public function options($uri = null, array $options = array());
164
+
165
+ /**
166
+ * Sends a single request or an array of requests in parallel
167
+ *
168
+ * @param array|RequestInterface $requests One or more RequestInterface objects to send
169
+ *
170
+ * @return \Guzzle\Http\Message\Response|array Returns a single Response or an array of Response objects
171
+ */
172
+ public function send($requests);
173
+
174
+ /**
175
+ * Get the client's base URL as either an expanded or raw URI template
176
+ *
177
+ * @param bool $expand Set to FALSE to get the raw base URL without URI template expansion
178
+ *
179
+ * @return string|null
180
+ */
181
+ public function getBaseUrl($expand = true);
182
+
183
+ /**
184
+ * Set the base URL of the client
185
+ *
186
+ * @param string $url The base service endpoint URL of the webservice
187
+ *
188
+ * @return self
189
+ */
190
+ public function setBaseUrl($url);
191
+
192
+ /**
193
+ * Set the User-Agent header to be used on all requests from the client
194
+ *
195
+ * @param string $userAgent User agent string
196
+ * @param bool $includeDefault Set to true to prepend the value to Guzzle's default user agent string
197
+ *
198
+ * @return self
199
+ */
200
+ public function setUserAgent($userAgent, $includeDefault = false);
201
+
202
+ /**
203
+ * Set SSL verification options.
204
+ *
205
+ * Setting $certificateAuthority to TRUE will result in the bundled cacert.pem being used to verify against the
206
+ * remote host.
207
+ *
208
+ * Alternate certificates to verify against can be specified with the $certificateAuthority option set to the full
209
+ * path to a certificate file, or the path to a directory containing certificates.
210
+ *
211
+ * Setting $certificateAuthority to FALSE will turn off peer verification, unset the bundled cacert.pem, and
212
+ * disable host verification. Please don't do this unless you really know what you're doing, and why you're doing
213
+ * it.
214
+ *
215
+ * @param string|bool $certificateAuthority bool, file path, or directory path
216
+ * @param bool $verifyPeer FALSE to stop from verifying the peer's certificate.
217
+ * @param int $verifyHost Set to 1 to check the existence of a common name in the SSL peer
218
+ * certificate. 2 to check the existence of a common name and also verify
219
+ * that it matches the hostname provided.
220
+ * @return self
221
+ */
222
+ public function setSslVerification($certificateAuthority = true, $verifyPeer = true, $verifyHost = 2);
223
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlHandle.php ADDED
@@ -0,0 +1,464 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Curl;
4
+
5
+ use Guzzle\Common\Exception\InvalidArgumentException;
6
+ use Guzzle\Common\Exception\RuntimeException;
7
+ use Guzzle\Common\Collection;
8
+ use Guzzle\Http\Message\EntityEnclosingRequest;
9
+ use Guzzle\Http\Message\RequestInterface;
10
+ use Guzzle\Parser\ParserRegistry;
11
+ use Guzzle\Http\Url;
12
+
13
+ /**
14
+ * Immutable wrapper for a cURL handle
15
+ */
16
+ class CurlHandle
17
+ {
18
+ const BODY_AS_STRING = 'body_as_string';
19
+ const PROGRESS = 'progress';
20
+ const DEBUG = 'debug';
21
+
22
+ /** @var Collection Curl options */
23
+ protected $options;
24
+
25
+ /** @var resource Curl resource handle */
26
+ protected $handle;
27
+
28
+ /** @var int CURLE_* error */
29
+ protected $errorNo = CURLE_OK;
30
+
31
+ /**
32
+ * Factory method to create a new curl handle based on an HTTP request.
33
+ *
34
+ * There are some helpful options you can set to enable specific behavior:
35
+ * - debug: Set to true to enable cURL debug functionality to track the actual headers sent over the wire.
36
+ * - progress: Set to true to enable progress function callbacks.
37
+ *
38
+ * @param RequestInterface $request Request
39
+ *
40
+ * @return CurlHandle
41
+ * @throws RuntimeException
42
+ */
43
+ public static function factory(RequestInterface $request)
44
+ {
45
+ $requestCurlOptions = $request->getCurlOptions();
46
+ $mediator = new RequestMediator($request, $requestCurlOptions->get('emit_io'));
47
+ $tempContentLength = null;
48
+ $method = $request->getMethod();
49
+ $bodyAsString = $requestCurlOptions->get(self::BODY_AS_STRING);
50
+
51
+ // Prepare url
52
+ $url = (string)$request->getUrl();
53
+ if(($pos = strpos($url, '#')) !== false ){
54
+ // strip fragment from url
55
+ $url = substr($url, 0, $pos);
56
+ }
57
+
58
+ // Array of default cURL options.
59
+ $curlOptions = array(
60
+ CURLOPT_URL => $url,
61
+ CURLOPT_CONNECTTIMEOUT => 150,
62
+ CURLOPT_RETURNTRANSFER => false,
63
+ CURLOPT_HEADER => false,
64
+ CURLOPT_PORT => $request->getPort(),
65
+ CURLOPT_HTTPHEADER => array(),
66
+ CURLOPT_WRITEFUNCTION => array($mediator, 'writeResponseBody'),
67
+ CURLOPT_HEADERFUNCTION => array($mediator, 'receiveResponseHeader'),
68
+ CURLOPT_HTTP_VERSION => $request->getProtocolVersion() === '1.0'
69
+ ? CURL_HTTP_VERSION_1_0 : CURL_HTTP_VERSION_1_1,
70
+ // Verifies the authenticity of the peer's certificate
71
+ CURLOPT_SSL_VERIFYPEER => 1,
72
+ // Certificate must indicate that the server is the server to which you meant to connect
73
+ CURLOPT_SSL_VERIFYHOST => 2
74
+ );
75
+
76
+ if (defined('CURLOPT_PROTOCOLS')) {
77
+ // Allow only HTTP and HTTPS protocols
78
+ $curlOptions[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS;
79
+ }
80
+
81
+ // Add CURLOPT_ENCODING if Accept-Encoding header is provided
82
+ if ($acceptEncodingHeader = $request->getHeader('Accept-Encoding')) {
83
+ $curlOptions[CURLOPT_ENCODING] = (string) $acceptEncodingHeader;
84
+ // Let cURL set the Accept-Encoding header, prevents duplicate values
85
+ $request->removeHeader('Accept-Encoding');
86
+ }
87
+
88
+ // Enable curl debug information if the 'debug' param was set
89
+ if ($requestCurlOptions->get('debug')) {
90
+ $curlOptions[CURLOPT_STDERR] = fopen('php://temp', 'r+');
91
+ // @codeCoverageIgnoreStart
92
+ if (false === $curlOptions[CURLOPT_STDERR]) {
93
+ throw new RuntimeException('Unable to create a stream for CURLOPT_STDERR');
94
+ }
95
+ // @codeCoverageIgnoreEnd
96
+ $curlOptions[CURLOPT_VERBOSE] = true;
97
+ }
98
+
99
+ // Specify settings according to the HTTP method
100
+ if ($method == 'GET') {
101
+ $curlOptions[CURLOPT_HTTPGET] = true;
102
+ } elseif ($method == 'HEAD') {
103
+ $curlOptions[CURLOPT_NOBODY] = true;
104
+ // HEAD requests do not use a write function
105
+ unset($curlOptions[CURLOPT_WRITEFUNCTION]);
106
+ } elseif (!($request instanceof EntityEnclosingRequest)) {
107
+ $curlOptions[CURLOPT_CUSTOMREQUEST] = $method;
108
+ } else {
109
+
110
+ $curlOptions[CURLOPT_CUSTOMREQUEST] = $method;
111
+
112
+ // Handle sending raw bodies in a request
113
+ if ($request->getBody()) {
114
+ // You can send the body as a string using curl's CURLOPT_POSTFIELDS
115
+ if ($bodyAsString) {
116
+ $curlOptions[CURLOPT_POSTFIELDS] = (string) $request->getBody();
117
+ // Allow curl to add the Content-Length for us to account for the times when
118
+ // POST redirects are followed by GET requests
119
+ if ($tempContentLength = $request->getHeader('Content-Length')) {
120
+ $tempContentLength = (int) (string) $tempContentLength;
121
+ }
122
+ // Remove the curl generated Content-Type header if none was set manually
123
+ if (!$request->hasHeader('Content-Type')) {
124
+ $curlOptions[CURLOPT_HTTPHEADER][] = 'Content-Type:';
125
+ }
126
+ } else {
127
+ $curlOptions[CURLOPT_UPLOAD] = true;
128
+ // Let cURL handle setting the Content-Length header
129
+ if ($tempContentLength = $request->getHeader('Content-Length')) {
130
+ $tempContentLength = (int) (string) $tempContentLength;
131
+ $curlOptions[CURLOPT_INFILESIZE] = $tempContentLength;
132
+ }
133
+ // Add a callback for curl to read data to send with the request only if a body was specified
134
+ $curlOptions[CURLOPT_READFUNCTION] = array($mediator, 'readRequestBody');
135
+ // Attempt to seek to the start of the stream
136
+ $request->getBody()->seek(0);
137
+ }
138
+
139
+ } else {
140
+
141
+ // Special handling for POST specific fields and files
142
+ $postFields = false;
143
+ if (count($request->getPostFiles())) {
144
+ $postFields = $request->getPostFields()->useUrlEncoding(false)->urlEncode();
145
+ foreach ($request->getPostFiles() as $key => $data) {
146
+ $prefixKeys = count($data) > 1;
147
+ foreach ($data as $index => $file) {
148
+ // Allow multiple files in the same key
149
+ $fieldKey = $prefixKeys ? "{$key}[{$index}]" : $key;
150
+ $postFields[$fieldKey] = $file->getCurlValue();
151
+ }
152
+ }
153
+ } elseif (count($request->getPostFields())) {
154
+ $postFields = (string) $request->getPostFields()->useUrlEncoding(true);
155
+ }
156
+
157
+ if ($postFields !== false) {
158
+ if ($method == 'POST') {
159
+ unset($curlOptions[CURLOPT_CUSTOMREQUEST]);
160
+ $curlOptions[CURLOPT_POST] = true;
161
+ }
162
+ $curlOptions[CURLOPT_POSTFIELDS] = $postFields;
163
+ $request->removeHeader('Content-Length');
164
+ }
165
+ }
166
+
167
+ // If the Expect header is not present, prevent curl from adding it
168
+ if (!$request->hasHeader('Expect')) {
169
+ $curlOptions[CURLOPT_HTTPHEADER][] = 'Expect:';
170
+ }
171
+ }
172
+
173
+ // If a Content-Length header was specified but we want to allow curl to set one for us
174
+ if (null !== $tempContentLength) {
175
+ $request->removeHeader('Content-Length');
176
+ }
177
+
178
+ // Set custom cURL options
179
+ foreach ($requestCurlOptions->toArray() as $key => $value) {
180
+ if (is_numeric($key)) {
181
+ $curlOptions[$key] = $value;
182
+ }
183
+ }
184
+
185
+ // Do not set an Accept header by default
186
+ if (!isset($curlOptions[CURLOPT_ENCODING])) {
187
+ $curlOptions[CURLOPT_HTTPHEADER][] = 'Accept:';
188
+ }
189
+
190
+ // Add any custom headers to the request. Empty headers will cause curl to not send the header at all.
191
+ foreach ($request->getHeaderLines() as $line) {
192
+ $curlOptions[CURLOPT_HTTPHEADER][] = $line;
193
+ }
194
+
195
+ // Add the content-length header back if it was temporarily removed
196
+ if (null !== $tempContentLength) {
197
+ $request->setHeader('Content-Length', $tempContentLength);
198
+ }
199
+
200
+ // Apply the options to a new cURL handle.
201
+ $handle = curl_init();
202
+
203
+ // Enable the progress function if the 'progress' param was set
204
+ if ($requestCurlOptions->get('progress')) {
205
+ // Wrap the function in a function that provides the curl handle to the mediator's progress function
206
+ // Using this rather than injecting the handle into the mediator prevents a circular reference
207
+ $curlOptions[CURLOPT_PROGRESSFUNCTION] = function () use ($mediator, $handle) {
208
+ $args = func_get_args();
209
+ $args[] = $handle;
210
+
211
+ // PHP 5.5 pushed the handle onto the start of the args
212
+ if (is_resource($args[0])) {
213
+ array_shift($args);
214
+ }
215
+
216
+ call_user_func_array(array($mediator, 'progress'), $args);
217
+ };
218
+ $curlOptions[CURLOPT_NOPROGRESS] = false;
219
+ }
220
+
221
+ curl_setopt_array($handle, $curlOptions);
222
+
223
+ return new static($handle, $curlOptions);
224
+ }
225
+
226
+ /**
227
+ * Construct a new CurlHandle object that wraps a cURL handle
228
+ *
229
+ * @param resource $handle Configured cURL handle resource
230
+ * @param Collection|array $options Curl options to use with the handle
231
+ *
232
+ * @throws InvalidArgumentException
233
+ */
234
+ public function __construct($handle, $options)
235
+ {
236
+ if (!is_resource($handle)) {
237
+ throw new InvalidArgumentException('Invalid handle provided');
238
+ }
239
+ if (is_array($options)) {
240
+ $this->options = new Collection($options);
241
+ } elseif ($options instanceof Collection) {
242
+ $this->options = $options;
243
+ } else {
244
+ throw new InvalidArgumentException('Expected array or Collection');
245
+ }
246
+ $this->handle = $handle;
247
+ }
248
+
249
+ /**
250
+ * Destructor
251
+ */
252
+ public function __destruct()
253
+ {
254
+ $this->close();
255
+ }
256
+
257
+ /**
258
+ * Close the curl handle
259
+ */
260
+ public function close()
261
+ {
262
+ if (is_resource($this->handle)) {
263
+ curl_close($this->handle);
264
+ }
265
+ $this->handle = null;
266
+ }
267
+
268
+ /**
269
+ * Check if the handle is available and still OK
270
+ *
271
+ * @return bool
272
+ */
273
+ public function isAvailable()
274
+ {
275
+ return is_resource($this->handle);
276
+ }
277
+
278
+ /**
279
+ * Get the last error that occurred on the cURL handle
280
+ *
281
+ * @return string
282
+ */
283
+ public function getError()
284
+ {
285
+ return $this->isAvailable() ? curl_error($this->handle) : '';
286
+ }
287
+
288
+ /**
289
+ * Get the last error number that occurred on the cURL handle
290
+ *
291
+ * @return int
292
+ */
293
+ public function getErrorNo()
294
+ {
295
+ if ($this->errorNo) {
296
+ return $this->errorNo;
297
+ }
298
+
299
+ return $this->isAvailable() ? curl_errno($this->handle) : CURLE_OK;
300
+ }
301
+
302
+ /**
303
+ * Set the curl error number
304
+ *
305
+ * @param int $error Error number to set
306
+ *
307
+ * @return CurlHandle
308
+ */
309
+ public function setErrorNo($error)
310
+ {
311
+ $this->errorNo = $error;
312
+
313
+ return $this;
314
+ }
315
+
316
+ /**
317
+ * Get cURL curl_getinfo data
318
+ *
319
+ * @param int $option Option to retrieve. Pass null to retrieve all data as an array.
320
+ *
321
+ * @return array|mixed
322
+ */
323
+ public function getInfo($option = null)
324
+ {
325
+ if (!is_resource($this->handle)) {
326
+ return null;
327
+ }
328
+
329
+ if (null !== $option) {
330
+ return curl_getinfo($this->handle, $option) ?: null;
331
+ }
332
+
333
+ return curl_getinfo($this->handle) ?: array();
334
+ }
335
+
336
+ /**
337
+ * Get the stderr output
338
+ *
339
+ * @param bool $asResource Set to TRUE to get an fopen resource
340
+ *
341
+ * @return string|resource|null
342
+ */
343
+ public function getStderr($asResource = false)
344
+ {
345
+ $stderr = $this->getOptions()->get(CURLOPT_STDERR);
346
+ if (!$stderr) {
347
+ return null;
348
+ }
349
+
350
+ if ($asResource) {
351
+ return $stderr;
352
+ }
353
+
354
+ fseek($stderr, 0);
355
+ $e = stream_get_contents($stderr);
356
+ fseek($stderr, 0, SEEK_END);
357
+
358
+ return $e;
359
+ }
360
+
361
+ /**
362
+ * Get the URL that this handle is connecting to
363
+ *
364
+ * @return Url
365
+ */
366
+ public function getUrl()
367
+ {
368
+ return Url::factory($this->options->get(CURLOPT_URL));
369
+ }
370
+
371
+ /**
372
+ * Get the wrapped curl handle
373
+ *
374
+ * @return resource|null Returns the cURL handle or null if it was closed
375
+ */
376
+ public function getHandle()
377
+ {
378
+ return $this->isAvailable() ? $this->handle : null;
379
+ }
380
+
381
+ /**
382
+ * Get the cURL setopt options of the handle. Changing values in the return object will have no effect on the curl
383
+ * handle after it is created.
384
+ *
385
+ * @return Collection
386
+ */
387
+ public function getOptions()
388
+ {
389
+ return $this->options;
390
+ }
391
+
392
+ /**
393
+ * Update a request based on the log messages of the CurlHandle
394
+ *
395
+ * @param RequestInterface $request Request to update
396
+ */
397
+ public function updateRequestFromTransfer(RequestInterface $request)
398
+ {
399
+ if (!$request->getResponse()) {
400
+ return;
401
+ }
402
+
403
+ // Update the transfer stats of the response
404
+ $request->getResponse()->setInfo($this->getInfo());
405
+
406
+ if (!$log = $this->getStderr(true)) {
407
+ return;
408
+ }
409
+
410
+ // Parse the cURL stderr output for outgoing requests
411
+ $headers = '';
412
+ fseek($log, 0);
413
+ while (($line = fgets($log)) !== false) {
414
+ if ($line && $line[0] == '>') {
415
+ $headers = substr(trim($line), 2) . "\r\n";
416
+ while (($line = fgets($log)) !== false) {
417
+ if ($line[0] == '*' || $line[0] == '<') {
418
+ break;
419
+ } else {
420
+ $headers .= trim($line) . "\r\n";
421
+ }
422
+ }
423
+ }
424
+ }
425
+
426
+ // Add request headers to the request exactly as they were sent
427
+ if ($headers) {
428
+ $parsed = ParserRegistry::getInstance()->getParser('message')->parseRequest($headers);
429
+ if (!empty($parsed['headers'])) {
430
+ $request->setHeaders(array());
431
+ foreach ($parsed['headers'] as $name => $value) {
432
+ $request->setHeader($name, $value);
433
+ }
434
+ }
435
+ if (!empty($parsed['version'])) {
436
+ $request->setProtocolVersion($parsed['version']);
437
+ }
438
+ }
439
+ }
440
+
441
+ /**
442
+ * Parse the config and replace curl.* configurators into the constant based values so it can be used elsewhere
443
+ *
444
+ * @param array|Collection $config The configuration we want to parse
445
+ *
446
+ * @return array
447
+ */
448
+ public static function parseCurlConfig($config)
449
+ {
450
+ $curlOptions = array();
451
+ foreach ($config as $key => $value) {
452
+ if (is_string($key) && defined($key)) {
453
+ // Convert constants represented as string to constant int values
454
+ $key = constant($key);
455
+ }
456
+ if (is_string($value) && defined($value)) {
457
+ $value = constant($value);
458
+ }
459
+ $curlOptions[$key] = $value;
460
+ }
461
+
462
+ return $curlOptions;
463
+ }
464
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php ADDED
@@ -0,0 +1,423 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Curl;
4
+
5
+ use Guzzle\Common\AbstractHasDispatcher;
6
+ use Guzzle\Common\Event;
7
+ use Guzzle\Http\Exception\MultiTransferException;
8
+ use Guzzle\Http\Exception\CurlException;
9
+ use Guzzle\Http\Message\RequestInterface;
10
+ use Guzzle\Http\Message\EntityEnclosingRequestInterface;
11
+ use Guzzle\Http\Exception\RequestException;
12
+
13
+ /**
14
+ * Send {@see RequestInterface} objects in parallel using curl_multi
15
+ */
16
+ class CurlMulti extends AbstractHasDispatcher implements CurlMultiInterface
17
+ {
18
+ /** @var resource cURL multi handle. */
19
+ protected $multiHandle;
20
+
21
+ /** @var array Attached {@see RequestInterface} objects. */
22
+ protected $requests;
23
+
24
+ /** @var \SplObjectStorage RequestInterface to CurlHandle hash */
25
+ protected $handles;
26
+
27
+ /** @var array Hash mapping curl handle resource IDs to request objects */
28
+ protected $resourceHash;
29
+
30
+ /** @var array Queued exceptions */
31
+ protected $exceptions = array();
32
+
33
+ /** @var array Requests that succeeded */
34
+ protected $successful = array();
35
+
36
+ /** @var array cURL multi error values and codes */
37
+ protected $multiErrors = array(
38
+ CURLM_BAD_HANDLE => array('CURLM_BAD_HANDLE', 'The passed-in handle is not a valid CURLM handle.'),
39
+ CURLM_BAD_EASY_HANDLE => array('CURLM_BAD_EASY_HANDLE', "An easy handle was not good/valid. It could mean that it isn't an easy handle at all, or possibly that the handle already is in used by this or another multi handle."),
40
+ CURLM_OUT_OF_MEMORY => array('CURLM_OUT_OF_MEMORY', 'You are doomed.'),
41
+ CURLM_INTERNAL_ERROR => array('CURLM_INTERNAL_ERROR', 'This can only be returned if libcurl bugs. Please report it to us!')
42
+ );
43
+
44
+ /** @var float */
45
+ protected $selectTimeout;
46
+
47
+ public function __construct($selectTimeout = 1.0)
48
+ {
49
+ $this->selectTimeout = $selectTimeout;
50
+ $this->multiHandle = curl_multi_init();
51
+ // @codeCoverageIgnoreStart
52
+ if ($this->multiHandle === false) {
53
+ throw new CurlException('Unable to create multi handle');
54
+ }
55
+ // @codeCoverageIgnoreEnd
56
+ $this->reset();
57
+ }
58
+
59
+ public function __destruct()
60
+ {
61
+ if (is_resource($this->multiHandle)) {
62
+ curl_multi_close($this->multiHandle);
63
+ }
64
+ }
65
+
66
+ public function add(RequestInterface $request)
67
+ {
68
+ $this->requests[] = $request;
69
+ // If requests are currently transferring and this is async, then the
70
+ // request must be prepared now as the send() method is not called.
71
+ $this->beforeSend($request);
72
+ $this->dispatch(self::ADD_REQUEST, array('request' => $request));
73
+
74
+ return $this;
75
+ }
76
+
77
+ public function all()
78
+ {
79
+ return $this->requests;
80
+ }
81
+
82
+ public function remove(RequestInterface $request)
83
+ {
84
+ $this->removeHandle($request);
85
+ if (($index = array_search($request, $this->requests, true)) !== false) {
86
+ $request = $this->requests[$index];
87
+ unset($this->requests[$index]);
88
+ $this->requests = array_values($this->requests);
89
+ $this->dispatch(self::REMOVE_REQUEST, array('request' => $request));
90
+ return true;
91
+ }
92
+
93
+ return false;
94
+ }
95
+
96
+ public function reset($hard = false)
97
+ {
98
+ // Remove each request
99
+ if ($this->requests) {
100
+ foreach ($this->requests as $request) {
101
+ $this->remove($request);
102
+ }
103
+ }
104
+
105
+ $this->handles = new \SplObjectStorage();
106
+ $this->requests = $this->resourceHash = $this->exceptions = $this->successful = array();
107
+ }
108
+
109
+ public function send()
110
+ {
111
+ $this->perform();
112
+ $exceptions = $this->exceptions;
113
+ $successful = $this->successful;
114
+ $this->reset();
115
+
116
+ if ($exceptions) {
117
+ $this->throwMultiException($exceptions, $successful);
118
+ }
119
+ }
120
+
121
+ public function count()
122
+ {
123
+ return count($this->requests);
124
+ }
125
+
126
+ /**
127
+ * Build and throw a MultiTransferException
128
+ *
129
+ * @param array $exceptions Exceptions encountered
130
+ * @param array $successful Successful requests
131
+ * @throws MultiTransferException
132
+ */
133
+ protected function throwMultiException(array $exceptions, array $successful)
134
+ {
135
+ $multiException = new MultiTransferException('Errors during multi transfer');
136
+
137
+ while ($e = array_shift($exceptions)) {
138
+ $multiException->addFailedRequestWithException($e['request'], $e['exception']);
139
+ }
140
+
141
+ // Add successful requests
142
+ foreach ($successful as $request) {
143
+ if (!$multiException->containsRequest($request)) {
144
+ $multiException->addSuccessfulRequest($request);
145
+ }
146
+ }
147
+
148
+ throw $multiException;
149
+ }
150
+
151
+ /**
152
+ * Prepare for sending
153
+ *
154
+ * @param RequestInterface $request Request to prepare
155
+ * @throws \Exception on error preparing the request
156
+ */
157
+ protected function beforeSend(RequestInterface $request)
158
+ {
159
+ try {
160
+ $state = $request->setState(RequestInterface::STATE_TRANSFER);
161
+ if ($state == RequestInterface::STATE_TRANSFER) {
162
+ $this->addHandle($request);
163
+ } else {
164
+ // Requests might decide they don't need to be sent just before
165
+ // transfer (e.g. CachePlugin)
166
+ $this->remove($request);
167
+ if ($state == RequestInterface::STATE_COMPLETE) {
168
+ $this->successful[] = $request;
169
+ }
170
+ }
171
+ } catch (\Exception $e) {
172
+ // Queue the exception to be thrown when sent
173
+ $this->removeErroredRequest($request, $e);
174
+ }
175
+ }
176
+
177
+ private function addHandle(RequestInterface $request)
178
+ {
179
+ $handle = $this->createCurlHandle($request)->getHandle();
180
+ $this->checkCurlResult(
181
+ curl_multi_add_handle($this->multiHandle, $handle)
182
+ );
183
+ }
184
+
185
+ /**
186
+ * Create a curl handle for a request
187
+ *
188
+ * @param RequestInterface $request Request
189
+ *
190
+ * @return CurlHandle
191
+ */
192
+ protected function createCurlHandle(RequestInterface $request)
193
+ {
194
+ $wrapper = CurlHandle::factory($request);
195
+ $this->handles[$request] = $wrapper;
196
+ $this->resourceHash[(int) $wrapper->getHandle()] = $request;
197
+
198
+ return $wrapper;
199
+ }
200
+
201
+ /**
202
+ * Get the data from the multi handle
203
+ */
204
+ protected function perform()
205
+ {
206
+ $event = new Event(array('curl_multi' => $this));
207
+
208
+ while ($this->requests) {
209
+ // Notify each request as polling
210
+ $blocking = $total = 0;
211
+ foreach ($this->requests as $request) {
212
+ ++$total;
213
+ $event['request'] = $request;
214
+ $request->getEventDispatcher()->dispatch(self::POLLING_REQUEST, $event);
215
+ // The blocking variable just has to be non-falsey to block the loop
216
+ if ($request->getParams()->hasKey(self::BLOCKING)) {
217
+ ++$blocking;
218
+ }
219
+ }
220
+ if ($blocking == $total) {
221
+ // Sleep to prevent eating CPU because no requests are actually pending a select call
222
+ usleep(500);
223
+ } else {
224
+ $this->executeHandles();
225
+ }
226
+ }
227
+ }
228
+
229
+ /**
230
+ * Execute and select curl handles
231
+ */
232
+ private function executeHandles()
233
+ {
234
+ // The first curl_multi_select often times out no matter what, but is usually required for fast transfers
235
+ $selectTimeout = 0.001;
236
+ $active = false;
237
+ do {
238
+ while (($mrc = curl_multi_exec($this->multiHandle, $active)) == CURLM_CALL_MULTI_PERFORM);
239
+ $this->checkCurlResult($mrc);
240
+ $this->processMessages();
241
+ if ($active && curl_multi_select($this->multiHandle, $selectTimeout) === -1) {
242
+ // Perform a usleep if a select returns -1: https://bugs.php.net/bug.php?id=61141
243
+ usleep(150);
244
+ }
245
+ $selectTimeout = $this->selectTimeout;
246
+ } while ($active);
247
+ }
248
+
249
+ /**
250
+ * Process any received curl multi messages
251
+ */
252
+ private function processMessages()
253
+ {
254
+ while ($done = curl_multi_info_read($this->multiHandle)) {
255
+ $request = $this->resourceHash[(int) $done['handle']];
256
+ try {
257
+ $this->processResponse($request, $this->handles[$request], $done);
258
+ $this->successful[] = $request;
259
+ } catch (\Exception $e) {
260
+ $this->removeErroredRequest($request, $e);
261
+ }
262
+ }
263
+ }
264
+
265
+ /**
266
+ * Remove a request that encountered an exception
267
+ *
268
+ * @param RequestInterface $request Request to remove
269
+ * @param \Exception $e Exception encountered
270
+ */
271
+ protected function removeErroredRequest(RequestInterface $request, \Exception $e = null)
272
+ {
273
+ $this->exceptions[] = array('request' => $request, 'exception' => $e);
274
+ $this->remove($request);
275
+ $this->dispatch(self::MULTI_EXCEPTION, array('exception' => $e, 'all_exceptions' => $this->exceptions));
276
+ }
277
+
278
+ /**
279
+ * Check for errors and fix headers of a request based on a curl response
280
+ *
281
+ * @param RequestInterface $request Request to process
282
+ * @param CurlHandle $handle Curl handle object
283
+ * @param array $curl Array returned from curl_multi_info_read
284
+ *
285
+ * @throws CurlException on Curl error
286
+ */
287
+ protected function processResponse(RequestInterface $request, CurlHandle $handle, array $curl)
288
+ {
289
+ // Set the transfer stats on the response
290
+ $handle->updateRequestFromTransfer($request);
291
+ // Check if a cURL exception occurred, and if so, notify things
292
+ $curlException = $this->isCurlException($request, $handle, $curl);
293
+
294
+ // Always remove completed curl handles. They can be added back again
295
+ // via events if needed (e.g. ExponentialBackoffPlugin)
296
+ $this->removeHandle($request);
297
+
298
+ if (!$curlException) {
299
+ if ($this->validateResponseWasSet($request)) {
300
+ $state = $request->setState(
301
+ RequestInterface::STATE_COMPLETE,
302
+ array('handle' => $handle)
303
+ );
304
+ // Only remove the request if it wasn't resent as a result of
305
+ // the state change
306
+ if ($state != RequestInterface::STATE_TRANSFER) {
307
+ $this->remove($request);
308
+ }
309
+ }
310
+ return;
311
+ }
312
+
313
+ // Set the state of the request to an error
314
+ $state = $request->setState(RequestInterface::STATE_ERROR, array('exception' => $curlException));
315
+ // Allow things to ignore the error if possible
316
+ if ($state != RequestInterface::STATE_TRANSFER) {
317
+ $this->remove($request);
318
+ }
319
+
320
+ // The error was not handled, so fail
321
+ if ($state == RequestInterface::STATE_ERROR) {
322
+ /** @var CurlException $curlException */
323
+ throw $curlException;
324
+ }
325
+ }
326
+
327
+ /**
328
+ * Remove a curl handle from the curl multi object
329
+ *
330
+ * @param RequestInterface $request Request that owns the handle
331
+ */
332
+ protected function removeHandle(RequestInterface $request)
333
+ {
334
+ if (isset($this->handles[$request])) {
335
+ $handle = $this->handles[$request];
336
+ curl_multi_remove_handle($this->multiHandle, $handle->getHandle());
337
+ unset($this->handles[$request]);
338
+ unset($this->resourceHash[(int) $handle->getHandle()]);
339
+ $handle->close();
340
+ }
341
+ }
342
+
343
+ /**
344
+ * Check if a cURL transfer resulted in what should be an exception
345
+ *
346
+ * @param RequestInterface $request Request to check
347
+ * @param CurlHandle $handle Curl handle object
348
+ * @param array $curl Array returned from curl_multi_info_read
349
+ *
350
+ * @return CurlException|bool
351
+ */
352
+ private function isCurlException(RequestInterface $request, CurlHandle $handle, array $curl)
353
+ {
354
+ if (CURLM_OK == $curl['result'] || CURLM_CALL_MULTI_PERFORM == $curl['result']) {
355
+ return false;
356
+ }
357
+
358
+ $handle->setErrorNo($curl['result']);
359
+ $e = new CurlException(sprintf('[curl] %s: %s [url] %s',
360
+ $handle->getErrorNo(), $handle->getError(), $handle->getUrl()));
361
+ $e->setCurlHandle($handle)
362
+ ->setRequest($request)
363
+ ->setCurlInfo($handle->getInfo())
364
+ ->setError($handle->getError(), $handle->getErrorNo());
365
+
366
+ return $e;
367
+ }
368
+
369
+ /**
370
+ * Throw an exception for a cURL multi response if needed
371
+ *
372
+ * @param int $code Curl response code
373
+ * @throws CurlException
374
+ */
375
+ private function checkCurlResult($code)
376
+ {
377
+ if ($code != CURLM_OK && $code != CURLM_CALL_MULTI_PERFORM) {
378
+ throw new CurlException(isset($this->multiErrors[$code])
379
+ ? "cURL error: {$code} ({$this->multiErrors[$code][0]}): cURL message: {$this->multiErrors[$code][1]}"
380
+ : 'Unexpected cURL error: ' . $code
381
+ );
382
+ }
383
+ }
384
+
385
+ /**
386
+ * @link https://github.com/guzzle/guzzle/issues/710
387
+ */
388
+ private function validateResponseWasSet(RequestInterface $request)
389
+ {
390
+ if ($request->getResponse()) {
391
+ return true;
392
+ }
393
+
394
+ $body = $request instanceof EntityEnclosingRequestInterface
395
+ ? $request->getBody()
396
+ : null;
397
+
398
+ if (!$body) {
399
+ $rex = new RequestException(
400
+ 'No response was received for a request with no body. This'
401
+ . ' could mean that you are saturating your network.'
402
+ );
403
+ $rex->setRequest($request);
404
+ $this->removeErroredRequest($request, $rex);
405
+ } elseif (!$body->isSeekable() || !$body->seek(0)) {
406
+ // Nothing we can do with this. Sorry!
407
+ $rex = new RequestException(
408
+ 'The connection was unexpectedly closed. The request would'
409
+ . ' have been retried, but attempting to rewind the'
410
+ . ' request body failed.'
411
+ );
412
+ $rex->setRequest($request);
413
+ $this->removeErroredRequest($request, $rex);
414
+ } else {
415
+ $this->remove($request);
416
+ // Add the request back to the batch to retry automatically.
417
+ $this->requests[] = $request;
418
+ $this->addHandle($request);
419
+ }
420
+
421
+ return false;
422
+ }
423
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiInterface.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Curl;
4
+
5
+ use Guzzle\Common\HasDispatcherInterface;
6
+ use Guzzle\Common\Exception\ExceptionCollection;
7
+ use Guzzle\Http\Message\RequestInterface;
8
+
9
+ /**
10
+ * Interface for sending a pool of {@see RequestInterface} objects in parallel
11
+ */
12
+ interface CurlMultiInterface extends \Countable, HasDispatcherInterface
13
+ {
14
+ const POLLING_REQUEST = 'curl_multi.polling_request';
15
+ const ADD_REQUEST = 'curl_multi.add_request';
16
+ const REMOVE_REQUEST = 'curl_multi.remove_request';
17
+ const MULTI_EXCEPTION = 'curl_multi.exception';
18
+ const BLOCKING = 'curl_multi.blocking';
19
+
20
+ /**
21
+ * Add a request to the pool.
22
+ *
23
+ * @param RequestInterface $request Request to add
24
+ *
25
+ * @return CurlMultiInterface
26
+ */
27
+ public function add(RequestInterface $request);
28
+
29
+ /**
30
+ * Get an array of attached {@see RequestInterface} objects
31
+ *
32
+ * @return array
33
+ */
34
+ public function all();
35
+
36
+ /**
37
+ * Remove a request from the pool.
38
+ *
39
+ * @param RequestInterface $request Request to remove
40
+ *
41
+ * @return bool Returns true on success or false on failure
42
+ */
43
+ public function remove(RequestInterface $request);
44
+
45
+ /**
46
+ * Reset the state and remove any attached RequestInterface objects
47
+ *
48
+ * @param bool $hard Set to true to close and reopen any open multi handles
49
+ */
50
+ public function reset($hard = false);
51
+
52
+ /**
53
+ * Send a pool of {@see RequestInterface} requests.
54
+ *
55
+ * @throws ExceptionCollection if any requests threw exceptions during the transfer.
56
+ */
57
+ public function send();
58
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiProxy.php ADDED
@@ -0,0 +1,150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Curl;
4
+
5
+ use Guzzle\Common\AbstractHasDispatcher;
6
+ use Guzzle\Http\Message\RequestInterface;
7
+
8
+ /**
9
+ * Proxies requests and connections to a pool of internal curl_multi handles. Each recursive call will add requests
10
+ * to the next available CurlMulti handle.
11
+ */
12
+ class CurlMultiProxy extends AbstractHasDispatcher implements CurlMultiInterface
13
+ {
14
+ protected $handles = array();
15
+ protected $groups = array();
16
+ protected $queued = array();
17
+ protected $maxHandles;
18
+ protected $selectTimeout;
19
+
20
+ /**
21
+ * @param int $maxHandles The maximum number of idle CurlMulti handles to allow to remain open
22
+ * @param float $selectTimeout timeout for curl_multi_select
23
+ */
24
+ public function __construct($maxHandles = 3, $selectTimeout = 1.0)
25
+ {
26
+ $this->maxHandles = $maxHandles;
27
+ $this->selectTimeout = $selectTimeout;
28
+ // You can get some weird "Too many open files" errors when sending a large amount of requests in parallel.
29
+ // These two statements autoload classes before a system runs out of file descriptors so that you can get back
30
+ // valuable error messages if you run out.
31
+ class_exists('Guzzle\Http\Message\Response');
32
+ class_exists('Guzzle\Http\Exception\CurlException');
33
+ }
34
+
35
+ public function add(RequestInterface $request)
36
+ {
37
+ $this->queued[] = $request;
38
+
39
+ return $this;
40
+ }
41
+
42
+ public function all()
43
+ {
44
+ $requests = $this->queued;
45
+ foreach ($this->handles as $handle) {
46
+ $requests = array_merge($requests, $handle->all());
47
+ }
48
+
49
+ return $requests;
50
+ }
51
+
52
+ public function remove(RequestInterface $request)
53
+ {
54
+ foreach ($this->queued as $i => $r) {
55
+ if ($request === $r) {
56
+ unset($this->queued[$i]);
57
+ return true;
58
+ }
59
+ }
60
+
61
+ foreach ($this->handles as $handle) {
62
+ if ($handle->remove($request)) {
63
+ return true;
64
+ }
65
+ }
66
+
67
+ return false;
68
+ }
69
+
70
+ public function reset($hard = false)
71
+ {
72
+ $this->queued = array();
73
+ $this->groups = array();
74
+ foreach ($this->handles as $handle) {
75
+ $handle->reset();
76
+ }
77
+ if ($hard) {
78
+ $this->handles = array();
79
+ }
80
+
81
+ return $this;
82
+ }
83
+
84
+ public function send()
85
+ {
86
+ if ($this->queued) {
87
+ $group = $this->getAvailableHandle();
88
+ // Add this handle to a list of handles than is claimed
89
+ $this->groups[] = $group;
90
+ while ($request = array_shift($this->queued)) {
91
+ $group->add($request);
92
+ }
93
+ try {
94
+ $group->send();
95
+ array_pop($this->groups);
96
+ $this->cleanupHandles();
97
+ } catch (\Exception $e) {
98
+ // Remove the group and cleanup if an exception was encountered and no more requests in group
99
+ if (!$group->count()) {
100
+ array_pop($this->groups);
101
+ $this->cleanupHandles();
102
+ }
103
+ throw $e;
104
+ }
105
+ }
106
+ }
107
+
108
+ public function count()
109
+ {
110
+ return count($this->all());
111
+ }
112
+
113
+ /**
114
+ * Get an existing available CurlMulti handle or create a new one
115
+ *
116
+ * @return CurlMulti
117
+ */
118
+ protected function getAvailableHandle()
119
+ {
120
+ // Grab a handle that is not claimed
121
+ foreach ($this->handles as $h) {
122
+ if (!in_array($h, $this->groups, true)) {
123
+ return $h;
124
+ }
125
+ }
126
+
127
+ // All are claimed, so create one
128
+ $handle = new CurlMulti($this->selectTimeout);
129
+ $handle->setEventDispatcher($this->getEventDispatcher());
130
+ $this->handles[] = $handle;
131
+
132
+ return $handle;
133
+ }
134
+
135
+ /**
136
+ * Trims down unused CurlMulti handles to limit the number of open connections
137
+ */
138
+ protected function cleanupHandles()
139
+ {
140
+ if ($diff = max(0, count($this->handles) - $this->maxHandles)) {
141
+ for ($i = count($this->handles) - 1; $i > 0 && $diff > 0; $i--) {
142
+ if (!count($this->handles[$i])) {
143
+ unset($this->handles[$i]);
144
+ $diff--;
145
+ }
146
+ }
147
+ $this->handles = array_values($this->handles);
148
+ }
149
+ }
150
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlVersion.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Curl;
4
+
5
+ /**
6
+ * Class used for querying curl_version data
7
+ */
8
+ class CurlVersion
9
+ {
10
+ /** @var array curl_version() information */
11
+ protected $version;
12
+
13
+ /** @var CurlVersion */
14
+ protected static $instance;
15
+
16
+ /** @var string Default user agent */
17
+ protected $userAgent;
18
+
19
+ /**
20
+ * @return CurlVersion
21
+ */
22
+ public static function getInstance()
23
+ {
24
+ if (!self::$instance) {
25
+ self::$instance = new self();
26
+ }
27
+
28
+ return self::$instance;
29
+ }
30
+
31
+ /**
32
+ * Get all of the curl_version() data
33
+ *
34
+ * @return array
35
+ */
36
+ public function getAll()
37
+ {
38
+ if (!$this->version) {
39
+ $this->version = curl_version();
40
+ }
41
+
42
+ return $this->version;
43
+ }
44
+
45
+ /**
46
+ * Get a specific type of curl information
47
+ *
48
+ * @param string $type Version information to retrieve. This value is one of:
49
+ * - version_number: cURL 24 bit version number
50
+ * - version: cURL version number, as a string
51
+ * - ssl_version_number: OpenSSL 24 bit version number
52
+ * - ssl_version: OpenSSL version number, as a string
53
+ * - libz_version: zlib version number, as a string
54
+ * - host: Information about the host where cURL was built
55
+ * - features: A bitmask of the CURL_VERSION_XXX constants
56
+ * - protocols: An array of protocols names supported by cURL
57
+ *
58
+ * @return string|float|bool if the $type is found, and false if not found
59
+ */
60
+ public function get($type)
61
+ {
62
+ $version = $this->getAll();
63
+
64
+ return isset($version[$type]) ? $version[$type] : false;
65
+ }
66
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/RequestMediator.php ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Curl;
4
+
5
+ use Guzzle\Http\Message\RequestInterface;
6
+ use Guzzle\Http\EntityBody;
7
+ use Guzzle\Http\Message\Response;
8
+
9
+ /**
10
+ * Mediator between curl handles and request objects
11
+ */
12
+ class RequestMediator
13
+ {
14
+ /** @var RequestInterface */
15
+ protected $request;
16
+
17
+ /** @var bool Whether or not to emit read/write events */
18
+ protected $emitIo;
19
+
20
+ /**
21
+ * @param RequestInterface $request Request to mediate
22
+ * @param bool $emitIo Set to true to dispatch events on input and output
23
+ */
24
+ public function __construct(RequestInterface $request, $emitIo = false)
25
+ {
26
+ $this->request = $request;
27
+ $this->emitIo = $emitIo;
28
+ }
29
+
30
+ /**
31
+ * Receive a response header from curl
32
+ *
33
+ * @param resource $curl Curl handle
34
+ * @param string $header Received header
35
+ *
36
+ * @return int
37
+ */
38
+ public function receiveResponseHeader($curl, $header)
39
+ {
40
+ static $normalize = array("\r", "\n");
41
+ $length = strlen($header);
42
+ $header = str_replace($normalize, '', $header);
43
+
44
+ if (strpos($header, 'HTTP/') === 0) {
45
+
46
+ $startLine = explode(' ', $header, 3);
47
+ $code = $startLine[1];
48
+ $status = isset($startLine[2]) ? $startLine[2] : '';
49
+
50
+ // Only download the body of the response to the specified response
51
+ // body when a successful response is received.
52
+ if ($code >= 200 && $code < 300) {
53
+ $body = $this->request->getResponseBody();
54
+ } else {
55
+ $body = EntityBody::factory();
56
+ }
57
+
58
+ $response = new Response($code, null, $body);
59
+ $response->setStatus($code, $status);
60
+ $this->request->startResponse($response);
61
+
62
+ $this->request->dispatch('request.receive.status_line', array(
63
+ 'request' => $this,
64
+ 'line' => $header,
65
+ 'status_code' => $code,
66
+ 'reason_phrase' => $status
67
+ ));
68
+
69
+ } elseif ($pos = strpos($header, ':')) {
70
+ $this->request->getResponse()->addHeader(
71
+ trim(substr($header, 0, $pos)),
72
+ trim(substr($header, $pos + 1))
73
+ );
74
+ }
75
+
76
+ return $length;
77
+ }
78
+
79
+ /**
80
+ * Received a progress notification
81
+ *
82
+ * @param int $downloadSize Total download size
83
+ * @param int $downloaded Amount of bytes downloaded
84
+ * @param int $uploadSize Total upload size
85
+ * @param int $uploaded Amount of bytes uploaded
86
+ * @param resource $handle CurlHandle object
87
+ */
88
+ public function progress($downloadSize, $downloaded, $uploadSize, $uploaded, $handle = null)
89
+ {
90
+ $this->request->dispatch('curl.callback.progress', array(
91
+ 'request' => $this->request,
92
+ 'handle' => $handle,
93
+ 'download_size' => $downloadSize,
94
+ 'downloaded' => $downloaded,
95
+ 'upload_size' => $uploadSize,
96
+ 'uploaded' => $uploaded
97
+ ));
98
+ }
99
+
100
+ /**
101
+ * Write data to the response body of a request
102
+ *
103
+ * @param resource $curl Curl handle
104
+ * @param string $write Data that was received
105
+ *
106
+ * @return int
107
+ */
108
+ public function writeResponseBody($curl, $write)
109
+ {
110
+ if ($this->emitIo) {
111
+ $this->request->dispatch('curl.callback.write', array(
112
+ 'request' => $this->request,
113
+ 'write' => $write
114
+ ));
115
+ }
116
+
117
+ if ($response = $this->request->getResponse()) {
118
+ return $response->getBody()->write($write);
119
+ } else {
120
+ // Unexpected data received before response headers - abort transfer
121
+ return 0;
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Read data from the request body and send it to curl
127
+ *
128
+ * @param resource $ch Curl handle
129
+ * @param resource $fd File descriptor
130
+ * @param int $length Amount of data to read
131
+ *
132
+ * @return string
133
+ */
134
+ public function readRequestBody($ch, $fd, $length)
135
+ {
136
+ if (!($body = $this->request->getBody())) {
137
+ return '';
138
+ }
139
+
140
+ $read = (string) $body->read($length);
141
+ if ($this->emitIo) {
142
+ $this->request->dispatch('curl.callback.read', array('request' => $this->request, 'read' => $read));
143
+ }
144
+
145
+ return $read;
146
+ }
147
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/EntityBody.php ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ use Guzzle\Common\Version;
6
+ use Guzzle\Stream\Stream;
7
+ use Guzzle\Common\Exception\InvalidArgumentException;
8
+ use Guzzle\Http\Mimetypes;
9
+
10
+ /**
11
+ * Entity body used with an HTTP request or response
12
+ */
13
+ class EntityBody extends Stream implements EntityBodyInterface
14
+ {
15
+ /** @var bool Content-Encoding of the entity body if known */
16
+ protected $contentEncoding = false;
17
+
18
+ /** @var callable Method to invoke for rewinding a stream */
19
+ protected $rewindFunction;
20
+
21
+ /**
22
+ * Create a new EntityBody based on the input type
23
+ *
24
+ * @param resource|string|EntityBody $resource Entity body data
25
+ * @param int $size Size of the data contained in the resource
26
+ *
27
+ * @return EntityBody
28
+ * @throws InvalidArgumentException if the $resource arg is not a resource or string
29
+ */
30
+ public static function factory($resource = '', $size = null)
31
+ {
32
+ if ($resource instanceof EntityBodyInterface) {
33
+ return $resource;
34
+ }
35
+
36
+ switch (gettype($resource)) {
37
+ case 'string':
38
+ return self::fromString($resource);
39
+ case 'resource':
40
+ return new static($resource, $size);
41
+ case 'object':
42
+ if (method_exists($resource, '__toString')) {
43
+ return self::fromString((string) $resource);
44
+ }
45
+ break;
46
+ case 'array':
47
+ return self::fromString(http_build_query($resource));
48
+ }
49
+
50
+ throw new InvalidArgumentException('Invalid resource type');
51
+ }
52
+
53
+ public function setRewindFunction($callable)
54
+ {
55
+ if (!is_callable($callable)) {
56
+ throw new InvalidArgumentException('Must specify a callable');
57
+ }
58
+
59
+ $this->rewindFunction = $callable;
60
+
61
+ return $this;
62
+ }
63
+
64
+ public function rewind()
65
+ {
66
+ return $this->rewindFunction ? call_user_func($this->rewindFunction, $this) : parent::rewind();
67
+ }
68
+
69
+ /**
70
+ * Create a new EntityBody from a string
71
+ *
72
+ * @param string $string String of data
73
+ *
74
+ * @return EntityBody
75
+ */
76
+ public static function fromString($string)
77
+ {
78
+ $stream = fopen('php://temp', 'r+');
79
+ if ($string !== '') {
80
+ fwrite($stream, $string);
81
+ rewind($stream);
82
+ }
83
+
84
+ return new static($stream);
85
+ }
86
+
87
+ public function compress($filter = 'zlib.deflate')
88
+ {
89
+ $result = $this->handleCompression($filter);
90
+ $this->contentEncoding = $result ? $filter : false;
91
+
92
+ return $result;
93
+ }
94
+
95
+ public function uncompress($filter = 'zlib.inflate')
96
+ {
97
+ $offsetStart = 0;
98
+
99
+ // When inflating gzipped data, the first 10 bytes must be stripped
100
+ // if a gzip header is present
101
+ if ($filter == 'zlib.inflate') {
102
+ // @codeCoverageIgnoreStart
103
+ if (!$this->isReadable() || ($this->isConsumed() && !$this->isSeekable())) {
104
+ return false;
105
+ }
106
+ // @codeCoverageIgnoreEnd
107
+ if (stream_get_contents($this->stream, 3, 0) === "\x1f\x8b\x08") {
108
+ $offsetStart = 10;
109
+ }
110
+ }
111
+
112
+ $this->contentEncoding = false;
113
+
114
+ return $this->handleCompression($filter, $offsetStart);
115
+ }
116
+
117
+ public function getContentLength()
118
+ {
119
+ return $this->getSize();
120
+ }
121
+
122
+ public function getContentType()
123
+ {
124
+ return $this->getUri() ? Mimetypes::getInstance()->fromFilename($this->getUri()) : null;
125
+ }
126
+
127
+ public function getContentMd5($rawOutput = false, $base64Encode = false)
128
+ {
129
+ if ($hash = self::getHash($this, 'md5', $rawOutput)) {
130
+ return $hash && $base64Encode ? base64_encode($hash) : $hash;
131
+ } else {
132
+ return false;
133
+ }
134
+ }
135
+
136
+ /**
137
+ * Calculate the MD5 hash of an entity body
138
+ *
139
+ * @param EntityBodyInterface $body Entity body to calculate the hash for
140
+ * @param bool $rawOutput Whether or not to use raw output
141
+ * @param bool $base64Encode Whether or not to base64 encode raw output (only if raw output is true)
142
+ *
143
+ * @return bool|string Returns an MD5 string on success or FALSE on failure
144
+ * @deprecated This will be deprecated soon
145
+ * @codeCoverageIgnore
146
+ */
147
+ public static function calculateMd5(EntityBodyInterface $body, $rawOutput = false, $base64Encode = false)
148
+ {
149
+ Version::warn(__CLASS__ . ' is deprecated. Use getContentMd5()');
150
+ return $body->getContentMd5($rawOutput, $base64Encode);
151
+ }
152
+
153
+ public function setStreamFilterContentEncoding($streamFilterContentEncoding)
154
+ {
155
+ $this->contentEncoding = $streamFilterContentEncoding;
156
+
157
+ return $this;
158
+ }
159
+
160
+ public function getContentEncoding()
161
+ {
162
+ return strtr($this->contentEncoding, array(
163
+ 'zlib.deflate' => 'gzip',
164
+ 'bzip2.compress' => 'compress'
165
+ )) ?: false;
166
+ }
167
+
168
+ protected function handleCompression($filter, $offsetStart = 0)
169
+ {
170
+ // @codeCoverageIgnoreStart
171
+ if (!$this->isReadable() || ($this->isConsumed() && !$this->isSeekable())) {
172
+ return false;
173
+ }
174
+ // @codeCoverageIgnoreEnd
175
+
176
+ $handle = fopen('php://temp', 'r+');
177
+ $filter = @stream_filter_append($handle, $filter, STREAM_FILTER_WRITE);
178
+ if (!$filter) {
179
+ return false;
180
+ }
181
+
182
+ // Seek to the offset start if possible
183
+ $this->seek($offsetStart);
184
+ while ($data = fread($this->stream, 8096)) {
185
+ fwrite($handle, $data);
186
+ }
187
+
188
+ fclose($this->stream);
189
+ $this->stream = $handle;
190
+ stream_filter_remove($filter);
191
+ $stat = fstat($this->stream);
192
+ $this->size = $stat['size'];
193
+ $this->rebuildCache();
194
+ $this->seek(0);
195
+
196
+ // Remove any existing rewind function as the underlying stream has been replaced
197
+ $this->rewindFunction = null;
198
+
199
+ return true;
200
+ }
201
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/EntityBodyInterface.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ use Guzzle\Stream\StreamInterface;
6
+
7
+ /**
8
+ * Entity body used with an HTTP request or response
9
+ */
10
+ interface EntityBodyInterface extends StreamInterface
11
+ {
12
+ /**
13
+ * Specify a custom callback used to rewind a non-seekable stream. This can be useful entity enclosing requests
14
+ * that are redirected.
15
+ *
16
+ * @param mixed $callable Callable to invoke to rewind a non-seekable stream. The callback must accept an
17
+ * EntityBodyInterface object, perform the rewind if possible, and return a boolean
18
+ * representing whether or not the rewind was successful.
19
+ * @return self
20
+ */
21
+ public function setRewindFunction($callable);
22
+
23
+ /**
24
+ * If the stream is readable, compress the data in the stream using deflate compression. The uncompressed stream is
25
+ * then closed, and the compressed stream then becomes the wrapped stream.
26
+ *
27
+ * @param string $filter Compression filter
28
+ *
29
+ * @return bool Returns TRUE on success or FALSE on failure
30
+ */
31
+ public function compress($filter = 'zlib.deflate');
32
+
33
+ /**
34
+ * Decompress a deflated string. Once uncompressed, the uncompressed string is then used as the wrapped stream.
35
+ *
36
+ * @param string $filter De-compression filter
37
+ *
38
+ * @return bool Returns TRUE on success or FALSE on failure
39
+ */
40
+ public function uncompress($filter = 'zlib.inflate');
41
+
42
+ /**
43
+ * Get the Content-Length of the entity body if possible (alias of getSize)
44
+ *
45
+ * @return int|bool Returns the Content-Length or false on failure
46
+ */
47
+ public function getContentLength();
48
+
49
+ /**
50
+ * Guess the Content-Type of a local stream
51
+ *
52
+ * @return string|null
53
+ * @see http://www.php.net/manual/en/function.finfo-open.php
54
+ */
55
+ public function getContentType();
56
+
57
+ /**
58
+ * Get an MD5 checksum of the stream's contents
59
+ *
60
+ * @param bool $rawOutput Whether or not to use raw output
61
+ * @param bool $base64Encode Whether or not to base64 encode raw output (only if raw output is true)
62
+ *
63
+ * @return bool|string Returns an MD5 string on success or FALSE on failure
64
+ */
65
+ public function getContentMd5($rawOutput = false, $base64Encode = false);
66
+
67
+ /**
68
+ * Get the Content-Encoding of the EntityBody
69
+ *
70
+ * @return bool|string
71
+ */
72
+ public function getContentEncoding();
73
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/BadResponseException.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Exception;
4
+
5
+ use Guzzle\Http\Message\RequestInterface;
6
+ use Guzzle\Http\Message\Response;
7
+
8
+ /**
9
+ * Http request exception thrown when a bad response is received
10
+ */
11
+ class BadResponseException extends RequestException
12
+ {
13
+ /** @var Response */
14
+ private $response;
15
+
16
+ /**
17
+ * Factory method to create a new response exception based on the response code.
18
+ *
19
+ * @param RequestInterface $request Request
20
+ * @param Response $response Response received
21
+ *
22
+ * @return BadResponseException
23
+ */
24
+ public static function factory(RequestInterface $request, Response $response)
25
+ {
26
+ if ($response->isClientError()) {
27
+ $label = 'Client error response';
28
+ $class = __NAMESPACE__ . '\\ClientErrorResponseException';
29
+ } elseif ($response->isServerError()) {
30
+ $label = 'Server error response';
31
+ $class = __NAMESPACE__ . '\\ServerErrorResponseException';
32
+ } else {
33
+ $label = 'Unsuccessful response';
34
+ $class = __CLASS__;
35
+ }
36
+
37
+ $message = $label . PHP_EOL . implode(PHP_EOL, array(
38
+ '[status code] ' . $response->getStatusCode(),
39
+ '[reason phrase] ' . $response->getReasonPhrase(),
40
+ '[url] ' . $request->getUrl(),
41
+ ));
42
+
43
+ $e = new $class($message);
44
+ $e->setResponse($response);
45
+ $e->setRequest($request);
46
+
47
+ return $e;
48
+ }
49
+
50
+ /**
51
+ * Set the response that caused the exception
52
+ *
53
+ * @param Response $response Response to set
54
+ */
55
+ public function setResponse(Response $response)
56
+ {
57
+ $this->response = $response;
58
+ }
59
+
60
+ /**
61
+ * Get the response that caused the exception
62
+ *
63
+ * @return Response
64
+ */
65
+ public function getResponse()
66
+ {
67
+ return $this->response;
68
+ }
69
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/ClientErrorResponseException.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Exception;
4
+
5
+ /**
6
+ * Exception when a client error is encountered (4xx codes)
7
+ */
8
+ class ClientErrorResponseException extends BadResponseException {}
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/CouldNotRewindStreamException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Exception;
4
+
5
+ use Guzzle\Common\Exception\RuntimeException;
6
+
7
+ class CouldNotRewindStreamException extends RuntimeException implements HttpException {}
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/CurlException.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Exception;
4
+
5
+ use Guzzle\Http\Curl\CurlHandle;
6
+
7
+ /**
8
+ * cURL request exception
9
+ */
10
+ class CurlException extends RequestException
11
+ {
12
+ private $curlError;
13
+ private $curlErrorNo;
14
+ private $handle;
15
+ private $curlInfo = array();
16
+
17
+ /**
18
+ * Set the cURL error message
19
+ *
20
+ * @param string $error Curl error
21
+ * @param int $number Curl error number
22
+ *
23
+ * @return self
24
+ */
25
+ public function setError($error, $number)
26
+ {
27
+ $this->curlError = $error;
28
+ $this->curlErrorNo = $number;
29
+
30
+ return $this;
31
+ }
32
+
33
+ /**
34
+ * Set the associated curl handle
35
+ *
36
+ * @param CurlHandle $handle Curl handle
37
+ *
38
+ * @return self
39
+ */
40
+ public function setCurlHandle(CurlHandle $handle)
41
+ {
42
+ $this->handle = $handle;
43
+
44
+ return $this;
45
+ }
46
+
47
+ /**
48
+ * Get the associated cURL handle
49
+ *
50
+ * @return CurlHandle|null
51
+ */
52
+ public function getCurlHandle()
53
+ {
54
+ return $this->handle;
55
+ }
56
+
57
+ /**
58
+ * Get the associated cURL error message
59
+ *
60
+ * @return string|null
61
+ */
62
+ public function getError()
63
+ {
64
+ return $this->curlError;
65
+ }
66
+
67
+ /**
68
+ * Get the associated cURL error number
69
+ *
70
+ * @return int|null
71
+ */
72
+ public function getErrorNo()
73
+ {
74
+ return $this->curlErrorNo;
75
+ }
76
+
77
+ /**
78
+ * Returns curl information about the transfer
79
+ *
80
+ * @return array
81
+ */
82
+ public function getCurlInfo()
83
+ {
84
+ return $this->curlInfo;
85
+ }
86
+
87
+ /**
88
+ * Set curl transfer information
89
+ *
90
+ * @param array $info Array of curl transfer information
91
+ *
92
+ * @return self
93
+ * @link http://php.net/manual/en/function.curl-getinfo.php
94
+ */
95
+ public function setCurlInfo(array $info)
96
+ {
97
+ $this->curlInfo = $info;
98
+
99
+ return $this;
100
+ }
101
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/HttpException.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Exception;
4
+
5
+ use Guzzle\Common\Exception\GuzzleException;
6
+
7
+ /**
8
+ * Http exception interface
9
+ */
10
+ interface HttpException extends GuzzleException {}
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/MultiTransferException.php ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Exception;
4
+
5
+ use Guzzle\Common\Exception\ExceptionCollection;
6
+ use Guzzle\Http\Message\RequestInterface;
7
+
8
+ /**
9
+ * Exception encountered during a multi transfer
10
+ */
11
+ class MultiTransferException extends ExceptionCollection
12
+ {
13
+ protected $successfulRequests = array();
14
+ protected $failedRequests = array();
15
+ protected $exceptionForRequest = array();
16
+
17
+ /**
18
+ * Get all of the requests in the transfer
19
+ *
20
+ * @return array
21
+ */
22
+ public function getAllRequests()
23
+ {
24
+ return array_merge($this->successfulRequests, $this->failedRequests);
25
+ }
26
+
27
+ /**
28
+ * Add to the array of successful requests
29
+ *
30
+ * @param RequestInterface $request Successful request
31
+ *
32
+ * @return self
33
+ */
34
+ public function addSuccessfulRequest(RequestInterface $request)
35
+ {
36
+ $this->successfulRequests[] = $request;
37
+
38
+ return $this;
39
+ }
40
+
41
+ /**
42
+ * Add to the array of failed requests
43
+ *
44
+ * @param RequestInterface $request Failed request
45
+ *
46
+ * @return self
47
+ */
48
+ public function addFailedRequest(RequestInterface $request)
49
+ {
50
+ $this->failedRequests[] = $request;
51
+
52
+ return $this;
53
+ }
54
+
55
+ /**
56
+ * Add to the array of failed requests and associate with exceptions
57
+ *
58
+ * @param RequestInterface $request Failed request
59
+ * @param \Exception $exception Exception to add and associate with
60
+ *
61
+ * @return self
62
+ */
63
+ public function addFailedRequestWithException(RequestInterface $request, \Exception $exception)
64
+ {
65
+ $this->add($exception)
66
+ ->addFailedRequest($request)
67
+ ->exceptionForRequest[spl_object_hash($request)] = $exception;
68
+
69
+ return $this;
70
+ }
71
+
72
+ /**
73
+ * Get the Exception that caused the given $request to fail
74
+ *
75
+ * @param RequestInterface $request Failed command
76
+ *
77
+ * @return \Exception|null
78
+ */
79
+ public function getExceptionForFailedRequest(RequestInterface $request)
80
+ {
81
+ $oid = spl_object_hash($request);
82
+
83
+ return isset($this->exceptionForRequest[$oid]) ? $this->exceptionForRequest[$oid] : null;
84
+ }
85
+
86
+ /**
87
+ * Set all of the successful requests
88
+ *
89
+ * @param array Array of requests
90
+ *
91
+ * @return self
92
+ */
93
+ public function setSuccessfulRequests(array $requests)
94
+ {
95
+ $this->successfulRequests = $requests;
96
+
97
+ return $this;
98
+ }
99
+
100
+ /**
101
+ * Set all of the failed requests
102
+ *
103
+ * @param array Array of requests
104
+ *
105
+ * @return self
106
+ */
107
+ public function setFailedRequests(array $requests)
108
+ {
109
+ $this->failedRequests = $requests;
110
+
111
+ return $this;
112
+ }
113
+
114
+ /**
115
+ * Get an array of successful requests sent in the multi transfer
116
+ *
117
+ * @return array
118
+ */
119
+ public function getSuccessfulRequests()
120
+ {
121
+ return $this->successfulRequests;
122
+ }
123
+
124
+ /**
125
+ * Get an array of failed requests sent in the multi transfer
126
+ *
127
+ * @return array
128
+ */
129
+ public function getFailedRequests()
130
+ {
131
+ return $this->failedRequests;
132
+ }
133
+
134
+ /**
135
+ * Check if the exception object contains a request
136
+ *
137
+ * @param RequestInterface $request Request to check
138
+ *
139
+ * @return bool
140
+ */
141
+ public function containsRequest(RequestInterface $request)
142
+ {
143
+ return in_array($request, $this->failedRequests, true) || in_array($request, $this->successfulRequests, true);
144
+ }
145
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/RequestException.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Exception;
4
+
5
+ use Guzzle\Common\Exception\RuntimeException;
6
+ use Guzzle\Http\Message\RequestInterface;
7
+
8
+ /**
9
+ * Http request exception
10
+ */
11
+ class RequestException extends RuntimeException implements HttpException
12
+ {
13
+ /** @var RequestInterface */
14
+ protected $request;
15
+
16
+ /**
17
+ * Set the request that caused the exception
18
+ *
19
+ * @param RequestInterface $request Request to set
20
+ *
21
+ * @return RequestException
22
+ */
23
+ public function setRequest(RequestInterface $request)
24
+ {
25
+ $this->request = $request;
26
+
27
+ return $this;
28
+ }
29
+
30
+ /**
31
+ * Get the request that caused the exception
32
+ *
33
+ * @return RequestInterface
34
+ */
35
+ public function getRequest()
36
+ {
37
+ return $this->request;
38
+ }
39
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/ServerErrorResponseException.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Exception;
4
+
5
+ /**
6
+ * Exception when a server error is encountered (5xx codes)
7
+ */
8
+ class ServerErrorResponseException extends BadResponseException {}
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/TooManyRedirectsException.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Exception;
4
+
5
+ class TooManyRedirectsException extends BadResponseException {}
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/IoEmittingEntityBody.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ use Guzzle\Common\Event;
6
+ use Guzzle\Common\HasDispatcherInterface;
7
+ use Symfony\Component\EventDispatcher\EventDispatcher;
8
+ use Symfony\Component\EventDispatcher\EventSubscriberInterface;
9
+ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
10
+
11
+ /**
12
+ * EntityBody decorator that emits events for read and write methods
13
+ */
14
+ class IoEmittingEntityBody extends AbstractEntityBodyDecorator implements HasDispatcherInterface
15
+ {
16
+ /** @var EventDispatcherInterface */
17
+ protected $eventDispatcher;
18
+
19
+ public static function getAllEvents()
20
+ {
21
+ return array('body.read', 'body.write');
22
+ }
23
+
24
+ /**
25
+ * {@inheritdoc}
26
+ * @codeCoverageIgnore
27
+ */
28
+ public function setEventDispatcher(EventDispatcherInterface $eventDispatcher)
29
+ {
30
+ $this->eventDispatcher = $eventDispatcher;
31
+
32
+ return $this;
33
+ }
34
+
35
+ public function getEventDispatcher()
36
+ {
37
+ if (!$this->eventDispatcher) {
38
+ $this->eventDispatcher = new EventDispatcher();
39
+ }
40
+
41
+ return $this->eventDispatcher;
42
+ }
43
+
44
+ public function dispatch($eventName, array $context = array())
45
+ {
46
+ return $this->getEventDispatcher()->dispatch($eventName, new Event($context));
47
+ }
48
+
49
+ /**
50
+ * {@inheritdoc}
51
+ * @codeCoverageIgnore
52
+ */
53
+ public function addSubscriber(EventSubscriberInterface $subscriber)
54
+ {
55
+ $this->getEventDispatcher()->addSubscriber($subscriber);
56
+
57
+ return $this;
58
+ }
59
+
60
+ public function read($length)
61
+ {
62
+ $event = array(
63
+ 'body' => $this,
64
+ 'length' => $length,
65
+ 'read' => $this->body->read($length)
66
+ );
67
+ $this->dispatch('body.read', $event);
68
+
69
+ return $event['read'];
70
+ }
71
+
72
+ public function write($string)
73
+ {
74
+ $event = array(
75
+ 'body' => $this,
76
+ 'write' => $string,
77
+ 'result' => $this->body->write($string)
78
+ );
79
+ $this->dispatch('body.write', $event);
80
+
81
+ return $event['result'];
82
+ }
83
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/AbstractMessage.php ADDED
@@ -0,0 +1,220 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Common\Version;
6
+ use Guzzle\Common\Collection;
7
+ use Guzzle\Http\Message\Header\HeaderCollection;
8
+ use Guzzle\Http\Message\Header\HeaderFactory;
9
+ use Guzzle\Http\Message\Header\HeaderFactoryInterface;
10
+ use Guzzle\Http\Message\Header\HeaderInterface;
11
+
12
+ /**
13
+ * Abstract HTTP request/response message
14
+ */
15
+ abstract class AbstractMessage implements MessageInterface
16
+ {
17
+ /** @var array HTTP header collection */
18
+ protected $headers;
19
+
20
+ /** @var HeaderFactoryInterface $headerFactory */
21
+ protected $headerFactory;
22
+
23
+ /** @var Collection Custom message parameters that are extendable by plugins */
24
+ protected $params;
25
+
26
+ /** @var string Message protocol */
27
+ protected $protocol = 'HTTP';
28
+
29
+ /** @var string HTTP protocol version of the message */
30
+ protected $protocolVersion = '1.1';
31
+
32
+ public function __construct()
33
+ {
34
+ $this->params = new Collection();
35
+ $this->headerFactory = new HeaderFactory();
36
+ $this->headers = new HeaderCollection();
37
+ }
38
+
39
+ /**
40
+ * Set the header factory to use to create headers
41
+ *
42
+ * @param HeaderFactoryInterface $factory
43
+ *
44
+ * @return self
45
+ */
46
+ public function setHeaderFactory(HeaderFactoryInterface $factory)
47
+ {
48
+ $this->headerFactory = $factory;
49
+
50
+ return $this;
51
+ }
52
+
53
+ public function getParams()
54
+ {
55
+ return $this->params;
56
+ }
57
+
58
+ public function addHeader($header, $value)
59
+ {
60
+ if (isset($this->headers[$header])) {
61
+ $this->headers[$header]->add($value);
62
+ } elseif ($value instanceof HeaderInterface) {
63
+ $this->headers[$header] = $value;
64
+ } else {
65
+ $this->headers[$header] = $this->headerFactory->createHeader($header, $value);
66
+ }
67
+
68
+ return $this;
69
+ }
70
+
71
+ public function addHeaders(array $headers)
72
+ {
73
+ foreach ($headers as $key => $value) {
74
+ $this->addHeader($key, $value);
75
+ }
76
+
77
+ return $this;
78
+ }
79
+
80
+ public function getHeader($header)
81
+ {
82
+ return $this->headers[$header];
83
+ }
84
+
85
+ public function getHeaders()
86
+ {
87
+ return $this->headers;
88
+ }
89
+
90
+ public function getHeaderLines()
91
+ {
92
+ $headers = array();
93
+ foreach ($this->headers as $value) {
94
+ $headers[] = $value->getName() . ': ' . $value;
95
+ }
96
+
97
+ return $headers;
98
+ }
99
+
100
+ public function setHeader($header, $value)
101
+ {
102
+ unset($this->headers[$header]);
103
+ $this->addHeader($header, $value);
104
+
105
+ return $this;
106
+ }
107
+
108
+ public function setHeaders(array $headers)
109
+ {
110
+ $this->headers->clear();
111
+ foreach ($headers as $key => $value) {
112
+ $this->addHeader($key, $value);
113
+ }
114
+
115
+ return $this;
116
+ }
117
+
118
+ public function hasHeader($header)
119
+ {
120
+ return isset($this->headers[$header]);
121
+ }
122
+
123
+ public function removeHeader($header)
124
+ {
125
+ unset($this->headers[$header]);
126
+
127
+ return $this;
128
+ }
129
+
130
+ /**
131
+ * @deprecated Use $message->getHeader()->parseParams()
132
+ * @codeCoverageIgnore
133
+ */
134
+ public function getTokenizedHeader($header, $token = ';')
135
+ {
136
+ Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader()->parseParams()');
137
+ if ($this->hasHeader($header)) {
138
+ $data = new Collection();
139
+ foreach ($this->getHeader($header)->parseParams() as $values) {
140
+ foreach ($values as $key => $value) {
141
+ if ($value === '') {
142
+ $data->set($data->count(), $key);
143
+ } else {
144
+ $data->add($key, $value);
145
+ }
146
+ }
147
+ }
148
+ return $data;
149
+ }
150
+ }
151
+
152
+ /**
153
+ * @deprecated
154
+ * @codeCoverageIgnore
155
+ */
156
+ public function setTokenizedHeader($header, $data, $token = ';')
157
+ {
158
+ Version::warn(__METHOD__ . ' is deprecated.');
159
+ return $this;
160
+ }
161
+
162
+ /**
163
+ * @deprecated
164
+ * @codeCoverageIgnore
165
+ */
166
+ public function getCacheControlDirective($directive)
167
+ {
168
+ Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->getDirective()');
169
+ if (!($header = $this->getHeader('Cache-Control'))) {
170
+ return null;
171
+ }
172
+
173
+ return $header->getDirective($directive);
174
+ }
175
+
176
+ /**
177
+ * @deprecated
178
+ * @codeCoverageIgnore
179
+ */
180
+ public function hasCacheControlDirective($directive)
181
+ {
182
+ Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->hasDirective()');
183
+ if ($header = $this->getHeader('Cache-Control')) {
184
+ return $header->hasDirective($directive);
185
+ } else {
186
+ return false;
187
+ }
188
+ }
189
+
190
+ /**
191
+ * @deprecated
192
+ * @codeCoverageIgnore
193
+ */
194
+ public function addCacheControlDirective($directive, $value = true)
195
+ {
196
+ Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->addDirective()');
197
+ if (!($header = $this->getHeader('Cache-Control'))) {
198
+ $this->addHeader('Cache-Control', '');
199
+ $header = $this->getHeader('Cache-Control');
200
+ }
201
+
202
+ $header->addDirective($directive, $value);
203
+
204
+ return $this;
205
+ }
206
+
207
+ /**
208
+ * @deprecated
209
+ * @codeCoverageIgnore
210
+ */
211
+ public function removeCacheControlDirective($directive)
212
+ {
213
+ Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->removeDirective()');
214
+ if ($header = $this->getHeader('Cache-Control')) {
215
+ $header->removeDirective($directive);
216
+ }
217
+
218
+ return $this;
219
+ }
220
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Http\EntityBody;
6
+ use Guzzle\Http\EntityBodyInterface;
7
+ use Guzzle\Http\QueryString;
8
+ use Guzzle\Http\RedirectPlugin;
9
+ use Guzzle\Http\Exception\RequestException;
10
+
11
+ /**
12
+ * HTTP request that sends an entity-body in the request message (POST, PUT, PATCH, DELETE)
13
+ */
14
+ class EntityEnclosingRequest extends Request implements EntityEnclosingRequestInterface
15
+ {
16
+ /** @var int When the size of the body is greater than 1MB, then send Expect: 100-Continue */
17
+ protected $expectCutoff = 1048576;
18
+
19
+ /** @var EntityBodyInterface $body Body of the request */
20
+ protected $body;
21
+
22
+ /** @var QueryString POST fields to use in the EntityBody */
23
+ protected $postFields;
24
+
25
+ /** @var array POST files to send with the request */
26
+ protected $postFiles = array();
27
+
28
+ public function __construct($method, $url, $headers = array())
29
+ {
30
+ $this->postFields = new QueryString();
31
+ parent::__construct($method, $url, $headers);
32
+ }
33
+
34
+ /**
35
+ * @return string
36
+ */
37
+ public function __toString()
38
+ {
39
+ // Only attempt to include the POST data if it's only fields
40
+ if (count($this->postFields) && empty($this->postFiles)) {
41
+ return parent::__toString() . (string) $this->postFields;
42
+ }
43
+
44
+ return parent::__toString() . $this->body;
45
+ }
46
+
47
+ public function setState($state, array $context = array())
48
+ {
49
+ parent::setState($state, $context);
50
+ if ($state == self::STATE_TRANSFER && !$this->body && !count($this->postFields) && !count($this->postFiles)) {
51
+ $this->setHeader('Content-Length', 0)->removeHeader('Transfer-Encoding');
52
+ }
53
+
54
+ return $this->state;
55
+ }
56
+
57
+ public function setBody($body, $contentType = null)
58
+ {
59
+ $this->body = EntityBody::factory($body);
60
+
61
+ // Auto detect the Content-Type from the path of the request if possible
62
+ if ($contentType === null && !$this->hasHeader('Content-Type')) {
63
+ $contentType = $this->body->getContentType();
64
+ }
65
+
66
+ if ($contentType) {
67
+ $this->setHeader('Content-Type', $contentType);
68
+ }
69
+
70
+ // Always add the Expect 100-Continue header if the body cannot be rewound. This helps with redirects.
71
+ if (!$this->body->isSeekable() && $this->expectCutoff !== false) {
72
+ $this->setHeader('Expect', '100-Continue');
73
+ }
74
+
75
+ // Set the Content-Length header if it can be determined
76
+ $size = $this->body->getContentLength();
77
+ if ($size !== null && $size !== false) {
78
+ $this->setHeader('Content-Length', $size);
79
+ if ($size > $this->expectCutoff) {
80
+ $this->setHeader('Expect', '100-Continue');
81
+ }
82
+ } elseif (!$this->hasHeader('Content-Length')) {
83
+ if ('1.1' == $this->protocolVersion) {
84
+ $this->setHeader('Transfer-Encoding', 'chunked');
85
+ } else {
86
+ throw new RequestException(
87
+ 'Cannot determine Content-Length and cannot use chunked Transfer-Encoding when using HTTP/1.0'
88
+ );
89
+ }
90
+ }
91
+
92
+ return $this;
93
+ }
94
+
95
+ public function getBody()
96
+ {
97
+ return $this->body;
98
+ }
99
+
100
+ /**
101
+ * Set the size that the entity body of the request must exceed before adding the Expect: 100-Continue header.
102
+ *
103
+ * @param int|bool $size Cutoff in bytes. Set to false to never send the expect header (even with non-seekable data)
104
+ *
105
+ * @return self
106
+ */
107
+ public function setExpectHeaderCutoff($size)
108
+ {
109
+ $this->expectCutoff = $size;
110
+ if ($size === false || !$this->body) {
111
+ $this->removeHeader('Expect');
112
+ } elseif ($this->body && $this->body->getSize() && $this->body->getSize() > $size) {
113
+ $this->setHeader('Expect', '100-Continue');
114
+ }
115
+
116
+ return $this;
117
+ }
118
+
119
+ public function configureRedirects($strict = false, $maxRedirects = 5)
120
+ {
121
+ $this->getParams()->set(RedirectPlugin::STRICT_REDIRECTS, $strict);
122
+ if ($maxRedirects == 0) {
123
+ $this->getParams()->set(RedirectPlugin::DISABLE, true);
124
+ } else {
125
+ $this->getParams()->set(RedirectPlugin::MAX_REDIRECTS, $maxRedirects);
126
+ }
127
+
128
+ return $this;
129
+ }
130
+
131
+ public function getPostField($field)
132
+ {
133
+ return $this->postFields->get($field);
134
+ }
135
+
136
+ public function getPostFields()
137
+ {
138
+ return $this->postFields;
139
+ }
140
+
141
+ public function setPostField($key, $value)
142
+ {
143
+ $this->postFields->set($key, $value);
144
+ $this->processPostFields();
145
+
146
+ return $this;
147
+ }
148
+
149
+ public function addPostFields($fields)
150
+ {
151
+ $this->postFields->merge($fields);
152
+ $this->processPostFields();
153
+
154
+ return $this;
155
+ }
156
+
157
+ public function removePostField($field)
158
+ {
159
+ $this->postFields->remove($field);
160
+ $this->processPostFields();
161
+
162
+ return $this;
163
+ }
164
+
165
+ public function getPostFiles()
166
+ {
167
+ return $this->postFiles;
168
+ }
169
+
170
+ public function getPostFile($fieldName)
171
+ {
172
+ return isset($this->postFiles[$fieldName]) ? $this->postFiles[$fieldName] : null;
173
+ }
174
+
175
+ public function removePostFile($fieldName)
176
+ {
177
+ unset($this->postFiles[$fieldName]);
178
+ $this->processPostFields();
179
+
180
+ return $this;
181
+ }
182
+
183
+ public function addPostFile($field, $filename = null, $contentType = null, $postname = null)
184
+ {
185
+ $data = null;
186
+
187
+ if ($field instanceof PostFileInterface) {
188
+ $data = $field;
189
+ } elseif (is_array($filename)) {
190
+ // Allow multiple values to be set in a single key
191
+ foreach ($filename as $file) {
192
+ $this->addPostFile($field, $file, $contentType);
193
+ }
194
+ return $this;
195
+ } elseif (!is_string($filename)) {
196
+ throw new RequestException('The path to a file must be a string');
197
+ } elseif (!empty($filename)) {
198
+ // Adding an empty file will cause cURL to error out
199
+ $data = new PostFile($field, $filename, $contentType, $postname);
200
+ }
201
+
202
+ if ($data) {
203
+ if (!isset($this->postFiles[$data->getFieldName()])) {
204
+ $this->postFiles[$data->getFieldName()] = array($data);
205
+ } else {
206
+ $this->postFiles[$data->getFieldName()][] = $data;
207
+ }
208
+ $this->processPostFields();
209
+ }
210
+
211
+ return $this;
212
+ }
213
+
214
+ public function addPostFiles(array $files)
215
+ {
216
+ foreach ($files as $key => $file) {
217
+ if ($file instanceof PostFileInterface) {
218
+ $this->addPostFile($file, null, null, false);
219
+ } elseif (is_string($file)) {
220
+ // Convert non-associative array keys into 'file'
221
+ if (is_numeric($key)) {
222
+ $key = 'file';
223
+ }
224
+ $this->addPostFile($key, $file, null, false);
225
+ } else {
226
+ throw new RequestException('File must be a string or instance of PostFileInterface');
227
+ }
228
+ }
229
+
230
+ return $this;
231
+ }
232
+
233
+ /**
234
+ * Determine what type of request should be sent based on post fields
235
+ */
236
+ protected function processPostFields()
237
+ {
238
+ if (!$this->postFiles) {
239
+ $this->removeHeader('Expect')->setHeader('Content-Type', self::URL_ENCODED);
240
+ } else {
241
+ $this->setHeader('Content-Type', self::MULTIPART);
242
+ if ($this->expectCutoff !== false) {
243
+ $this->setHeader('Expect', '100-Continue');
244
+ }
245
+ }
246
+ }
247
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequestInterface.php ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Http\Exception\RequestException;
6
+ use Guzzle\Http\EntityBodyInterface;
7
+ use Guzzle\Http\QueryString;
8
+
9
+ /**
10
+ * HTTP request that sends an entity-body in the request message (POST, PUT)
11
+ */
12
+ interface EntityEnclosingRequestInterface extends RequestInterface
13
+ {
14
+ const URL_ENCODED = 'application/x-www-form-urlencoded; charset=utf-8';
15
+ const MULTIPART = 'multipart/form-data';
16
+
17
+ /**
18
+ * Set the body of the request
19
+ *
20
+ * @param string|resource|EntityBodyInterface $body Body to use in the entity body of the request
21
+ * @param string $contentType Content-Type to set. Leave null to use an existing
22
+ * Content-Type or to guess the Content-Type
23
+ * @return self
24
+ * @throws RequestException if the protocol is < 1.1 and Content-Length can not be determined
25
+ */
26
+ public function setBody($body, $contentType = null);
27
+
28
+ /**
29
+ * Get the body of the request if set
30
+ *
31
+ * @return EntityBodyInterface|null
32
+ */
33
+ public function getBody();
34
+
35
+ /**
36
+ * Get a POST field from the request
37
+ *
38
+ * @param string $field Field to retrieve
39
+ *
40
+ * @return mixed|null
41
+ */
42
+ public function getPostField($field);
43
+
44
+ /**
45
+ * Get the post fields that will be used in the request
46
+ *
47
+ * @return QueryString
48
+ */
49
+ public function getPostFields();
50
+
51
+ /**
52
+ * Set a POST field value
53
+ *
54
+ * @param string $key Key to set
55
+ * @param string $value Value to set
56
+ *
57
+ * @return self
58
+ */
59
+ public function setPostField($key, $value);
60
+
61
+ /**
62
+ * Add POST fields to use in the request
63
+ *
64
+ * @param QueryString|array $fields POST fields
65
+ *
66
+ * @return self
67
+ */
68
+ public function addPostFields($fields);
69
+
70
+ /**
71
+ * Remove a POST field or file by name
72
+ *
73
+ * @param string $field Name of the POST field or file to remove
74
+ *
75
+ * @return self
76
+ */
77
+ public function removePostField($field);
78
+
79
+ /**
80
+ * Returns an associative array of POST field names to PostFileInterface objects
81
+ *
82
+ * @return array
83
+ */
84
+ public function getPostFiles();
85
+
86
+ /**
87
+ * Get a POST file from the request
88
+ *
89
+ * @param string $fieldName POST fields to retrieve
90
+ *
91
+ * @return array|null Returns an array wrapping an array of PostFileInterface objects
92
+ */
93
+ public function getPostFile($fieldName);
94
+
95
+ /**
96
+ * Remove a POST file from the request
97
+ *
98
+ * @param string $fieldName POST file field name to remove
99
+ *
100
+ * @return self
101
+ */
102
+ public function removePostFile($fieldName);
103
+
104
+ /**
105
+ * Add a POST file to the upload
106
+ *
107
+ * @param string $field POST field to use (e.g. file). Used to reference content from the server.
108
+ * @param string $filename Full path to the file. Do not include the @ symbol.
109
+ * @param string $contentType Optional Content-Type to add to the Content-Disposition.
110
+ * Default behavior is to guess. Set to false to not specify.
111
+ * @param string $postname The name of the file, when posted. (e.g. rename the file)
112
+ * @return self
113
+ */
114
+ public function addPostFile($field, $filename = null, $contentType = null, $postname = null);
115
+
116
+ /**
117
+ * Add POST files to use in the upload
118
+ *
119
+ * @param array $files An array of POST fields => filenames where filename can be a string or PostFileInterface
120
+ *
121
+ * @return self
122
+ */
123
+ public function addPostFiles(array $files);
124
+
125
+ /**
126
+ * Configure how redirects are handled for the request
127
+ *
128
+ * @param bool $strict Set to true to follow strict RFC compliance when redirecting POST requests. Most
129
+ * browsers with follow a 301-302 redirect for a POST request with a GET request. This is
130
+ * the default behavior of Guzzle. Enable strict redirects to redirect these responses
131
+ * with a POST rather than a GET request.
132
+ * @param int $maxRedirects Specify the maximum number of allowed redirects. Set to 0 to disable redirects.
133
+ *
134
+ * @return self
135
+ */
136
+ public function configureRedirects($strict = false, $maxRedirects = 5);
137
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header.php ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Common\Version;
6
+ use Guzzle\Http\Message\Header\HeaderInterface;
7
+
8
+ /**
9
+ * Represents a header and all of the values stored by that header
10
+ */
11
+ class Header implements HeaderInterface
12
+ {
13
+ protected $values = array();
14
+ protected $header;
15
+ protected $glue;
16
+
17
+ /**
18
+ * @param string $header Name of the header
19
+ * @param array|string $values Values of the header as an array or a scalar
20
+ * @param string $glue Glue used to combine multiple values into a string
21
+ */
22
+ public function __construct($header, $values = array(), $glue = ',')
23
+ {
24
+ $this->header = trim($header);
25
+ $this->glue = $glue;
26
+
27
+ foreach ((array) $values as $value) {
28
+ foreach ((array) $value as $v) {
29
+ $this->values[] = $v;
30
+ }
31
+ }
32
+ }
33
+
34
+ public function __toString()
35
+ {
36
+ return implode($this->glue . ' ', $this->toArray());
37
+ }
38
+
39
+ public function add($value)
40
+ {
41
+ $this->values[] = $value;
42
+
43
+ return $this;
44
+ }
45
+
46
+ public function getName()
47
+ {
48
+ return $this->header;
49
+ }
50
+
51
+ public function setName($name)
52
+ {
53
+ $this->header = $name;
54
+
55
+ return $this;
56
+ }
57
+
58
+ public function setGlue($glue)
59
+ {
60
+ $this->glue = $glue;
61
+
62
+ return $this;
63
+ }
64
+
65
+ public function getGlue()
66
+ {
67
+ return $this->glue;
68
+ }
69
+
70
+ /**
71
+ * Normalize the header to be a single header with an array of values.
72
+ *
73
+ * If any values of the header contains the glue string value (e.g. ","), then the value will be exploded into
74
+ * multiple entries in the header.
75
+ *
76
+ * @return self
77
+ */
78
+ public function normalize()
79
+ {
80
+ $values = $this->toArray();
81
+
82
+ for ($i = 0, $total = count($values); $i < $total; $i++) {
83
+ if (strpos($values[$i], $this->glue) !== false) {
84
+ // Explode on glue when the glue is not inside of a comma
85
+ foreach (preg_split('/' . preg_quote($this->glue) . '(?=([^"]*"[^"]*")*[^"]*$)/', $values[$i]) as $v) {
86
+ $values[] = trim($v);
87
+ }
88
+ unset($values[$i]);
89
+ }
90
+ }
91
+
92
+ $this->values = array_values($values);
93
+
94
+ return $this;
95
+ }
96
+
97
+ public function hasValue($searchValue)
98
+ {
99
+ return in_array($searchValue, $this->toArray());
100
+ }
101
+
102
+ public function removeValue($searchValue)
103
+ {
104
+ $this->values = array_values(array_filter($this->values, function ($value) use ($searchValue) {
105
+ return $value != $searchValue;
106
+ }));
107
+
108
+ return $this;
109
+ }
110
+
111
+ public function toArray()
112
+ {
113
+ return $this->values;
114
+ }
115
+
116
+ public function count()
117
+ {
118
+ return count($this->toArray());
119
+ }
120
+
121
+ public function getIterator()
122
+ {
123
+ return new \ArrayIterator($this->toArray());
124
+ }
125
+
126
+ public function parseParams()
127
+ {
128
+ $params = $matches = array();
129
+ $callback = array($this, 'trimHeader');
130
+
131
+ // Normalize the header into a single array and iterate over all values
132
+ foreach ($this->normalize()->toArray() as $val) {
133
+ $part = array();
134
+ foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) {
135
+ if (!preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
136
+ continue;
137
+ }
138
+ $pieces = array_map($callback, $matches[0]);
139
+ $part[$pieces[0]] = isset($pieces[1]) ? $pieces[1] : '';
140
+ }
141
+ if ($part) {
142
+ $params[] = $part;
143
+ }
144
+ }
145
+
146
+ return $params;
147
+ }
148
+
149
+ /**
150
+ * @deprecated
151
+ * @codeCoverageIgnore
152
+ */
153
+ public function hasExactHeader($header)
154
+ {
155
+ Version::warn(__METHOD__ . ' is deprecated');
156
+ return $this->header == $header;
157
+ }
158
+
159
+ /**
160
+ * @deprecated
161
+ * @codeCoverageIgnore
162
+ */
163
+ public function raw()
164
+ {
165
+ Version::warn(__METHOD__ . ' is deprecated. Use toArray()');
166
+ return $this->toArray();
167
+ }
168
+
169
+ /**
170
+ * Trim a header by removing excess spaces and wrapping quotes
171
+ *
172
+ * @param $str
173
+ *
174
+ * @return string
175
+ */
176
+ protected function trimHeader($str)
177
+ {
178
+ static $trimmed = "\"' \n\t";
179
+
180
+ return trim($str, $trimmed);
181
+ }
182
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/CacheControl.php ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message\Header;
4
+
5
+ use Guzzle\Http\Message\Header;
6
+
7
+ /**
8
+ * Provides helpful functionality for Cache-Control headers
9
+ */
10
+ class CacheControl extends Header
11
+ {
12
+ /** @var array */
13
+ protected $directives;
14
+
15
+ public function add($value)
16
+ {
17
+ parent::add($value);
18
+ $this->directives = null;
19
+ }
20
+
21
+ public function removeValue($searchValue)
22
+ {
23
+ parent::removeValue($searchValue);
24
+ $this->directives = null;
25
+ }
26
+
27
+ /**
28
+ * Check if a specific cache control directive exists
29
+ *
30
+ * @param string $param Directive to retrieve
31
+ *
32
+ * @return bool
33
+ */
34
+ public function hasDirective($param)
35
+ {
36
+ $directives = $this->getDirectives();
37
+
38
+ return isset($directives[$param]);
39
+ }
40
+
41
+ /**
42
+ * Get a specific cache control directive
43
+ *
44
+ * @param string $param Directive to retrieve
45
+ *
46
+ * @return string|bool|null
47
+ */
48
+ public function getDirective($param)
49
+ {
50
+ $directives = $this->getDirectives();
51
+
52
+ return isset($directives[$param]) ? $directives[$param] : null;
53
+ }
54
+
55
+ /**
56
+ * Add a cache control directive
57
+ *
58
+ * @param string $param Directive to add
59
+ * @param string $value Value to set
60
+ *
61
+ * @return self
62
+ */
63
+ public function addDirective($param, $value)
64
+ {
65
+ $directives = $this->getDirectives();
66
+ $directives[$param] = $value;
67
+ $this->updateFromDirectives($directives);
68
+
69
+ return $this;
70
+ }
71
+
72
+ /**
73
+ * Remove a cache control directive by name
74
+ *
75
+ * @param string $param Directive to remove
76
+ *
77
+ * @return self
78
+ */
79
+ public function removeDirective($param)
80
+ {
81
+ $directives = $this->getDirectives();
82
+ unset($directives[$param]);
83
+ $this->updateFromDirectives($directives);
84
+
85
+ return $this;
86
+ }
87
+
88
+ /**
89
+ * Get an associative array of cache control directives
90
+ *
91
+ * @return array
92
+ */
93
+ public function getDirectives()
94
+ {
95
+ if ($this->directives === null) {
96
+ $this->directives = array();
97
+ foreach ($this->parseParams() as $collection) {
98
+ foreach ($collection as $key => $value) {
99
+ $this->directives[$key] = $value === '' ? true : $value;
100
+ }
101
+ }
102
+ }
103
+
104
+ return $this->directives;
105
+ }
106
+
107
+ /**
108
+ * Updates the header value based on the parsed directives
109
+ *
110
+ * @param array $directives Array of cache control directives
111
+ */
112
+ protected function updateFromDirectives(array $directives)
113
+ {
114
+ $this->directives = $directives;
115
+ $this->values = array();
116
+
117
+ foreach ($directives as $key => $value) {
118
+ $this->values[] = $value === true ? $key : "{$key}={$value}";
119
+ }
120
+ }
121
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderCollection.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message\Header;
4
+
5
+ use Guzzle\Common\ToArrayInterface;
6
+
7
+ /**
8
+ * Provides a case-insensitive collection of headers
9
+ */
10
+ class HeaderCollection implements \IteratorAggregate, \Countable, \ArrayAccess, ToArrayInterface
11
+ {
12
+ /** @var array */
13
+ protected $headers;
14
+
15
+ public function __construct($headers = array())
16
+ {
17
+ $this->headers = $headers;
18
+ }
19
+
20
+ public function __clone()
21
+ {
22
+ foreach ($this->headers as &$header) {
23
+ $header = clone $header;
24
+ }
25
+ }
26
+
27
+ /**
28
+ * Clears the header collection
29
+ */
30
+ public function clear()
31
+ {
32
+ $this->headers = array();
33
+ }
34
+
35
+ /**
36
+ * Set a header on the collection
37
+ *
38
+ * @param HeaderInterface $header Header to add
39
+ *
40
+ * @return self
41
+ */
42
+ public function add(HeaderInterface $header)
43
+ {
44
+ $this->headers[strtolower($header->getName())] = $header;
45
+
46
+ return $this;
47
+ }
48
+
49
+ /**
50
+ * Get an array of header objects
51
+ *
52
+ * @return array
53
+ */
54
+ public function getAll()
55
+ {
56
+ return $this->headers;
57
+ }
58
+
59
+ /**
60
+ * Alias of offsetGet
61
+ */
62
+ public function get($key)
63
+ {
64
+ return $this->offsetGet($key);
65
+ }
66
+
67
+ public function count()
68
+ {
69
+ return count($this->headers);
70
+ }
71
+
72
+ public function offsetExists($offset)
73
+ {
74
+ return isset($this->headers[strtolower($offset)]);
75
+ }
76
+
77
+ public function offsetGet($offset)
78
+ {
79
+ $l = strtolower($offset);
80
+
81
+ return isset($this->headers[$l]) ? $this->headers[$l] : null;
82
+ }
83
+
84
+ public function offsetSet($offset, $value)
85
+ {
86
+ $this->add($value);
87
+ }
88
+
89
+ public function offsetUnset($offset)
90
+ {
91
+ unset($this->headers[strtolower($offset)]);
92
+ }
93
+
94
+ public function getIterator()
95
+ {
96
+ return new \ArrayIterator($this->headers);
97
+ }
98
+
99
+ public function toArray()
100
+ {
101
+ $result = array();
102
+ foreach ($this->headers as $header) {
103
+ $result[$header->getName()] = $header->toArray();
104
+ }
105
+
106
+ return $result;
107
+ }
108
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactory.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message\Header;
4
+
5
+ use Guzzle\Http\Message\Header;
6
+
7
+ /**
8
+ * Default header factory implementation
9
+ */
10
+ class HeaderFactory implements HeaderFactoryInterface
11
+ {
12
+ /** @var array */
13
+ protected $mapping = array(
14
+ 'cache-control' => 'Guzzle\Http\Message\Header\CacheControl',
15
+ 'link' => 'Guzzle\Http\Message\Header\Link',
16
+ );
17
+
18
+ public function createHeader($header, $value = null)
19
+ {
20
+ $lowercase = strtolower($header);
21
+
22
+ return isset($this->mapping[$lowercase])
23
+ ? new $this->mapping[$lowercase]($header, $value)
24
+ : new Header($header, $value);
25
+ }
26
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactoryInterface.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message\Header;
4
+
5
+ /**
6
+ * Interface for creating headers
7
+ */
8
+ interface HeaderFactoryInterface
9
+ {
10
+ /**
11
+ * Create a header from a header name and a single value
12
+ *
13
+ * @param string $header Name of the header to create
14
+ * @param string $value Value to set on the header
15
+ *
16
+ * @return HeaderInterface
17
+ */
18
+ public function createHeader($header, $value = null);
19
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderInterface.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message\Header;
4
+
5
+ use Guzzle\Common\ToArrayInterface;
6
+
7
+ interface HeaderInterface extends ToArrayInterface, \Countable, \IteratorAggregate
8
+ {
9
+ /**
10
+ * Convert the header to a string
11
+ *
12
+ * @return string
13
+ */
14
+ public function __toString();
15
+
16
+ /**
17
+ * Add a value to the list of header values
18
+ *
19
+ * @param string $value Value to add to the header
20
+ *
21
+ * @return self
22
+ */
23
+ public function add($value);
24
+
25
+ /**
26
+ * Get the name of the header
27
+ *
28
+ * @return string
29
+ */
30
+ public function getName();
31
+
32
+ /**
33
+ * Change the name of the header
34
+ *
35
+ * @param string $name Name to change to
36
+ *
37
+ * @return self
38
+ */
39
+ public function setName($name);
40
+
41
+ /**
42
+ * Change the glue used to implode the values
43
+ *
44
+ * @param string $glue Glue used to implode multiple values
45
+ *
46
+ * @return self
47
+ */
48
+ public function setGlue($glue);
49
+
50
+ /**
51
+ * Get the glue used to implode multiple values into a string
52
+ *
53
+ * @return string
54
+ */
55
+ public function getGlue();
56
+
57
+ /**
58
+ * Check if the collection of headers has a particular value
59
+ *
60
+ * @param string $searchValue Value to search for
61
+ *
62
+ * @return bool
63
+ */
64
+ public function hasValue($searchValue);
65
+
66
+ /**
67
+ * Remove a specific value from the header
68
+ *
69
+ * @param string $searchValue Value to remove
70
+ *
71
+ * @return self
72
+ */
73
+ public function removeValue($searchValue);
74
+
75
+ /**
76
+ * Parse a header containing ";" separated data into an array of associative arrays representing the header
77
+ * key value pair data of the header. When a parameter does not contain a value, but just contains a key, this
78
+ * function will inject a key with a '' string value.
79
+ *
80
+ * @return array
81
+ */
82
+ public function parseParams();
83
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Header/Link.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message\Header;
4
+
5
+ use Guzzle\Http\Message\Header;
6
+
7
+ /**
8
+ * Provides helpful functionality for link headers
9
+ */
10
+ class Link extends Header
11
+ {
12
+ /**
13
+ * Add a link to the header
14
+ *
15
+ * @param string $url Link URL
16
+ * @param string $rel Link rel
17
+ * @param array $params Other link parameters
18
+ *
19
+ * @return self
20
+ */
21
+ public function addLink($url, $rel, array $params = array())
22
+ {
23
+ $values = array("<{$url}>", "rel=\"{$rel}\"");
24
+
25
+ foreach ($params as $k => $v) {
26
+ $values[] = "{$k}=\"{$v}\"";
27
+ }
28
+
29
+ return $this->add(implode('; ', $values));
30
+ }
31
+
32
+ /**
33
+ * Check if a specific link exists for a given rel attribute
34
+ *
35
+ * @param string $rel rel value
36
+ *
37
+ * @return bool
38
+ */
39
+ public function hasLink($rel)
40
+ {
41
+ return $this->getLink($rel) !== null;
42
+ }
43
+
44
+ /**
45
+ * Get a specific link for a given rel attribute
46
+ *
47
+ * @param string $rel Rel value
48
+ *
49
+ * @return array|null
50
+ */
51
+ public function getLink($rel)
52
+ {
53
+ foreach ($this->getLinks() as $link) {
54
+ if (isset($link['rel']) && $link['rel'] == $rel) {
55
+ return $link;
56
+ }
57
+ }
58
+
59
+ return null;
60
+ }
61
+
62
+ /**
63
+ * Get an associative array of links
64
+ *
65
+ * For example:
66
+ * Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg", <http://.../back.jpeg>; rel=back; type="image/jpeg"
67
+ *
68
+ * <code>
69
+ * var_export($response->getLinks());
70
+ * array(
71
+ * array(
72
+ * 'url' => 'http:/.../front.jpeg',
73
+ * 'rel' => 'back',
74
+ * 'type' => 'image/jpeg',
75
+ * )
76
+ * )
77
+ * </code>
78
+ *
79
+ * @return array
80
+ */
81
+ public function getLinks()
82
+ {
83
+ $links = $this->parseParams();
84
+
85
+ foreach ($links as &$link) {
86
+ $key = key($link);
87
+ unset($link[$key]);
88
+ $link['url'] = trim($key, '<> ');
89
+ }
90
+
91
+ return $links;
92
+ }
93
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/MessageInterface.php ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ /**
6
+ * Request and response message interface
7
+ */
8
+ interface MessageInterface
9
+ {
10
+ /**
11
+ * Get application and plugin specific parameters set on the message.
12
+ *
13
+ * @return \Guzzle\Common\Collection
14
+ */
15
+ public function getParams();
16
+
17
+ /**
18
+ * Add a header to an existing collection of headers.
19
+ *
20
+ * @param string $header Header name to add
21
+ * @param string $value Value of the header
22
+ *
23
+ * @return self
24
+ */
25
+ public function addHeader($header, $value);
26
+
27
+ /**
28
+ * Add and merge in an array of HTTP headers.
29
+ *
30
+ * @param array $headers Associative array of header data.
31
+ *
32
+ * @return self
33
+ */
34
+ public function addHeaders(array $headers);
35
+
36
+ /**
37
+ * Retrieve an HTTP header by name. Performs a case-insensitive search of all headers.
38
+ *
39
+ * @param string $header Header to retrieve.
40
+ *
41
+ * @return Header|null
42
+ */
43
+ public function getHeader($header);
44
+
45
+ /**
46
+ * Get all headers as a collection
47
+ *
48
+ * @return \Guzzle\Http\Message\Header\HeaderCollection
49
+ */
50
+ public function getHeaders();
51
+
52
+ /**
53
+ * Check if the specified header is present.
54
+ *
55
+ * @param string $header The header to check.
56
+ *
57
+ * @return bool
58
+ */
59
+ public function hasHeader($header);
60
+
61
+ /**
62
+ * Remove a specific HTTP header.
63
+ *
64
+ * @param string $header HTTP header to remove.
65
+ *
66
+ * @return self
67
+ */
68
+ public function removeHeader($header);
69
+
70
+ /**
71
+ * Set an HTTP header and overwrite any existing value for the header
72
+ *
73
+ * @param string $header Name of the header to set.
74
+ * @param mixed $value Value to set.
75
+ *
76
+ * @return self
77
+ */
78
+ public function setHeader($header, $value);
79
+
80
+ /**
81
+ * Overwrite all HTTP headers with the supplied array of headers
82
+ *
83
+ * @param array $headers Associative array of header data.
84
+ *
85
+ * @return self
86
+ */
87
+ public function setHeaders(array $headers);
88
+
89
+ /**
90
+ * Get an array of message header lines (e.g. ["Host: example.com", ...])
91
+ *
92
+ * @return array
93
+ */
94
+ public function getHeaderLines();
95
+
96
+ /**
97
+ * Get the raw message headers as a string
98
+ *
99
+ * @return string
100
+ */
101
+ public function getRawHeaders();
102
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/PostFile.php ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Common\Version;
6
+ use Guzzle\Common\Exception\InvalidArgumentException;
7
+ use Guzzle\Http\Mimetypes;
8
+
9
+ /**
10
+ * POST file upload
11
+ */
12
+ class PostFile implements PostFileInterface
13
+ {
14
+ protected $fieldName;
15
+ protected $contentType;
16
+ protected $filename;
17
+ protected $postname;
18
+
19
+ /**
20
+ * @param string $fieldName Name of the field
21
+ * @param string $filename Local path to the file
22
+ * @param string $postname Remote post file name
23
+ * @param string $contentType Content-Type of the upload
24
+ */
25
+ public function __construct($fieldName, $filename, $contentType = null, $postname = null)
26
+ {
27
+ $this->fieldName = $fieldName;
28
+ $this->setFilename($filename);
29
+ $this->postname = $postname ? $postname : basename($filename);
30
+ $this->contentType = $contentType ?: $this->guessContentType();
31
+ }
32
+
33
+ public function setFieldName($name)
34
+ {
35
+ $this->fieldName = $name;
36
+
37
+ return $this;
38
+ }
39
+
40
+ public function getFieldName()
41
+ {
42
+ return $this->fieldName;
43
+ }
44
+
45
+ public function setFilename($filename)
46
+ {
47
+ // Remove leading @ symbol
48
+ if (strpos($filename, '@') === 0) {
49
+ $filename = substr($filename, 1);
50
+ }
51
+
52
+ if (!is_readable($filename)) {
53
+ throw new InvalidArgumentException("Unable to open {$filename} for reading");
54
+ }
55
+
56
+ $this->filename = $filename;
57
+
58
+ return $this;
59
+ }
60
+
61
+ public function setPostname($postname)
62
+ {
63
+ $this->postname = $postname;
64
+
65
+ return $this;
66
+ }
67
+
68
+ public function getFilename()
69
+ {
70
+ return $this->filename;
71
+ }
72
+
73
+ public function getPostname()
74
+ {
75
+ return $this->postname;
76
+ }
77
+
78
+ public function setContentType($type)
79
+ {
80
+ $this->contentType = $type;
81
+
82
+ return $this;
83
+ }
84
+
85
+ public function getContentType()
86
+ {
87
+ return $this->contentType;
88
+ }
89
+
90
+ public function getCurlValue()
91
+ {
92
+ // PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax
93
+ // See: https://wiki.php.net/rfc/curl-file-upload
94
+ if (function_exists('curl_file_create')) {
95
+ return curl_file_create($this->filename, $this->contentType, $this->postname);
96
+ }
97
+
98
+ // Use the old style if using an older version of PHP
99
+ $value = "@{$this->filename};filename=" . $this->postname;
100
+ if ($this->contentType) {
101
+ $value .= ';type=' . $this->contentType;
102
+ }
103
+
104
+ return $value;
105
+ }
106
+
107
+ /**
108
+ * @deprecated
109
+ * @codeCoverageIgnore
110
+ */
111
+ public function getCurlString()
112
+ {
113
+ Version::warn(__METHOD__ . ' is deprecated. Use getCurlValue()');
114
+ return $this->getCurlValue();
115
+ }
116
+
117
+ /**
118
+ * Determine the Content-Type of the file
119
+ */
120
+ protected function guessContentType()
121
+ {
122
+ return Mimetypes::getInstance()->fromFilename($this->filename) ?: 'application/octet-stream';
123
+ }
124
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/PostFileInterface.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Common\Exception\InvalidArgumentException;
6
+
7
+ /**
8
+ * POST file upload
9
+ */
10
+ interface PostFileInterface
11
+ {
12
+ /**
13
+ * Set the name of the field
14
+ *
15
+ * @param string $name Field name
16
+ *
17
+ * @return self
18
+ */
19
+ public function setFieldName($name);
20
+
21
+ /**
22
+ * Get the name of the field
23
+ *
24
+ * @return string
25
+ */
26
+ public function getFieldName();
27
+
28
+ /**
29
+ * Set the path to the file
30
+ *
31
+ * @param string $path Full path to the file
32
+ *
33
+ * @return self
34
+ * @throws InvalidArgumentException if the file cannot be read
35
+ */
36
+ public function setFilename($path);
37
+
38
+ /**
39
+ * Set the post name of the file
40
+ *
41
+ * @param string $name The new name of the file
42
+ *
43
+ * @return self
44
+ */
45
+ public function setPostname($name);
46
+
47
+ /**
48
+ * Get the full path to the file
49
+ *
50
+ * @return string
51
+ */
52
+ public function getFilename();
53
+
54
+ /**
55
+ * Get the post name of the file
56
+ *
57
+ * @return string
58
+ */
59
+ public function getPostname();
60
+
61
+ /**
62
+ * Set the Content-Type of the file
63
+ *
64
+ * @param string $type Content type
65
+ *
66
+ * @return self
67
+ */
68
+ public function setContentType($type);
69
+
70
+ /**
71
+ * Get the Content-Type of the file
72
+ *
73
+ * @return string
74
+ */
75
+ public function getContentType();
76
+
77
+ /**
78
+ * Get a cURL ready string or CurlFile object for the upload
79
+ *
80
+ * @return string
81
+ */
82
+ public function getCurlValue();
83
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Request.php ADDED
@@ -0,0 +1,638 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Common\Version;
6
+ use Guzzle\Common\Event;
7
+ use Guzzle\Common\Collection;
8
+ use Guzzle\Common\Exception\RuntimeException;
9
+ use Guzzle\Common\Exception\InvalidArgumentException;
10
+ use Guzzle\Http\Exception\RequestException;
11
+ use Guzzle\Http\Exception\BadResponseException;
12
+ use Guzzle\Http\ClientInterface;
13
+ use Guzzle\Http\EntityBody;
14
+ use Guzzle\Http\EntityBodyInterface;
15
+ use Guzzle\Http\Message\Header\HeaderInterface;
16
+ use Guzzle\Http\Url;
17
+ use Guzzle\Parser\ParserRegistry;
18
+ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
19
+ use Symfony\Component\EventDispatcher\EventDispatcher;
20
+ use Symfony\Component\EventDispatcher\EventSubscriberInterface;
21
+
22
+ /**
23
+ * HTTP request class to send requests
24
+ */
25
+ class Request extends AbstractMessage implements RequestInterface
26
+ {
27
+ /** @var EventDispatcherInterface */
28
+ protected $eventDispatcher;
29
+
30
+ /** @var Url HTTP Url */
31
+ protected $url;
32
+
33
+ /** @var string HTTP method (GET, PUT, POST, DELETE, HEAD, OPTIONS, TRACE) */
34
+ protected $method;
35
+
36
+ /** @var ClientInterface */
37
+ protected $client;
38
+
39
+ /** @var Response Response of the request */
40
+ protected $response;
41
+
42
+ /** @var EntityBodyInterface Response body */
43
+ protected $responseBody;
44
+
45
+ /** @var string State of the request object */
46
+ protected $state;
47
+
48
+ /** @var string Authentication username */
49
+ protected $username;
50
+
51
+ /** @var string Auth password */
52
+ protected $password;
53
+
54
+ /** @var Collection cURL specific transfer options */
55
+ protected $curlOptions;
56
+
57
+ /** @var bool */
58
+ protected $isRedirect = false;
59
+
60
+ public static function getAllEvents()
61
+ {
62
+ return array(
63
+ // Called when receiving or uploading data through cURL
64
+ 'curl.callback.read', 'curl.callback.write', 'curl.callback.progress',
65
+ // Cloning a request
66
+ 'request.clone',
67
+ // About to send the request, sent request, completed transaction
68
+ 'request.before_send', 'request.sent', 'request.complete',
69
+ // A request received a successful response
70
+ 'request.success',
71
+ // A request received an unsuccessful response
72
+ 'request.error',
73
+ // An exception is being thrown because of an unsuccessful response
74
+ 'request.exception',
75
+ // Received response status line
76
+ 'request.receive.status_line'
77
+ );
78
+ }
79
+
80
+ /**
81
+ * @param string $method HTTP method
82
+ * @param string|Url $url HTTP URL to connect to. The URI scheme, host header, and URI are parsed from the
83
+ * full URL. If query string parameters are present they will be parsed as well.
84
+ * @param array|Collection $headers HTTP headers
85
+ */
86
+ public function __construct($method, $url, $headers = array())
87
+ {
88
+ parent::__construct();
89
+ $this->method = strtoupper($method);
90
+ $this->curlOptions = new Collection();
91
+ $this->setUrl($url);
92
+
93
+ if ($headers) {
94
+ // Special handling for multi-value headers
95
+ foreach ($headers as $key => $value) {
96
+ // Deal with collisions with Host and Authorization
97
+ if ($key == 'host' || $key == 'Host') {
98
+ $this->setHeader($key, $value);
99
+ } elseif ($value instanceof HeaderInterface) {
100
+ $this->addHeader($key, $value);
101
+ } else {
102
+ foreach ((array) $value as $v) {
103
+ $this->addHeader($key, $v);
104
+ }
105
+ }
106
+ }
107
+ }
108
+
109
+ $this->setState(self::STATE_NEW);
110
+ }
111
+
112
+ public function __clone()
113
+ {
114
+ if ($this->eventDispatcher) {
115
+ $this->eventDispatcher = clone $this->eventDispatcher;
116
+ }
117
+ $this->curlOptions = clone $this->curlOptions;
118
+ $this->params = clone $this->params;
119
+ $this->url = clone $this->url;
120
+ $this->response = $this->responseBody = null;
121
+ $this->headers = clone $this->headers;
122
+
123
+ $this->setState(RequestInterface::STATE_NEW);
124
+ $this->dispatch('request.clone', array('request' => $this));
125
+ }
126
+
127
+ /**
128
+ * Get the HTTP request as a string
129
+ *
130
+ * @return string
131
+ */
132
+ public function __toString()
133
+ {
134
+ return $this->getRawHeaders() . "\r\n\r\n";
135
+ }
136
+
137
+ /**
138
+ * Default method that will throw exceptions if an unsuccessful response is received.
139
+ *
140
+ * @param Event $event Received
141
+ * @throws BadResponseException if the response is not successful
142
+ */
143
+ public static function onRequestError(Event $event)
144
+ {
145
+ $e = BadResponseException::factory($event['request'], $event['response']);
146
+ $event['request']->setState(self::STATE_ERROR, array('exception' => $e) + $event->toArray());
147
+ throw $e;
148
+ }
149
+
150
+ public function setClient(ClientInterface $client)
151
+ {
152
+ $this->client = $client;
153
+
154
+ return $this;
155
+ }
156
+
157
+ public function getClient()
158
+ {
159
+ return $this->client;
160
+ }
161
+
162
+ public function getRawHeaders()
163
+ {
164
+ $protocolVersion = $this->protocolVersion ?: '1.1';
165
+
166
+ return trim($this->method . ' ' . $this->getResource()) . ' '
167
+ . strtoupper(str_replace('https', 'http', $this->url->getScheme()))
168
+ . '/' . $protocolVersion . "\r\n" . implode("\r\n", $this->getHeaderLines());
169
+ }
170
+
171
+ public function setUrl($url)
172
+ {
173
+ if ($url instanceof Url) {
174
+ $this->url = $url;
175
+ } else {
176
+ $this->url = Url::factory($url);
177
+ }
178
+
179
+ // Update the port and host header
180
+ $this->setPort($this->url->getPort());
181
+
182
+ if ($this->url->getUsername() || $this->url->getPassword()) {
183
+ $this->setAuth($this->url->getUsername(), $this->url->getPassword());
184
+ // Remove the auth info from the URL
185
+ $this->url->setUsername(null);
186
+ $this->url->setPassword(null);
187
+ }
188
+
189
+ return $this;
190
+ }
191
+
192
+ public function send()
193
+ {
194
+ if (!$this->client) {
195
+ throw new RuntimeException('A client must be set on the request');
196
+ }
197
+
198
+ return $this->client->send($this);
199
+ }
200
+
201
+ public function getResponse()
202
+ {
203
+ return $this->response;
204
+ }
205
+
206
+ public function getQuery($asString = false)
207
+ {
208
+ return $asString
209
+ ? (string) $this->url->getQuery()
210
+ : $this->url->getQuery();
211
+ }
212
+
213
+ public function getMethod()
214
+ {
215
+ return $this->method;
216
+ }
217
+
218
+ public function getScheme()
219
+ {
220
+ return $this->url->getScheme();
221
+ }
222
+
223
+ public function setScheme($scheme)
224
+ {
225
+ $this->url->setScheme($scheme);
226
+
227
+ return $this;
228
+ }
229
+
230
+ public function getHost()
231
+ {
232
+ return $this->url->getHost();
233
+ }
234
+
235
+ public function setHost($host)
236
+ {
237
+ $this->url->setHost($host);
238
+ $this->setPort($this->url->getPort());
239
+
240
+ return $this;
241
+ }
242
+
243
+ public function getProtocolVersion()
244
+ {
245
+ return $this->protocolVersion;
246
+ }
247
+
248
+ public function setProtocolVersion($protocol)
249
+ {
250
+ $this->protocolVersion = $protocol;
251
+
252
+ return $this;
253
+ }
254
+
255
+ public function getPath()
256
+ {
257
+ return '/' . ltrim($this->url->getPath(), '/');
258
+ }
259
+
260
+ public function setPath($path)
261
+ {
262
+ $this->url->setPath($path);
263
+
264
+ return $this;
265
+ }
266
+
267
+ public function getPort()
268
+ {
269
+ return $this->url->getPort();
270
+ }
271
+
272
+ public function setPort($port)
273
+ {
274
+ $this->url->setPort($port);
275
+
276
+ // Include the port in the Host header if it is not the default port for the scheme of the URL
277
+ $scheme = $this->url->getScheme();
278
+ if ($port && (($scheme == 'http' && $port != 80) || ($scheme == 'https' && $port != 443))) {
279
+ $this->headers['host'] = $this->headerFactory->createHeader('Host', $this->url->getHost() . ':' . $port);
280
+ } else {
281
+ $this->headers['host'] = $this->headerFactory->createHeader('Host', $this->url->getHost());
282
+ }
283
+
284
+ return $this;
285
+ }
286
+
287
+ public function getUsername()
288
+ {
289
+ return $this->username;
290
+ }
291
+
292
+ public function getPassword()
293
+ {
294
+ return $this->password;
295
+ }
296
+
297
+ public function setAuth($user, $password = '', $scheme = CURLAUTH_BASIC)
298
+ {
299
+ static $authMap = array(
300
+ 'basic' => CURLAUTH_BASIC,
301
+ 'digest' => CURLAUTH_DIGEST,
302
+ 'ntlm' => CURLAUTH_NTLM,
303
+ 'any' => CURLAUTH_ANY
304
+ );
305
+
306
+ // If we got false or null, disable authentication
307
+ if (!$user) {
308
+ $this->password = $this->username = null;
309
+ $this->removeHeader('Authorization');
310
+ $this->getCurlOptions()->remove(CURLOPT_HTTPAUTH);
311
+ return $this;
312
+ }
313
+
314
+ if (!is_numeric($scheme)) {
315
+ $scheme = strtolower($scheme);
316
+ if (!isset($authMap[$scheme])) {
317
+ throw new InvalidArgumentException($scheme . ' is not a valid authentication type');
318
+ }
319
+ $scheme = $authMap[$scheme];
320
+ }
321
+
322
+ $this->username = $user;
323
+ $this->password = $password;
324
+
325
+ // Bypass CURL when using basic auth to promote connection reuse
326
+ if ($scheme == CURLAUTH_BASIC) {
327
+ $this->getCurlOptions()->remove(CURLOPT_HTTPAUTH);
328
+ $this->setHeader('Authorization', 'Basic ' . base64_encode($this->username . ':' . $this->password));
329
+ } else {
330
+ $this->getCurlOptions()
331
+ ->set(CURLOPT_HTTPAUTH, $scheme)
332
+ ->set(CURLOPT_USERPWD, $this->username . ':' . $this->password);
333
+ }
334
+
335
+ return $this;
336
+ }
337
+
338
+ public function getResource()
339
+ {
340
+ $resource = $this->getPath();
341
+ if ($query = (string) $this->url->getQuery()) {
342
+ $resource .= '?' . $query;
343
+ }
344
+
345
+ return $resource;
346
+ }
347
+
348
+ public function getUrl($asObject = false)
349
+ {
350
+ return $asObject ? clone $this->url : (string) $this->url;
351
+ }
352
+
353
+ public function getState()
354
+ {
355
+ return $this->state;
356
+ }
357
+
358
+ public function setState($state, array $context = array())
359
+ {
360
+ $oldState = $this->state;
361
+ $this->state = $state;
362
+
363
+ switch ($state) {
364
+ case self::STATE_NEW:
365
+ $this->response = null;
366
+ break;
367
+ case self::STATE_TRANSFER:
368
+ if ($oldState !== $state) {
369
+ // Fix Content-Length and Transfer-Encoding collisions
370
+ if ($this->hasHeader('Transfer-Encoding') && $this->hasHeader('Content-Length')) {
371
+ $this->removeHeader('Transfer-Encoding');
372
+ }
373
+ $this->dispatch('request.before_send', array('request' => $this));
374
+ }
375
+ break;
376
+ case self::STATE_COMPLETE:
377
+ if ($oldState !== $state) {
378
+ $this->processResponse($context);
379
+ $this->responseBody = null;
380
+ }
381
+ break;
382
+ case self::STATE_ERROR:
383
+ if (isset($context['exception'])) {
384
+ $this->dispatch('request.exception', array(
385
+ 'request' => $this,
386
+ 'response' => isset($context['response']) ? $context['response'] : $this->response,
387
+ 'exception' => isset($context['exception']) ? $context['exception'] : null
388
+ ));
389
+ }
390
+ }
391
+
392
+ return $this->state;
393
+ }
394
+
395
+ public function getCurlOptions()
396
+ {
397
+ return $this->curlOptions;
398
+ }
399
+
400
+ public function startResponse(Response $response)
401
+ {
402
+ $this->state = self::STATE_TRANSFER;
403
+ $response->setEffectiveUrl((string) $this->getUrl());
404
+ $this->response = $response;
405
+
406
+ return $this;
407
+ }
408
+
409
+ public function setResponse(Response $response, $queued = false)
410
+ {
411
+ $response->setEffectiveUrl((string) $this->url);
412
+
413
+ if ($queued) {
414
+ $ed = $this->getEventDispatcher();
415
+ $ed->addListener('request.before_send', $f = function ($e) use ($response, &$f, $ed) {
416
+ $e['request']->setResponse($response);
417
+ $ed->removeListener('request.before_send', $f);
418
+ }, -9999);
419
+ } else {
420
+ $this->response = $response;
421
+ // If a specific response body is specified, then use it instead of the response's body
422
+ if ($this->responseBody && !$this->responseBody->getCustomData('default') && !$response->isRedirect()) {
423
+ $this->getResponseBody()->write((string) $this->response->getBody());
424
+ } else {
425
+ $this->responseBody = $this->response->getBody();
426
+ }
427
+ $this->setState(self::STATE_COMPLETE);
428
+ }
429
+
430
+ return $this;
431
+ }
432
+
433
+ public function setResponseBody($body)
434
+ {
435
+ // Attempt to open a file for writing if a string was passed
436
+ if (is_string($body)) {
437
+ // @codeCoverageIgnoreStart
438
+ if (!($body = fopen($body, 'w+'))) {
439
+ throw new InvalidArgumentException('Could not open ' . $body . ' for writing');
440
+ }
441
+ // @codeCoverageIgnoreEnd
442
+ }
443
+
444
+ $this->responseBody = EntityBody::factory($body);
445
+
446
+ return $this;
447
+ }
448
+
449
+ public function getResponseBody()
450
+ {
451
+ if ($this->responseBody === null) {
452
+ $this->responseBody = EntityBody::factory()->setCustomData('default', true);
453
+ }
454
+
455
+ return $this->responseBody;
456
+ }
457
+
458
+ /**
459
+ * Determine if the response body is repeatable (readable + seekable)
460
+ *
461
+ * @return bool
462
+ * @deprecated Use getResponseBody()->isSeekable()
463
+ * @codeCoverageIgnore
464
+ */
465
+ public function isResponseBodyRepeatable()
466
+ {
467
+ Version::warn(__METHOD__ . ' is deprecated. Use $request->getResponseBody()->isRepeatable()');
468
+ return !$this->responseBody ? true : $this->responseBody->isRepeatable();
469
+ }
470
+
471
+ public function getCookies()
472
+ {
473
+ if ($cookie = $this->getHeader('Cookie')) {
474
+ $data = ParserRegistry::getInstance()->getParser('cookie')->parseCookie($cookie);
475
+ return $data['cookies'];
476
+ }
477
+
478
+ return array();
479
+ }
480
+
481
+ public function getCookie($name)
482
+ {
483
+ $cookies = $this->getCookies();
484
+
485
+ return isset($cookies[$name]) ? $cookies[$name] : null;
486
+ }
487
+
488
+ public function addCookie($name, $value)
489
+ {
490
+ if (!$this->hasHeader('Cookie')) {
491
+ $this->setHeader('Cookie', "{$name}={$value}");
492
+ } else {
493
+ $this->getHeader('Cookie')->add("{$name}={$value}");
494
+ }
495
+
496
+ // Always use semicolons to separate multiple cookie headers
497
+ $this->getHeader('Cookie')->setGlue(';');
498
+
499
+ return $this;
500
+ }
501
+
502
+ public function removeCookie($name)
503
+ {
504
+ if ($cookie = $this->getHeader('Cookie')) {
505
+ foreach ($cookie as $cookieValue) {
506
+ if (strpos($cookieValue, $name . '=') === 0) {
507
+ $cookie->removeValue($cookieValue);
508
+ }
509
+ }
510
+ }
511
+
512
+ return $this;
513
+ }
514
+
515
+ public function setEventDispatcher(EventDispatcherInterface $eventDispatcher)
516
+ {
517
+ $this->eventDispatcher = $eventDispatcher;
518
+ $this->eventDispatcher->addListener('request.error', array(__CLASS__, 'onRequestError'), -255);
519
+
520
+ return $this;
521
+ }
522
+
523
+ public function getEventDispatcher()
524
+ {
525
+ if (!$this->eventDispatcher) {
526
+ $this->setEventDispatcher(new EventDispatcher());
527
+ }
528
+
529
+ return $this->eventDispatcher;
530
+ }
531
+
532
+ public function dispatch($eventName, array $context = array())
533
+ {
534
+ $context['request'] = $this;
535
+
536
+ return $this->getEventDispatcher()->dispatch($eventName, new Event($context));
537
+ }
538
+
539
+ public function addSubscriber(EventSubscriberInterface $subscriber)
540
+ {
541
+ $this->getEventDispatcher()->addSubscriber($subscriber);
542
+
543
+ return $this;
544
+ }
545
+
546
+ /**
547
+ * Get an array containing the request and response for event notifications
548
+ *
549
+ * @return array
550
+ */
551
+ protected function getEventArray()
552
+ {
553
+ return array(
554
+ 'request' => $this,
555
+ 'response' => $this->response
556
+ );
557
+ }
558
+
559
+ /**
560
+ * Process a received response
561
+ *
562
+ * @param array $context Contextual information
563
+ * @throws RequestException|BadResponseException on unsuccessful responses
564
+ */
565
+ protected function processResponse(array $context = array())
566
+ {
567
+ if (!$this->response) {
568
+ // If no response, then processResponse shouldn't have been called
569
+ $e = new RequestException('Error completing request');
570
+ $e->setRequest($this);
571
+ throw $e;
572
+ }
573
+
574
+ $this->state = self::STATE_COMPLETE;
575
+
576
+ // A request was sent, but we don't know if we'll send more or if the final response will be successful
577
+ $this->dispatch('request.sent', $this->getEventArray() + $context);
578
+
579
+ // Some response processors will remove the response or reset the state (example: ExponentialBackoffPlugin)
580
+ if ($this->state == RequestInterface::STATE_COMPLETE) {
581
+
582
+ // The request completed, so the HTTP transaction is complete
583
+ $this->dispatch('request.complete', $this->getEventArray());
584
+
585
+ // If the response is bad, allow listeners to modify it or throw exceptions. You can change the response by
586
+ // modifying the Event object in your listeners or calling setResponse() on the request
587
+ if ($this->response->isError()) {
588
+ $event = new Event($this->getEventArray());
589
+ $this->getEventDispatcher()->dispatch('request.error', $event);
590
+ // Allow events of request.error to quietly change the response
591
+ if ($event['response'] !== $this->response) {
592
+ $this->response = $event['response'];
593
+ }
594
+ }
595
+
596
+ // If a successful response was received, dispatch an event
597
+ if ($this->response->isSuccessful()) {
598
+ $this->dispatch('request.success', $this->getEventArray());
599
+ }
600
+ }
601
+ }
602
+
603
+ /**
604
+ * @deprecated Use Guzzle\Plugin\Cache\DefaultCanCacheStrategy
605
+ * @codeCoverageIgnore
606
+ */
607
+ public function canCache()
608
+ {
609
+ Version::warn(__METHOD__ . ' is deprecated. Use Guzzle\Plugin\Cache\DefaultCanCacheStrategy.');
610
+ if (class_exists('Guzzle\Plugin\Cache\DefaultCanCacheStrategy')) {
611
+ $canCache = new \Guzzle\Plugin\Cache\DefaultCanCacheStrategy();
612
+ return $canCache->canCacheRequest($this);
613
+ } else {
614
+ return false;
615
+ }
616
+ }
617
+
618
+ /**
619
+ * @deprecated Use the history plugin (not emitting a warning as this is built-into the RedirectPlugin for now)
620
+ * @codeCoverageIgnore
621
+ */
622
+ public function setIsRedirect($isRedirect)
623
+ {
624
+ $this->isRedirect = $isRedirect;
625
+
626
+ return $this;
627
+ }
628
+
629
+ /**
630
+ * @deprecated Use the history plugin
631
+ * @codeCoverageIgnore
632
+ */
633
+ public function isRedirect()
634
+ {
635
+ Version::warn(__METHOD__ . ' is deprecated. Use the HistoryPlugin to track this.');
636
+ return $this->isRedirect;
637
+ }
638
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php ADDED
@@ -0,0 +1,359 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Common\Collection;
6
+ use Guzzle\Common\Exception\InvalidArgumentException;
7
+ use Guzzle\Http\RedirectPlugin;
8
+ use Guzzle\Http\Url;
9
+ use Guzzle\Parser\ParserRegistry;
10
+
11
+ /**
12
+ * Default HTTP request factory used to create the default {@see Request} and {@see EntityEnclosingRequest} objects.
13
+ */
14
+ class RequestFactory implements RequestFactoryInterface
15
+ {
16
+ /** @var RequestFactory Singleton instance of the default request factory */
17
+ protected static $instance;
18
+
19
+ /** @var array Hash of methods available to the class (provides fast isset() lookups) */
20
+ protected $methods;
21
+
22
+ /** @var string Class to instantiate for requests with no body */
23
+ protected $requestClass = 'Guzzle\\Http\\Message\\Request';
24
+
25
+ /** @var string Class to instantiate for requests with a body */
26
+ protected $entityEnclosingRequestClass = 'Guzzle\\Http\\Message\\EntityEnclosingRequest';
27
+
28
+ /**
29
+ * Get a cached instance of the default request factory
30
+ *
31
+ * @return RequestFactory
32
+ */
33
+ public static function getInstance()
34
+ {
35
+ // @codeCoverageIgnoreStart
36
+ if (!static::$instance) {
37
+ static::$instance = new static();
38
+ }
39
+ // @codeCoverageIgnoreEnd
40
+
41
+ return static::$instance;
42
+ }
43
+
44
+ public function __construct()
45
+ {
46
+ $this->methods = array_flip(get_class_methods(__CLASS__));
47
+ }
48
+
49
+ public function fromMessage($message)
50
+ {
51
+ $parsed = ParserRegistry::getInstance()->getParser('message')->parseRequest($message);
52
+
53
+ if (!$parsed) {
54
+ return false;
55
+ }
56
+
57
+ $request = $this->fromParts($parsed['method'], $parsed['request_url'],
58
+ $parsed['headers'], $parsed['body'], $parsed['protocol'],
59
+ $parsed['version']);
60
+
61
+ // EntityEnclosingRequest adds an "Expect: 100-Continue" header when using a raw request body for PUT or POST
62
+ // requests. This factory method should accurately reflect the message, so here we are removing the Expect
63
+ // header if one was not supplied in the message.
64
+ if (!isset($parsed['headers']['Expect']) && !isset($parsed['headers']['expect'])) {
65
+ $request->removeHeader('Expect');
66
+ }
67
+
68
+ return $request;
69
+ }
70
+
71
+ public function fromParts(
72
+ $method,
73
+ array $urlParts,
74
+ $headers = null,
75
+ $body = null,
76
+ $protocol = 'HTTP',
77
+ $protocolVersion = '1.1'
78
+ ) {
79
+ return $this->create($method, Url::buildUrl($urlParts), $headers, $body)
80
+ ->setProtocolVersion($protocolVersion);
81
+ }
82
+
83
+ public function create($method, $url, $headers = null, $body = null, array $options = array())
84
+ {
85
+ $method = strtoupper($method);
86
+
87
+ if ($method == 'GET' || $method == 'HEAD' || $method == 'TRACE') {
88
+ // Handle non-entity-enclosing request methods
89
+ $request = new $this->requestClass($method, $url, $headers);
90
+ if ($body) {
91
+ // The body is where the response body will be stored
92
+ $type = gettype($body);
93
+ if ($type == 'string' || $type == 'resource' || $type == 'object') {
94
+ $request->setResponseBody($body);
95
+ }
96
+ }
97
+ } else {
98
+ // Create an entity enclosing request by default
99
+ $request = new $this->entityEnclosingRequestClass($method, $url, $headers);
100
+ if ($body || $body === '0') {
101
+ // Add POST fields and files to an entity enclosing request if an array is used
102
+ if (is_array($body) || $body instanceof Collection) {
103
+ // Normalize PHP style cURL uploads with a leading '@' symbol
104
+ foreach ($body as $key => $value) {
105
+ if (is_string($value) && substr($value, 0, 1) == '@') {
106
+ $request->addPostFile($key, $value);
107
+ unset($body[$key]);
108
+ }
109
+ }
110
+ // Add the fields if they are still present and not all files
111
+ $request->addPostFields($body);
112
+ } else {
113
+ // Add a raw entity body body to the request
114
+ $request->setBody($body, (string) $request->getHeader('Content-Type'));
115
+ if ((string) $request->getHeader('Transfer-Encoding') == 'chunked') {
116
+ $request->removeHeader('Content-Length');
117
+ }
118
+ }
119
+ }
120
+ }
121
+
122
+ if ($options) {
123
+ $this->applyOptions($request, $options);
124
+ }
125
+
126
+ return $request;
127
+ }
128
+
129
+ /**
130
+ * Clone a request while changing the method. Emulates the behavior of
131
+ * {@see Guzzle\Http\Message\Request::clone}, but can change the HTTP method.
132
+ *
133
+ * @param RequestInterface $request Request to clone
134
+ * @param string $method Method to set
135
+ *
136
+ * @return RequestInterface
137
+ */
138
+ public function cloneRequestWithMethod(RequestInterface $request, $method)
139
+ {
140
+ // Create the request with the same client if possible
141
+ if ($request->getClient()) {
142
+ $cloned = $request->getClient()->createRequest($method, $request->getUrl(), $request->getHeaders());
143
+ } else {
144
+ $cloned = $this->create($method, $request->getUrl(), $request->getHeaders());
145
+ }
146
+
147
+ $cloned->getCurlOptions()->replace($request->getCurlOptions()->toArray());
148
+ $cloned->setEventDispatcher(clone $request->getEventDispatcher());
149
+ // Ensure that that the Content-Length header is not copied if changing to GET or HEAD
150
+ if (!($cloned instanceof EntityEnclosingRequestInterface)) {
151
+ $cloned->removeHeader('Content-Length');
152
+ } elseif ($request instanceof EntityEnclosingRequestInterface) {
153
+ $cloned->setBody($request->getBody());
154
+ }
155
+ $cloned->getParams()->replace($request->getParams()->toArray());
156
+ $cloned->dispatch('request.clone', array('request' => $cloned));
157
+
158
+ return $cloned;
159
+ }
160
+
161
+ public function applyOptions(RequestInterface $request, array $options = array(), $flags = self::OPTIONS_NONE)
162
+ {
163
+ // Iterate over each key value pair and attempt to apply a config using function visitors
164
+ foreach ($options as $key => $value) {
165
+ $method = "visit_{$key}";
166
+ if (isset($this->methods[$method])) {
167
+ $this->{$method}($request, $value, $flags);
168
+ }
169
+ }
170
+ }
171
+
172
+ protected function visit_headers(RequestInterface $request, $value, $flags)
173
+ {
174
+ if (!is_array($value)) {
175
+ throw new InvalidArgumentException('headers value must be an array');
176
+ }
177
+
178
+ if ($flags & self::OPTIONS_AS_DEFAULTS) {
179
+ // Merge headers in but do not overwrite existing values
180
+ foreach ($value as $key => $header) {
181
+ if (!$request->hasHeader($key)) {
182
+ $request->setHeader($key, $header);
183
+ }
184
+ }
185
+ } else {
186
+ $request->addHeaders($value);
187
+ }
188
+ }
189
+
190
+ protected function visit_body(RequestInterface $request, $value, $flags)
191
+ {
192
+ if ($request instanceof EntityEnclosingRequestInterface) {
193
+ $request->setBody($value);
194
+ } else {
195
+ throw new InvalidArgumentException('Attempting to set a body on a non-entity-enclosing request');
196
+ }
197
+ }
198
+
199
+ protected function visit_allow_redirects(RequestInterface $request, $value, $flags)
200
+ {
201
+ if ($value === false) {
202
+ $request->getParams()->set(RedirectPlugin::DISABLE, true);
203
+ }
204
+ }
205
+
206
+ protected function visit_auth(RequestInterface $request, $value, $flags)
207
+ {
208
+ if (!is_array($value)) {
209
+ throw new InvalidArgumentException('auth value must be an array');
210
+ }
211
+
212
+ $request->setAuth($value[0], isset($value[1]) ? $value[1] : null, isset($value[2]) ? $value[2] : 'basic');
213
+ }
214
+
215
+ protected function visit_query(RequestInterface $request, $value, $flags)
216
+ {
217
+ if (!is_array($value)) {
218
+ throw new InvalidArgumentException('query value must be an array');
219
+ }
220
+
221
+ if ($flags & self::OPTIONS_AS_DEFAULTS) {
222
+ // Merge query string values in but do not overwrite existing values
223
+ $query = $request->getQuery();
224
+ $query->overwriteWith(array_diff_key($value, $query->toArray()));
225
+ } else {
226
+ $request->getQuery()->overwriteWith($value);
227
+ }
228
+ }
229
+
230
+ protected function visit_cookies(RequestInterface $request, $value, $flags)
231
+ {
232
+ if (!is_array($value)) {
233
+ throw new InvalidArgumentException('cookies value must be an array');
234
+ }
235
+
236
+ foreach ($value as $name => $v) {
237
+ $request->addCookie($name, $v);
238
+ }
239
+ }
240
+
241
+ protected function visit_events(RequestInterface $request, $value, $flags)
242
+ {
243
+ if (!is_array($value)) {
244
+ throw new InvalidArgumentException('events value must be an array');
245
+ }
246
+
247
+ foreach ($value as $name => $method) {
248
+ if (is_array($method)) {
249
+ $request->getEventDispatcher()->addListener($name, $method[0], $method[1]);
250
+ } else {
251
+ $request->getEventDispatcher()->addListener($name, $method);
252
+ }
253
+ }
254
+ }
255
+
256
+ protected function visit_plugins(RequestInterface $request, $value, $flags)
257
+ {
258
+ if (!is_array($value)) {
259
+ throw new InvalidArgumentException('plugins value must be an array');
260
+ }
261
+
262
+ foreach ($value as $plugin) {
263
+ $request->addSubscriber($plugin);
264
+ }
265
+ }
266
+
267
+ protected function visit_exceptions(RequestInterface $request, $value, $flags)
268
+ {
269
+ if ($value === false || $value === 0) {
270
+ $dispatcher = $request->getEventDispatcher();
271
+ foreach ($dispatcher->getListeners('request.error') as $listener) {
272
+ if (is_array($listener) && $listener[0] == 'Guzzle\Http\Message\Request' && $listener[1] = 'onRequestError') {
273
+ $dispatcher->removeListener('request.error', $listener);
274
+ break;
275
+ }
276
+ }
277
+ }
278
+ }
279
+
280
+ protected function visit_save_to(RequestInterface $request, $value, $flags)
281
+ {
282
+ $request->setResponseBody($value);
283
+ }
284
+
285
+ protected function visit_params(RequestInterface $request, $value, $flags)
286
+ {
287
+ if (!is_array($value)) {
288
+ throw new InvalidArgumentException('params value must be an array');
289
+ }
290
+
291
+ $request->getParams()->overwriteWith($value);
292
+ }
293
+
294
+ protected function visit_timeout(RequestInterface $request, $value, $flags)
295
+ {
296
+ if (defined('CURLOPT_TIMEOUT_MS')) {
297
+ $request->getCurlOptions()->set(CURLOPT_TIMEOUT_MS, $value * 1000);
298
+ } else {
299
+ $request->getCurlOptions()->set(CURLOPT_TIMEOUT, $value);
300
+ }
301
+ }
302
+
303
+ protected function visit_connect_timeout(RequestInterface $request, $value, $flags)
304
+ {
305
+ if (defined('CURLOPT_CONNECTTIMEOUT_MS')) {
306
+ $request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT_MS, $value * 1000);
307
+ } else {
308
+ $request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT, $value);
309
+ }
310
+ }
311
+
312
+ protected function visit_debug(RequestInterface $request, $value, $flags)
313
+ {
314
+ if ($value) {
315
+ $request->getCurlOptions()->set(CURLOPT_VERBOSE, true);
316
+ }
317
+ }
318
+
319
+ protected function visit_verify(RequestInterface $request, $value, $flags)
320
+ {
321
+ $curl = $request->getCurlOptions();
322
+ if ($value === true || is_string($value)) {
323
+ $curl[CURLOPT_SSL_VERIFYHOST] = 2;
324
+ $curl[CURLOPT_SSL_VERIFYPEER] = true;
325
+ if ($value !== true) {
326
+ $curl[CURLOPT_CAINFO] = $value;
327
+ }
328
+ } elseif ($value === false) {
329
+ unset($curl[CURLOPT_CAINFO]);
330
+ $curl[CURLOPT_SSL_VERIFYHOST] = 0;
331
+ $curl[CURLOPT_SSL_VERIFYPEER] = false;
332
+ }
333
+ }
334
+
335
+ protected function visit_proxy(RequestInterface $request, $value, $flags)
336
+ {
337
+ $request->getCurlOptions()->set(CURLOPT_PROXY, $value, $flags);
338
+ }
339
+
340
+ protected function visit_cert(RequestInterface $request, $value, $flags)
341
+ {
342
+ if (is_array($value)) {
343
+ $request->getCurlOptions()->set(CURLOPT_SSLCERT, $value[0]);
344
+ $request->getCurlOptions()->set(CURLOPT_SSLCERTPASSWD, $value[1]);
345
+ } else {
346
+ $request->getCurlOptions()->set(CURLOPT_SSLCERT, $value);
347
+ }
348
+ }
349
+
350
+ protected function visit_ssl_key(RequestInterface $request, $value, $flags)
351
+ {
352
+ if (is_array($value)) {
353
+ $request->getCurlOptions()->set(CURLOPT_SSLKEY, $value[0]);
354
+ $request->getCurlOptions()->set(CURLOPT_SSLKEYPASSWD, $value[1]);
355
+ } else {
356
+ $request->getCurlOptions()->set(CURLOPT_SSLKEY, $value);
357
+ }
358
+ }
359
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactoryInterface.php ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Common\Collection;
6
+ use Guzzle\Http\EntityBodyInterface;
7
+ use Guzzle\Http\Url;
8
+
9
+ /**
10
+ * Request factory used to create HTTP requests
11
+ */
12
+ interface RequestFactoryInterface
13
+ {
14
+ const OPTIONS_NONE = 0;
15
+ const OPTIONS_AS_DEFAULTS = 1;
16
+
17
+ /**
18
+ * Create a new request based on an HTTP message
19
+ *
20
+ * @param string $message HTTP message as a string
21
+ *
22
+ * @return RequestInterface
23
+ */
24
+ public function fromMessage($message);
25
+
26
+ /**
27
+ * Create a request from URL parts as returned from parse_url()
28
+ *
29
+ * @param string $method HTTP method (GET, POST, PUT, HEAD, DELETE, etc)
30
+ *
31
+ * @param array $urlParts URL parts containing the same keys as parse_url()
32
+ * - scheme: e.g. http
33
+ * - host: e.g. www.guzzle-project.com
34
+ * - port: e.g. 80
35
+ * - user: e.g. michael
36
+ * - pass: e.g. rocks
37
+ * - path: e.g. / OR /index.html
38
+ * - query: after the question mark ?
39
+ * @param array|Collection $headers HTTP headers
40
+ * @param string|resource|array|EntityBodyInterface $body Body to send in the request
41
+ * @param string $protocol Protocol (HTTP, SPYDY, etc)
42
+ * @param string $protocolVersion 1.0, 1.1, etc
43
+ *
44
+ * @return RequestInterface
45
+ */
46
+ public function fromParts(
47
+ $method,
48
+ array $urlParts,
49
+ $headers = null,
50
+ $body = null,
51
+ $protocol = 'HTTP',
52
+ $protocolVersion = '1.1'
53
+ );
54
+
55
+ /**
56
+ * Create a new request based on the HTTP method
57
+ *
58
+ * @param string $method HTTP method (GET, POST, PUT, PATCH, HEAD, DELETE, ...)
59
+ * @param string|Url $url HTTP URL to connect to
60
+ * @param array|Collection $headers HTTP headers
61
+ * @param string|resource|array|EntityBodyInterface $body Body to send in the request
62
+ * @param array $options Array of options to apply to the request
63
+ *
64
+ * @return RequestInterface
65
+ */
66
+ public function create($method, $url, $headers = null, $body = null, array $options = array());
67
+
68
+ /**
69
+ * Apply an associative array of options to the request
70
+ *
71
+ * @param RequestInterface $request Request to update
72
+ * @param array $options Options to use with the request. Available options are:
73
+ * "headers": Associative array of headers
74
+ * "query": Associative array of query string values to add to the request
75
+ * "body": Body of a request, including an EntityBody, string, or array when sending POST requests.
76
+ * "auth": Array of HTTP authentication parameters to use with the request. The array must contain the
77
+ * username in index [0], the password in index [2], and can optionally contain the authentication type
78
+ * in index [3]. The authentication types are: "Basic", "Digest", "NTLM", "Any" (defaults to "Basic").
79
+ * "cookies": Associative array of cookies
80
+ * "allow_redirects": Set to false to disable redirects
81
+ * "save_to": String, fopen resource, or EntityBody object used to store the body of the response
82
+ * "events": Associative array mapping event names to a closure or array of (priority, closure)
83
+ * "plugins": Array of plugins to add to the request
84
+ * "exceptions": Set to false to disable throwing exceptions on an HTTP level error (e.g. 404, 500, etc)
85
+ * "params": Set custom request data parameters on a request. (Note: these are not query string parameters)
86
+ * "timeout": Float describing the timeout of the request in seconds
87
+ * "connect_timeout": Float describing the number of seconds to wait while trying to connect. Use 0 to wait
88
+ * indefinitely.
89
+ * "verify": Set to true to enable SSL cert validation (the default), false to disable, or supply the path
90
+ * to a CA bundle to enable verification using a custom certificate.
91
+ * "cert": Set to a string to specify the path to a file containing a PEM formatted certificate. If a
92
+ * password is required, then set an array containing the path to the PEM file followed by the the
93
+ * password required for the certificate.
94
+ * "ssl_key": Specify the path to a file containing a private SSL key in PEM format. If a password is
95
+ * required, then set an array containing the path to the SSL key followed by the password required for
96
+ * the certificate.
97
+ * "proxy": Specify an HTTP proxy (e.g. "http://username:password@192.168.16.1:10")
98
+ * "debug": Set to true to display all data sent over the wire
99
+ * @param int $flags Bitwise flags to apply when applying the options to the request. Defaults to no special
100
+ * options. `1` (OPTIONS_AS_DEFAULTS): When specified, options will only update a request when
101
+ * the value does not already exist on the request. This is only supported by "query" and
102
+ * "headers". Other bitwise options may be added in the future.
103
+ */
104
+ public function applyOptions(RequestInterface $request, array $options = array(), $flags = self::OPTIONS_NONE);
105
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/RequestInterface.php ADDED
@@ -0,0 +1,318 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Common\Collection;
6
+ use Guzzle\Common\HasDispatcherInterface;
7
+ use Guzzle\Http\Exception\RequestException;
8
+ use Guzzle\Http\ClientInterface;
9
+ use Guzzle\Http\EntityBodyInterface;
10
+ use Guzzle\Http\Url;
11
+ use Guzzle\Http\QueryString;
12
+
13
+ /**
14
+ * Generic HTTP request interface
15
+ */
16
+ interface RequestInterface extends MessageInterface, HasDispatcherInterface
17
+ {
18
+ const STATE_NEW = 'new';
19
+ const STATE_COMPLETE = 'complete';
20
+ const STATE_TRANSFER = 'transfer';
21
+ const STATE_ERROR = 'error';
22
+
23
+ const GET = 'GET';
24
+ const PUT = 'PUT';
25
+ const POST = 'POST';
26
+ const DELETE = 'DELETE';
27
+ const HEAD = 'HEAD';
28
+ const CONNECT = 'CONNECT';
29
+ const OPTIONS = 'OPTIONS';
30
+ const TRACE = 'TRACE';
31
+ const PATCH = 'PATCH';
32
+
33
+ /**
34
+ * @return string
35
+ */
36
+ public function __toString();
37
+
38
+ /**
39
+ * Send the request
40
+ *
41
+ * @return Response
42
+ * @throws RequestException on a request error
43
+ */
44
+ public function send();
45
+
46
+ /**
47
+ * Set the client used to transport the request
48
+ *
49
+ * @param ClientInterface $client
50
+ *
51
+ * @return self
52
+ */
53
+ public function setClient(ClientInterface $client);
54
+
55
+ /**
56
+ * Get the client used to transport the request
57
+ *
58
+ * @return ClientInterface $client
59
+ */
60
+ public function getClient();
61
+
62
+ /**
63
+ * Set the URL of the request
64
+ *
65
+ * @param string $url|Url Full URL to set including query string
66
+ *
67
+ * @return self
68
+ */
69
+ public function setUrl($url);
70
+
71
+ /**
72
+ * Get the full URL of the request (e.g. 'http://www.guzzle-project.com/')
73
+ *
74
+ * @param bool $asObject Set to TRUE to retrieve the URL as a clone of the URL object owned by the request.
75
+ *
76
+ * @return string|Url
77
+ */
78
+ public function getUrl($asObject = false);
79
+
80
+ /**
81
+ * Get the resource part of the the request, including the path, query string, and fragment
82
+ *
83
+ * @return string
84
+ */
85
+ public function getResource();
86
+
87
+ /**
88
+ * Get the collection of key value pairs that will be used as the query string in the request
89
+ *
90
+ * @return QueryString
91
+ */
92
+ public function getQuery();
93
+
94
+ /**
95
+ * Get the HTTP method of the request
96
+ *
97
+ * @return string
98
+ */
99
+ public function getMethod();
100
+
101
+ /**
102
+ * Get the URI scheme of the request (http, https, ftp, etc)
103
+ *
104
+ * @return string
105
+ */
106
+ public function getScheme();
107
+
108
+ /**
109
+ * Set the URI scheme of the request (http, https, ftp, etc)
110
+ *
111
+ * @param string $scheme Scheme to set
112
+ *
113
+ * @return self
114
+ */
115
+ public function setScheme($scheme);
116
+
117
+ /**
118
+ * Get the host of the request
119
+ *
120
+ * @return string
121
+ */
122
+ public function getHost();
123
+
124
+ /**
125
+ * Set the host of the request. Including a port in the host will modify the port of the request.
126
+ *
127
+ * @param string $host Host to set (e.g. www.yahoo.com, www.yahoo.com:80)
128
+ *
129
+ * @return self
130
+ */
131
+ public function setHost($host);
132
+
133
+ /**
134
+ * Get the path of the request (e.g. '/', '/index.html')
135
+ *
136
+ * @return string
137
+ */
138
+ public function getPath();
139
+
140
+ /**
141
+ * Set the path of the request (e.g. '/', '/index.html')
142
+ *
143
+ * @param string|array $path Path to set or array of segments to implode
144
+ *
145
+ * @return self
146
+ */
147
+ public function setPath($path);
148
+
149
+ /**
150
+ * Get the port that the request will be sent on if it has been set
151
+ *
152
+ * @return int|null
153
+ */
154
+ public function getPort();
155
+
156
+ /**
157
+ * Set the port that the request will be sent on
158
+ *
159
+ * @param int $port Port number to set
160
+ *
161
+ * @return self
162
+ */
163
+ public function setPort($port);
164
+
165
+ /**
166
+ * Get the username to pass in the URL if set
167
+ *
168
+ * @return string|null
169
+ */
170
+ public function getUsername();
171
+
172
+ /**
173
+ * Get the password to pass in the URL if set
174
+ *
175
+ * @return string|null
176
+ */
177
+ public function getPassword();
178
+
179
+ /**
180
+ * Set HTTP authorization parameters
181
+ *
182
+ * @param string|bool $user User name or false disable authentication
183
+ * @param string $password Password
184
+ * @param string $scheme Authentication scheme ('Basic', 'Digest', or a CURLAUTH_* constant (deprecated))
185
+ *
186
+ * @return self
187
+ * @link http://www.ietf.org/rfc/rfc2617.txt
188
+ * @link http://php.net/manual/en/function.curl-setopt.php See the available options for CURLOPT_HTTPAUTH
189
+ * @throws RequestException
190
+ */
191
+ public function setAuth($user, $password = '', $scheme = 'Basic');
192
+
193
+ /**
194
+ * Get the HTTP protocol version of the request
195
+ *
196
+ * @return string
197
+ */
198
+ public function getProtocolVersion();
199
+
200
+ /**
201
+ * Set the HTTP protocol version of the request (e.g. 1.1 or 1.0)
202
+ *
203
+ * @param string $protocol HTTP protocol version to use with the request
204
+ *
205
+ * @return self
206
+ */
207
+ public function setProtocolVersion($protocol);
208
+
209
+ /**
210
+ * Get the previously received {@see Response} or NULL if the request has not been sent
211
+ *
212
+ * @return Response|null
213
+ */
214
+ public function getResponse();
215
+
216
+ /**
217
+ * Manually set a response for the request.
218
+ *
219
+ * This method is useful for specifying a mock response for the request or setting the response using a cache.
220
+ * Manually setting a response will bypass the actual sending of a request.
221
+ *
222
+ * @param Response $response Response object to set
223
+ * @param bool $queued Set to TRUE to keep the request in a state of not having been sent, but queue the
224
+ * response for send()
225
+ *
226
+ * @return self Returns a reference to the object.
227
+ */
228
+ public function setResponse(Response $response, $queued = false);
229
+
230
+ /**
231
+ * The start of a response has been received for a request and the request is still in progress
232
+ *
233
+ * @param Response $response Response that has been received so far
234
+ *
235
+ * @return self
236
+ */
237
+ public function startResponse(Response $response);
238
+
239
+ /**
240
+ * Set the EntityBody that will hold a successful response message's entity body.
241
+ *
242
+ * This method should be invoked when you need to send the response's entity body somewhere other than the normal
243
+ * php://temp buffer. For example, you can send the entity body to a socket, file, or some other custom stream.
244
+ *
245
+ * @param EntityBodyInterface|string|resource $body Response body object. Pass a string to attempt to store the
246
+ * response body in a local file.
247
+ * @return Request
248
+ */
249
+ public function setResponseBody($body);
250
+
251
+ /**
252
+ * Get the EntityBody that will hold the resulting response message's entity body. This response body will only
253
+ * be used for successful responses. Intermediate responses (e.g. redirects) will not use the targeted response
254
+ * body.
255
+ *
256
+ * @return EntityBodyInterface
257
+ */
258
+ public function getResponseBody();
259
+
260
+ /**
261
+ * Get the state of the request. One of 'complete', 'transfer', 'new', 'error'
262
+ *
263
+ * @return string
264
+ */
265
+ public function getState();
266
+
267
+ /**
268
+ * Set the state of the request
269
+ *
270
+ * @param string $state State of the request ('complete', 'transfer', 'new', 'error')
271
+ * @param array $context Contextual information about the state change
272
+ *
273
+ * @return string Returns the current state of the request (which may have changed due to events being fired)
274
+ */
275
+ public function setState($state, array $context = array());
276
+
277
+ /**
278
+ * Get the cURL options that will be applied when the cURL handle is created
279
+ *
280
+ * @return Collection
281
+ */
282
+ public function getCurlOptions();
283
+
284
+ /**
285
+ * Get an array of Cookies
286
+ *
287
+ * @return array
288
+ */
289
+ public function getCookies();
290
+
291
+ /**
292
+ * Get a cookie value by name
293
+ *
294
+ * @param string $name Cookie to retrieve
295
+ *
296
+ * @return null|string
297
+ */
298
+ public function getCookie($name);
299
+
300
+ /**
301
+ * Add a Cookie value by name to the Cookie header
302
+ *
303
+ * @param string $name Name of the cookie to add
304
+ * @param string $value Value to set
305
+ *
306
+ * @return self
307
+ */
308
+ public function addCookie($name, $value);
309
+
310
+ /**
311
+ * Remove a specific cookie value by name
312
+ *
313
+ * @param string $name Cookie to remove by name
314
+ *
315
+ * @return self
316
+ */
317
+ public function removeCookie($name);
318
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Response.php ADDED
@@ -0,0 +1,968 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\Message;
4
+
5
+ use Guzzle\Common\Version;
6
+ use Guzzle\Common\ToArrayInterface;
7
+ use Guzzle\Common\Exception\RuntimeException;
8
+ use Guzzle\Http\EntityBodyInterface;
9
+ use Guzzle\Http\EntityBody;
10
+ use Guzzle\Http\Exception\BadResponseException;
11
+ use Guzzle\Http\RedirectPlugin;
12
+ use Guzzle\Parser\ParserRegistry;
13
+
14
+ /**
15
+ * Guzzle HTTP response object
16
+ */
17
+ class Response extends AbstractMessage implements \Serializable
18
+ {
19
+ /**
20
+ * @var array Array of reason phrases and their corresponding status codes
21
+ */
22
+ private static $statusTexts = array(
23
+ 100 => 'Continue',
24
+ 101 => 'Switching Protocols',
25
+ 102 => 'Processing',
26
+ 200 => 'OK',
27
+ 201 => 'Created',
28
+ 202 => 'Accepted',
29
+ 203 => 'Non-Authoritative Information',
30
+ 204 => 'No Content',
31
+ 205 => 'Reset Content',
32
+ 206 => 'Partial Content',
33
+ 207 => 'Multi-Status',
34
+ 208 => 'Already Reported',
35
+ 226 => 'IM Used',
36
+ 300 => 'Multiple Choices',
37
+ 301 => 'Moved Permanently',
38
+ 302 => 'Found',
39
+ 303 => 'See Other',
40
+ 304 => 'Not Modified',
41
+ 305 => 'Use Proxy',
42
+ 307 => 'Temporary Redirect',
43
+ 308 => 'Permanent Redirect',
44
+ 400 => 'Bad Request',
45
+ 401 => 'Unauthorized',
46
+ 402 => 'Payment Required',
47
+ 403 => 'Forbidden',
48
+ 404 => 'Not Found',
49
+ 405 => 'Method Not Allowed',
50
+ 406 => 'Not Acceptable',
51
+ 407 => 'Proxy Authentication Required',
52
+ 408 => 'Request Timeout',
53
+ 409 => 'Conflict',
54
+ 410 => 'Gone',
55
+ 411 => 'Length Required',
56
+ 412 => 'Precondition Failed',
57
+ 413 => 'Request Entity Too Large',
58
+ 414 => 'Request-URI Too Long',
59
+ 415 => 'Unsupported Media Type',
60
+ 416 => 'Requested Range Not Satisfiable',
61
+ 417 => 'Expectation Failed',
62
+ 422 => 'Unprocessable Entity',
63
+ 423 => 'Locked',
64
+ 424 => 'Failed Dependency',
65
+ 425 => 'Reserved for WebDAV advanced collections expired proposal',
66
+ 426 => 'Upgrade required',
67
+ 428 => 'Precondition Required',
68
+ 429 => 'Too Many Requests',
69
+ 431 => 'Request Header Fields Too Large',
70
+ 500 => 'Internal Server Error',
71
+ 501 => 'Not Implemented',
72
+ 502 => 'Bad Gateway',
73
+ 503 => 'Service Unavailable',
74
+ 504 => 'Gateway Timeout',
75
+ 505 => 'HTTP Version Not Supported',
76
+ 506 => 'Variant Also Negotiates (Experimental)',
77
+ 507 => 'Insufficient Storage',
78
+ 508 => 'Loop Detected',
79
+ 510 => 'Not Extended',
80
+ 511 => 'Network Authentication Required',
81
+ );
82
+
83
+ /** @var EntityBodyInterface The response body */
84
+ protected $body;
85
+
86
+ /** @var string The reason phrase of the response (human readable code) */
87
+ protected $reasonPhrase;
88
+
89
+ /** @var string The status code of the response */
90
+ protected $statusCode;
91
+
92
+ /** @var array Information about the request */
93
+ protected $info = array();
94
+
95
+ /** @var string The effective URL that returned this response */
96
+ protected $effectiveUrl;
97
+
98
+ /** @var array Cacheable response codes (see RFC 2616:13.4) */
99
+ protected static $cacheResponseCodes = array(200, 203, 206, 300, 301, 410);
100
+
101
+ /**
102
+ * Create a new Response based on a raw response message
103
+ *
104
+ * @param string $message Response message
105
+ *
106
+ * @return self|bool Returns false on error
107
+ */
108
+ public static function fromMessage($message)
109
+ {
110
+ $data = ParserRegistry::getInstance()->getParser('message')->parseResponse($message);
111
+ if (!$data) {
112
+ return false;
113
+ }
114
+
115
+ $response = new static($data['code'], $data['headers'], $data['body']);
116
+ $response->setProtocol($data['protocol'], $data['version'])
117
+ ->setStatus($data['code'], $data['reason_phrase']);
118
+
119
+ // Set the appropriate Content-Length if the one set is inaccurate (e.g. setting to X)
120
+ $contentLength = (string) $response->getHeader('Content-Length');
121
+ $actualLength = strlen($data['body']);
122
+ if (strlen($data['body']) > 0 && $contentLength != $actualLength) {
123
+ $response->setHeader('Content-Length', $actualLength);
124
+ }
125
+
126
+ return $response;
127
+ }
128
+
129
+ /**
130
+ * Construct the response
131
+ *
132
+ * @param string $statusCode The response status code (e.g. 200, 404, etc)
133
+ * @param ToArrayInterface|array $headers The response headers
134
+ * @param string|resource|EntityBodyInterface $body The body of the response
135
+ *
136
+ * @throws BadResponseException if an invalid response code is given
137
+ */
138
+ public function __construct($statusCode, $headers = null, $body = null)
139
+ {
140
+ parent::__construct();
141
+ $this->setStatus($statusCode);
142
+ $this->body = EntityBody::factory($body !== null ? $body : '');
143
+
144
+ if ($headers) {
145
+ if (is_array($headers)) {
146
+ $this->setHeaders($headers);
147
+ } elseif ($headers instanceof ToArrayInterface) {
148
+ $this->setHeaders($headers->toArray());
149
+ } else {
150
+ throw new BadResponseException('Invalid headers argument received');
151
+ }
152
+ }
153
+ }
154
+
155
+ /**
156
+ * @return string
157
+ */
158
+ public function __toString()
159
+ {
160
+ return $this->getMessage();
161
+ }
162
+
163
+ public function serialize()
164
+ {
165
+ return json_encode(array(
166
+ 'status' => $this->statusCode,
167
+ 'body' => (string) $this->body,
168
+ 'headers' => $this->headers->toArray()
169
+ ));
170
+ }
171
+
172
+ public function unserialize($serialize)
173
+ {
174
+ $data = json_decode($serialize, true);
175
+ $this->__construct($data['status'], $data['headers'], $data['body']);
176
+ }
177
+
178
+ /**
179
+ * Get the response entity body
180
+ *
181
+ * @param bool $asString Set to TRUE to return a string of the body rather than a full body object
182
+ *
183
+ * @return EntityBodyInterface|string
184
+ */
185
+ public function getBody($asString = false)
186
+ {
187
+ return $asString ? (string) $this->body : $this->body;
188
+ }
189
+
190
+ /**
191
+ * Set the response entity body
192
+ *
193
+ * @param EntityBodyInterface|string $body Body to set
194
+ *
195
+ * @return self
196
+ */
197
+ public function setBody($body)
198
+ {
199
+ $this->body = EntityBody::factory($body);
200
+
201
+ return $this;
202
+ }
203
+
204
+ /**
205
+ * Set the protocol and protocol version of the response
206
+ *
207
+ * @param string $protocol Response protocol
208
+ * @param string $version Protocol version
209
+ *
210
+ * @return self
211
+ */
212
+ public function setProtocol($protocol, $version)
213
+ {
214
+ $this->protocol = $protocol;
215
+ $this->protocolVersion = $version;
216
+
217
+ return $this;
218
+ }
219
+
220
+ /**
221
+ * Get the protocol used for the response (e.g. HTTP)
222
+ *
223
+ * @return string
224
+ */
225
+ public function getProtocol()
226
+ {
227
+ return $this->protocol;
228
+ }
229
+
230
+ /**
231
+ * Get the HTTP protocol version
232
+ *
233
+ * @return string
234
+ */
235
+ public function getProtocolVersion()
236
+ {
237
+ return $this->protocolVersion;
238
+ }
239
+
240
+ /**
241
+ * Get a cURL transfer information
242
+ *
243
+ * @param string $key A single statistic to check
244
+ *
245
+ * @return array|string|null Returns all stats if no key is set, a single stat if a key is set, or null if a key
246
+ * is set and not found
247
+ * @link http://www.php.net/manual/en/function.curl-getinfo.php
248
+ */
249
+ public function getInfo($key = null)
250
+ {
251
+ if ($key === null) {
252
+ return $this->info;
253
+ } elseif (array_key_exists($key, $this->info)) {
254
+ return $this->info[$key];
255
+ } else {
256
+ return null;
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Set the transfer information
262
+ *
263
+ * @param array $info Array of cURL transfer stats
264
+ *
265
+ * @return self
266
+ */
267
+ public function setInfo(array $info)
268
+ {
269
+ $this->info = $info;
270
+
271
+ return $this;
272
+ }
273
+
274
+ /**
275
+ * Set the response status
276
+ *
277
+ * @param int $statusCode Response status code to set
278
+ * @param string $reasonPhrase Response reason phrase
279
+ *
280
+ * @return self
281
+ * @throws BadResponseException when an invalid response code is received
282
+ */
283
+ public function setStatus($statusCode, $reasonPhrase = '')
284
+ {
285
+ $this->statusCode = (int) $statusCode;
286
+
287
+ if (!$reasonPhrase && isset(self::$statusTexts[$this->statusCode])) {
288
+ $this->reasonPhrase = self::$statusTexts[$this->statusCode];
289
+ } else {
290
+ $this->reasonPhrase = $reasonPhrase;
291
+ }
292
+
293
+ return $this;
294
+ }
295
+
296
+ /**
297
+ * Get the response status code
298
+ *
299
+ * @return integer
300
+ */
301
+ public function getStatusCode()
302
+ {
303
+ return $this->statusCode;
304
+ }
305
+
306
+ /**
307
+ * Get the entire response as a string
308
+ *
309
+ * @return string
310
+ */
311
+ public function getMessage()
312
+ {
313
+ $message = $this->getRawHeaders();
314
+
315
+ // Only include the body in the message if the size is < 2MB
316
+ $size = $this->body->getSize();
317
+ if ($size < 2097152) {
318
+ $message .= (string) $this->body;
319
+ }
320
+
321
+ return $message;
322
+ }
323
+
324
+ /**
325
+ * Get the the raw message headers as a string
326
+ *
327
+ * @return string
328
+ */
329
+ public function getRawHeaders()
330
+ {
331
+ $headers = 'HTTP/1.1 ' . $this->statusCode . ' ' . $this->reasonPhrase . "\r\n";
332
+ $lines = $this->getHeaderLines();
333
+ if (!empty($lines)) {
334
+ $headers .= implode("\r\n", $lines) . "\r\n";
335
+ }
336
+
337
+ return $headers . "\r\n";
338
+ }
339
+
340
+ /**
341
+ * Get the response reason phrase- a human readable version of the numeric
342
+ * status code
343
+ *
344
+ * @return string
345
+ */
346
+ public function getReasonPhrase()
347
+ {
348
+ return $this->reasonPhrase;
349
+ }
350
+
351
+ /**
352
+ * Get the Accept-Ranges HTTP header
353
+ *
354
+ * @return string Returns what partial content range types this server supports.
355
+ */
356
+ public function getAcceptRanges()
357
+ {
358
+ return (string) $this->getHeader('Accept-Ranges');
359
+ }
360
+
361
+ /**
362
+ * Calculate the age of the response
363
+ *
364
+ * @return integer
365
+ */
366
+ public function calculateAge()
367
+ {
368
+ $age = $this->getHeader('Age');
369
+
370
+ if ($age === null && $this->getDate()) {
371
+ $age = time() - strtotime($this->getDate());
372
+ }
373
+
374
+ return $age === null ? null : (int) (string) $age;
375
+ }
376
+
377
+ /**
378
+ * Get the Age HTTP header
379
+ *
380
+ * @return integer|null Returns the age the object has been in a proxy cache in seconds.
381
+ */
382
+ public function getAge()
383
+ {
384
+ return (string) $this->getHeader('Age');
385
+ }
386
+
387
+ /**
388
+ * Get the Allow HTTP header
389
+ *
390
+ * @return string|null Returns valid actions for a specified resource. To be used for a 405 Method not allowed.
391
+ */
392
+ public function getAllow()
393
+ {
394
+ return (string) $this->getHeader('Allow');
395
+ }
396
+
397
+ /**
398
+ * Check if an HTTP method is allowed by checking the Allow response header
399
+ *
400
+ * @param string $method Method to check
401
+ *
402
+ * @return bool
403
+ */
404
+ public function isMethodAllowed($method)
405
+ {
406
+ $allow = $this->getHeader('Allow');
407
+ if ($allow) {
408
+ foreach (explode(',', $allow) as $allowable) {
409
+ if (!strcasecmp(trim($allowable), $method)) {
410
+ return true;
411
+ }
412
+ }
413
+ }
414
+
415
+ return false;
416
+ }
417
+
418
+ /**
419
+ * Get the Cache-Control HTTP header
420
+ *
421
+ * @return string
422
+ */
423
+ public function getCacheControl()
424
+ {
425
+ return (string) $this->getHeader('Cache-Control');
426
+ }
427
+
428
+ /**
429
+ * Get the Connection HTTP header
430
+ *
431
+ * @return string
432
+ */
433
+ public function getConnection()
434
+ {
435
+ return (string) $this->getHeader('Connection');
436
+ }
437
+
438
+ /**
439
+ * Get the Content-Encoding HTTP header
440
+ *
441
+ * @return string|null
442
+ */
443
+ public function getContentEncoding()
444
+ {
445
+ return (string) $this->getHeader('Content-Encoding');
446
+ }
447
+
448
+ /**
449
+ * Get the Content-Language HTTP header
450
+ *
451
+ * @return string|null Returns the language the content is in.
452
+ */
453
+ public function getContentLanguage()
454
+ {
455
+ return (string) $this->getHeader('Content-Language');
456
+ }
457
+
458
+ /**
459
+ * Get the Content-Length HTTP header
460
+ *
461
+ * @return integer Returns the length of the response body in bytes
462
+ */
463
+ public function getContentLength()
464
+ {
465
+ return (int) (string) $this->getHeader('Content-Length');
466
+ }
467
+
468
+ /**
469
+ * Get the Content-Location HTTP header
470
+ *
471
+ * @return string|null Returns an alternate location for the returned data (e.g /index.htm)
472
+ */
473
+ public function getContentLocation()
474
+ {
475
+ return (string) $this->getHeader('Content-Location');
476
+ }
477
+
478
+ /**
479
+ * Get the Content-Disposition HTTP header
480
+ *
481
+ * @return string|null Returns the Content-Disposition header
482
+ */
483
+ public function getContentDisposition()
484
+ {
485
+ return (string) $this->getHeader('Content-Disposition');
486
+ }
487
+
488
+ /**
489
+ * Get the Content-MD5 HTTP header
490
+ *
491
+ * @return string|null Returns a Base64-encoded binary MD5 sum of the content of the response.
492
+ */
493
+ public function getContentMd5()
494
+ {
495
+ return (string) $this->getHeader('Content-MD5');
496
+ }
497
+
498
+ /**
499
+ * Get the Content-Range HTTP header
500
+ *
501
+ * @return string Returns where in a full body message this partial message belongs (e.g. bytes 21010-47021/47022).
502
+ */
503
+ public function getContentRange()
504
+ {
505
+ return (string) $this->getHeader('Content-Range');
506
+ }
507
+
508
+ /**
509
+ * Get the Content-Type HTTP header
510
+ *
511
+ * @return string Returns the mime type of this content.
512
+ */
513
+ public function getContentType()
514
+ {
515
+ return (string) $this->getHeader('Content-Type');
516
+ }
517
+
518
+ /**
519
+ * Checks if the Content-Type is of a certain type. This is useful if the
520
+ * Content-Type header contains charset information and you need to know if
521
+ * the Content-Type matches a particular type.
522
+ *
523
+ * @param string $type Content type to check against
524
+ *
525
+ * @return bool
526
+ */
527
+ public function isContentType($type)
528
+ {
529
+ return stripos($this->getHeader('Content-Type'), $type) !== false;
530
+ }
531
+
532
+ /**
533
+ * Get the Date HTTP header
534
+ *
535
+ * @return string|null Returns the date and time that the message was sent.
536
+ */
537
+ public function getDate()
538
+ {
539
+ return (string) $this->getHeader('Date');
540
+ }
541
+
542
+ /**
543
+ * Get the ETag HTTP header
544
+ *
545
+ * @return string|null Returns an identifier for a specific version of a resource, often a Message digest.
546
+ */
547
+ public function getEtag()
548
+ {
549
+ return (string) $this->getHeader('ETag');
550
+ }
551
+
552
+ /**
553
+ * Get the Expires HTTP header
554
+ *
555
+ * @return string|null Returns the date/time after which the response is considered stale.
556
+ */
557
+ public function getExpires()
558
+ {
559
+ return (string) $this->getHeader('Expires');
560
+ }
561
+
562
+ /**
563
+ * Get the Last-Modified HTTP header
564
+ *
565
+ * @return string|null Returns the last modified date for the requested object, in RFC 2822 format
566
+ * (e.g. Tue, 15 Nov 1994 12:45:26 GMT)
567
+ */
568
+ public function getLastModified()
569
+ {
570
+ return (string) $this->getHeader('Last-Modified');
571
+ }
572
+
573
+ /**
574
+ * Get the Location HTTP header
575
+ *
576
+ * @return string|null Used in redirection, or when a new resource has been created.
577
+ */
578
+ public function getLocation()
579
+ {
580
+ return (string) $this->getHeader('Location');
581
+ }
582
+
583
+ /**
584
+ * Get the Pragma HTTP header
585
+ *
586
+ * @return Header|null Returns the implementation-specific headers that may have various effects anywhere along
587
+ * the request-response chain.
588
+ */
589
+ public function getPragma()
590
+ {
591
+ return (string) $this->getHeader('Pragma');
592
+ }
593
+
594
+ /**
595
+ * Get the Proxy-Authenticate HTTP header
596
+ *
597
+ * @return string|null Authentication to access the proxy (e.g. Basic)
598
+ */
599
+ public function getProxyAuthenticate()
600
+ {
601
+ return (string) $this->getHeader('Proxy-Authenticate');
602
+ }
603
+
604
+ /**
605
+ * Get the Retry-After HTTP header
606
+ *
607
+ * @return int|null If an entity is temporarily unavailable, this instructs the client to try again after a
608
+ * specified period of time.
609
+ */
610
+ public function getRetryAfter()
611
+ {
612
+ return (string) $this->getHeader('Retry-After');
613
+ }
614
+
615
+ /**
616
+ * Get the Server HTTP header
617
+ *
618
+ * @return string|null A name for the server
619
+ */
620
+ public function getServer()
621
+ {
622
+ return (string) $this->getHeader('Server');
623
+ }
624
+
625
+ /**
626
+ * Get the Set-Cookie HTTP header
627
+ *
628
+ * @return string|null An HTTP cookie.
629
+ */
630
+ public function getSetCookie()
631
+ {
632
+ return (string) $this->getHeader('Set-Cookie');
633
+ }
634
+
635
+ /**
636
+ * Get the Trailer HTTP header
637
+ *
638
+ * @return string|null The Trailer general field value indicates that the given set of header fields is present in
639
+ * the trailer of a message encoded with chunked transfer-coding.
640
+ */
641
+ public function getTrailer()
642
+ {
643
+ return (string) $this->getHeader('Trailer');
644
+ }
645
+
646
+ /**
647
+ * Get the Transfer-Encoding HTTP header
648
+ *
649
+ * @return string|null The form of encoding used to safely transfer the entity to the user
650
+ */
651
+ public function getTransferEncoding()
652
+ {
653
+ return (string) $this->getHeader('Transfer-Encoding');
654
+ }
655
+
656
+ /**
657
+ * Get the Vary HTTP header
658
+ *
659
+ * @return string|null Tells downstream proxies how to match future request headers to decide whether the cached
660
+ * response can be used rather than requesting a fresh one from the origin server.
661
+ */
662
+ public function getVary()
663
+ {
664
+ return (string) $this->getHeader('Vary');
665
+ }
666
+
667
+ /**
668
+ * Get the Via HTTP header
669
+ *
670
+ * @return string|null Informs the client of proxies through which the response was sent.
671
+ */
672
+ public function getVia()
673
+ {
674
+ return (string) $this->getHeader('Via');
675
+ }
676
+
677
+ /**
678
+ * Get the Warning HTTP header
679
+ *
680
+ * @return string|null A general warning about possible problems with the entity body
681
+ */
682
+ public function getWarning()
683
+ {
684
+ return (string) $this->getHeader('Warning');
685
+ }
686
+
687
+ /**
688
+ * Get the WWW-Authenticate HTTP header
689
+ *
690
+ * @return string|null Indicates the authentication scheme that should be used to access the requested entity
691
+ */
692
+ public function getWwwAuthenticate()
693
+ {
694
+ return (string) $this->getHeader('WWW-Authenticate');
695
+ }
696
+
697
+ /**
698
+ * Checks if HTTP Status code is a Client Error (4xx)
699
+ *
700
+ * @return bool
701
+ */
702
+ public function isClientError()
703
+ {
704
+ return $this->statusCode >= 400 && $this->statusCode < 500;
705
+ }
706
+
707
+ /**
708
+ * Checks if HTTP Status code is Server OR Client Error (4xx or 5xx)
709
+ *
710
+ * @return boolean
711
+ */
712
+ public function isError()
713
+ {
714
+ return $this->isClientError() || $this->isServerError();
715
+ }
716
+
717
+ /**
718
+ * Checks if HTTP Status code is Information (1xx)
719
+ *
720
+ * @return bool
721
+ */
722
+ public function isInformational()
723
+ {
724
+ return $this->statusCode < 200;
725
+ }
726
+
727
+ /**
728
+ * Checks if HTTP Status code is a Redirect (3xx)
729
+ *
730
+ * @return bool
731
+ */
732
+ public function isRedirect()
733
+ {
734
+ return $this->statusCode >= 300 && $this->statusCode < 400;
735
+ }
736
+
737
+ /**
738
+ * Checks if HTTP Status code is Server Error (5xx)
739
+ *
740
+ * @return bool
741
+ */
742
+ public function isServerError()
743
+ {
744
+ return $this->statusCode >= 500 && $this->statusCode < 600;
745
+ }
746
+
747
+ /**
748
+ * Checks if HTTP Status code is Successful (2xx | 304)
749
+ *
750
+ * @return bool
751
+ */
752
+ public function isSuccessful()
753
+ {
754
+ return ($this->statusCode >= 200 && $this->statusCode < 300) || $this->statusCode == 304;
755
+ }
756
+
757
+ /**
758
+ * Check if the response can be cached based on the response headers
759
+ *
760
+ * @return bool Returns TRUE if the response can be cached or false if not
761
+ */
762
+ public function canCache()
763
+ {
764
+ // Check if the response is cacheable based on the code
765
+ if (!in_array((int) $this->getStatusCode(), self::$cacheResponseCodes)) {
766
+ return false;
767
+ }
768
+
769
+ // Make sure a valid body was returned and can be cached
770
+ if ((!$this->getBody()->isReadable() || !$this->getBody()->isSeekable())
771
+ && ($this->getContentLength() > 0 || $this->getTransferEncoding() == 'chunked')) {
772
+ return false;
773
+ }
774
+
775
+ // Never cache no-store resources (this is a private cache, so private
776
+ // can be cached)
777
+ if ($this->getHeader('Cache-Control') && $this->getHeader('Cache-Control')->hasDirective('no-store')) {
778
+ return false;
779
+ }
780
+
781
+ return $this->isFresh() || $this->getFreshness() === null || $this->canValidate();
782
+ }
783
+
784
+ /**
785
+ * Gets the number of seconds from the current time in which this response is still considered fresh
786
+ *
787
+ * @return int|null Returns the number of seconds
788
+ */
789
+ public function getMaxAge()
790
+ {
791
+ if ($header = $this->getHeader('Cache-Control')) {
792
+ // s-max-age, then max-age, then Expires
793
+ if ($age = $header->getDirective('s-maxage')) {
794
+ return $age;
795
+ }
796
+ if ($age = $header->getDirective('max-age')) {
797
+ return $age;
798
+ }
799
+ }
800
+
801
+ if ($this->getHeader('Expires')) {
802
+ return strtotime($this->getExpires()) - time();
803
+ }
804
+
805
+ return null;
806
+ }
807
+
808
+ /**
809
+ * Check if the response is considered fresh.
810
+ *
811
+ * A response is considered fresh when its age is less than or equal to the freshness lifetime (maximum age) of the
812
+ * response.
813
+ *
814
+ * @return bool|null
815
+ */
816
+ public function isFresh()
817
+ {
818
+ $fresh = $this->getFreshness();
819
+
820
+ return $fresh === null ? null : $fresh >= 0;
821
+ }
822
+
823
+ /**
824
+ * Check if the response can be validated against the origin server using a conditional GET request.
825
+ *
826
+ * @return bool
827
+ */
828
+ public function canValidate()
829
+ {
830
+ return $this->getEtag() || $this->getLastModified();
831
+ }
832
+
833
+ /**
834
+ * Get the freshness of the response by returning the difference of the maximum lifetime of the response and the
835
+ * age of the response (max-age - age).
836
+ *
837
+ * Freshness values less than 0 mean that the response is no longer fresh and is ABS(freshness) seconds expired.
838
+ * Freshness values of greater than zero is the number of seconds until the response is no longer fresh. A NULL
839
+ * result means that no freshness information is available.
840
+ *
841
+ * @return int
842
+ */
843
+ public function getFreshness()
844
+ {
845
+ $maxAge = $this->getMaxAge();
846
+ $age = $this->calculateAge();
847
+
848
+ return $maxAge && $age ? ($maxAge - $age) : null;
849
+ }
850
+
851
+ /**
852
+ * Parse the JSON response body and return an array
853
+ *
854
+ * @return array|string|int|bool|float
855
+ * @throws RuntimeException if the response body is not in JSON format
856
+ */
857
+ public function json()
858
+ {
859
+ $data = json_decode((string) $this->body, true);
860
+ if (JSON_ERROR_NONE !== json_last_error()) {
861
+ throw new RuntimeException('Unable to parse response body into JSON: ' . json_last_error());
862
+ }
863
+
864
+ return $data === null ? array() : $data;
865
+ }
866
+
867
+ /**
868
+ * Parse the XML response body and return a \SimpleXMLElement.
869
+ *
870
+ * In order to prevent XXE attacks, this method disables loading external
871
+ * entities. If you rely on external entities, then you must parse the
872
+ * XML response manually by accessing the response body directly.
873
+ *
874
+ * @return \SimpleXMLElement
875
+ * @throws RuntimeException if the response body is not in XML format
876
+ * @link http://websec.io/2012/08/27/Preventing-XXE-in-PHP.html
877
+ */
878
+ public function xml()
879
+ {
880
+ $errorMessage = null;
881
+ $internalErrors = libxml_use_internal_errors(true);
882
+ $disableEntities = libxml_disable_entity_loader(true);
883
+ libxml_clear_errors();
884
+
885
+ try {
886
+ $xml = new \SimpleXMLElement((string) $this->body ?: '<root />', LIBXML_NONET);
887
+ if ($error = libxml_get_last_error()) {
888
+ $errorMessage = $error->message;
889
+ }
890
+ } catch (\Exception $e) {
891
+ $errorMessage = $e->getMessage();
892
+ }
893
+
894
+ libxml_clear_errors();
895
+ libxml_use_internal_errors($internalErrors);
896
+ libxml_disable_entity_loader($disableEntities);
897
+
898
+ if ($errorMessage) {
899
+ throw new RuntimeException('Unable to parse response body into XML: ' . $errorMessage);
900
+ }
901
+
902
+ return $xml;
903
+ }
904
+
905
+ /**
906
+ * Get the redirect count of this response
907
+ *
908
+ * @return int
909
+ */
910
+ public function getRedirectCount()
911
+ {
912
+ return (int) $this->params->get(RedirectPlugin::REDIRECT_COUNT);
913
+ }
914
+
915
+ /**
916
+ * Set the effective URL that resulted in this response (e.g. the last redirect URL)
917
+ *
918
+ * @param string $url The effective URL
919
+ *
920
+ * @return self
921
+ */
922
+ public function setEffectiveUrl($url)
923
+ {
924
+ $this->effectiveUrl = $url;
925
+
926
+ return $this;
927
+ }
928
+
929
+ /**
930
+ * Get the effective URL that resulted in this response (e.g. the last redirect URL)
931
+ *
932
+ * @return string
933
+ */
934
+ public function getEffectiveUrl()
935
+ {
936
+ return $this->effectiveUrl;
937
+ }
938
+
939
+ /**
940
+ * @deprecated
941
+ * @codeCoverageIgnore
942
+ */
943
+ public function getPreviousResponse()
944
+ {
945
+ Version::warn(__METHOD__ . ' is deprecated. Use the HistoryPlugin.');
946
+ return null;
947
+ }
948
+
949
+ /**
950
+ * @deprecated
951
+ * @codeCoverageIgnore
952
+ */
953
+ public function setRequest($request)
954
+ {
955
+ Version::warn(__METHOD__ . ' is deprecated');
956
+ return $this;
957
+ }
958
+
959
+ /**
960
+ * @deprecated
961
+ * @codeCoverageIgnore
962
+ */
963
+ public function getRequest()
964
+ {
965
+ Version::warn(__METHOD__ . ' is deprecated');
966
+ return null;
967
+ }
968
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Mimetypes.php ADDED
@@ -0,0 +1,962 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ /**
6
+ * Provides mappings of file extensions to mimetypes
7
+ * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types
8
+ */
9
+ class Mimetypes
10
+ {
11
+ /** @var self */
12
+ protected static $instance;
13
+
14
+ /** @var array Mapping of extension to mimetype */
15
+ protected $mimetypes = array(
16
+ '3dml' => 'text/vnd.in3d.3dml',
17
+ '3g2' => 'video/3gpp2',
18
+ '3gp' => 'video/3gpp',
19
+ '7z' => 'application/x-7z-compressed',
20
+ 'aab' => 'application/x-authorware-bin',
21
+ 'aac' => 'audio/x-aac',
22
+ 'aam' => 'application/x-authorware-map',
23
+ 'aas' => 'application/x-authorware-seg',
24
+ 'abw' => 'application/x-abiword',
25
+ 'ac' => 'application/pkix-attr-cert',
26
+ 'acc' => 'application/vnd.americandynamics.acc',
27
+ 'ace' => 'application/x-ace-compressed',
28
+ 'acu' => 'application/vnd.acucobol',
29
+ 'acutc' => 'application/vnd.acucorp',
30
+ 'adp' => 'audio/adpcm',
31
+ 'aep' => 'application/vnd.audiograph',
32
+ 'afm' => 'application/x-font-type1',
33
+ 'afp' => 'application/vnd.ibm.modcap',
34
+ 'ahead' => 'application/vnd.ahead.space',
35
+ 'ai' => 'application/postscript',
36
+ 'aif' => 'audio/x-aiff',
37
+ 'aifc' => 'audio/x-aiff',
38
+ 'aiff' => 'audio/x-aiff',
39
+ 'air' => 'application/vnd.adobe.air-application-installer-package+zip',
40
+ 'ait' => 'application/vnd.dvb.ait',
41
+ 'ami' => 'application/vnd.amiga.ami',
42
+ 'apk' => 'application/vnd.android.package-archive',
43
+ 'application' => 'application/x-ms-application',
44
+ 'apr' => 'application/vnd.lotus-approach',
45
+ 'asa' => 'text/plain',
46
+ 'asax' => 'application/octet-stream',
47
+ 'asc' => 'application/pgp-signature',
48
+ 'ascx' => 'text/plain',
49
+ 'asf' => 'video/x-ms-asf',
50
+ 'ashx' => 'text/plain',
51
+ 'asm' => 'text/x-asm',
52
+ 'asmx' => 'text/plain',
53
+ 'aso' => 'application/vnd.accpac.simply.aso',
54
+ 'asp' => 'text/plain',
55
+ 'aspx' => 'text/plain',
56
+ 'asx' => 'video/x-ms-asf',
57
+ 'atc' => 'application/vnd.acucorp',
58
+ 'atom' => 'application/atom+xml',
59
+ 'atomcat' => 'application/atomcat+xml',
60
+ 'atomsvc' => 'application/atomsvc+xml',
61
+ 'atx' => 'application/vnd.antix.game-component',
62
+ 'au' => 'audio/basic',
63
+ 'avi' => 'video/x-msvideo',
64
+ 'aw' => 'application/applixware',
65
+ 'axd' => 'text/plain',
66
+ 'azf' => 'application/vnd.airzip.filesecure.azf',
67
+ 'azs' => 'application/vnd.airzip.filesecure.azs',
68
+ 'azw' => 'application/vnd.amazon.ebook',
69
+ 'bat' => 'application/x-msdownload',
70
+ 'bcpio' => 'application/x-bcpio',
71
+ 'bdf' => 'application/x-font-bdf',
72
+ 'bdm' => 'application/vnd.syncml.dm+wbxml',
73
+ 'bed' => 'application/vnd.realvnc.bed',
74
+ 'bh2' => 'application/vnd.fujitsu.oasysprs',
75
+ 'bin' => 'application/octet-stream',
76
+ 'bmi' => 'application/vnd.bmi',
77
+ 'bmp' => 'image/bmp',
78
+ 'book' => 'application/vnd.framemaker',
79
+ 'box' => 'application/vnd.previewsystems.box',
80
+ 'boz' => 'application/x-bzip2',
81
+ 'bpk' => 'application/octet-stream',
82
+ 'btif' => 'image/prs.btif',
83
+ 'bz' => 'application/x-bzip',
84
+ 'bz2' => 'application/x-bzip2',
85
+ 'c' => 'text/x-c',
86
+ 'c11amc' => 'application/vnd.cluetrust.cartomobile-config',
87
+ 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',
88
+ 'c4d' => 'application/vnd.clonk.c4group',
89
+ 'c4f' => 'application/vnd.clonk.c4group',
90
+ 'c4g' => 'application/vnd.clonk.c4group',
91
+ 'c4p' => 'application/vnd.clonk.c4group',
92
+ 'c4u' => 'application/vnd.clonk.c4group',
93
+ 'cab' => 'application/vnd.ms-cab-compressed',
94
+ 'car' => 'application/vnd.curl.car',
95
+ 'cat' => 'application/vnd.ms-pki.seccat',
96
+ 'cc' => 'text/x-c',
97
+ 'cct' => 'application/x-director',
98
+ 'ccxml' => 'application/ccxml+xml',
99
+ 'cdbcmsg' => 'application/vnd.contact.cmsg',
100
+ 'cdf' => 'application/x-netcdf',
101
+ 'cdkey' => 'application/vnd.mediastation.cdkey',
102
+ 'cdmia' => 'application/cdmi-capability',
103
+ 'cdmic' => 'application/cdmi-container',
104
+ 'cdmid' => 'application/cdmi-domain',
105
+ 'cdmio' => 'application/cdmi-object',
106
+ 'cdmiq' => 'application/cdmi-queue',
107
+ 'cdx' => 'chemical/x-cdx',
108
+ 'cdxml' => 'application/vnd.chemdraw+xml',
109
+ 'cdy' => 'application/vnd.cinderella',
110
+ 'cer' => 'application/pkix-cert',
111
+ 'cfc' => 'application/x-coldfusion',
112
+ 'cfm' => 'application/x-coldfusion',
113
+ 'cgm' => 'image/cgm',
114
+ 'chat' => 'application/x-chat',
115
+ 'chm' => 'application/vnd.ms-htmlhelp',
116
+ 'chrt' => 'application/vnd.kde.kchart',
117
+ 'cif' => 'chemical/x-cif',
118
+ 'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
119
+ 'cil' => 'application/vnd.ms-artgalry',
120
+ 'cla' => 'application/vnd.claymore',
121
+ 'class' => 'application/java-vm',
122
+ 'clkk' => 'application/vnd.crick.clicker.keyboard',
123
+ 'clkp' => 'application/vnd.crick.clicker.palette',
124
+ 'clkt' => 'application/vnd.crick.clicker.template',
125
+ 'clkw' => 'application/vnd.crick.clicker.wordbank',
126
+ 'clkx' => 'application/vnd.crick.clicker',
127
+ 'clp' => 'application/x-msclip',
128
+ 'cmc' => 'application/vnd.cosmocaller',
129
+ 'cmdf' => 'chemical/x-cmdf',
130
+ 'cml' => 'chemical/x-cml',
131
+ 'cmp' => 'application/vnd.yellowriver-custom-menu',
132
+ 'cmx' => 'image/x-cmx',
133
+ 'cod' => 'application/vnd.rim.cod',
134
+ 'com' => 'application/x-msdownload',
135
+ 'conf' => 'text/plain',
136
+ 'cpio' => 'application/x-cpio',
137
+ 'cpp' => 'text/x-c',
138
+ 'cpt' => 'application/mac-compactpro',
139
+ 'crd' => 'application/x-mscardfile',
140
+ 'crl' => 'application/pkix-crl',
141
+ 'crt' => 'application/x-x509-ca-cert',
142
+ 'cryptonote' => 'application/vnd.rig.cryptonote',
143
+ 'cs' => 'text/plain',
144
+ 'csh' => 'application/x-csh',
145
+ 'csml' => 'chemical/x-csml',
146
+ 'csp' => 'application/vnd.commonspace',
147
+ 'css' => 'text/css',
148
+ 'cst' => 'application/x-director',
149
+ 'csv' => 'text/csv',
150
+ 'cu' => 'application/cu-seeme',
151
+ 'curl' => 'text/vnd.curl',
152
+ 'cww' => 'application/prs.cww',
153
+ 'cxt' => 'application/x-director',
154
+ 'cxx' => 'text/x-c',
155
+ 'dae' => 'model/vnd.collada+xml',
156
+ 'daf' => 'application/vnd.mobius.daf',
157
+ 'dataless' => 'application/vnd.fdsn.seed',
158
+ 'davmount' => 'application/davmount+xml',
159
+ 'dcr' => 'application/x-director',
160
+ 'dcurl' => 'text/vnd.curl.dcurl',
161
+ 'dd2' => 'application/vnd.oma.dd2+xml',
162
+ 'ddd' => 'application/vnd.fujixerox.ddd',
163
+ 'deb' => 'application/x-debian-package',
164
+ 'def' => 'text/plain',
165
+ 'deploy' => 'application/octet-stream',
166
+ 'der' => 'application/x-x509-ca-cert',
167
+ 'dfac' => 'application/vnd.dreamfactory',
168
+ 'dic' => 'text/x-c',
169
+ 'dir' => 'application/x-director',
170
+ 'dis' => 'application/vnd.mobius.dis',
171
+ 'dist' => 'application/octet-stream',
172
+ 'distz' => 'application/octet-stream',
173
+ 'djv' => 'image/vnd.djvu',
174
+ 'djvu' => 'image/vnd.djvu',
175
+ 'dll' => 'application/x-msdownload',
176
+ 'dmg' => 'application/octet-stream',
177
+ 'dms' => 'application/octet-stream',
178
+ 'dna' => 'application/vnd.dna',
179
+ 'doc' => 'application/msword',
180
+ 'docm' => 'application/vnd.ms-word.document.macroenabled.12',
181
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
182
+ 'dot' => 'application/msword',
183
+ 'dotm' => 'application/vnd.ms-word.template.macroenabled.12',
184
+ 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
185
+ 'dp' => 'application/vnd.osgi.dp',
186
+ 'dpg' => 'application/vnd.dpgraph',
187
+ 'dra' => 'audio/vnd.dra',
188
+ 'dsc' => 'text/prs.lines.tag',
189
+ 'dssc' => 'application/dssc+der',
190
+ 'dtb' => 'application/x-dtbook+xml',
191
+ 'dtd' => 'application/xml-dtd',
192
+ 'dts' => 'audio/vnd.dts',
193
+ 'dtshd' => 'audio/vnd.dts.hd',
194
+ 'dump' => 'application/octet-stream',
195
+ 'dvi' => 'application/x-dvi',
196
+ 'dwf' => 'model/vnd.dwf',
197
+ 'dwg' => 'image/vnd.dwg',
198
+ 'dxf' => 'image/vnd.dxf',
199
+ 'dxp' => 'application/vnd.spotfire.dxp',
200
+ 'dxr' => 'application/x-director',
201
+ 'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
202
+ 'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
203
+ 'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
204
+ 'ecma' => 'application/ecmascript',
205
+ 'edm' => 'application/vnd.novadigm.edm',
206
+ 'edx' => 'application/vnd.novadigm.edx',
207
+ 'efif' => 'application/vnd.picsel',
208
+ 'ei6' => 'application/vnd.pg.osasli',
209
+ 'elc' => 'application/octet-stream',
210
+ 'eml' => 'message/rfc822',
211
+ 'emma' => 'application/emma+xml',
212
+ 'eol' => 'audio/vnd.digital-winds',
213
+ 'eot' => 'application/vnd.ms-fontobject',
214
+ 'eps' => 'application/postscript',
215
+ 'epub' => 'application/epub+zip',
216
+ 'es3' => 'application/vnd.eszigno3+xml',
217
+ 'esf' => 'application/vnd.epson.esf',
218
+ 'et3' => 'application/vnd.eszigno3+xml',
219
+ 'etx' => 'text/x-setext',
220
+ 'exe' => 'application/x-msdownload',
221
+ 'exi' => 'application/exi',
222
+ 'ext' => 'application/vnd.novadigm.ext',
223
+ 'ez' => 'application/andrew-inset',
224
+ 'ez2' => 'application/vnd.ezpix-album',
225
+ 'ez3' => 'application/vnd.ezpix-package',
226
+ 'f' => 'text/x-fortran',
227
+ 'f4v' => 'video/x-f4v',
228
+ 'f77' => 'text/x-fortran',
229
+ 'f90' => 'text/x-fortran',
230
+ 'fbs' => 'image/vnd.fastbidsheet',
231
+ 'fcs' => 'application/vnd.isac.fcs',
232
+ 'fdf' => 'application/vnd.fdf',
233
+ 'fe_launch' => 'application/vnd.denovo.fcselayout-link',
234
+ 'fg5' => 'application/vnd.fujitsu.oasysgp',
235
+ 'fgd' => 'application/x-director',
236
+ 'fh' => 'image/x-freehand',
237
+ 'fh4' => 'image/x-freehand',
238
+ 'fh5' => 'image/x-freehand',
239
+ 'fh7' => 'image/x-freehand',
240
+ 'fhc' => 'image/x-freehand',
241
+ 'fig' => 'application/x-xfig',
242
+ 'fli' => 'video/x-fli',
243
+ 'flo' => 'application/vnd.micrografx.flo',
244
+ 'flv' => 'video/x-flv',
245
+ 'flw' => 'application/vnd.kde.kivio',
246
+ 'flx' => 'text/vnd.fmi.flexstor',
247
+ 'fly' => 'text/vnd.fly',
248
+ 'fm' => 'application/vnd.framemaker',
249
+ 'fnc' => 'application/vnd.frogans.fnc',
250
+ 'for' => 'text/x-fortran',
251
+ 'fpx' => 'image/vnd.fpx',
252
+ 'frame' => 'application/vnd.framemaker',
253
+ 'fsc' => 'application/vnd.fsc.weblaunch',
254
+ 'fst' => 'image/vnd.fst',
255
+ 'ftc' => 'application/vnd.fluxtime.clip',
256
+ 'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
257
+ 'fvt' => 'video/vnd.fvt',
258
+ 'fxp' => 'application/vnd.adobe.fxp',
259
+ 'fxpl' => 'application/vnd.adobe.fxp',
260
+ 'fzs' => 'application/vnd.fuzzysheet',
261
+ 'g2w' => 'application/vnd.geoplan',
262
+ 'g3' => 'image/g3fax',
263
+ 'g3w' => 'application/vnd.geospace',
264
+ 'gac' => 'application/vnd.groove-account',
265
+ 'gdl' => 'model/vnd.gdl',
266
+ 'geo' => 'application/vnd.dynageo',
267
+ 'gex' => 'application/vnd.geometry-explorer',
268
+ 'ggb' => 'application/vnd.geogebra.file',
269
+ 'ggt' => 'application/vnd.geogebra.tool',
270
+ 'ghf' => 'application/vnd.groove-help',
271
+ 'gif' => 'image/gif',
272
+ 'gim' => 'application/vnd.groove-identity-message',
273
+ 'gmx' => 'application/vnd.gmx',
274
+ 'gnumeric' => 'application/x-gnumeric',
275
+ 'gph' => 'application/vnd.flographit',
276
+ 'gqf' => 'application/vnd.grafeq',
277
+ 'gqs' => 'application/vnd.grafeq',
278
+ 'gram' => 'application/srgs',
279
+ 'gre' => 'application/vnd.geometry-explorer',
280
+ 'grv' => 'application/vnd.groove-injector',
281
+ 'grxml' => 'application/srgs+xml',
282
+ 'gsf' => 'application/x-font-ghostscript',
283
+ 'gtar' => 'application/x-gtar',
284
+ 'gtm' => 'application/vnd.groove-tool-message',
285
+ 'gtw' => 'model/vnd.gtw',
286
+ 'gv' => 'text/vnd.graphviz',
287
+ 'gxt' => 'application/vnd.geonext',
288
+ 'h' => 'text/x-c',
289
+ 'h261' => 'video/h261',
290
+ 'h263' => 'video/h263',
291
+ 'h264' => 'video/h264',
292
+ 'hal' => 'application/vnd.hal+xml',
293
+ 'hbci' => 'application/vnd.hbci',
294
+ 'hdf' => 'application/x-hdf',
295
+ 'hh' => 'text/x-c',
296
+ 'hlp' => 'application/winhlp',
297
+ 'hpgl' => 'application/vnd.hp-hpgl',
298
+ 'hpid' => 'application/vnd.hp-hpid',
299
+ 'hps' => 'application/vnd.hp-hps',
300
+ 'hqx' => 'application/mac-binhex40',
301
+ 'hta' => 'application/octet-stream',
302
+ 'htc' => 'text/html',
303
+ 'htke' => 'application/vnd.kenameaapp',
304
+ 'htm' => 'text/html',
305
+ 'html' => 'text/html',
306
+ 'hvd' => 'application/vnd.yamaha.hv-dic',
307
+ 'hvp' => 'application/vnd.yamaha.hv-voice',
308
+ 'hvs' => 'application/vnd.yamaha.hv-script',
309
+ 'i2g' => 'application/vnd.intergeo',
310
+ 'icc' => 'application/vnd.iccprofile',
311
+ 'ice' => 'x-conference/x-cooltalk',
312
+ 'icm' => 'application/vnd.iccprofile',
313
+ 'ico' => 'image/x-icon',
314
+ 'ics' => 'text/calendar',
315
+ 'ief' => 'image/ief',
316
+ 'ifb' => 'text/calendar',
317
+ 'ifm' => 'application/vnd.shana.informed.formdata',
318
+ 'iges' => 'model/iges',
319
+ 'igl' => 'application/vnd.igloader',
320
+ 'igm' => 'application/vnd.insors.igm',
321
+ 'igs' => 'model/iges',
322
+ 'igx' => 'application/vnd.micrografx.igx',
323
+ 'iif' => 'application/vnd.shana.informed.interchange',
324
+ 'imp' => 'application/vnd.accpac.simply.imp',
325
+ 'ims' => 'application/vnd.ms-ims',
326
+ 'in' => 'text/plain',
327
+ 'ini' => 'text/plain',
328
+ 'ipfix' => 'application/ipfix',
329
+ 'ipk' => 'application/vnd.shana.informed.package',
330
+ 'irm' => 'application/vnd.ibm.rights-management',
331
+ 'irp' => 'application/vnd.irepository.package+xml',
332
+ 'iso' => 'application/octet-stream',
333
+ 'itp' => 'application/vnd.shana.informed.formtemplate',
334
+ 'ivp' => 'application/vnd.immervision-ivp',
335
+ 'ivu' => 'application/vnd.immervision-ivu',
336
+ 'jad' => 'text/vnd.sun.j2me.app-descriptor',
337
+ 'jam' => 'application/vnd.jam',
338
+ 'jar' => 'application/java-archive',
339
+ 'java' => 'text/x-java-source',
340
+ 'jisp' => 'application/vnd.jisp',
341
+ 'jlt' => 'application/vnd.hp-jlyt',
342
+ 'jnlp' => 'application/x-java-jnlp-file',
343
+ 'joda' => 'application/vnd.joost.joda-archive',
344
+ 'jpe' => 'image/jpeg',
345
+ 'jpeg' => 'image/jpeg',
346
+ 'jpg' => 'image/jpeg',
347
+ 'jpgm' => 'video/jpm',
348
+ 'jpgv' => 'video/jpeg',
349
+ 'jpm' => 'video/jpm',
350
+ 'js' => 'text/javascript',
351
+ 'json' => 'application/json',
352
+ 'kar' => 'audio/midi',
353
+ 'karbon' => 'application/vnd.kde.karbon',
354
+ 'kfo' => 'application/vnd.kde.kformula',
355
+ 'kia' => 'application/vnd.kidspiration',
356
+ 'kml' => 'application/vnd.google-earth.kml+xml',
357
+ 'kmz' => 'application/vnd.google-earth.kmz',
358
+ 'kne' => 'application/vnd.kinar',
359
+ 'knp' => 'application/vnd.kinar',
360
+ 'kon' => 'application/vnd.kde.kontour',
361
+ 'kpr' => 'application/vnd.kde.kpresenter',
362
+ 'kpt' => 'application/vnd.kde.kpresenter',
363
+ 'ksp' => 'application/vnd.kde.kspread',
364
+ 'ktr' => 'application/vnd.kahootz',
365
+ 'ktx' => 'image/ktx',
366
+ 'ktz' => 'application/vnd.kahootz',
367
+ 'kwd' => 'application/vnd.kde.kword',
368
+ 'kwt' => 'application/vnd.kde.kword',
369
+ 'lasxml' => 'application/vnd.las.las+xml',
370
+ 'latex' => 'application/x-latex',
371
+ 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
372
+ 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
373
+ 'les' => 'application/vnd.hhe.lesson-player',
374
+ 'lha' => 'application/octet-stream',
375
+ 'link66' => 'application/vnd.route66.link66+xml',
376
+ 'list' => 'text/plain',
377
+ 'list3820' => 'application/vnd.ibm.modcap',
378
+ 'listafp' => 'application/vnd.ibm.modcap',
379
+ 'log' => 'text/plain',
380
+ 'lostxml' => 'application/lost+xml',
381
+ 'lrf' => 'application/octet-stream',
382
+ 'lrm' => 'application/vnd.ms-lrm',
383
+ 'ltf' => 'application/vnd.frogans.ltf',
384
+ 'lvp' => 'audio/vnd.lucent.voice',
385
+ 'lwp' => 'application/vnd.lotus-wordpro',
386
+ 'lzh' => 'application/octet-stream',
387
+ 'm13' => 'application/x-msmediaview',
388
+ 'm14' => 'application/x-msmediaview',
389
+ 'm1v' => 'video/mpeg',
390
+ 'm21' => 'application/mp21',
391
+ 'm2a' => 'audio/mpeg',
392
+ 'm2v' => 'video/mpeg',
393
+ 'm3a' => 'audio/mpeg',
394
+ 'm3u' => 'audio/x-mpegurl',
395
+ 'm3u8' => 'application/vnd.apple.mpegurl',
396
+ 'm4a' => 'audio/mp4',
397
+ 'm4u' => 'video/vnd.mpegurl',
398
+ 'm4v' => 'video/mp4',
399
+ 'ma' => 'application/mathematica',
400
+ 'mads' => 'application/mads+xml',
401
+ 'mag' => 'application/vnd.ecowin.chart',
402
+ 'maker' => 'application/vnd.framemaker',
403
+ 'man' => 'text/troff',
404
+ 'mathml' => 'application/mathml+xml',
405
+ 'mb' => 'application/mathematica',
406
+ 'mbk' => 'application/vnd.mobius.mbk',
407
+ 'mbox' => 'application/mbox',
408
+ 'mc1' => 'application/vnd.medcalcdata',
409
+ 'mcd' => 'application/vnd.mcd',
410
+ 'mcurl' => 'text/vnd.curl.mcurl',
411
+ 'mdb' => 'application/x-msaccess',
412
+ 'mdi' => 'image/vnd.ms-modi',
413
+ 'me' => 'text/troff',
414
+ 'mesh' => 'model/mesh',
415
+ 'meta4' => 'application/metalink4+xml',
416
+ 'mets' => 'application/mets+xml',
417
+ 'mfm' => 'application/vnd.mfmp',
418
+ 'mgp' => 'application/vnd.osgeo.mapguide.package',
419
+ 'mgz' => 'application/vnd.proteus.magazine',
420
+ 'mid' => 'audio/midi',
421
+ 'midi' => 'audio/midi',
422
+ 'mif' => 'application/vnd.mif',
423
+ 'mime' => 'message/rfc822',
424
+ 'mj2' => 'video/mj2',
425
+ 'mjp2' => 'video/mj2',
426
+ 'mlp' => 'application/vnd.dolby.mlp',
427
+ 'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
428
+ 'mmf' => 'application/vnd.smaf',
429
+ 'mmr' => 'image/vnd.fujixerox.edmics-mmr',
430
+ 'mny' => 'application/x-msmoney',
431
+ 'mobi' => 'application/x-mobipocket-ebook',
432
+ 'mods' => 'application/mods+xml',
433
+ 'mov' => 'video/quicktime',
434
+ 'movie' => 'video/x-sgi-movie',
435
+ 'mp2' => 'audio/mpeg',
436
+ 'mp21' => 'application/mp21',
437
+ 'mp2a' => 'audio/mpeg',
438
+ 'mp3' => 'audio/mpeg',
439
+ 'mp4' => 'video/mp4',
440
+ 'mp4a' => 'audio/mp4',
441
+ 'mp4s' => 'application/mp4',
442
+ 'mp4v' => 'video/mp4',
443
+ 'mpc' => 'application/vnd.mophun.certificate',
444
+ 'mpe' => 'video/mpeg',
445
+ 'mpeg' => 'video/mpeg',
446
+ 'mpg' => 'video/mpeg',
447
+ 'mpg4' => 'video/mp4',
448
+ 'mpga' => 'audio/mpeg',
449
+ 'mpkg' => 'application/vnd.apple.installer+xml',
450
+ 'mpm' => 'application/vnd.blueice.multipass',
451
+ 'mpn' => 'application/vnd.mophun.application',
452
+ 'mpp' => 'application/vnd.ms-project',
453
+ 'mpt' => 'application/vnd.ms-project',
454
+ 'mpy' => 'application/vnd.ibm.minipay',
455
+ 'mqy' => 'application/vnd.mobius.mqy',
456
+ 'mrc' => 'application/marc',
457
+ 'mrcx' => 'application/marcxml+xml',
458
+ 'ms' => 'text/troff',
459
+ 'mscml' => 'application/mediaservercontrol+xml',
460
+ 'mseed' => 'application/vnd.fdsn.mseed',
461
+ 'mseq' => 'application/vnd.mseq',
462
+ 'msf' => 'application/vnd.epson.msf',
463
+ 'msh' => 'model/mesh',
464
+ 'msi' => 'application/x-msdownload',
465
+ 'msl' => 'application/vnd.mobius.msl',
466
+ 'msty' => 'application/vnd.muvee.style',
467
+ 'mts' => 'model/vnd.mts',
468
+ 'mus' => 'application/vnd.musician',
469
+ 'musicxml' => 'application/vnd.recordare.musicxml+xml',
470
+ 'mvb' => 'application/x-msmediaview',
471
+ 'mwf' => 'application/vnd.mfer',
472
+ 'mxf' => 'application/mxf',
473
+ 'mxl' => 'application/vnd.recordare.musicxml',
474
+ 'mxml' => 'application/xv+xml',
475
+ 'mxs' => 'application/vnd.triscape.mxs',
476
+ 'mxu' => 'video/vnd.mpegurl',
477
+ 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
478
+ 'n3' => 'text/n3',
479
+ 'nb' => 'application/mathematica',
480
+ 'nbp' => 'application/vnd.wolfram.player',
481
+ 'nc' => 'application/x-netcdf',
482
+ 'ncx' => 'application/x-dtbncx+xml',
483
+ 'ngdat' => 'application/vnd.nokia.n-gage.data',
484
+ 'nlu' => 'application/vnd.neurolanguage.nlu',
485
+ 'nml' => 'application/vnd.enliven',
486
+ 'nnd' => 'application/vnd.noblenet-directory',
487
+ 'nns' => 'application/vnd.noblenet-sealer',
488
+ 'nnw' => 'application/vnd.noblenet-web',
489
+ 'npx' => 'image/vnd.net-fpx',
490
+ 'nsf' => 'application/vnd.lotus-notes',
491
+ 'oa2' => 'application/vnd.fujitsu.oasys2',
492
+ 'oa3' => 'application/vnd.fujitsu.oasys3',
493
+ 'oas' => 'application/vnd.fujitsu.oasys',
494
+ 'obd' => 'application/x-msbinder',
495
+ 'oda' => 'application/oda',
496
+ 'odb' => 'application/vnd.oasis.opendocument.database',
497
+ 'odc' => 'application/vnd.oasis.opendocument.chart',
498
+ 'odf' => 'application/vnd.oasis.opendocument.formula',
499
+ 'odft' => 'application/vnd.oasis.opendocument.formula-template',
500
+ 'odg' => 'application/vnd.oasis.opendocument.graphics',
501
+ 'odi' => 'application/vnd.oasis.opendocument.image',
502
+ 'odm' => 'application/vnd.oasis.opendocument.text-master',
503
+ 'odp' => 'application/vnd.oasis.opendocument.presentation',
504
+ 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
505
+ 'odt' => 'application/vnd.oasis.opendocument.text',
506
+ 'oga' => 'audio/ogg',
507
+ 'ogg' => 'audio/ogg',
508
+ 'ogv' => 'video/ogg',
509
+ 'ogx' => 'application/ogg',
510
+ 'onepkg' => 'application/onenote',
511
+ 'onetmp' => 'application/onenote',
512
+ 'onetoc' => 'application/onenote',
513
+ 'onetoc2' => 'application/onenote',
514
+ 'opf' => 'application/oebps-package+xml',
515
+ 'oprc' => 'application/vnd.palm',
516
+ 'org' => 'application/vnd.lotus-organizer',
517
+ 'osf' => 'application/vnd.yamaha.openscoreformat',
518
+ 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
519
+ 'otc' => 'application/vnd.oasis.opendocument.chart-template',
520
+ 'otf' => 'application/x-font-otf',
521
+ 'otg' => 'application/vnd.oasis.opendocument.graphics-template',
522
+ 'oth' => 'application/vnd.oasis.opendocument.text-web',
523
+ 'oti' => 'application/vnd.oasis.opendocument.image-template',
524
+ 'otp' => 'application/vnd.oasis.opendocument.presentation-template',
525
+ 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
526
+ 'ott' => 'application/vnd.oasis.opendocument.text-template',
527
+ 'oxt' => 'application/vnd.openofficeorg.extension',
528
+ 'p' => 'text/x-pascal',
529
+ 'p10' => 'application/pkcs10',
530
+ 'p12' => 'application/x-pkcs12',
531
+ 'p7b' => 'application/x-pkcs7-certificates',
532
+ 'p7c' => 'application/pkcs7-mime',
533
+ 'p7m' => 'application/pkcs7-mime',
534
+ 'p7r' => 'application/x-pkcs7-certreqresp',
535
+ 'p7s' => 'application/pkcs7-signature',
536
+ 'p8' => 'application/pkcs8',
537
+ 'pas' => 'text/x-pascal',
538
+ 'paw' => 'application/vnd.pawaafile',
539
+ 'pbd' => 'application/vnd.powerbuilder6',
540
+ 'pbm' => 'image/x-portable-bitmap',
541
+ 'pcf' => 'application/x-font-pcf',
542
+ 'pcl' => 'application/vnd.hp-pcl',
543
+ 'pclxl' => 'application/vnd.hp-pclxl',
544
+ 'pct' => 'image/x-pict',
545
+ 'pcurl' => 'application/vnd.curl.pcurl',
546
+ 'pcx' => 'image/x-pcx',
547
+ 'pdb' => 'application/vnd.palm',
548
+ 'pdf' => 'application/pdf',
549
+ 'pfa' => 'application/x-font-type1',
550
+ 'pfb' => 'application/x-font-type1',
551
+ 'pfm' => 'application/x-font-type1',
552
+ 'pfr' => 'application/font-tdpfr',
553
+ 'pfx' => 'application/x-pkcs12',
554
+ 'pgm' => 'image/x-portable-graymap',
555
+ 'pgn' => 'application/x-chess-pgn',
556
+ 'pgp' => 'application/pgp-encrypted',
557
+ 'php' => 'text/x-php',
558
+ 'phps' => 'application/x-httpd-phps',
559
+ 'pic' => 'image/x-pict',
560
+ 'pkg' => 'application/octet-stream',
561
+ 'pki' => 'application/pkixcmp',
562
+ 'pkipath' => 'application/pkix-pkipath',
563
+ 'plb' => 'application/vnd.3gpp.pic-bw-large',
564
+ 'plc' => 'application/vnd.mobius.plc',
565
+ 'plf' => 'application/vnd.pocketlearn',
566
+ 'pls' => 'application/pls+xml',
567
+ 'pml' => 'application/vnd.ctc-posml',
568
+ 'png' => 'image/png',
569
+ 'pnm' => 'image/x-portable-anymap',
570
+ 'portpkg' => 'application/vnd.macports.portpkg',
571
+ 'pot' => 'application/vnd.ms-powerpoint',
572
+ 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12',
573
+ 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
574
+ 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12',
575
+ 'ppd' => 'application/vnd.cups-ppd',
576
+ 'ppm' => 'image/x-portable-pixmap',
577
+ 'pps' => 'application/vnd.ms-powerpoint',
578
+ 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',
579
+ 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
580
+ 'ppt' => 'application/vnd.ms-powerpoint',
581
+ 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12',
582
+ 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
583
+ 'pqa' => 'application/vnd.palm',
584
+ 'prc' => 'application/x-mobipocket-ebook',
585
+ 'pre' => 'application/vnd.lotus-freelance',
586
+ 'prf' => 'application/pics-rules',
587
+ 'ps' => 'application/postscript',
588
+ 'psb' => 'application/vnd.3gpp.pic-bw-small',
589
+ 'psd' => 'image/vnd.adobe.photoshop',
590
+ 'psf' => 'application/x-font-linux-psf',
591
+ 'pskcxml' => 'application/pskc+xml',
592
+ 'ptid' => 'application/vnd.pvi.ptid1',
593
+ 'pub' => 'application/x-mspublisher',
594
+ 'pvb' => 'application/vnd.3gpp.pic-bw-var',
595
+ 'pwn' => 'application/vnd.3m.post-it-notes',
596
+ 'pya' => 'audio/vnd.ms-playready.media.pya',
597
+ 'pyv' => 'video/vnd.ms-playready.media.pyv',
598
+ 'qam' => 'application/vnd.epson.quickanime',
599
+ 'qbo' => 'application/vnd.intu.qbo',
600
+ 'qfx' => 'application/vnd.intu.qfx',
601
+ 'qps' => 'application/vnd.publishare-delta-tree',
602
+ 'qt' => 'video/quicktime',
603
+ 'qwd' => 'application/vnd.quark.quarkxpress',
604
+ 'qwt' => 'application/vnd.quark.quarkxpress',
605
+ 'qxb' => 'application/vnd.quark.quarkxpress',
606
+ 'qxd' => 'application/vnd.quark.quarkxpress',
607
+ 'qxl' => 'application/vnd.quark.quarkxpress',
608
+ 'qxt' => 'application/vnd.quark.quarkxpress',
609
+ 'ra' => 'audio/x-pn-realaudio',
610
+ 'ram' => 'audio/x-pn-realaudio',
611
+ 'rar' => 'application/x-rar-compressed',
612
+ 'ras' => 'image/x-cmu-raster',
613
+ 'rb' => 'text/plain',
614
+ 'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
615
+ 'rdf' => 'application/rdf+xml',
616
+ 'rdz' => 'application/vnd.data-vision.rdz',
617
+ 'rep' => 'application/vnd.businessobjects',
618
+ 'res' => 'application/x-dtbresource+xml',
619
+ 'resx' => 'text/xml',
620
+ 'rgb' => 'image/x-rgb',
621
+ 'rif' => 'application/reginfo+xml',
622
+ 'rip' => 'audio/vnd.rip',
623
+ 'rl' => 'application/resource-lists+xml',
624
+ 'rlc' => 'image/vnd.fujixerox.edmics-rlc',
625
+ 'rld' => 'application/resource-lists-diff+xml',
626
+ 'rm' => 'application/vnd.rn-realmedia',
627
+ 'rmi' => 'audio/midi',
628
+ 'rmp' => 'audio/x-pn-realaudio-plugin',
629
+ 'rms' => 'application/vnd.jcp.javame.midlet-rms',
630
+ 'rnc' => 'application/relax-ng-compact-syntax',
631
+ 'roff' => 'text/troff',
632
+ 'rp9' => 'application/vnd.cloanto.rp9',
633
+ 'rpss' => 'application/vnd.nokia.radio-presets',
634
+ 'rpst' => 'application/vnd.nokia.radio-preset',
635
+ 'rq' => 'application/sparql-query',
636
+ 'rs' => 'application/rls-services+xml',
637
+ 'rsd' => 'application/rsd+xml',
638
+ 'rss' => 'application/rss+xml',
639
+ 'rtf' => 'application/rtf',
640
+ 'rtx' => 'text/richtext',
641
+ 's' => 'text/x-asm',
642
+ 'saf' => 'application/vnd.yamaha.smaf-audio',
643
+ 'sbml' => 'application/sbml+xml',
644
+ 'sc' => 'application/vnd.ibm.secure-container',
645
+ 'scd' => 'application/x-msschedule',
646
+ 'scm' => 'application/vnd.lotus-screencam',
647
+ 'scq' => 'application/scvp-cv-request',
648
+ 'scs' => 'application/scvp-cv-response',
649
+ 'scurl' => 'text/vnd.curl.scurl',
650
+ 'sda' => 'application/vnd.stardivision.draw',
651
+ 'sdc' => 'application/vnd.stardivision.calc',
652
+ 'sdd' => 'application/vnd.stardivision.impress',
653
+ 'sdkd' => 'application/vnd.solent.sdkm+xml',
654
+ 'sdkm' => 'application/vnd.solent.sdkm+xml',
655
+ 'sdp' => 'application/sdp',
656
+ 'sdw' => 'application/vnd.stardivision.writer',
657
+ 'see' => 'application/vnd.seemail',
658
+ 'seed' => 'application/vnd.fdsn.seed',
659
+ 'sema' => 'application/vnd.sema',
660
+ 'semd' => 'application/vnd.semd',
661
+ 'semf' => 'application/vnd.semf',
662
+ 'ser' => 'application/java-serialized-object',
663
+ 'setpay' => 'application/set-payment-initiation',
664
+ 'setreg' => 'application/set-registration-initiation',
665
+ 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',
666
+ 'sfs' => 'application/vnd.spotfire.sfs',
667
+ 'sgl' => 'application/vnd.stardivision.writer-global',
668
+ 'sgm' => 'text/sgml',
669
+ 'sgml' => 'text/sgml',
670
+ 'sh' => 'application/x-sh',
671
+ 'shar' => 'application/x-shar',
672
+ 'shf' => 'application/shf+xml',
673
+ 'sig' => 'application/pgp-signature',
674
+ 'silo' => 'model/mesh',
675
+ 'sis' => 'application/vnd.symbian.install',
676
+ 'sisx' => 'application/vnd.symbian.install',
677
+ 'sit' => 'application/x-stuffit',
678
+ 'sitx' => 'application/x-stuffitx',
679
+ 'skd' => 'application/vnd.koan',
680
+ 'skm' => 'application/vnd.koan',
681
+ 'skp' => 'application/vnd.koan',
682
+ 'skt' => 'application/vnd.koan',
683
+ 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
684
+ 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
685
+ 'slt' => 'application/vnd.epson.salt',
686
+ 'sm' => 'application/vnd.stepmania.stepchart',
687
+ 'smf' => 'application/vnd.stardivision.math',
688
+ 'smi' => 'application/smil+xml',
689
+ 'smil' => 'application/smil+xml',
690
+ 'snd' => 'audio/basic',
691
+ 'snf' => 'application/x-font-snf',
692
+ 'so' => 'application/octet-stream',
693
+ 'spc' => 'application/x-pkcs7-certificates',
694
+ 'spf' => 'application/vnd.yamaha.smaf-phrase',
695
+ 'spl' => 'application/x-futuresplash',
696
+ 'spot' => 'text/vnd.in3d.spot',
697
+ 'spp' => 'application/scvp-vp-response',
698
+ 'spq' => 'application/scvp-vp-request',
699
+ 'spx' => 'audio/ogg',
700
+ 'src' => 'application/x-wais-source',
701
+ 'sru' => 'application/sru+xml',
702
+ 'srx' => 'application/sparql-results+xml',
703
+ 'sse' => 'application/vnd.kodak-descriptor',
704
+ 'ssf' => 'application/vnd.epson.ssf',
705
+ 'ssml' => 'application/ssml+xml',
706
+ 'st' => 'application/vnd.sailingtracker.track',
707
+ 'stc' => 'application/vnd.sun.xml.calc.template',
708
+ 'std' => 'application/vnd.sun.xml.draw.template',
709
+ 'stf' => 'application/vnd.wt.stf',
710
+ 'sti' => 'application/vnd.sun.xml.impress.template',
711
+ 'stk' => 'application/hyperstudio',
712
+ 'stl' => 'application/vnd.ms-pki.stl',
713
+ 'str' => 'application/vnd.pg.format',
714
+ 'stw' => 'application/vnd.sun.xml.writer.template',
715
+ 'sub' => 'image/vnd.dvb.subtitle',
716
+ 'sus' => 'application/vnd.sus-calendar',
717
+ 'susp' => 'application/vnd.sus-calendar',
718
+ 'sv4cpio' => 'application/x-sv4cpio',
719
+ 'sv4crc' => 'application/x-sv4crc',
720
+ 'svc' => 'application/vnd.dvb.service',
721
+ 'svd' => 'application/vnd.svd',
722
+ 'svg' => 'image/svg+xml',
723
+ 'svgz' => 'image/svg+xml',
724
+ 'swa' => 'application/x-director',
725
+ 'swf' => 'application/x-shockwave-flash',
726
+ 'swi' => 'application/vnd.aristanetworks.swi',
727
+ 'sxc' => 'application/vnd.sun.xml.calc',
728
+ 'sxd' => 'application/vnd.sun.xml.draw',
729
+ 'sxg' => 'application/vnd.sun.xml.writer.global',
730
+ 'sxi' => 'application/vnd.sun.xml.impress',
731
+ 'sxm' => 'application/vnd.sun.xml.math',
732
+ 'sxw' => 'application/vnd.sun.xml.writer',
733
+ 't' => 'text/troff',
734
+ 'tao' => 'application/vnd.tao.intent-module-archive',
735
+ 'tar' => 'application/x-tar',
736
+ 'tcap' => 'application/vnd.3gpp2.tcap',
737
+ 'tcl' => 'application/x-tcl',
738
+ 'teacher' => 'application/vnd.smart.teacher',
739
+ 'tei' => 'application/tei+xml',
740
+ 'teicorpus' => 'application/tei+xml',
741
+ 'tex' => 'application/x-tex',
742
+ 'texi' => 'application/x-texinfo',
743
+ 'texinfo' => 'application/x-texinfo',
744
+ 'text' => 'text/plain',
745
+ 'tfi' => 'application/thraud+xml',
746
+ 'tfm' => 'application/x-tex-tfm',
747
+ 'thmx' => 'application/vnd.ms-officetheme',
748
+ 'tif' => 'image/tiff',
749
+ 'tiff' => 'image/tiff',
750
+ 'tmo' => 'application/vnd.tmobile-livetv',
751
+ 'torrent' => 'application/x-bittorrent',
752
+ 'tpl' => 'application/vnd.groove-tool-template',
753
+ 'tpt' => 'application/vnd.trid.tpt',
754
+ 'tr' => 'text/troff',
755
+ 'tra' => 'application/vnd.trueapp',
756
+ 'trm' => 'application/x-msterminal',
757
+ 'tsd' => 'application/timestamped-data',
758
+ 'tsv' => 'text/tab-separated-values',
759
+ 'ttc' => 'application/x-font-ttf',
760
+ 'ttf' => 'application/x-font-ttf',
761
+ 'ttl' => 'text/turtle',
762
+ 'twd' => 'application/vnd.simtech-mindmapper',
763
+ 'twds' => 'application/vnd.simtech-mindmapper',
764
+ 'txd' => 'application/vnd.genomatix.tuxedo',
765
+ 'txf' => 'application/vnd.mobius.txf',
766
+ 'txt' => 'text/plain',
767
+ 'u32' => 'application/x-authorware-bin',
768
+ 'udeb' => 'application/x-debian-package',
769
+ 'ufd' => 'application/vnd.ufdl',
770
+ 'ufdl' => 'application/vnd.ufdl',
771
+ 'umj' => 'application/vnd.umajin',
772
+ 'unityweb' => 'application/vnd.unity',
773
+ 'uoml' => 'application/vnd.uoml+xml',
774
+ 'uri' => 'text/uri-list',
775
+ 'uris' => 'text/uri-list',
776
+ 'urls' => 'text/uri-list',
777
+ 'ustar' => 'application/x-ustar',
778
+ 'utz' => 'application/vnd.uiq.theme',
779
+ 'uu' => 'text/x-uuencode',
780
+ 'uva' => 'audio/vnd.dece.audio',
781
+ 'uvd' => 'application/vnd.dece.data',
782
+ 'uvf' => 'application/vnd.dece.data',
783
+ 'uvg' => 'image/vnd.dece.graphic',
784
+ 'uvh' => 'video/vnd.dece.hd',
785
+ 'uvi' => 'image/vnd.dece.graphic',
786
+ 'uvm' => 'video/vnd.dece.mobile',
787
+ 'uvp' => 'video/vnd.dece.pd',
788
+ 'uvs' => 'video/vnd.dece.sd',
789
+ 'uvt' => 'application/vnd.dece.ttml+xml',
790
+ 'uvu' => 'video/vnd.uvvu.mp4',
791
+ 'uvv' => 'video/vnd.dece.video',
792
+ 'uvva' => 'audio/vnd.dece.audio',
793
+ 'uvvd' => 'application/vnd.dece.data',
794
+ 'uvvf' => 'application/vnd.dece.data',
795
+ 'uvvg' => 'image/vnd.dece.graphic',
796
+ 'uvvh' => 'video/vnd.dece.hd',
797
+ 'uvvi' => 'image/vnd.dece.graphic',
798
+ 'uvvm' => 'video/vnd.dece.mobile',
799
+ 'uvvp' => 'video/vnd.dece.pd',
800
+ 'uvvs' => 'video/vnd.dece.sd',
801
+ 'uvvt' => 'application/vnd.dece.ttml+xml',
802
+ 'uvvu' => 'video/vnd.uvvu.mp4',
803
+ 'uvvv' => 'video/vnd.dece.video',
804
+ 'uvvx' => 'application/vnd.dece.unspecified',
805
+ 'uvx' => 'application/vnd.dece.unspecified',
806
+ 'vcd' => 'application/x-cdlink',
807
+ 'vcf' => 'text/x-vcard',
808
+ 'vcg' => 'application/vnd.groove-vcard',
809
+ 'vcs' => 'text/x-vcalendar',
810
+ 'vcx' => 'application/vnd.vcx',
811
+ 'vis' => 'application/vnd.visionary',
812
+ 'viv' => 'video/vnd.vivo',
813
+ 'vor' => 'application/vnd.stardivision.writer',
814
+ 'vox' => 'application/x-authorware-bin',
815
+ 'vrml' => 'model/vrml',
816
+ 'vsd' => 'application/vnd.visio',
817
+ 'vsf' => 'application/vnd.vsf',
818
+ 'vss' => 'application/vnd.visio',
819
+ 'vst' => 'application/vnd.visio',
820
+ 'vsw' => 'application/vnd.visio',
821
+ 'vtu' => 'model/vnd.vtu',
822
+ 'vxml' => 'application/voicexml+xml',
823
+ 'w3d' => 'application/x-director',
824
+ 'wad' => 'application/x-doom',
825
+ 'wav' => 'audio/x-wav',
826
+ 'wax' => 'audio/x-ms-wax',
827
+ 'wbmp' => 'image/vnd.wap.wbmp',
828
+ 'wbs' => 'application/vnd.criticaltools.wbs+xml',
829
+ 'wbxml' => 'application/vnd.wap.wbxml',
830
+ 'wcm' => 'application/vnd.ms-works',
831
+ 'wdb' => 'application/vnd.ms-works',
832
+ 'weba' => 'audio/webm',
833
+ 'webm' => 'video/webm',
834
+ 'webp' => 'image/webp',
835
+ 'wg' => 'application/vnd.pmi.widget',
836
+ 'wgt' => 'application/widget',
837
+ 'wks' => 'application/vnd.ms-works',
838
+ 'wm' => 'video/x-ms-wm',
839
+ 'wma' => 'audio/x-ms-wma',
840
+ 'wmd' => 'application/x-ms-wmd',
841
+ 'wmf' => 'application/x-msmetafile',
842
+ 'wml' => 'text/vnd.wap.wml',
843
+ 'wmlc' => 'application/vnd.wap.wmlc',
844
+ 'wmls' => 'text/vnd.wap.wmlscript',
845
+ 'wmlsc' => 'application/vnd.wap.wmlscriptc',
846
+ 'wmv' => 'video/x-ms-wmv',
847
+ 'wmx' => 'video/x-ms-wmx',
848
+ 'wmz' => 'application/x-ms-wmz',
849
+ 'woff' => 'application/x-font-woff',
850
+ 'wpd' => 'application/vnd.wordperfect',
851
+ 'wpl' => 'application/vnd.ms-wpl',
852
+ 'wps' => 'application/vnd.ms-works',
853
+ 'wqd' => 'application/vnd.wqd',
854
+ 'wri' => 'application/x-mswrite',
855
+ 'wrl' => 'model/vrml',
856
+ 'wsdl' => 'application/wsdl+xml',
857
+ 'wspolicy' => 'application/wspolicy+xml',
858
+ 'wtb' => 'application/vnd.webturbo',
859
+ 'wvx' => 'video/x-ms-wvx',
860
+ 'x32' => 'application/x-authorware-bin',
861
+ 'x3d' => 'application/vnd.hzn-3d-crossword',
862
+ 'xap' => 'application/x-silverlight-app',
863
+ 'xar' => 'application/vnd.xara',
864
+ 'xbap' => 'application/x-ms-xbap',
865
+ 'xbd' => 'application/vnd.fujixerox.docuworks.binder',
866
+ 'xbm' => 'image/x-xbitmap',
867
+ 'xdf' => 'application/xcap-diff+xml',
868
+ 'xdm' => 'application/vnd.syncml.dm+xml',
869
+ 'xdp' => 'application/vnd.adobe.xdp+xml',
870
+ 'xdssc' => 'application/dssc+xml',
871
+ 'xdw' => 'application/vnd.fujixerox.docuworks',
872
+ 'xenc' => 'application/xenc+xml',
873
+ 'xer' => 'application/patch-ops-error+xml',
874
+ 'xfdf' => 'application/vnd.adobe.xfdf',
875
+ 'xfdl' => 'application/vnd.xfdl',
876
+ 'xht' => 'application/xhtml+xml',
877
+ 'xhtml' => 'application/xhtml+xml',
878
+ 'xhvml' => 'application/xv+xml',
879
+ 'xif' => 'image/vnd.xiff',
880
+ 'xla' => 'application/vnd.ms-excel',
881
+ 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12',
882
+ 'xlc' => 'application/vnd.ms-excel',
883
+ 'xlm' => 'application/vnd.ms-excel',
884
+ 'xls' => 'application/vnd.ms-excel',
885
+ 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12',
886
+ 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12',
887
+ 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
888
+ 'xlt' => 'application/vnd.ms-excel',
889
+ 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12',
890
+ 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
891
+ 'xlw' => 'application/vnd.ms-excel',
892
+ 'xml' => 'application/xml',
893
+ 'xo' => 'application/vnd.olpc-sugar',
894
+ 'xop' => 'application/xop+xml',
895
+ 'xpi' => 'application/x-xpinstall',
896
+ 'xpm' => 'image/x-xpixmap',
897
+ 'xpr' => 'application/vnd.is-xpr',
898
+ 'xps' => 'application/vnd.ms-xpsdocument',
899
+ 'xpw' => 'application/vnd.intercon.formnet',
900
+ 'xpx' => 'application/vnd.intercon.formnet',
901
+ 'xsl' => 'application/xml',
902
+ 'xslt' => 'application/xslt+xml',
903
+ 'xsm' => 'application/vnd.syncml+xml',
904
+ 'xspf' => 'application/xspf+xml',
905
+ 'xul' => 'application/vnd.mozilla.xul+xml',
906
+ 'xvm' => 'application/xv+xml',
907
+ 'xvml' => 'application/xv+xml',
908
+ 'xwd' => 'image/x-xwindowdump',
909
+ 'xyz' => 'chemical/x-xyz',
910
+ 'yaml' => 'text/yaml',
911
+ 'yang' => 'application/yang',
912
+ 'yin' => 'application/yin+xml',
913
+ 'yml' => 'text/yaml',
914
+ 'zaz' => 'application/vnd.zzazz.deck+xml',
915
+ 'zip' => 'application/zip',
916
+ 'zir' => 'application/vnd.zul',
917
+ 'zirz' => 'application/vnd.zul',
918
+ 'zmm' => 'application/vnd.handheld-entertainment+xml'
919
+ );
920
+
921
+ /**
922
+ * Get a singleton instance of the class
923
+ *
924
+ * @return self
925
+ * @codeCoverageIgnore
926
+ */
927
+ public static function getInstance()
928
+ {
929
+ if (!self::$instance) {
930
+ self::$instance = new self();
931
+ }
932
+
933
+ return self::$instance;
934
+ }
935
+
936
+ /**
937
+ * Get a mimetype value from a file extension
938
+ *
939
+ * @param string $extension File extension
940
+ *
941
+ * @return string|null
942
+ *
943
+ */
944
+ public function fromExtension($extension)
945
+ {
946
+ $extension = strtolower($extension);
947
+
948
+ return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null;
949
+ }
950
+
951
+ /**
952
+ * Get a mimetype from a filename
953
+ *
954
+ * @param string $filename Filename to generate a mimetype from
955
+ *
956
+ * @return string|null
957
+ */
958
+ public function fromFilename($filename)
959
+ {
960
+ return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION));
961
+ }
962
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/CommaAggregator.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\QueryAggregator;
4
+
5
+ use Guzzle\Http\QueryString;
6
+
7
+ /**
8
+ * Aggregates nested query string variables using commas
9
+ */
10
+ class CommaAggregator implements QueryAggregatorInterface
11
+ {
12
+ public function aggregate($key, $value, QueryString $query)
13
+ {
14
+ if ($query->isUrlEncoding()) {
15
+ return array($query->encodeValue($key) => implode(',', array_map(array($query, 'encodeValue'), $value)));
16
+ } else {
17
+ return array($key => implode(',', $value));
18
+ }
19
+ }
20
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/DuplicateAggregator.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\QueryAggregator;
4
+
5
+ use Guzzle\Http\QueryString;
6
+
7
+ /**
8
+ * Does not aggregate nested query string values and allows duplicates in the resulting array
9
+ *
10
+ * Example: http://test.com?q=1&q=2
11
+ */
12
+ class DuplicateAggregator implements QueryAggregatorInterface
13
+ {
14
+ public function aggregate($key, $value, QueryString $query)
15
+ {
16
+ if ($query->isUrlEncoding()) {
17
+ return array($query->encodeValue($key) => array_map(array($query, 'encodeValue'), $value));
18
+ } else {
19
+ return array($key => $value);
20
+ }
21
+ }
22
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/PhpAggregator.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\QueryAggregator;
4
+
5
+ use Guzzle\Http\QueryString;
6
+
7
+ /**
8
+ * Aggregates nested query string variables using PHP style []
9
+ */
10
+ class PhpAggregator implements QueryAggregatorInterface
11
+ {
12
+ public function aggregate($key, $value, QueryString $query)
13
+ {
14
+ $ret = array();
15
+
16
+ foreach ($value as $k => $v) {
17
+ $k = "{$key}[{$k}]";
18
+ if (is_array($v)) {
19
+ $ret = array_merge($ret, self::aggregate($k, $v, $query));
20
+ } else {
21
+ $ret[$query->encodeValue($k)] = $query->encodeValue($v);
22
+ }
23
+ }
24
+
25
+ return $ret;
26
+ }
27
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http\QueryAggregator;
4
+
5
+ use Guzzle\Http\QueryString;
6
+
7
+ /**
8
+ * Interface used for aggregating nested query string variables into a flattened array of key value pairs
9
+ */
10
+ interface QueryAggregatorInterface
11
+ {
12
+ /**
13
+ * Aggregate multi-valued parameters into a flattened associative array
14
+ *
15
+ * @param string $key The name of the query string parameter
16
+ * @param array $value The values of the parameter
17
+ * @param QueryString $query The query string that is being aggregated
18
+ *
19
+ * @return array Returns an array of the combined values
20
+ */
21
+ public function aggregate($key, $value, QueryString $query);
22
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/QueryString.php ADDED
@@ -0,0 +1,297 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ use Guzzle\Common\Collection;
6
+ use Guzzle\Common\Exception\RuntimeException;
7
+ use Guzzle\Http\QueryAggregator\DuplicateAggregator;
8
+ use Guzzle\Http\QueryAggregator\QueryAggregatorInterface;
9
+ use Guzzle\Http\QueryAggregator\PhpAggregator;
10
+
11
+ /**
12
+ * Query string object to handle managing query string parameters and aggregating those parameters together as a string.
13
+ */
14
+ class QueryString extends Collection
15
+ {
16
+ /** @var string Used to URL encode with rawurlencode */
17
+ const RFC_3986 = 'RFC 3986';
18
+
19
+ /** @var string Used to encode with urlencode */
20
+ const FORM_URLENCODED = 'application/x-www-form-urlencoded';
21
+
22
+ /** @var string Constant used to create blank query string values (e.g. ?foo) */
23
+ const BLANK = "_guzzle_blank_";
24
+
25
+ /** @var string The query string field separator (e.g. '&') */
26
+ protected $fieldSeparator = '&';
27
+
28
+ /** @var string The query string value separator (e.g. '=') */
29
+ protected $valueSeparator = '=';
30
+
31
+ /** @var bool URL encode fields and values */
32
+ protected $urlEncode = 'RFC 3986';
33
+
34
+ /** @var QueryAggregatorInterface */
35
+ protected $aggregator;
36
+
37
+ /** @var array Cached PHP aggregator */
38
+ private static $defaultAggregator = null;
39
+
40
+ /**
41
+ * Parse a query string into a QueryString object
42
+ *
43
+ * @param string $query Query string to parse
44
+ *
45
+ * @return self
46
+ */
47
+ public static function fromString($query)
48
+ {
49
+ $q = new static();
50
+ if ($query === '') {
51
+ return $q;
52
+ }
53
+
54
+ $foundDuplicates = $foundPhpStyle = false;
55
+
56
+ foreach (explode('&', $query) as $kvp) {
57
+ $parts = explode('=', $kvp, 2);
58
+ $key = rawurldecode($parts[0]);
59
+ if ($paramIsPhpStyleArray = substr($key, -2) == '[]') {
60
+ $foundPhpStyle = true;
61
+ $key = substr($key, 0, -2);
62
+ }
63
+ if (isset($parts[1])) {
64
+ $value = rawurldecode(str_replace('+', '%20', $parts[1]));
65
+ if (isset($q[$key])) {
66
+ $q->add($key, $value);
67
+ $foundDuplicates = true;
68
+ } elseif ($paramIsPhpStyleArray) {
69
+ $q[$key] = array($value);
70
+ } else {
71
+ $q[$key] = $value;
72
+ }
73
+ } else {
74
+ // Uses false by default to represent keys with no trailing "=" sign.
75
+ $q->add($key, false);
76
+ }
77
+ }
78
+
79
+ // Use the duplicate aggregator if duplicates were found and not using PHP style arrays
80
+ if ($foundDuplicates && !$foundPhpStyle) {
81
+ $q->setAggregator(new DuplicateAggregator());
82
+ }
83
+
84
+ return $q;
85
+ }
86
+
87
+ /**
88
+ * Convert the query string parameters to a query string string
89
+ *
90
+ * @return string
91
+ * @throws RuntimeException
92
+ */
93
+ public function __toString()
94
+ {
95
+ if (!$this->data) {
96
+ return '';
97
+ }
98
+
99
+ $queryList = array();
100
+ foreach ($this->prepareData($this->data) as $name => $value) {
101
+ $queryList[] = $this->convertKvp($name, $value);
102
+ }
103
+
104
+ return implode($this->fieldSeparator, $queryList);
105
+ }
106
+
107
+ /**
108
+ * Get the query string field separator
109
+ *
110
+ * @return string
111
+ */
112
+ public function getFieldSeparator()
113
+ {
114
+ return $this->fieldSeparator;
115
+ }
116
+
117
+ /**
118
+ * Get the query string value separator
119
+ *
120
+ * @return string
121
+ */
122
+ public function getValueSeparator()
123
+ {
124
+ return $this->valueSeparator;
125
+ }
126
+
127
+ /**
128
+ * Returns the type of URL encoding used by the query string
129
+ *
130
+ * One of: false, "RFC 3986", or "application/x-www-form-urlencoded"
131
+ *
132
+ * @return bool|string
133
+ */
134
+ public function getUrlEncoding()
135
+ {
136
+ return $this->urlEncode;
137
+ }
138
+
139
+ /**
140
+ * Returns true or false if using URL encoding
141
+ *
142
+ * @return bool
143
+ */
144
+ public function isUrlEncoding()
145
+ {
146
+ return $this->urlEncode !== false;
147
+ }
148
+
149
+ /**
150
+ * Provide a function for combining multi-valued query string parameters into a single or multiple fields
151
+ *
152
+ * @param null|QueryAggregatorInterface $aggregator Pass in a QueryAggregatorInterface object to handle converting
153
+ * deeply nested query string variables into a flattened array.
154
+ * Pass null to use the default PHP style aggregator. For legacy
155
+ * reasons, this function accepts a callable that must accepts a
156
+ * $key, $value, and query object.
157
+ * @return self
158
+ * @see \Guzzle\Http\QueryString::aggregateUsingComma()
159
+ */
160
+ public function setAggregator(QueryAggregatorInterface $aggregator = null)
161
+ {
162
+ // Use the default aggregator if none was set
163
+ if (!$aggregator) {
164
+ if (!self::$defaultAggregator) {
165
+ self::$defaultAggregator = new PhpAggregator();
166
+ }
167
+ $aggregator = self::$defaultAggregator;
168
+ }
169
+
170
+ $this->aggregator = $aggregator;
171
+
172
+ return $this;
173
+ }
174
+
175
+ /**
176
+ * Set whether or not field names and values should be rawurlencoded
177
+ *
178
+ * @param bool|string $encode Set to TRUE to use RFC 3986 encoding (rawurlencode), false to disable encoding, or
179
+ * form_urlencoding to use application/x-www-form-urlencoded encoding (urlencode)
180
+ * @return self
181
+ */
182
+ public function useUrlEncoding($encode)
183
+ {
184
+ $this->urlEncode = ($encode === true) ? self::RFC_3986 : $encode;
185
+
186
+ return $this;
187
+ }
188
+
189
+ /**
190
+ * Set the query string separator
191
+ *
192
+ * @param string $separator The query string separator that will separate fields
193
+ *
194
+ * @return self
195
+ */
196
+ public function setFieldSeparator($separator)
197
+ {
198
+ $this->fieldSeparator = $separator;
199
+
200
+ return $this;
201
+ }
202
+
203
+ /**
204
+ * Set the query string value separator
205
+ *
206
+ * @param string $separator The query string separator that will separate values from fields
207
+ *
208
+ * @return self
209
+ */
210
+ public function setValueSeparator($separator)
211
+ {
212
+ $this->valueSeparator = $separator;
213
+
214
+ return $this;
215
+ }
216
+
217
+ /**
218
+ * Returns an array of url encoded field names and values
219
+ *
220
+ * @return array
221
+ */
222
+ public function urlEncode()
223
+ {
224
+ return $this->prepareData($this->data);
225
+ }
226
+
227
+ /**
228
+ * URL encodes a value based on the url encoding type of the query string object
229
+ *
230
+ * @param string $value Value to encode
231
+ *
232
+ * @return string
233
+ */
234
+ public function encodeValue($value)
235
+ {
236
+ if ($this->urlEncode == self::RFC_3986) {
237
+ return rawurlencode($value);
238
+ } elseif ($this->urlEncode == self::FORM_URLENCODED) {
239
+ return urlencode($value);
240
+ } else {
241
+ return (string) $value;
242
+ }
243
+ }
244
+
245
+ /**
246
+ * Url encode parameter data and convert nested query strings into a flattened hash.
247
+ *
248
+ * @param array $data The data to encode
249
+ *
250
+ * @return array Returns an array of encoded values and keys
251
+ */
252
+ protected function prepareData(array $data)
253
+ {
254
+ // If no aggregator is present then set the default
255
+ if (!$this->aggregator) {
256
+ $this->setAggregator(null);
257
+ }
258
+
259
+ $temp = array();
260
+ foreach ($data as $key => $value) {
261
+ if ($value === false || $value === null) {
262
+ // False and null will not include the "=". Use an empty string to include the "=".
263
+ $temp[$this->encodeValue($key)] = $value;
264
+ } elseif (is_array($value)) {
265
+ $temp = array_merge($temp, $this->aggregator->aggregate($key, $value, $this));
266
+ } else {
267
+ $temp[$this->encodeValue($key)] = $this->encodeValue($value);
268
+ }
269
+ }
270
+
271
+ return $temp;
272
+ }
273
+
274
+ /**
275
+ * Converts a key value pair that can contain strings, nulls, false, or arrays
276
+ * into a single string.
277
+ *
278
+ * @param string $name Name of the field
279
+ * @param mixed $value Value of the field
280
+ * @return string
281
+ */
282
+ private function convertKvp($name, $value)
283
+ {
284
+ if ($value === self::BLANK || $value === null || $value === false) {
285
+ return $name;
286
+ } elseif (!is_array($value)) {
287
+ return $name . $this->valueSeparator . $value;
288
+ }
289
+
290
+ $result = '';
291
+ foreach ($value as $v) {
292
+ $result .= $this->convertKvp($name, $v) . $this->fieldSeparator;
293
+ }
294
+
295
+ return rtrim($result, $this->fieldSeparator);
296
+ }
297
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/ReadLimitEntityBody.php ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ use Guzzle\Stream\StreamInterface;
6
+
7
+ /**
8
+ * EntityBody decorator used to return only a subset of an entity body
9
+ */
10
+ class ReadLimitEntityBody extends AbstractEntityBodyDecorator
11
+ {
12
+ /** @var int Limit the number of bytes that can be read */
13
+ protected $limit;
14
+
15
+ /** @var int Offset to start reading from */
16
+ protected $offset;
17
+
18
+ /**
19
+ * @param EntityBodyInterface $body Body to wrap
20
+ * @param int $limit Total number of bytes to allow to be read from the stream
21
+ * @param int $offset Position to seek to before reading (only works on seekable streams)
22
+ */
23
+ public function __construct(EntityBodyInterface $body, $limit, $offset = 0)
24
+ {
25
+ parent::__construct($body);
26
+ $this->setLimit($limit)->setOffset($offset);
27
+ }
28
+
29
+ /**
30
+ * Returns only a subset of the decorated entity body when cast as a string
31
+ * {@inheritdoc}
32
+ */
33
+ public function __toString()
34
+ {
35
+ if (!$this->body->isReadable() ||
36
+ (!$this->body->isSeekable() && $this->body->isConsumed())
37
+ ) {
38
+ return '';
39
+ }
40
+
41
+ $originalPos = $this->body->ftell();
42
+ $this->body->seek($this->offset);
43
+ $data = '';
44
+ while (!$this->feof()) {
45
+ $data .= $this->read(1048576);
46
+ }
47
+ $this->body->seek($originalPos);
48
+
49
+ return (string) $data ?: '';
50
+ }
51
+
52
+ public function isConsumed()
53
+ {
54
+ return $this->body->isConsumed() ||
55
+ ($this->body->ftell() >= $this->offset + $this->limit);
56
+ }
57
+
58
+ /**
59
+ * Returns the Content-Length of the limited subset of data
60
+ * {@inheritdoc}
61
+ */
62
+ public function getContentLength()
63
+ {
64
+ $length = $this->body->getContentLength();
65
+
66
+ return $length === false
67
+ ? $this->limit
68
+ : min($this->limit, min($length, $this->offset + $this->limit) - $this->offset);
69
+ }
70
+
71
+ /**
72
+ * Allow for a bounded seek on the read limited entity body
73
+ * {@inheritdoc}
74
+ */
75
+ public function seek($offset, $whence = SEEK_SET)
76
+ {
77
+ return $whence === SEEK_SET
78
+ ? $this->body->seek(max($this->offset, min($this->offset + $this->limit, $offset)))
79
+ : false;
80
+ }
81
+
82
+ /**
83
+ * Set the offset to start limiting from
84
+ *
85
+ * @param int $offset Offset to seek to and begin byte limiting from
86
+ *
87
+ * @return self
88
+ */
89
+ public function setOffset($offset)
90
+ {
91
+ $this->body->seek($offset);
92
+ $this->offset = $offset;
93
+
94
+ return $this;
95
+ }
96
+
97
+ /**
98
+ * Set the limit of bytes that the decorator allows to be read from the stream
99
+ *
100
+ * @param int $limit Total number of bytes to allow to be read from the stream
101
+ *
102
+ * @return self
103
+ */
104
+ public function setLimit($limit)
105
+ {
106
+ $this->limit = $limit;
107
+
108
+ return $this;
109
+ }
110
+
111
+ public function read($length)
112
+ {
113
+ // Check if the current position is less than the total allowed bytes + original offset
114
+ $remaining = ($this->offset + $this->limit) - $this->body->ftell();
115
+ if ($remaining > 0) {
116
+ // Only return the amount of requested data, ensuring that the byte limit is not exceeded
117
+ return $this->body->read(min($remaining, $length));
118
+ } else {
119
+ return false;
120
+ }
121
+ }
122
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/RedirectPlugin.php ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Guzzle\Http;
4
+
5
+ use Guzzle\Common\Event;
6
+ use Guzzle\Http\Exception\BadResponseException;
7
+ use Guzzle\Http\Url;
8
+ use Guzzle\Http\Message\Response;
9
+ use Guzzle\Http\Message\RequestInterface;
10
+ use Guzzle\Http\Message\RequestFactory;
11
+ use Guzzle\Http\Message\EntityEnclosingRequestInterface;
12
+ use Guzzle\Http\Exception\TooManyRedirectsException;
13
+ use Guzzle\Http\Exception\CouldNotRewindStreamException;
14
+ use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15
+
16
+ /**
17
+ * Plugin to implement HTTP redirects. Can redirect like a web browser or using strict RFC 2616 compliance
18
+ */
19
+ class RedirectPlugin implements EventSubscriberInterface
20
+ {
21
+ const REDIRECT_COUNT = 'redirect.count';
22
+ const MAX_REDIRECTS = 'redirect.max';
23
+ const STRICT_REDIRECTS = 'redirect.strict';
24
+ const PARENT_REQUEST = 'redirect.parent_request';
25
+ const DISABLE = 'redirect.disable';
26
+
27
+ /**
28
+ * @var int Default number of redirects allowed when no setting is supplied by a request
29
+ */
30
+ protected $defaultMaxRedirects = 5;
31
+
32
+ public static function getSubscribedEvents()
33
+ {
34
+ return array(
35
+ 'request.sent' => array('onRequestSent', 100),
36
+ 'request.clone' => 'cleanupRequest',
37
+ 'request.before_send' => 'cleanupRequest'
38
+ );
39
+ }
40
+
41
+ /**
42
+ * Clean up the parameters of a request when it is cloned
43
+ *
44
+ * @param Event $event Event emitted
45
+ */
46
+ public function cleanupRequest(Event $event)
47
+ {
48
+ $params = $event['request']->getParams();
49
+ unset($params[self::REDIRECT_COUNT]);
50
+ unset($params[self::PARENT_REQUEST]);
51
+ }
52
+
53
+ /**
54
+ * Called when a request receives a redirect response
55
+ *
56
+ * @param Event $event Event emitted
57
+ */
58
+ public function onRequestSent(Event $event)
59
+ {
60
+ $response = $event['response'];
61
+ $request = $event['request'];
62
+
63
+ // Only act on redirect requests with Location headers
64
+ if (!$response || $request->getParams()->get(self::DISABLE)) {
65
+ return;
66
+ }
67
+
68
+ // Trace the original request based on parameter history
69
+ $original = $this->getOriginalRequest($request);
70
+
71
+ // Terminating condition to set the effective response on the original request
72
+ if (!$response->isRedirect() || !$response->hasHeader('Location')) {
73
+ if ($request !== $original) {
74
+ // This is a terminating redirect response, so set it on the original request
75
+ $response->getParams()->set(self::REDIRECT_COUNT, $original->getParams()->get(self::REDIRECT_COUNT));
76
+ $original->setResponse($response);
77
+ $response->setEffectiveUrl($request->getUrl());
78
+ }
79
+ return;
80
+ }
81
+
82
+ $this->sendRedirectRequest($original, $request, $response);
83
+ }
84
+
85
+ /**
86
+ * Get the original request that initiated a series of redirects
87
+ *
88
+ * @param RequestInterface $request Request to get the original request from
89
+ *
90
+ * @return RequestInterface
91
+ */
92
+ protected function getOriginalRequest(RequestInterface $request)
93
+ {
94
+ $original = $request;
95
+ // The number of redirects is held on the original request, so determine which request that is
96
+ while ($parent = $original->getParams()->get(self::PARENT_REQUEST)) {
97
+ $original = $parent;
98
+ }
99
+
100
+ return $original;
101
+ }
102
+
103
+ /**
104
+ * Create a redirect request for a specific request object
105
+ *
106
+ * Takes into account strict RFC compliant redirection (e.g. redirect POST with POST) vs doing what most clients do
107
+ * (e.g. redirect POST with GET).
108
+ *
109
+ * @param RequestInterface $request Request being redirected
110
+ * @param RequestInterface $original Original request
111
+ * @param int $statusCode Status code of the redirect
112
+ * @param string $location Location header of the redirect
113
+ *
114
+ * @return RequestInterface Returns a new redirect request
115
+ * @throws CouldNotRewindStreamException If the body needs to be rewound but cannot
116
+ */
117
+ protected function createRedirectRequest(
118
+ RequestInterface $request,
119
+ $statusCode,
120
+ $location,
121
+ RequestInterface $original
122
+ ) {
123
+ $redirectRequest = null;
124
+ $strict = $original->getParams()->get(self::STRICT_REDIRECTS);
125
+
126
+ // Switch method to GET for 303 redirects. 301 and 302 redirects also switch to GET unless we are forcing RFC
127
+ // compliance to emulate what most browsers do. NOTE: IE only switches methods on 301/302 when coming from a POST.
128
+ if ($request instanceof EntityEnclosingRequestInterface && ($statusCode == 303 || (!$strict && $statusCode <= 302))) {
129
+ $redirectRequest = RequestFactory::getInstance()->cloneRequestWithMethod($request, 'GET');
130
+ } else {
131
+ $redirectRequest = clone $request;
132
+ }
133
+
134
+ $redirectRequest->setIsRedirect(true);
135
+ // Always use the same response body when redirecting
136
+ $redirectRequest->setResponseBody($request->getResponseBody());
137
+
138
+ $location = Url::factory($location);
139
+ // If the location is not absolute, then combine it with the original URL
140
+ if (!$location->isAbsolute()) {
141
+ $originalUrl = $redirectRequest->getUrl(true);
142
+ // Remove query string parameters and just take what is present on the redirect Location header
143
+ $originalUrl->getQuery()->clear();
144
+ $location = $originalUrl->combine((string) $location, true);
145
+ }
146
+
147
+ $redirectRequest->setUrl($location);
148
+
149
+ // Add the parent request to the request before it sends (make sure it's before the onRequestClone event too)
150
+ $redirectRequest->getEventDispatcher()->addListener(
151
+ 'request.before_send',
152
+ $func = function ($e) use (&$func, $request, $redirectRequest) {
153
+ $redirectRequest->getEventDispatcher()->removeListener('request.before_send', $func);
154
+ $e['request']->getParams()->set(RedirectPlugin::PARENT_REQUEST, $request);
155
+ }
156
+ );
157
+
158
+ // Rewind the entity body of the request if needed
159
+ if ($redirectRequest instanceof EntityEnclosingRequestInterface && $redirectRequest->getBody()) {
160
+ $body = $redirectRequest->getBody();
161
+ // Only rewind the body if some of it has been read already, and throw an exception if the rewind fails
162
+ if ($body->ftell() && !$body->rewind()) {
163
+ throw new CouldNotRewindStreamException(
164
+ 'Unable to rewind the non-seekable entity body of the request after redirecting. cURL probably '
165
+ . 'sent part of body before the redirect occurred. Try adding acustom rewind function using on the '
166
+ . 'entity body of the request using setRewindFunction().'
167
+ );
168
+ }
169
+ }
170
+
171
+ return $redirectRequest;
172
+ }
173
+
174
+ /**
175
+ * Prepare the request for redirection and enforce the maximum number of allowed redirects per client
176
+ *
177
+ * @param RequestInterface $original Original request
178
+ * @param RequestInterface $request Request to prepare and validate
179
+ * @param Response $response The current response
180
+ *
181
+ * @return RequestInterface
182
+ */
183
+ protected function prepareRedirection(RequestInterface $original, RequestInterface $request, Response $response)
184
+ {
185
+ $params = $original->getParams();
186
+ // This is a new redirect, so increment the redirect counter
187
+ $current = $params[self::REDIRECT_COUNT] + 1;
188
+ $params[self::REDIRECT_COUNT] = $current;
189
+ // Use a provided maximum value or default to a max redirect count of 5
190
+ $max = isset($params[self::MAX_REDIRECTS]) ? $params[self::MAX_REDIRECTS] : $this->defaultMaxRedirects;
191
+
192
+ // Throw an exception if the redirect count is exceeded
193
+ if ($current > $max) {
194
+ $this->throwTooManyRedirectsException($original, $max);
195
+ return false;
196
+ } else {
197
+ // Create a redirect request based on the redirect rules set on the request
198
+ return $this->createRedirectRequest(
199
+ $request,
200
+ $response->getStatusCode(),
201
+ trim($response->getLocation()),
202
+ $original
203
+ );
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Send a redirect request and handle any errors
209
+ *
210
+ * @param RequestInterface $original The originating request
211
+ * @param RequestInterface $request The current request being redirected
212
+ * @param Response $response The response of the current request
213
+ *
214
+ * @throws BadResponseException|\Exception
215
+ */
216
+ protected function sendRedirectRequest(RequestInterface $original, RequestInterface $request, Response $response)
217
+ {
218
+ // Validate and create a redirect request based on the original request and current response
219
+ if ($redirectRequest = $this->prepareRedirection($original, $request, $response)) {
220
+ try {
221
+ $redirectRequest->send();
222
+ } catch (BadResponseException $e) {
223
+ $e->getResponse();
224
+ if (!$e->getResponse()) {
225
+ throw $e;
226
+ }
227
+ }
228
+ }
229
+ }
230
+
231
+ /**
232
+ * Throw a too many redirects exception for a request
233
+ *
234
+ * @param RequestInterface $original Request
235
+ * @param int $max Max allowed redirects
236
+ *
237
+ * @throws TooManyRedirectsException when too many redirects have been issued
238
+ */
239
+ protected function throwTooManyRedirectsException(RequestInterface $original, $max)
240
+ {
241
+ $original->getEventDispatcher()->addListener(
242
+ 'request.complete',
243
+ $func = function ($e) use (&$func, $original, $max) {
244
+ $original->getEventDispatcher()->removeListener('request.complete', $func);
245
+ $str = "{$max} redirects were issued for this request:\n" . $e['request']->getRawHeaders();
246
+ throw new TooManyRedirectsException($str);
247
+ }
248
+ );
249
+ }
250
+ }
vendor/sendgrid-php/vendor/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem ADDED
@@ -0,0 +1,3870 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##
2
+ ## Bundle of CA Root Certificates
3
+ ##
4
+ ## Certificate data from Mozilla downloaded on: Wed Aug 13 21:49:32 2014
5
+ ##
6
+ ## This is a bundle of X.509 certificates of public Certificate Authorities
7
+ ## (CA). These were automatically extracted from Mozilla's root certificates
8
+ ## file (certdata.txt). This file can be found in the mozilla source tree:
9
+ ## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
10
+ ##
11
+ ## It contains the certificates in PEM format and therefore
12
+ ## can be directly used with curl / libcurl / php_curl, or with
13
+ ## an Apache+mod_ssl webserver for SSL client authentication.
14
+ ## Just configure this file as the SSLCACertificateFile.
15
+ ##
16
+ ## Conversion done with mk-ca-bundle.pl verison 1.22.
17
+ ## SHA1: bf2c15b3019e696660321d2227d942936dc50aa7
18
+ ##
19
+
20
+
21
+ GTE CyberTrust Global Root
22
+ ==========================
23
+ -----BEGIN CERTIFICATE-----
24
+ MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
25
+ Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
26
+ A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
27
+ MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
28
+ Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
29
+ IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
30
+ sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
31
+ HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
32
+ AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
33
+ M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
34
+ NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
35
+ -----END CERTIFICATE-----
36
+
37
+ Thawte Server CA
38
+ ================
39
+ -----BEGIN CERTIFICATE-----
40
+ MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
41
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
42
+ dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
43
+ AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
44
+ b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
45
+ BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
46
+ c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
47
+ A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
48
+ ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
49
+ /Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
50
+ 1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
51
+ MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
52
+ GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
53
+ GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
54
+ -----END CERTIFICATE-----
55
+
56
+ Thawte Premium Server CA
57
+ ========================
58
+ -----BEGIN CERTIFICATE-----
59
+ MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
60
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
61
+ dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
62
+ AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
63
+ ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
64
+ AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
65
+ VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
66
+ aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
67
+ cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
68
+ aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
69
+ Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
70
+ qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
71
+ SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
72
+ 8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
73
+ UCemDaYj+bvLpgcUQg==
74
+ -----END CERTIFICATE-----
75
+
76
+ Equifax Secure CA
77
+ =================
78
+ -----BEGIN CERTIFICATE-----
79
+ MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
80
+ ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
81
+ MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
82
+ B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
83
+ nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
84
+ fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
85
+ 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
86
+ A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
87
+ CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
88
+ A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
89
+ spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
90
+ Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
91
+ zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
92
+ BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
93
+ 70+sB3c4
94
+ -----END CERTIFICATE-----
95
+
96
+ Verisign Class 3 Public Primary Certification Authority
97
+ =======================================================
98
+ -----BEGIN CERTIFICATE-----
99
+ MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
100
+ FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
101
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
102
+ XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
103
+ IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
104
+ A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
105
+ f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
106
+ hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
107
+ TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
108
+ WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
109
+ Tqj/ZA1k
110
+ -----END CERTIFICATE-----
111
+
112
+ Verisign Class 3 Public Primary Certification Authority - G2
113
+ ============================================================
114
+ -----BEGIN CERTIFICATE-----
115
+ MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
116
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
117
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
118
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
119
+ dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
120
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
121
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
122
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
123
+ dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
124
+ FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
125
+ lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
126
+ MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
127
+ 1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
128
+ Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
129
+ -----END CERTIFICATE-----
130
+
131
+ GlobalSign Root CA
132
+ ==================
133
+ -----BEGIN CERTIFICATE-----
134
+ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
135
+ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
136
+ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
137
+ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
138
+ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
139
+ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
140
+ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
141
+ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
142
+ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
143
+ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
144
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
145
+ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
146
+ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
147
+ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
148
+ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
149
+ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
150
+ -----END CERTIFICATE-----
151
+
152
+ GlobalSign Root CA - R2
153
+ =======================
154
+ -----BEGIN CERTIFICATE-----
155
+ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
156
+ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
157
+ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
158
+ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
159
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
160
+ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
161
+ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
162
+ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
163
+ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
164
+ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
165
+ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
166
+ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
167
+ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
168
+ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
169
+ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
170
+ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
171
+ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
172
+ -----END CERTIFICATE-----
173
+
174
+ ValiCert Class 1 VA
175
+ ===================
176
+ -----BEGIN CERTIFICATE-----
177
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
178
+ b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
179
+ YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
180
+ bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
181
+ MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
182
+ d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
183
+ UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
184
+ LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
185
+ A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
186
+ GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
187
+ DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
188
+ lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
189
+ icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
190
+ Orf1LXLI
191
+ -----END CERTIFICATE-----
192
+
193
+ ValiCert Class 2 VA
194
+ ===================
195
+ -----BEGIN CERTIFICATE-----
196
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
197
+ b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
198
+ YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
199
+ bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
200
+ MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
201
+ d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
202
+ UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
203
+ LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
204
+ A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
205
+ CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
206
+ ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
207
+ SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
208
+ UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
209
+ W9ViH0Pd
210
+ -----END CERTIFICATE-----
211
+
212
+ RSA Root Certificate 1
213
+ ======================
214
+ -----BEGIN CERTIFICATE-----
215
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
216
+ b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
217
+ YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
218
+ bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
219
+ MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
220
+ d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
221
+ UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
222
+ LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
223
+ A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
224
+ 3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
225
+ BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
226
+ 3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
227
+ V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
228
+ on+jjBXu
229
+ -----END CERTIFICATE-----
230
+
231
+ Verisign Class 3 Public Primary Certification Authority - G3
232
+ ============================================================
233
+ -----BEGIN CERTIFICATE-----
234
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
235
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
236
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
237
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
238
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
239
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
240
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
241
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
242
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
243
+ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
244
+ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
245
+ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
246
+ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
247
+ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
248
+ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
249
+ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
250
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
251
+ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
252
+ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
253
+ -----END CERTIFICATE-----
254
+
255
+ Verisign Class 4 Public Primary Certification Authority - G3
256
+ ============================================================
257
+ -----BEGIN CERTIFICATE-----
258
+ MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
259
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
260
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
261
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
262
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
263
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
264
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
265
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
266
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
267
+ ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
268
+ tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
269
+ 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
270
+ Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
271
+ Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
272
+ j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
273
+ mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
274
+ fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
275
+ RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
276
+ UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
277
+ -----END CERTIFICATE-----
278
+
279
+ Entrust.net Secure Server CA
280
+ ============================
281
+ -----BEGIN CERTIFICATE-----
282
+ MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
283
+ BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
284
+ cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
285
+ ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
286
+ cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
287
+ A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
288
+ eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
289
+ dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
290
+ aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
291
+ aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
292
+ gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
293
+ ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
294
+ CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
295
+ dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
296
+ bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
297
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
298
+ dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
299
+ NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
300
+ HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
301
+ BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
302
+ Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
303
+ n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
304
+ -----END CERTIFICATE-----
305
+
306
+ Entrust.net Premium 2048 Secure Server CA
307
+ =========================================
308
+ -----BEGIN CERTIFICATE-----
309
+ MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
310
+ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
311
+ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
312
+ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
313
+ NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
314
+ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
315
+ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
316
+ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
317
+ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
318
+ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
319
+ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
320
+ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
321
+ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
322
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
323
+ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
324
+ T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
325
+ zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
326
+ J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
327
+ nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
328
+ -----END CERTIFICATE-----
329
+
330
+ Baltimore CyberTrust Root
331
+ =========================
332
+ -----BEGIN CERTIFICATE-----
333
+ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
334
+ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
335
+ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
336
+ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
337
+ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
338
+ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
339
+ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
340
+ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
341
+ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
342
+ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
343
+ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
344
+ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
345
+ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
346
+ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
347
+ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
348
+ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
349
+ -----END CERTIFICATE-----
350
+
351
+ Equifax Secure Global eBusiness CA
352
+ ==================================
353
+ -----BEGIN CERTIFICATE-----
354
+ MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
355
+ RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
356
+ bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
357
+ HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
358
+ b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
359
+ PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
360
+ qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
361
+ hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
362
+ BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
363
+ MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
364
+ I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
365
+ NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
366
+ -----END CERTIFICATE-----
367
+
368
+ Equifax Secure eBusiness CA 1
369
+ =============================
370
+ -----BEGIN CERTIFICATE-----
371
+ MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
372
+ RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
373
+ LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
374
+ ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
375
+ IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
376
+ 1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
377
+ IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
378
+ MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
379
+ Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
380
+ AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
381
+ lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
382
+ KpYrtWKmpj29f5JZzVoqgrI3eQ==
383
+ -----END CERTIFICATE-----
384
+
385
+ AddTrust Low-Value Services Root
386
+ ================================
387
+ -----BEGIN CERTIFICATE-----
388
+ MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
389
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
390
+ cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
391
+ CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
392
+ ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
393
+ AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
394
+ 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
395
+ oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
396
+ Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
397
+ GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
398
+ HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
399
+ AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
400
+ RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
401
+ HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
402
+ ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
403
+ iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
404
+ eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
405
+ mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
406
+ ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
407
+ -----END CERTIFICATE-----
408
+
409
+ AddTrust External Root
410
+ ======================
411
+ -----BEGIN CERTIFICATE-----
412
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
413
+ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
414
+ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
415
+ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
416
+ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
417
+ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
418
+ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
419
+ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
420
+ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
421
+ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
422
+ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
423
+ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
424
+ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
425
+ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
426
+ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
427
+ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
428
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
429
+ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
430
+ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
431
+ -----END CERTIFICATE-----
432
+
433
+ AddTrust Public Services Root
434
+ =============================
435
+ -----BEGIN CERTIFICATE-----
436
+ MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
437
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
438
+ cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
439
+ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
440
+ dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
441
+ AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
442
+ nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
443
+ d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
444
+ Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
445
+ HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
446
+ A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
447
+ /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
448
+ FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
449
+ A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
450
+ JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
451
+ +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
452
+ GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
453
+ Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
454
+ EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
455
+ -----END CERTIFICATE-----
456
+
457
+ AddTrust Qualified Certificates Root
458
+ ====================================
459
+ -----BEGIN CERTIFICATE-----
460
+ MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
461
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
462
+ cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
463
+ CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
464
+ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
465
+ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
466
+ 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
467
+ KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
468
+ L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
469
+ wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
470
+ MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
471
+ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
472
+ BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
473
+ azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
474
+ ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
475
+ GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
476
+ dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
477
+ RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
478
+ iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
479
+ -----END CERTIFICATE-----
480
+
481
+ Entrust Root Certification Authority
482
+ ====================================
483
+ -----BEGIN CERTIFICATE-----
484
+ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
485
+ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
486
+ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
487
+ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
488
+ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
489
+ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
490
+ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
491
+ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
492
+ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
493
+ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
494
+ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
495
+ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
496
+ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
497
+ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
498
+ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
499
+ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
500
+ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
501
+ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
502
+ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
503
+ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
504
+ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
505
+ -----END CERTIFICATE-----
506
+
507
+ RSA Security 2048 v3
508
+ ====================
509
+ -----BEGIN CERTIFICATE-----
510
+ MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
511
+ ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
512
+ MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
513
+ BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
514
+ AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
515
+ Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
516
+ WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
517
+ KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
518
+ +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
519
+ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
520
+ FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
521
+ v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
522
+ 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
523
+ VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
524
+ nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
525
+ pKnXwiJPZ9d37CAFYd4=
526
+ -----END CERTIFICATE-----
527
+
528
+ GeoTrust Global CA
529
+ ==================
530
+ -----BEGIN CERTIFICATE-----
531
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
532
+ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
533
+ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
534
+ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
535
+ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
536
+ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
537
+ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
538
+ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
539
+ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
540
+ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
541
+ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
542
+ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
543
+ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
544
+ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
545
+ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
546
+ Mw==
547
+ -----END CERTIFICATE-----
548
+
549
+ GeoTrust Global CA 2
550
+ ====================
551
+ -----BEGIN CERTIFICATE-----
552
+ MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
553
+ R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
554
+ MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
555
+ LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
556
+ ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
557
+ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
558
+ LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
559
+ Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
560
+ HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
561
+ MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
562
+ K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
563
+ srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
564
+ ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
565
+ OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
566
+ x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
567
+ H4z1Ir+rzoPz4iIprn2DQKi6bA==
568
+ -----END CERTIFICATE-----
569
+
570
+ GeoTrust Universal CA
571
+ =====================
572
+ -----BEGIN CERTIFICATE-----
573
+ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
574
+ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
575
+ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
576
+ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
577
+ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
578
+ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
579
+ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
580
+ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
581
+ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
582
+ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
583
+ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
584
+ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
585
+ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
586
+ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
587
+ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
588
+ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
589
+ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
590
+ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
591
+ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
592
+ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
593
+ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
594
+ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
595
+ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
596
+ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
597
+ P/rmMuGNG2+k5o7Y+SlIis5z/iw=
598
+ -----END CERTIFICATE-----
599
+
600
+ GeoTrust Universal CA 2
601
+ =======================
602
+ -----BEGIN CERTIFICATE-----
603
+ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
604
+ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
605
+ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
606
+ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
607
+ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
608
+ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
609
+ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
610
+ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
611
+ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
612
+ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
613
+ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
614
+ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
615
+ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
616
+ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
617
+ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
618
+ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
619
+ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
620
+ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
621
+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
622
+ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
623
+ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
624
+ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
625
+ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
626
+ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
627
+ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
628
+ -----END CERTIFICATE-----
629
+
630
+ America Online Root Certification Authority 1
631
+ =============================================
632
+ -----BEGIN CERTIFICATE-----
633
+ MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
634
+ QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
635
+ Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
636
+ A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
637
+ T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
638
+ ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
639
+ v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
640
+ DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
641
+ sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
642
+ 8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
643
+ AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
644
+ o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
645
+ GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
646
+ VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
647
+ 3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
648
+ Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
649
+ sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
650
+ -----END CERTIFICATE-----
651
+
652
+ America Online Root Certification Authority 2
653
+ =============================================
654
+ -----BEGIN CERTIFICATE-----
655
+ MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
656
+ QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
657
+ Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
658
+ A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
659
+ T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
660
+ ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
661
+ fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
662
+ f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
663
+ qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
664
+ RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
665
+ gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
666
+ 6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
667
+ FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
668
+ Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
669
+ B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
670
+ aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
671
+ AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
672
+ T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
673
+ +DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
674
+ JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
675
+ zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
676
+ ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
677
+ 1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
678
+ GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
679
+ Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
680
+ cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
681
+ -----END CERTIFICATE-----
682
+
683
+ Visa eCommerce Root
684
+ ===================
685
+ -----BEGIN CERTIFICATE-----
686
+ MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
687
+ EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
688
+ QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
689
+ WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
690
+ VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
691
+ bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
692
+ F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
693
+ RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
694
+ TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
695
+ /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
696
+ GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
697
+ MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
698
+ CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
699
+ YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
700
+ zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
701
+ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
702
+ 398znM/jra6O1I7mT1GvFpLgXPYHDw==
703
+ -----END CERTIFICATE-----
704
+
705
+ Certum Root CA
706
+ ==============
707
+ -----BEGIN CERTIFICATE-----
708
+ MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
709
+ ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
710
+ Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
711
+ by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
712
+ wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
713
+ kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
714
+ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
715
+ Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
716
+ NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
717
+ hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
718
+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
719
+ GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
720
+ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
721
+ qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
722
+ -----END CERTIFICATE-----
723
+
724
+ Comodo AAA Services root
725
+ ========================
726
+ -----BEGIN CERTIFICATE-----
727
+ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
728
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
729
+ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
730
+ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
731
+ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
732
+ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
733
+ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
734
+ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
735
+ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
736
+ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
737
+ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
738
+ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
739
+ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
740
+ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
741
+ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
742
+ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
743
+ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
744
+ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
745
+ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
746
+ -----END CERTIFICATE-----
747
+
748
+ Comodo Secure Services root
749
+ ===========================
750
+ -----BEGIN CERTIFICATE-----
751
+ MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
752
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
753
+ TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
754
+ MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
755
+ Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
756
+ BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
757
+ ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
758
+ 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
759
+ rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
760
+ oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
761
+ p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
762
+ FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
763
+ gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
764
+ YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
765
+ aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
766
+ 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
767
+ Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
768
+ DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
769
+ pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
770
+ RR3B7Hzs/Sk=
771
+ -----END CERTIFICATE-----
772
+
773
+ Comodo Trusted Services root
774
+ ============================
775
+ -----BEGIN CERTIFICATE-----
776
+ MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
777
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
778
+ TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
779
+ MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
780
+ bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
781
+ IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
782
+ AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
783
+ 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
784
+ /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
785
+ juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
786
+ ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
787
+ DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
788
+ /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
789
+ ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
790
+ cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
791
+ uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
792
+ pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
793
+ BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
794
+ R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
795
+ 9y5Xt5hwXsjEeLBi
796
+ -----END CERTIFICATE-----
797
+
798
+ QuoVadis Root CA
799
+ ================
800
+ -----BEGIN CERTIFICATE-----
801
+ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
802
+ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
803
+ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
804
+ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
805
+ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
806
+ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
807
+ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
808
+ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
809
+ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
810
+ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
811
+ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
812
+ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
813
+ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
814
+ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
815
+ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
816
+ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
817
+ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
818
+ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
819
+ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
820
+ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
821
+ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
822
+ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
823
+ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
824
+ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
825
+ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
826
+ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
827
+ 5nrQNiOKSnQ2+Q==
828
+ -----END CERTIFICATE-----
829
+
830
+ QuoVadis Root CA 2
831
+ ==================
832
+ -----BEGIN CERTIFICATE-----
833
+ MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
834
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
835
+ ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
836
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
837
+ DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
838
+ XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
839
+ lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
840
+ lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
841
+ lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
842
+ 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
843
+ wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
844
+ D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
845
+ BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
846
+ J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
847
+ DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
848
+ a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
849
+ ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
850
+ Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
851
+ UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
852
+ VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
853
+ +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
854
+ IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
855
+ WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
856
+ f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
857
+ 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
858
+ VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
859
+ -----END CERTIFICATE-----
860
+
861
+ QuoVadis Root CA 3
862
+ ==================
863
+ -----BEGIN CERTIFICATE-----
864
+ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
865
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
866
+ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
867
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
868
+ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
869
+ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
870
+ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
871
+ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
872
+ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
873
+ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
874
+ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
875
+ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
876
+ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
877
+ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
878
+ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
879
+ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
880
+ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
881
+ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
882
+ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
883
+ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
884
+ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
885
+ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
886
+ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
887
+ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
888
+ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
889
+ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
890
+ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
891
+ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
892
+ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
893
+ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
894
+ -----END CERTIFICATE-----
895
+
896
+ Security Communication Root CA
897
+ ==============================
898
+ -----BEGIN CERTIFICATE-----
899
+ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
900
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
901
+ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
902
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
903
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
904
+ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
905
+ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
906
+ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
907
+ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
908
+ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
909
+ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
910
+ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
911
+ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
912
+ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
913
+ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
914
+ FL39vmwLAw==
915
+ -----END CERTIFICATE-----
916
+
917
+ Sonera Class 2 Root CA
918
+ ======================
919
+ -----BEGIN CERTIFICATE-----
920
+ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
921
+ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
922
+ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
923
+ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
924
+ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
925
+ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
926
+ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
927
+ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
928
+ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
929
+ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
930
+ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
931
+ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
932
+ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
933
+ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
934
+ llpwrN9M
935
+ -----END CERTIFICATE-----
936
+
937
+ Staat der Nederlanden Root CA
938
+ =============================
939
+ -----BEGIN CERTIFICATE-----
940
+ MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
941
+ ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
942
+ Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
943
+ HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
944
+ bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
945
+ vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
946
+ jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
947
+ C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
948
+ vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
949
+ 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
950
+ HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
951
+ dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
952
+ BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
953
+ EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
954
+ MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
955
+ nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
956
+ iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
957
+ -----END CERTIFICATE-----
958
+
959
+ TDC Internet Root CA
960
+ ====================
961
+ -----BEGIN CERTIFICATE-----
962
+ MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
963
+ ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
964
+ NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
965
+ ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
966
+ MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
967
+ xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
968
+ znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
969
+ 5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
970
+ otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
971
+ AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
972
+ VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
973
+ MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
974
+ AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
975
+ UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
976
+ CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
977
+ gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
978
+ 2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
979
+ O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
980
+ Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
981
+ -----END CERTIFICATE-----
982
+
983
+ UTN DATACorp SGC Root CA
984
+ ========================
985
+ -----BEGIN CERTIFICATE-----
986
+ MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
987
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
988
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
989
+ BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
990
+ MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
991
+ HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
992
+ dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
993
+ AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
994
+ raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
995
+ wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
996
+ 9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
997
+ 33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
998
+ DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
999
+ BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
1000
+ LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
1001
+ DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
1002
+ Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
1003
+ I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
1004
+ EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
1005
+ DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
1006
+ -----END CERTIFICATE-----
1007
+
1008
+ UTN USERFirst Hardware Root CA
1009
+ ==============================
1010
+ -----BEGIN CERTIFICATE-----
1011
+ MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
1012
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
1013
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
1014
+ BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
1015
+ OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
1016
+ eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
1017
+ ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
1018
+ DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
1019
+ wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
1020
+ tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
1021
+ i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
1022
+ Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
1023
+ gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
1024
+ lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
1025
+ UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
1026
+ BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
1027
+ //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
1028
+ XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
1029
+ lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
1030
+ iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
1031
+ nfhmqA==
1032
+ -----END CERTIFICATE-----
1033
+
1034
+ Camerfirma Chambers of Commerce Root
1035
+ ====================================
1036
+ -----BEGIN CERTIFICATE-----
1037
+ MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
1038
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
1039
+ ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
1040
+ NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
1041
+ cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
1042
+ MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
1043
+ AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
1044
+ xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
1045
+ NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
1046
+ DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
1047
+ d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
1048
+ EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
1049
+ cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
1050
+ AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
1051
+ bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
1052
+ VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
1053
+ aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
1054
+ fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
1055
+ L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
1056
+ UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
1057
+ ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
1058
+ erfutGWaIZDgqtCYvDi1czyL+Nw=
1059
+ -----END CERTIFICATE-----
1060
+
1061
+ Camerfirma Global Chambersign Root
1062
+ ==================================
1063
+ -----BEGIN CERTIFICATE-----
1064
+ MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
1065
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
1066
+ ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
1067
+ NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
1068
+ YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
1069
+ MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
1070
+ ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
1071
+ 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
1072
+ by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
1073
+ 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
1074
+ 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
1075
+ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
1076
+ aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
1077
+ Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
1078
+ aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
1079
+ ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
1080
+ bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
1081
+ PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
1082
+ gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
1083
+ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
1084
+ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
1085
+ t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
1086
+ -----END CERTIFICATE-----
1087
+
1088
+ NetLock Notary (Class A) Root
1089
+ =============================
1090
+ -----BEGIN CERTIFICATE-----
1091
+ MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
1092
+ EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
1093
+ dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
1094
+ ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
1095
+ DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
1096
+ EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
1097
+ VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
1098
+ cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
1099
+ D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
1100
+ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
1101
+ /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
1102
+ tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
1103
+ 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
1104
+ A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
1105
+ Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
1106
+ bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
1107
+ IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
1108
+ LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
1109
+ ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
1110
+ IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
1111
+ IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
1112
+ b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
1113
+ bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
1114
+ Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
1115
+ bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
1116
+ ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
1117
+ ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
1118
+ CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
1119
+ KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
1120
+ 8CgHrTwXZoi1/baI
1121
+ -----END CERTIFICATE-----
1122
+
1123
+ NetLock Business (Class B) Root
1124
+ ===============================
1125
+ -----BEGIN CERTIFICATE-----
1126
+ MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
1127
+ CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
1128
+ BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
1129
+ VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
1130
+ VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
1131
+ bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
1132
+ VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
1133
+ iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
1134
+ o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
1135
+ 1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
1136
+ HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
1137
+ RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
1138
+ dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
1139
+ ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
1140
+ c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
1141
+ YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
1142
+ c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
1143
+ Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
1144
+ bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
1145
+ IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
1146
+ YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
1147
+ cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
1148
+ 43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
1149
+ stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
1150
+ -----END CERTIFICATE-----
1151
+
1152
+ NetLock Express (Class C) Root
1153
+ ==============================
1154
+ -----BEGIN CERTIFICATE-----
1155
+ MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
1156
+ CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
1157
+ BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
1158
+ KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
1159
+ BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
1160
+ dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
1161
+ ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
1162
+ jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
1163
+ W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
1164
+ euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
1165
+ DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
1166
+ RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
1167
+ YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
1168
+ IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
1169
+ aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
1170
+ ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
1171
+ ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
1172
+ dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
1173
+ emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
1174
+ IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
1175
+ UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
1176
+ YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
1177
+ xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
1178
+ gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
1179
+ -----END CERTIFICATE-----
1180
+
1181
+ XRamp Global CA Root
1182
+ ====================
1183
+ -----BEGIN CERTIFICATE-----
1184
+ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
1185
+ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
1186
+ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
1187
+ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
1188
+ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
1189
+ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
1190
+ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
1191
+ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
1192
+ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
1193
+ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
1194
+ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
1195
+ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
1196
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
1197
+ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
1198
+ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
1199
+ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
1200
+ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
1201
+ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
1202
+ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
1203
+ -----END CERTIFICATE-----
1204
+
1205
+ Go Daddy Class 2 CA
1206
+ ===================
1207
+ -----BEGIN CERTIFICATE-----
1208
+ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
1209
+ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
1210
+ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
1211
+ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
1212
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
1213
+ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
1214
+ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
1215
+ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
1216
+ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
1217
+ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
1218
+ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
1219
+ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
1220
+ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
1221
+ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
1222
+ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
1223
+ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
1224
+ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
1225
+ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
1226
+ vZ8=
1227
+ -----END CERTIFICATE-----
1228
+
1229
+ Starfield Class 2 CA
1230
+ ====================
1231
+ -----BEGIN CERTIFICATE-----
1232
+ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
1233
+ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
1234
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
1235
+ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
1236
+ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
1237
+ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
1238
+ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
1239
+ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
1240
+ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
1241
+ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
1242
+ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
1243
+ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
1244
+ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
1245
+ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
1246
+ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
1247
+ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
1248
+ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
1249
+ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
1250
+ QBFGmh95DmK/D5fs4C8fF5Q=
1251
+ -----END CERTIFICATE-----
1252
+
1253
+ StartCom Certification Authority
1254
+ ================================
1255
+ -----BEGIN CERTIFICATE-----
1256
+ MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
1257
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
1258
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
1259
+ NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
1260
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
1261
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
1262
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
1263
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
1264
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
1265
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
1266
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
1267
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
1268
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
1269
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
1270
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
1271
+ 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
1272
+ FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
1273
+ Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
1274
+ YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
1275
+ AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
1276
+ Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
1277
+ U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
1278
+ LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
1279
+ cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
1280
+ cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
1281
+ dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
1282
+ AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
1283
+ 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
1284
+ vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
1285
+ fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
1286
+ fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
1287
+ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
1288
+ yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
1289
+ 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
1290
+ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
1291
+ g14=
1292
+ -----END CERTIFICATE-----
1293
+
1294
+ Taiwan GRCA
1295
+ ===========
1296
+ -----BEGIN CERTIFICATE-----
1297
+ MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
1298
+ EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
1299
+ DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
1300
+ dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
1301
+ ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
1302
+ w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
1303
+ BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
1304
+ 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
1305
+ htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
1306
+ J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
1307
+ Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
1308
+ B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
1309
+ O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
1310
+ lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
1311
+ HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
1312
+ 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
1313
+ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
1314
+ Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
1315
+ Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
1316
+ D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
1317
+ DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
1318
+ Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
1319
+ 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
1320
+ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
1321
+ +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
1322
+ -----END CERTIFICATE-----
1323
+
1324
+ Swisscom Root CA 1
1325
+ ==================
1326
+ -----BEGIN CERTIFICATE-----
1327
+ MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
1328
+ EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
1329
+ dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
1330
+ MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
1331
+ aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
1332
+ IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
1333
+ MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
1334
+ NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
1335
+ AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
1336
+ b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
1337
+ 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
1338
+ cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
1339
+ WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
1340
+ haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
1341
+ MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
1342
+ HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
1343
+ BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
1344
+ MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
1345
+ jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
1346
+ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
1347
+ VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
1348
+ vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
1349
+ OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
1350
+ 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
1351
+ nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
1352
+ x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
1353
+ NY6E0F/6MBr1mmz0DlP5OlvRHA==
1354
+ -----END CERTIFICATE-----
1355
+
1356
+ DigiCert Assured ID Root CA
1357
+ ===========================
1358
+ -----BEGIN CERTIFICATE-----
1359
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
1360
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
1361
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
1362
+ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
1363
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
1364
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
1365
+ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
1366
+ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
1367
+ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
1368
+ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
1369
+ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
1370
+ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
1371
+ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
1372
+ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
1373
+ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
1374
+ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
1375
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
1376
+ -----END CERTIFICATE-----
1377
+
1378
+ DigiCert Global Root CA
1379
+ =======================
1380
+ -----BEGIN CERTIFICATE-----
1381
+ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
1382
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
1383
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
1384
+ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
1385
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
1386
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
1387
+ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
1388
+ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
1389
+ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
1390
+ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
1391
+ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
1392
+ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
1393
+ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
1394
+ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
1395
+ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
1396
+ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
1397
+ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
1398
+ -----END CERTIFICATE-----
1399
+
1400
+ DigiCert High Assurance EV Root CA
1401
+ ==================================
1402
+ -----BEGIN CERTIFICATE-----
1403
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
1404
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
1405
+ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
1406
+ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
1407
+ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
1408
+ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
1409
+ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
1410
+ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
1411
+ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
1412
+ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
1413
+ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
1414
+ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
1415
+ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
1416
+ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
1417
+ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
1418
+ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
1419
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
1420
+ -----END CERTIFICATE-----
1421
+
1422
+ Certplus Class 2 Primary CA
1423
+ ===========================
1424
+ -----BEGIN CERTIFICATE-----
1425
+ MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
1426
+ BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
1427
+ OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
1428
+ dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
1429
+ ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
1430
+ 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
1431
+ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
1432
+ YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
1433
+ e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
1434
+ CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
1435
+ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
1436
+ L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
1437
+ P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
1438
+ TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
1439
+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
1440
+ //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
1441
+ l7+ijrRU
1442
+ -----END CERTIFICATE-----
1443
+
1444
+ DST Root CA X3
1445
+ ==============
1446
+ -----BEGIN CERTIFICATE-----
1447
+ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
1448
+ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
1449
+ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
1450
+ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
1451
+ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
1452
+ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
1453
+ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
1454
+ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
1455
+ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
1456
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
1457
+ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
1458
+ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
1459
+ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
1460
+ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
1461
+ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
1462
+ -----END CERTIFICATE-----
1463
+
1464
+ DST ACES CA X6
1465
+ ==============
1466
+ -----BEGIN CERTIFICATE-----
1467
+ MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
1468
+ EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
1469
+ MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
1470
+ MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
1471
+ CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
1472
+ AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
1473
+ DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
1474
+ pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
1475
+ GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
1476
+ MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
1477
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
1478
+ Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
1479
+ dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
1480
+ CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
1481
+ 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
1482
+ Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
1483
+ nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
1484
+ vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
1485
+ oKfN5XozNmr6mis=
1486
+ -----END CERTIFICATE-----
1487
+
1488
+ TURKTRUST Certificate Services Provider Root 1
1489
+ ==============================================
1490
+ -----BEGIN CERTIFICATE-----
1491
+ MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
1492
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
1493
+ MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
1494
+ acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
1495
+ MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
1496
+ U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
1497
+ TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
1498
+ aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
1499
+ AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
1500
+ yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
1501
+ Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
1502
+ 8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
1503
+ W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
1504
+ BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
1505
+ sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
1506
+ q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
1507
+ B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
1508
+ nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
1509
+ -----END CERTIFICATE-----
1510
+
1511
+ TURKTRUST Certificate Services Provider Root 2
1512
+ ==============================================
1513
+ -----BEGIN CERTIFICATE-----
1514
+ MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
1515
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
1516
+ MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
1517
+ QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
1518
+ MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
1519
+ dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
1520
+ A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
1521
+ acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
1522
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
1523
+ LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
1524
+ x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
1525
+ QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
1526
+ 5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
1527
+ AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
1528
+ A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
1529
+ Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
1530
+ Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
1531
+ hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
1532
+ 9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
1533
+ UrbnBEI=
1534
+ -----END CERTIFICATE-----
1535
+
1536
+ SwissSign Gold CA - G2
1537
+ ======================
1538
+ -----BEGIN CERTIFICATE-----
1539
+ MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
1540
+ EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
1541
+ MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
1542
+ c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
1543
+ AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
1544
+ t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
1545
+ jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
1546
+ vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
1547
+ ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
1548
+ AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
1549
+ jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
1550
+ peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
1551
+ 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
1552
+ GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
1553
+ AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
1554
+ OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
1555
+ L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
1556
+ 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
1557
+ 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
1558
+ Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
1559
+ Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
1560
+ mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
1561
+ vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
1562
+ KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
1563
+ NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
1564
+ viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
1565
+ -----END CERTIFICATE-----
1566
+
1567
+ SwissSign Silver CA - G2
1568
+ ========================
1569
+ -----BEGIN CERTIFICATE-----
1570
+ MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
1571
+ BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
1572
+ DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
1573
+ aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
1574
+ 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
1575
+ N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
1576
+ +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
1577
+ 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
1578
+ MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
1579
+ qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
1580
+ FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
1581
+ ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
1582
+ celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
1583
+ CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
1584
+ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
1585
+ tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
1586
+ cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
1587
+ 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
1588
+ kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
1589
+ 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
1590
+ /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
1591
+ DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
1592
+ e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
1593
+ WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
1594
+ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
1595
+ DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
1596
+ -----END CERTIFICATE-----
1597
+
1598
+ GeoTrust Primary Certification Authority
1599
+ ========================================
1600
+ -----BEGIN CERTIFICATE-----
1601
+ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
1602
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
1603
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
1604
+ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
1605
+ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
1606
+ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
1607
+ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
1608
+ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
1609
+ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
1610
+ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
1611
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
1612
+ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
1613
+ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
1614
+ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
1615
+ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
1616
+ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
1617
+ -----END CERTIFICATE-----
1618
+
1619
+ thawte Primary Root CA
1620
+ ======================
1621
+ -----BEGIN CERTIFICATE-----
1622
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
1623
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
1624
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
1625
+ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
1626
+ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
1627
+ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
1628
+ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
1629
+ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
1630
+ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
1631
+ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
1632
+ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
1633
+ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
1634
+ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
1635
+ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
1636
+ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
1637
+ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
1638
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
1639
+ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
1640
+ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
1641
+ -----END CERTIFICATE-----
1642
+
1643
+ VeriSign Class 3 Public Primary Certification Authority - G5
1644
+ ============================================================
1645
+ -----BEGIN CERTIFICATE-----
1646
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
1647
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
1648
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
1649
+ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
1650
+ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
1651
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
1652
+ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
1653
+ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
1654
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
1655
+ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
1656
+ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
1657
+ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
1658
+ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
1659
+ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
1660
+ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
1661
+ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
1662
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
1663
+ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
1664
+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
1665
+ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
1666
+ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
1667
+ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
1668
+ -----END CERTIFICATE-----
1669
+
1670
+ SecureTrust CA
1671
+ ==============
1672
+ -----BEGIN CERTIFICATE-----
1673
+ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
1674
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
1675
+ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
1676
+ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
1677
+ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
1678
+ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
1679
+ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
1680
+ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
1681
+ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
1682
+ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
1683
+ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
1684
+ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
1685
+ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
1686
+ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
1687
+ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
1688
+ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
1689
+ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
1690
+ -----END CERTIFICATE-----
1691
+
1692
+ Secure Global CA
1693
+ ================
1694
+ -----BEGIN CERTIFICATE-----
1695
+ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
1696
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
1697
+ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
1698
+ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
1699
+ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
1700
+ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
1701
+ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
1702
+ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
1703
+ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
1704
+ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
1705
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
1706
+ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
1707
+ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
1708
+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
1709
+ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
1710
+ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
1711
+ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
1712
+ -----END CERTIFICATE-----
1713
+
1714
+ COMODO Certification Authority
1715
+ ==============================
1716
+ -----BEGIN CERTIFICATE-----
1717
+ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
1718
+ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
1719
+ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
1720
+ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
1721
+ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
1722
+ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
1723
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
1724
+ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
1725
+ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
1726
+ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
1727
+ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
1728
+ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
1729
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
1730
+ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
1731
+ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
1732
+ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
1733
+ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
1734
+ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
1735
+ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
1736
+ -----END CERTIFICATE-----
1737
+
1738
+ Network Solutions Certificate Authority
1739
+ =======================================
1740
+ -----BEGIN CERTIFICATE-----
1741
+ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
1742
+ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
1743
+ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
1744
+ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
1745
+ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
1746
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
1747
+ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
1748
+ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
1749
+ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
1750
+ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
1751
+ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
1752
+ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
1753
+ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
1754
+ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
1755
+ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
1756
+ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
1757
+ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
1758
+ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
1759
+ -----END CERTIFICATE-----
1760
+
1761
+ WellsSecure Public Root Certificate Authority
1762
+ =============================================
1763
+ -----BEGIN CERTIFICATE-----
1764
+ MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
1765
+ F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
1766
+ NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
1767
+ MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
1768
+ bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
1769
+ VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
1770
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
1771
+ iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
1772
+ i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
1773
+ bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
1774
+ K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
1775
+ AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
1776
+ cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
1777
+ lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
1778
+ i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
1779
+ GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
1780
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
1781
+ K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
1782
+ bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
1783
+ qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
1784
+ E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
1785
+ tylv2G0xffX8oRAHh84vWdw+WNs=
1786
+ -----END CERTIFICATE-----
1787
+
1788
+ COMODO ECC Certification Authority
1789
+ ==================================
1790
+ -----BEGIN CERTIFICATE-----
1791
+ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
1792
+ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
1793
+ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
1794
+ dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
1795
+ GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
1796
+ Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
1797
+ b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
1798
+ 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
1799
+ wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
1800
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
1801
+ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
1802
+ U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
1803
+ -----END CERTIFICATE-----
1804
+
1805
+ IGC/A
1806
+ =====
1807
+ -----BEGIN CERTIFICATE-----
1808
+ MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
1809
+ VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
1810
+ Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
1811
+ MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
1812
+ EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
1813
+ STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
1814
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
1815
+ TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
1816
+ So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
1817
+ HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
1818
+ frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
1819
+ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
1820
+ egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
1821
+ iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
1822
+ q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
1823
+ MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
1824
+ Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
1825
+ lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
1826
+ 0mBWWg==
1827
+ -----END CERTIFICATE-----
1828
+
1829
+ Security Communication EV RootCA1
1830
+ =================================
1831
+ -----BEGIN CERTIFICATE-----
1832
+ MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
1833
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
1834
+ dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
1835
+ BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
1836
+ Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1837
+ AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
1838
+ /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
1839
+ WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
1840
+ ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
1841
+ bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
1842
+ 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
1843
+ SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
1844
+ iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
1845
+ Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
1846
+ mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
1847
+ T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
1848
+ -----END CERTIFICATE-----
1849
+
1850
+ OISTE WISeKey Global Root GA CA
1851
+ ===============================
1852
+ -----BEGIN CERTIFICATE-----
1853
+ MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
1854
+ BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
1855
+ A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
1856
+ bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
1857
+ VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
1858
+ IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
1859
+ IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
1860
+ Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
1861
+ Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
1862
+ d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
1863
+ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
1864
+ LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
1865
+ AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
1866
+ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
1867
+ MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
1868
+ +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
1869
+ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
1870
+ okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
1871
+ -----END CERTIFICATE-----
1872
+
1873
+ Microsec e-Szigno Root CA
1874
+ =========================
1875
+ -----BEGIN CERTIFICATE-----
1876
+ MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
1877
+ BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
1878
+ EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
1879
+ MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
1880
+ dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
1881
+ GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
1882
+ AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
1883
+ d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
1884
+ oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
1885
+ QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
1886
+ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
1887
+ MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
1888
+ IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
1889
+ VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
1890
+ LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
1891
+ dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
1892
+ AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
1893
+ 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
1894
+ AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
1895
+ egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
1896
+ Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
1897
+ PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
1898
+ c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
1899
+ cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
1900
+ IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
1901
+ WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
1902
+ MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
1903
+ MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
1904
+ Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
1905
+ HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
1906
+ nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
1907
+ aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
1908
+ 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
1909
+ yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
1910
+ S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
1911
+ -----END CERTIFICATE-----
1912
+
1913
+ Certigna
1914
+ ========
1915
+ -----BEGIN CERTIFICATE-----
1916
+ MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
1917
+ EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
1918
+ MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
1919
+ Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
1920
+ XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
1921
+ GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
1922
+ ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
1923
+ DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
1924
+ Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
1925
+ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
1926
+ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
1927
+ SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
1928
+ hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
1929
+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
1930
+ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
1931
+ 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
1932
+ WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
1933
+ -----END CERTIFICATE-----
1934
+
1935
+ AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
1936
+ ======================================
1937
+ -----BEGIN CERTIFICATE-----
1938
+ MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
1939
+ AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
1940
+ LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
1941
+ HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
1942
+ U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
1943
+ IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
1944
+ AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
1945
+ yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
1946
+ 2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
1947
+ 4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
1948
+ 2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
1949
+ 8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
1950
+ HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
1951
+ Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
1952
+ 5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
1953
+ czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
1954
+ AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
1955
+ ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
1956
+ BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
1957
+ cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
1958
+ AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
1959
+ EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
1960
+ /zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
1961
+ MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
1962
+ 3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
1963
+ eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
1964
+ /RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
1965
+ RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
1966
+ Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
1967
+ -----END CERTIFICATE-----
1968
+
1969
+ TC TrustCenter Class 2 CA II
1970
+ ============================
1971
+ -----BEGIN CERTIFICATE-----
1972
+ MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
1973
+ REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
1974
+ IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
1975
+ MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
1976
+ c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
1977
+ AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1978
+ AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
1979
+ IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
1980
+ xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
1981
+ Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
1982
+ SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
1983
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
1984
+ 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
1985
+ Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
1986
+ cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
1987
+ SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
1988
+ TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
1989
+ dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
1990
+ KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
1991
+ TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
1992
+ JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
1993
+ vQ==
1994
+ -----END CERTIFICATE-----
1995
+
1996
+ TC TrustCenter Class 3 CA II
1997
+ ============================
1998
+ -----BEGIN CERTIFICATE-----
1999
+ MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
2000
+ REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
2001
+ IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
2002
+ MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
2003
+ c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
2004
+ AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2005
+ AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
2006
+ yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
2007
+ 6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
2008
+ uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
2009
+ 2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
2010
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
2011
+ 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
2012
+ Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
2013
+ cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
2014
+ SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
2015
+ TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
2016
+ O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
2017
+ yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
2018
+ IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
2019
+ 092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
2020
+ 5A==
2021
+ -----END CERTIFICATE-----
2022
+
2023
+ TC TrustCenter Universal CA I
2024
+ =============================
2025
+ -----BEGIN CERTIFICATE-----
2026
+ MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
2027
+ REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
2028
+ IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
2029
+ MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
2030
+ VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
2031
+ JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
2032
+ ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
2033
+ qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
2034
+ xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
2035
+ ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
2036
+ gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
2037
+ BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2038
+ AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
2039
+ 1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
2040
+ vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
2041
+ ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
2042
+ ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
2043
+ 7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
2044
+ -----END CERTIFICATE-----
2045
+
2046
+ Deutsche Telekom Root CA 2
2047
+ ==========================
2048
+ -----BEGIN CERTIFICATE-----
2049
+ MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
2050
+ RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
2051
+ A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
2052
+ MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
2053
+ A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
2054
+ b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
2055
+ bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
2056
+ KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
2057
+ AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
2058
+ Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
2059
+ jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
2060
+ HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
2061
+ E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
2062
+ zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
2063
+ rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
2064
+ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
2065
+ Cm26OWMohpLzGITY+9HPBVZkVw==
2066
+ -----END CERTIFICATE-----
2067
+
2068
+ ComSign Secured CA
2069
+ ==================
2070
+ -----BEGIN CERTIFICATE-----
2071
+ MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
2072
+ AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
2073
+ NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
2074
+ QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
2075
+ ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
2076
+ 49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
2077
+ 7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
2078
+ kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
2079
+ 9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
2080
+ AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
2081
+ U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
2082
+ j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
2083
+ AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
2084
+ BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
2085
+ FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
2086
+ 51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
2087
+ OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
2088
+ -----END CERTIFICATE-----
2089
+
2090
+ Cybertrust Global Root
2091
+ ======================
2092
+ -----BEGIN CERTIFICATE-----
2093
+ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
2094
+ ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
2095
+ MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
2096
+ ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
2097
+ +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
2098
+ 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
2099
+ AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
2100
+ 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
2101
+ 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
2102
+ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
2103
+ MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
2104
+ A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
2105
+ lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
2106
+ 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
2107
+ hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
2108
+ X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
2109
+ WL1WMRJOEcgh4LMRkWXbtKaIOM5V
2110
+ -----END CERTIFICATE-----
2111
+
2112
+ ePKI Root Certification Authority
2113
+ =================================
2114
+ -----BEGIN CERTIFICATE-----
2115
+ MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
2116
+ EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
2117
+ Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
2118
+ MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
2119
+ MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
2120
+ AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
2121
+ IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
2122
+ lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
2123
+ qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
2124
+ 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
2125
+ WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
2126
+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
2127
+ lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
2128
+ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
2129
+ Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
2130
+ MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
2131
+ ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
2132
+ 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
2133
+ KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
2134
+ xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
2135
+ NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
2136
+ GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
2137
+ xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
2138
+ gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
2139
+ sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
2140
+ BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
2141
+ -----END CERTIFICATE-----
2142
+
2143
+ 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
2144
+ =============================================================================================================================
2145
+ -----BEGIN CERTIFICATE-----
2146
+ MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
2147
+ DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
2148
+ aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
2149
+ b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
2150
+ BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
2151
+ S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
2152
+ MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
2153
+ IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
2154
+ n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
2155
+ IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
2156
+ dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
2157
+ cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
2158
+ AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
2159
+ Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
2160
+ xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
2161
+ 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
2162
+ hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
2163
+ BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
2164
+ MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
2165
+ N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
2166
+ y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
2167
+ LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
2168
+ dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
2169
+ -----END CERTIFICATE-----
2170
+
2171
+ Buypass Class 2 CA 1
2172
+ ====================
2173
+ -----BEGIN CERTIFICATE-----
2174
+ MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
2175
+ QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
2176
+ MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
2177
+ c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
2178
+ hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
2179
+ cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
2180
+ 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
2181
+ 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
2182
+ uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
2183
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
2184
+ AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
2185
+ 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
2186
+ 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
2187
+ fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
2188
+ wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
2189
+ -----END CERTIFICATE-----
2190
+
2191
+ Buypass Class 3 CA 1
2192
+ ====================
2193
+ -----BEGIN CERTIFICATE-----
2194
+ MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
2195
+ QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
2196
+ MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
2197
+ c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
2198
+ hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
2199
+ ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
2200
+ n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
2201
+ AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
2202
+ 1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
2203
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
2204
+ AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
2205
+ pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
2206
+ EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
2207
+ htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
2208
+ el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
2209
+ -----END CERTIFICATE-----
2210
+
2211
+ EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
2212
+ ==========================================================================
2213
+ -----BEGIN CERTIFICATE-----
2214
+ MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
2215
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
2216
+ QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
2217
+ Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
2218
+ ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
2219
+ IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
2220
+ SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
2221
+ X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
2222
+ gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
2223
+ eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
2224
+ TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
2225
+ Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
2226
+ uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
2227
+ qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
2228
+ ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
2229
+ Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
2230
+ /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
2231
+ Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
2232
+ FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
2233
+ zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
2234
+ XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
2235
+ bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
2236
+ RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
2237
+ 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
2238
+ 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
2239
+ Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
2240
+ AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
2241
+ -----END CERTIFICATE-----
2242
+
2243
+ certSIGN ROOT CA
2244
+ ================
2245
+ -----BEGIN CERTIFICATE-----
2246
+ MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
2247
+ VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
2248
+ Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
2249
+ CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
2250
+ JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
2251
+ rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
2252
+ ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
2253
+ 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
2254
+ AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
2255
+ Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
2256
+ AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
2257
+ SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
2258
+ x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
2259
+ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
2260
+ TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
2261
+ -----END CERTIFICATE-----
2262
+
2263
+ CNNIC ROOT
2264
+ ==========
2265
+ -----BEGIN CERTIFICATE-----
2266
+ MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
2267
+ ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
2268
+ OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
2269
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
2270
+ o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
2271
+ VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
2272
+ VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
2273
+ czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
2274
+ y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
2275
+ wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
2276
+ lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
2277
+ Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
2278
+ O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
2279
+ BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
2280
+ G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
2281
+ mxE=
2282
+ -----END CERTIFICATE-----
2283
+
2284
+ ApplicationCA - Japanese Government
2285
+ ===================================
2286
+ -----BEGIN CERTIFICATE-----
2287
+ MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
2288
+ SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
2289
+ MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
2290
+ cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
2291
+ CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
2292
+ fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
2293
+ wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
2294
+ jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
2295
+ nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
2296
+ WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
2297
+ BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
2298
+ vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
2299
+ o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
2300
+ /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
2301
+ io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
2302
+ dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
2303
+ rosot4LKGAfmt1t06SAZf7IbiVQ=
2304
+ -----END CERTIFICATE-----
2305
+
2306
+ GeoTrust Primary Certification Authority - G3
2307
+ =============================================
2308
+ -----BEGIN CERTIFICATE-----
2309
+ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
2310
+ BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
2311
+ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
2312
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
2313
+ NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
2314
+ YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
2315
+ LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
2316
+ hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
2317
+ K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
2318
+ c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
2319
+ IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
2320
+ dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
2321
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
2322
+ 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
2323
+ cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
2324
+ Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
2325
+ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
2326
+ t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
2327
+ -----END CERTIFICATE-----
2328
+
2329
+ thawte Primary Root CA - G2
2330
+ ===========================
2331
+ -----BEGIN CERTIFICATE-----
2332
+ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
2333
+ VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
2334
+ IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
2335
+ Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
2336
+ MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
2337
+ b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
2338
+ IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
2339
+ LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
2340
+ 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
2341
+ mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
2342
+ G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
2343
+ rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
2344
+ -----END CERTIFICATE-----
2345
+
2346
+ thawte Primary Root CA - G3
2347
+ ===========================
2348
+ -----BEGIN CERTIFICATE-----
2349
+ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
2350
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
2351
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
2352
+ cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
2353
+ ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
2354
+ d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
2355
+ VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
2356
+ A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
2357
+ MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
2358
+ P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
2359
+ +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
2360
+ 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
2361
+ vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
2362
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
2363
+ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
2364
+ A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
2365
+ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
2366
+ 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
2367
+ er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
2368
+ -----END CERTIFICATE-----
2369
+
2370
+ GeoTrust Primary Certification Authority - G2
2371
+ =============================================
2372
+ -----BEGIN CERTIFICATE-----
2373
+ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
2374
+ VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
2375
+ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
2376
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
2377
+ OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
2378
+ MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
2379
+ b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
2380
+ BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
2381
+ KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
2382
+ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
2383
+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
2384
+ ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
2385
+ npaqBA+K
2386
+ -----END CERTIFICATE-----
2387
+
2388
+ VeriSign Universal Root Certification Authority
2389
+ ===============================================
2390
+ -----BEGIN CERTIFICATE-----
2391
+ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
2392
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
2393
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
2394
+ IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
2395
+ IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
2396
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
2397
+ cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
2398
+ IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
2399
+ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
2400
+ 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
2401
+ MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
2402
+ 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
2403
+ AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
2404
+ tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
2405
+ CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
2406
+ a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
2407
+ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
2408
+ Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
2409
+ Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
2410
+ P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
2411
+ wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
2412
+ mJO37M2CYfE45k+XmCpajQ==
2413
+ -----END CERTIFICATE-----
2414
+
2415
+ VeriSign Class 3 Public Primary Certification Authority - G4
2416
+ ============================================================
2417
+ -----BEGIN CERTIFICATE-----
2418
+ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
2419
+ VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
2420
+ b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
2421
+ ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
2422
+ YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
2423
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
2424
+ cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
2425
+ b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
2426
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
2427
+ Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
2428
+ rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
2429
+ /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
2430
+ HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
2431
+ Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
2432
+ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
2433
+ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
2434
+ -----END CERTIFICATE-----
2435
+
2436
+ NetLock Arany (Class Gold) Főtanúsítvány
2437
+ ============================================
2438
+ -----BEGIN CERTIFICATE-----
2439
+ MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
2440
+ A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
2441
+ dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
2442
+ cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
2443
+ MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
2444
+ ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
2445
+ biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
2446
+ c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
2447
+ 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
2448
+ /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
2449
+ H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
2450
+ fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
2451
+ neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
2452
+ BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
2453
+ qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
2454
+ YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
2455
+ bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
2456
+ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
2457
+ dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
2458
+ -----END CERTIFICATE-----
2459
+
2460
+ Staat der Nederlanden Root CA - G2
2461
+ ==================================
2462
+ -----BEGIN CERTIFICATE-----
2463
+ MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
2464
+ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
2465
+ Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
2466
+ TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
2467
+ ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
2468
+ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
2469
+ vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
2470
+ CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
2471
+ e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
2472
+ OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
2473
+ CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
2474
+ 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
2475
+ trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
2476
+ qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
2477
+ AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
2478
+ ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
2479
+ HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
2480
+ A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
2481
+ +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
2482
+ f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
2483
+ kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
2484
+ CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
2485
+ URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
2486
+ CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
2487
+ oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
2488
+ IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
2489
+ 66+KAQ==
2490
+ -----END CERTIFICATE-----
2491
+
2492
+ CA Disig
2493
+ ========
2494
+ -----BEGIN CERTIFICATE-----
2495
+ MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
2496
+ QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
2497
+ MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
2498
+ bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
2499
+ DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
2500
+ GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
2501
+ Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
2502
+ hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
2503
+ ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
2504
+ gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
2505
+ AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
2506
+ aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
2507
+ ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
2508
+ BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
2509
+ WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
2510
+ mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
2511
+ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
2512
+ ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
2513
+ 4Z7CRneC9VkGjCFMhwnN5ag=
2514
+ -----END CERTIFICATE-----
2515
+
2516
+ Juur-SK
2517
+ =======
2518
+ -----BEGIN CERTIFICATE-----
2519
+ MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
2520
+ c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
2521
+ DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
2522
+ SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
2523
+ aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
2524
+ ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
2525
+ TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
2526
+ +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
2527
+ UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
2528
+ Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
2529
+ MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
2530
+ HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
2531
+ AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
2532
+ cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
2533
+ AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
2534
+ cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
2535
+ FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
2536
+ A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
2537
+ ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
2538
+ abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
2539
+ IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
2540
+ Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
2541
+ yyqcjg==
2542
+ -----END CERTIFICATE-----
2543
+
2544
+ Hongkong Post Root CA 1
2545
+ =======================
2546
+ -----BEGIN CERTIFICATE-----
2547
+ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
2548
+ DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
2549
+ NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
2550
+ IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
2551
+ AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
2552
+ ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
2553
+ auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
2554
+ qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
2555
+ V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
2556
+ HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
2557
+ h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
2558
+ l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
2559
+ IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
2560
+ T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
2561
+ c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
2562
+ -----END CERTIFICATE-----
2563
+
2564
+ SecureSign RootCA11
2565
+ ===================
2566
+ -----BEGIN CERTIFICATE-----
2567
+ MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
2568
+ SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
2569
+ b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
2570
+ KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
2571
+ cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
2572
+ TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
2573
+ wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
2574
+ g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
2575
+ O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
2576
+ bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
2577
+ t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
2578
+ OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
2579
+ bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
2580
+ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
2581
+ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
2582
+ lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
2583
+ -----END CERTIFICATE-----
2584
+
2585
+ ACEDICOM Root
2586
+ =============
2587
+ -----BEGIN CERTIFICATE-----
2588
+ MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
2589
+ T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
2590
+ MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
2591
+ A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
2592
+ AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
2593
+ WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
2594
+ YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
2595
+ MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
2596
+ m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
2597
+ HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
2598
+ xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
2599
+ 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
2600
+ 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
2601
+ TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
2602
+ 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
2603
+ 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
2604
+ bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
2605
+ aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
2606
+ eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
2607
+ zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
2608
+ ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
2609
+ KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
2610
+ nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
2611
+ I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
2612
+ MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
2613
+ tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
2614
+ -----END CERTIFICATE-----
2615
+
2616
+ Verisign Class 3 Public Primary Certification Authority
2617
+ =======================================================
2618
+ -----BEGIN CERTIFICATE-----
2619
+ MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
2620
+ FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
2621
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
2622
+ XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
2623
+ IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
2624
+ A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
2625
+ f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
2626
+ hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
2627
+ CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
2628
+ bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
2629
+ D/xwzoiQ
2630
+ -----END CERTIFICATE-----
2631
+
2632
+ Microsec e-Szigno Root CA 2009
2633
+ ==============================
2634
+ -----BEGIN CERTIFICATE-----
2635
+ MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
2636
+ MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
2637
+ c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
2638
+ dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
2639
+ BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
2640
+ U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
2641
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
2642
+ fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
2643
+ 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
2644
+ pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
2645
+ 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
2646
+ AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
2647
+ QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
2648
+ FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
2649
+ lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
2650
+ I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
2651
+ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
2652
+ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
2653
+ LXpUq3DDfSJlgnCW
2654
+ -----END CERTIFICATE-----
2655
+
2656
+ E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
2657
+ ===================================================
2658
+ -----BEGIN CERTIFICATE-----
2659
+ MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
2660
+ EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
2661
+ ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
2662
+ MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
2663
+ cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
2664
+ aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2665
+ AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
2666
+ 8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
2667
+ jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
2668
+ JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
2669
+ 9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
2670
+ AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
2671
+ SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
2672
+ F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
2673
+ D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
2674
+ Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
2675
+ fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
2676
+ -----END CERTIFICATE-----
2677
+
2678
+ GlobalSign Root CA - R3
2679
+ =======================
2680
+ -----BEGIN CERTIFICATE-----
2681
+ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
2682
+ YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
2683
+ bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
2684
+ aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
2685
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
2686
+ iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
2687
+ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
2688
+ rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
2689
+ OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
2690
+ xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
2691
+ FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
2692
+ lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
2693
+ EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
2694
+ bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
2695
+ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
2696
+ kpeDMdmztcpHWD9f
2697
+ -----END CERTIFICATE-----
2698
+
2699
+ Autoridad de Certificacion Firmaprofesional CIF A62634068
2700
+ =========================================================
2701
+ -----BEGIN CERTIFICATE-----
2702
+ MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
2703
+ BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
2704
+ MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
2705
+ QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
2706
+ NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
2707
+ Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
2708
+ B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
2709
+ 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
2710
+ ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
2711
+ plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
2712
+ MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
2713
+ LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
2714
+ bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
2715
+ vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
2716
+ EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
2717
+ DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
2718
+ cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
2719
+ bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
2720
+ ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
2721
+ 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
2722
+ R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
2723
+ T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
2724
+ Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
2725
+ osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
2726
+ crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
2727
+ saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
2728
+ KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
2729
+ 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
2730
+ -----END CERTIFICATE-----
2731
+
2732
+ Izenpe.com
2733
+ ==========
2734
+ -----BEGIN CERTIFICATE-----
2735
+ MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
2736
+ EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
2737
+ MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
2738
+ QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
2739
+ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
2740
+ ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
2741
+ +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
2742
+ PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
2743
+ OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
2744
+ F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
2745
+ 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
2746
+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
2747
+ leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
2748
+ AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
2749
+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
2750
+ NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
2751
+ MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
2752
+ BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
2753
+ Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
2754
+ kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
2755
+ hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
2756
+ g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
2757
+ aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
2758
+ nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
2759
+ ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
2760
+ Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
2761
+ WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
2762
+ -----END CERTIFICATE-----
2763
+
2764
+ Chambers of Commerce Root - 2008
2765
+ ================================
2766
+ -----BEGIN CERTIFICATE-----
2767
+ MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
2768
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
2769
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
2770
+ QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
2771
+ Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
2772
+ ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
2773
+ EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
2774
+ cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
2775
+ AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
2776
+ XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
2777
+ h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
2778
+ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
2779
+ NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
2780
+ D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
2781
+ lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
2782
+ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
2783
+ ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
2784
+ EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
2785
+ G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
2786
+ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
2787
+ bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
2788
+ bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
2789
+ CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
2790
+ AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
2791
+ wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
2792
+ 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
2793
+ RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
2794
+ M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
2795
+ YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
2796
+ 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
2797
+ zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
2798
+ nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
2799
+ OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
2800
+ -----END CERTIFICATE-----
2801
+
2802
+ Global Chambersign Root - 2008
2803
+ ==============================
2804
+ -----BEGIN CERTIFICATE-----
2805
+ MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
2806
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
2807
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
2808
+ QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
2809
+ NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
2810
+ Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
2811
+ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
2812
+ aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
2813
+ VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
2814
+ XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
2815
+ ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
2816
+ /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
2817
+ TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
2818
+ H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
2819
+ Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
2820
+ HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
2821
+ wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
2822
+ AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
2823
+ BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
2824
+ BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
2825
+ aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
2826
+ aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
2827
+ 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
2828
+ dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
2829
+ /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
2830
+ ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
2831
+ dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
2832
+ 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
2833
+ foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
2834
+ qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
2835
+ P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
2836
+ c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
2837
+ 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
2838
+ -----END CERTIFICATE-----
2839
+
2840
+ Go Daddy Root Certificate Authority - G2
2841
+ ========================================
2842
+ -----BEGIN CERTIFICATE-----
2843
+ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
2844
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
2845
+ MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
2846
+ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
2847
+ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
2848
+ A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
2849
+ hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
2850
+ 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
2851
+ +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
2852
+ fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
2853
+ NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
2854
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
2855
+ BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
2856
+ vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
2857
+ 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
2858
+ N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
2859
+ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
2860
+ -----END CERTIFICATE-----
2861
+
2862
+ Starfield Root Certificate Authority - G2
2863
+ =========================================
2864
+ -----BEGIN CERTIFICATE-----
2865
+ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
2866
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
2867
+ b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
2868
+ eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
2869
+ DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
2870
+ VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
2871
+ dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
2872
+ W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
2873
+ bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
2874
+ N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
2875
+ ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
2876
+ JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2877
+ AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
2878
+ TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
2879
+ 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
2880
+ F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
2881
+ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
2882
+ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
2883
+ -----END CERTIFICATE-----
2884
+
2885
+ Starfield Services Root Certificate Authority - G2
2886
+ ==================================================
2887
+ -----BEGIN CERTIFICATE-----
2888
+ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
2889
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
2890
+ b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
2891
+ IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
2892
+ BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
2893
+ dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
2894
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2895
+ AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
2896
+ h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
2897
+ hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
2898
+ LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
2899
+ rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
2900
+ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
2901
+ SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
2902
+ E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
2903
+ xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
2904
+ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
2905
+ YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
2906
+ -----END CERTIFICATE-----
2907
+
2908
+ AffirmTrust Commercial
2909
+ ======================
2910
+ -----BEGIN CERTIFICATE-----
2911
+ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
2912
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
2913
+ MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
2914
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
2915
+ AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
2916
+ DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
2917
+ C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
2918
+ BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
2919
+ MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
2920
+ HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2921
+ AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
2922
+ hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
2923
+ qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
2924
+ 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
2925
+ sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
2926
+ -----END CERTIFICATE-----
2927
+
2928
+ AffirmTrust Networking
2929
+ ======================
2930
+ -----BEGIN CERTIFICATE-----
2931
+ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
2932
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
2933
+ MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
2934
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
2935
+ AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
2936
+ Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
2937
+ dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
2938
+ /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
2939
+ h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
2940
+ HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2941
+ AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
2942
+ UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
2943
+ 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
2944
+ WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
2945
+ /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
2946
+ -----END CERTIFICATE-----
2947
+
2948
+ AffirmTrust Premium
2949
+ ===================
2950
+ -----BEGIN CERTIFICATE-----
2951
+ MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
2952
+ BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
2953
+ OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
2954
+ dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
2955
+ MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
2956
+ BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
2957
+ 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
2958
+ +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
2959
+ GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
2960
+ p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
2961
+ S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
2962
+ 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
2963
+ /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
2964
+ +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
2965
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
2966
+ MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
2967
+ Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
2968
+ 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
2969
+ L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
2970
+ +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
2971
+ BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
2972
+ IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
2973
+ g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
2974
+ zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
2975
+ -----END CERTIFICATE-----
2976
+
2977
+ AffirmTrust Premium ECC
2978
+ =======================
2979
+ -----BEGIN CERTIFICATE-----
2980
+ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
2981
+ BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
2982
+ MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
2983
+ cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
2984
+ IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
2985
+ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
2986
+ BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
2987
+ BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
2988
+ 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
2989
+ eQ==
2990
+ -----END CERTIFICATE-----
2991
+
2992
+ Certum Trusted Network CA
2993
+ =========================
2994
+ -----BEGIN CERTIFICATE-----
2995
+ MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
2996
+ ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
2997
+ biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
2998
+ MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
2999
+ ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
3000
+ MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
3001
+ AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
3002
+ l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
3003
+ J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
3004
+ fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
3005
+ cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
3006
+ Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
3007
+ DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
3008
+ jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
3009
+ mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
3010
+ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
3011
+ 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
3012
+ -----END CERTIFICATE-----
3013
+
3014
+ Certinomis - Autorité Racine
3015
+ =============================
3016
+ -----BEGIN CERTIFICATE-----
3017
+ MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
3018
+ Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
3019
+ LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
3020
+ A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
3021
+ JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
3022
+ ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
3023
+ wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
3024
+ Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
3025
+ 2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
3026
+ jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
3027
+ c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
3028
+ lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
3029
+ xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
3030
+ 530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
3031
+ 4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
3032
+ A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
3033
+ KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
3034
+ WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
3035
+ R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
3036
+ nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
3037
+ CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
3038
+ JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
3039
+ qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
3040
+ WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
3041
+ wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
3042
+ vgt2Fl43N+bYdJeimUV5
3043
+ -----END CERTIFICATE-----
3044
+
3045
+ Root CA Generalitat Valenciana
3046
+ ==============================
3047
+ -----BEGIN CERTIFICATE-----
3048
+ MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
3049
+ ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
3050
+ IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
3051
+ WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
3052
+ CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
3053
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
3054
+ F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
3055
+ ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
3056
+ D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
3057
+ JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
3058
+ AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
3059
+ dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
3060
+ ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
3061
+ AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
3062
+ YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
3063
+ AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
3064
+ aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
3065
+ AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
3066
+ YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
3067
+ AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
3068
+ OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
3069
+ dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
3070
+ BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
3071
+ A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
3072
+ b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
3073
+ TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
3074
+ Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
3075
+ NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
3076
+ iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
3077
+ +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
3078
+ -----END CERTIFICATE-----
3079
+
3080
+ A-Trust-nQual-03
3081
+ ================
3082
+ -----BEGIN CERTIFICATE-----
3083
+ MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
3084
+ Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
3085
+ a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
3086
+ dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
3087
+ RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
3088
+ ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
3089
+ c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
3090
+ zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
3091
+ yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
3092
+ SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
3093
+ iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
3094
+ cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
3095
+ eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
3096
+ ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
3097
+ sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
3098
+ JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
3099
+ mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
3100
+ ahq97BvIxYSazQ==
3101
+ -----END CERTIFICATE-----
3102
+
3103
+ TWCA Root Certification Authority
3104
+ =================================
3105
+ -----BEGIN CERTIFICATE-----
3106
+ MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
3107
+ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
3108
+ dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
3109
+ EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
3110
+ IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
3111
+ AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
3112
+ QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
3113
+ oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
3114
+ 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
3115
+ y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
3116
+ BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
3117
+ 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
3118
+ mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
3119
+ QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
3120
+ T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
3121
+ Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
3122
+ -----END CERTIFICATE-----
3123
+
3124
+ Security Communication RootCA2
3125
+ ==============================
3126
+ -----BEGIN CERTIFICATE-----
3127
+ MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
3128
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
3129
+ dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
3130
+ SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
3131
+ aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
3132
+ ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
3133
+ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
3134
+ 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
3135
+ spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
3136
+ EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
3137
+ QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
3138
+ CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
3139
+ u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
3140
+ 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
3141
+ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
3142
+ mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
3143
+ -----END CERTIFICATE-----
3144
+
3145
+ EC-ACC
3146
+ ======
3147
+ -----BEGIN CERTIFICATE-----
3148
+ MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
3149
+ BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
3150
+ ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
3151
+ VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
3152
+ CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
3153
+ BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
3154
+ MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
3155
+ SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
3156
+ Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
3157
+ cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
3158
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
3159
+ w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
3160
+ ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
3161
+ HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
3162
+ E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
3163
+ 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
3164
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
3165
+ VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
3166
+ Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
3167
+ dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
3168
+ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
3169
+ Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
3170
+ l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
3171
+ E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
3172
+ 5EI=
3173
+ -----END CERTIFICATE-----
3174
+
3175
+ Hellenic Academic and Research Institutions RootCA 2011
3176
+ =======================================================
3177
+ -----BEGIN CERTIFICATE-----
3178
+ MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
3179
+ O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
3180
+ aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
3181
+ IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
3182
+ AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
3183
+ IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
3184
+ IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
3185
+ AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
3186
+ 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
3187
+ 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
3188
+ 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
3189
+ 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
3190
+ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
3191
+ MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
3192
+ b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
3193
+ XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
3194
+ TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
3195
+ /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
3196
+ 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
3197
+ -----END CERTIFICATE-----
3198
+
3199
+ Actalis Authentication Root CA
3200
+ ==============================
3201
+ -----BEGIN CERTIFICATE-----
3202
+ MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
3203
+ BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
3204
+ AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
3205
+ MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
3206
+ IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
3207
+ IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
3208
+ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
3209
+ by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
3210
+ zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
3211
+ YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
3212
+ oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
3213
+ EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
3214
+ hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
3215
+ EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
3216
+ jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
3217
+ iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
3218
+ ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
3219
+ WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
3220
+ JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
3221
+ K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
3222
+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
3223
+ 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
3224
+ 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
3225
+ lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
3226
+ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
3227
+ vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
3228
+ -----END CERTIFICATE-----
3229
+
3230
+ Trustis FPS Root CA
3231
+ ===================
3232
+ -----BEGIN CERTIFICATE-----
3233
+ MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
3234
+ EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
3235
+ IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
3236
+ BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
3237
+ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
3238
+ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
3239
+ H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
3240
+ cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
3241
+ o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
3242
+ AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
3243
+ BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
3244
+ GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
3245
+ yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
3246
+ 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
3247
+ l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
3248
+ iB6XzCGcKQENZetX2fNXlrtIzYE=
3249
+ -----END CERTIFICATE-----
3250
+
3251
+ StartCom Certification Authority
3252
+ ================================
3253
+ -----BEGIN CERTIFICATE-----
3254
+ MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
3255
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
3256
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
3257
+ NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
3258
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
3259
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
3260
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
3261
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
3262
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
3263
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
3264
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
3265
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
3266
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
3267
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
3268
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
3269
+ 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
3270
+ VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
3271
+ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
3272
+ dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
3273
+ c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
3274
+ bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
3275
+ aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
3276
+ aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
3277
+ L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
3278
+ cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
3279
+ fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
3280
+ N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
3281
+ Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
3282
+ tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
3283
+ e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
3284
+ 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
3285
+ HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
3286
+ JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
3287
+ D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
3288
+ -----END CERTIFICATE-----
3289
+
3290
+ StartCom Certification Authority G2
3291
+ ===================================
3292
+ -----BEGIN CERTIFICATE-----
3293
+ MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
3294
+ U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
3295
+ RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
3296
+ ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
3297
+ dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
3298
+ o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
3299
+ 4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
3300
+ Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
3301
+ Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
3302
+ O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
3303
+ vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
3304
+ nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
3305
+ FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
3306
+ z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
3307
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
3308
+ KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
3309
+ 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
3310
+ J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
3311
+ JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
3312
+ /+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
3313
+ nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
3314
+ blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
3315
+ l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
3316
+ 7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
3317
+ obp573PYtlNXLfbQ4ddI
3318
+ -----END CERTIFICATE-----
3319
+
3320
+ Buypass Class 2 Root CA
3321
+ =======================
3322
+ -----BEGIN CERTIFICATE-----
3323
+ MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
3324
+ QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
3325
+ DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
3326
+ eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
3327
+ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
3328
+ g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
3329
+ 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
3330
+ /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
3331
+ CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
3332
+ awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
3333
+ zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
3334
+ Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
3335
+ Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
3336
+ M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
3337
+ VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
3338
+ AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
3339
+ A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
3340
+ osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
3341
+ aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
3342
+ DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
3343
+ LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
3344
+ oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
3345
+ wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
3346
+ CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
3347
+ rJgWVqA=
3348
+ -----END CERTIFICATE-----
3349
+
3350
+ Buypass Class 3 Root CA
3351
+ =======================
3352
+ -----BEGIN CERTIFICATE-----
3353
+ MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
3354
+ QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
3355
+ DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
3356
+ eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
3357
+ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
3358
+ sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
3359
+ 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
3360
+ 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
3361
+ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
3362
+ 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
3363
+ /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
3364
+ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
3365
+ Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
3366
+ j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
3367
+ VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
3368
+ AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
3369
+ cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
3370
+ uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
3371
+ Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
3372
+ ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
3373
+ KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
3374
+ 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
3375
+ UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
3376
+ eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
3377
+ Cp/HuZc=
3378
+ -----END CERTIFICATE-----
3379
+
3380
+ T-TeleSec GlobalRoot Class 3
3381
+ ============================
3382
+ -----BEGIN CERTIFICATE-----
3383
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
3384
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
3385
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
3386
+ MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
3387
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
3388
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
3389
+ DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
3390
+ 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
3391
+ NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
3392
+ iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
3393
+ 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
3394
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
3395
+ AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
3396
+ fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
3397
+ ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
3398
+ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
3399
+ e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
3400
+ -----END CERTIFICATE-----
3401
+
3402
+ EE Certification Centre Root CA
3403
+ ===============================
3404
+ -----BEGIN CERTIFICATE-----
3405
+ MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
3406
+ EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
3407
+ dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
3408
+ MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
3409
+ UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
3410
+ ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
3411
+ DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
3412
+ TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
3413
+ rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
3414
+ 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
3415
+ P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
3416
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
3417
+ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
3418
+ BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
3419
+ xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
3420
+ lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
3421
+ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
3422
+ 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
3423
+ dcGWxZ0=
3424
+ -----END CERTIFICATE-----
3425
+
3426
+ TURKTRUST Certificate Services Provider Root 2007
3427
+ =================================================
3428
+ -----BEGIN CERTIFICATE-----
3429
+ MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
3430
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
3431
+ MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
3432
+ QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
3433
+ DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
3434
+ a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
3435
+ BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
3436
+ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
3437
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
3438
+ YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
3439
+ KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
3440
+ KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
3441
+ rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
3442
+ AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
3443
+ BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
3444
+ Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
3445
+ aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
3446
+ Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
3447
+ BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
3448
+ poRq0Tl9
3449
+ -----END CERTIFICATE-----
3450
+
3451
+ D-TRUST Root Class 3 CA 2 2009
3452
+ ==============================
3453
+ -----BEGIN CERTIFICATE-----
3454
+ MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
3455
+ DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
3456
+ Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
3457
+ LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
3458
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
3459
+ ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
3460
+ BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
3461
+ KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
3462
+ p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
3463
+ AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
3464
+ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
3465
+ eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
3466
+ MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
3467
+ PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
3468
+ OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
3469
+ 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0