From 0f968aac14bea6e271b2195d018cc83229e83575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CVeLiTi=E2=80=9D?= <“info@veliti.nl”> Date: Sun, 21 Dec 2025 14:44:37 +0100 Subject: [PATCH 1/2] Add Mollie API integration and webhook for software upgrade payments - Introduced the `CaBundle.php` class for managing CA certificates. - Updated `installed.json` and `installed.php` to include the new `composer/ca-bundle` dependency. - Added `platform_check.php` to enforce PHP version requirements. - Created `initialize.php` for initializing the Mollie API client with the API key. - Implemented `webhook_mollie.php` to handle webhook callbacks for software upgrade payments, including transaction status updates and invoice generation. - Integrated DomPDF for generating invoices and sending them via email. --- api/v2/get/payment.php | 88 + api/v2/post/payment.php | 280 ++ assets/functions.php | 256 +- assets/mollie/.DS_Store | Bin 0 -> 6148 bytes assets/mollie/LICENSE | 8 + assets/mollie/README.md | 231 ++ assets/mollie/composer.json | 84 + assets/mollie/src/.DS_Store | Bin 0 -> 6148 bytes assets/mollie/src/CompatibilityChecker.php | 47 + .../mollie/src/Endpoints/BalanceEndpoint.php | 74 + .../src/Endpoints/BalanceReportEndpoint.php | 57 + .../Endpoints/BalanceTransactionEndpoint.php | 73 + .../src/Endpoints/ChargebackEndpoint.php | 46 + .../mollie/src/Endpoints/ClientEndpoint.php | 63 + .../src/Endpoints/ClientLinkEndpoint.php | 36 + .../Endpoints/CollectionEndpointAbstract.php | 41 + .../mollie/src/Endpoints/CustomerEndpoint.php | 111 + .../Endpoints/CustomerPaymentsEndpoint.php | 88 + .../mollie/src/Endpoints/EndpointAbstract.php | 163 + .../mollie/src/Endpoints/InvoiceEndpoint.php | 73 + .../mollie/src/Endpoints/MandateEndpoint.php | 134 + .../mollie/src/Endpoints/MethodEndpoint.php | 88 + .../src/Endpoints/OnboardingEndpoint.php | 74 + assets/mollie/src/Endpoints/OrderEndpoint.php | 119 + .../src/Endpoints/OrderLineEndpoint.php | 115 + .../src/Endpoints/OrderPaymentEndpoint.php | 67 + .../src/Endpoints/OrderRefundEndpoint.php | 63 + .../src/Endpoints/OrganizationEndpoint.php | 58 + .../Endpoints/OrganizationPartnerEndpoint.php | 49 + .../src/Endpoints/PaymentCaptureEndpoint.php | 109 + .../Endpoints/PaymentChargebackEndpoint.php | 80 + .../mollie/src/Endpoints/PaymentEndpoint.php | 152 + .../src/Endpoints/PaymentLinkEndpoint.php | 79 + .../src/Endpoints/PaymentRefundEndpoint.php | 109 + .../src/Endpoints/PaymentRouteEndpoint.php | 60 + .../src/Endpoints/PermissionEndpoint.php | 60 + .../mollie/src/Endpoints/ProfileEndpoint.php | 130 + .../src/Endpoints/ProfileMethodEndpoint.php | 116 + .../mollie/src/Endpoints/RefundEndpoint.php | 46 + .../Endpoints/SettlementPaymentEndpoint.php | 40 + .../src/Endpoints/SettlementsEndpoint.php | 80 + .../mollie/src/Endpoints/ShipmentEndpoint.php | 145 + .../src/Endpoints/SubscriptionEndpoint.php | 187 + .../mollie/src/Endpoints/TerminalEndpoint.php | 65 + .../mollie/src/Endpoints/WalletEndpoint.php | 33 + assets/mollie/src/Exceptions/ApiException.php | 194 + .../CurlConnectTimeoutException.php | 7 + ...dapterDoesNotSupportDebuggingException.php | 7 + .../src/Exceptions/IncompatiblePlatform.php | 12 + .../UnrecognizedClientException.php | 7 + .../src/HttpAdapter/CurlMollieHttpAdapter.php | 190 + .../Guzzle6And7MollieHttpAdapter.php | 169 + .../Guzzle6And7RetryMiddlewareFactory.php | 67 + .../MollieHttpAdapterInterface.php | 25 + .../HttpAdapter/MollieHttpAdapterPicker.php | 55 + .../MollieHttpAdapterPickerInterface.php | 13 + .../DefaultIdempotencyKeyGenerator.php | 36 + .../FakeIdempotencyKeyGenerator.php | 18 + .../IdempotencyKeyGeneratorContract.php | 8 + assets/mollie/src/MollieApiClient.php | 623 +++ assets/mollie/src/Resources/Balance.php | 101 + .../src/Resources/BalanceCollection.php | 21 + assets/mollie/src/Resources/BalanceReport.php | 72 + .../src/Resources/BalanceTransaction.php | 74 + .../BalanceTransactionCollection.php | 22 + .../mollie/src/Resources/BaseCollection.php | 31 + assets/mollie/src/Resources/BaseResource.php | 28 + assets/mollie/src/Resources/Capture.php | 62 + .../src/Resources/CaptureCollection.php | 21 + assets/mollie/src/Resources/Chargeback.php | 67 + .../src/Resources/ChargebackCollection.php | 21 + assets/mollie/src/Resources/Client.php | 32 + .../mollie/src/Resources/ClientCollection.php | 21 + assets/mollie/src/Resources/ClientLink.php | 38 + .../mollie/src/Resources/CurrentProfile.php | 32 + .../mollie/src/Resources/CursorCollection.php | 80 + assets/mollie/src/Resources/Customer.php | 216 ++ .../src/Resources/CustomerCollection.php | 21 + assets/mollie/src/Resources/Invoice.php | 94 + .../src/Resources/InvoiceCollection.php | 21 + assets/mollie/src/Resources/Issuer.php | 32 + .../mollie/src/Resources/IssuerCollection.php | 14 + assets/mollie/src/Resources/Mandate.php | 89 + .../src/Resources/MandateCollection.php | 36 + assets/mollie/src/Resources/Method.php | 82 + .../mollie/src/Resources/MethodCollection.php | 14 + assets/mollie/src/Resources/MethodPrice.php | 26 + .../src/Resources/MethodPriceCollection.php | 14 + assets/mollie/src/Resources/Onboarding.php | 56 + assets/mollie/src/Resources/Order.php | 485 +++ .../mollie/src/Resources/OrderCollection.php | 21 + assets/mollie/src/Resources/OrderLine.php | 358 ++ .../src/Resources/OrderLineCollection.php | 30 + assets/mollie/src/Resources/Organization.php | 62 + .../src/Resources/OrganizationCollection.php | 21 + assets/mollie/src/Resources/Partner.php | 45 + assets/mollie/src/Resources/Payment.php | 672 ++++ .../src/Resources/PaymentCollection.php | 21 + assets/mollie/src/Resources/PaymentLink.php | 112 + .../src/Resources/PaymentLinkCollection.php | 21 + assets/mollie/src/Resources/Permission.php | 24 + .../src/Resources/PermissionCollection.php | 14 + assets/mollie/src/Resources/Profile.php | 180 + .../src/Resources/ProfileCollection.php | 21 + assets/mollie/src/Resources/Refund.php | 153 + .../mollie/src/Resources/RefundCollection.php | 21 + .../mollie/src/Resources/ResourceFactory.php | 61 + assets/mollie/src/Resources/Route.php | 32 + .../mollie/src/Resources/RouteCollection.php | 21 + assets/mollie/src/Resources/Settlement.php | 154 + .../src/Resources/SettlementCollection.php | 21 + assets/mollie/src/Resources/Shipment.php | 104 + .../src/Resources/ShipmentCollection.php | 14 + assets/mollie/src/Resources/Subscription.php | 180 + .../src/Resources/SubscriptionCollection.php | 21 + assets/mollie/src/Resources/Terminal.php | 138 + .../src/Resources/TerminalCollection.php | 21 + assets/mollie/src/Types/ApprovalPrompt.php | 13 + .../src/Types/BalanceTransferFrequency.php | 18 + assets/mollie/src/Types/InvoiceStatus.php | 19 + assets/mollie/src/Types/MandateMethod.php | 24 + assets/mollie/src/Types/MandateStatus.php | 10 + assets/mollie/src/Types/OnboardingStatus.php | 19 + assets/mollie/src/Types/OrderLineStatus.php | 36 + assets/mollie/src/Types/OrderLineType.php | 14 + .../Types/OrderLineUpdateOperationType.php | 11 + assets/mollie/src/Types/OrderStatus.php | 44 + assets/mollie/src/Types/PaymentMethod.php | 113 + .../mollie/src/Types/PaymentMethodStatus.php | 46 + assets/mollie/src/Types/PaymentStatus.php | 40 + assets/mollie/src/Types/ProfileStatus.php | 19 + assets/mollie/src/Types/RefundStatus.php | 31 + assets/mollie/src/Types/SequenceType.php | 15 + assets/mollie/src/Types/SettlementStatus.php | 23 + .../mollie/src/Types/SubscriptionStatus.php | 14 + assets/mollie/src/Types/TerminalStatus.php | 19 + assets/mollie/vendor/autoload.php | 31 + assets/mollie/vendor/composer-autoload.php | 25 + assets/mollie/vendor/composer/ClassLoader.php | 579 +++ .../vendor/composer/InstalledVersions.php | 313 ++ assets/mollie/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 139 + .../vendor/composer/autoload_namespaces.php | 9 + .../mollie/vendor/composer/autoload_psr4.php | 11 + .../mollie/vendor/composer/autoload_real.php | 39 + .../vendor/composer/autoload_static.php | 173 + .../mollie/vendor/composer/ca-bundle/LICENSE | 19 + .../vendor/composer/ca-bundle/README.md | 85 + .../vendor/composer/ca-bundle/composer.json | 54 + .../vendor/composer/ca-bundle/res/cacert.pem | 3363 +++++++++++++++++ .../composer/ca-bundle/src/CaBundle.php | 361 ++ assets/mollie/vendor/composer/installed.json | 85 + assets/mollie/vendor/composer/installed.php | 5 + .../mollie/vendor/composer/platform_check.php | 26 + assets/mollie/vendor/scoper-autoload.php.bak | 31 + assets/softwaretool.js | 97 +- initialize.php | 18 + softwaretool.php | 22 +- webhook_mollie.php | 210 + 159 files changed, 16197 insertions(+), 21 deletions(-) create mode 100644 api/v2/get/payment.php create mode 100644 api/v2/post/payment.php create mode 100644 assets/mollie/.DS_Store create mode 100644 assets/mollie/LICENSE create mode 100644 assets/mollie/README.md create mode 100644 assets/mollie/composer.json create mode 100644 assets/mollie/src/.DS_Store create mode 100644 assets/mollie/src/CompatibilityChecker.php create mode 100644 assets/mollie/src/Endpoints/BalanceEndpoint.php create mode 100644 assets/mollie/src/Endpoints/BalanceReportEndpoint.php create mode 100644 assets/mollie/src/Endpoints/BalanceTransactionEndpoint.php create mode 100644 assets/mollie/src/Endpoints/ChargebackEndpoint.php create mode 100644 assets/mollie/src/Endpoints/ClientEndpoint.php create mode 100644 assets/mollie/src/Endpoints/ClientLinkEndpoint.php create mode 100644 assets/mollie/src/Endpoints/CollectionEndpointAbstract.php create mode 100644 assets/mollie/src/Endpoints/CustomerEndpoint.php create mode 100644 assets/mollie/src/Endpoints/CustomerPaymentsEndpoint.php create mode 100644 assets/mollie/src/Endpoints/EndpointAbstract.php create mode 100644 assets/mollie/src/Endpoints/InvoiceEndpoint.php create mode 100644 assets/mollie/src/Endpoints/MandateEndpoint.php create mode 100644 assets/mollie/src/Endpoints/MethodEndpoint.php create mode 100644 assets/mollie/src/Endpoints/OnboardingEndpoint.php create mode 100644 assets/mollie/src/Endpoints/OrderEndpoint.php create mode 100644 assets/mollie/src/Endpoints/OrderLineEndpoint.php create mode 100644 assets/mollie/src/Endpoints/OrderPaymentEndpoint.php create mode 100644 assets/mollie/src/Endpoints/OrderRefundEndpoint.php create mode 100644 assets/mollie/src/Endpoints/OrganizationEndpoint.php create mode 100644 assets/mollie/src/Endpoints/OrganizationPartnerEndpoint.php create mode 100644 assets/mollie/src/Endpoints/PaymentCaptureEndpoint.php create mode 100644 assets/mollie/src/Endpoints/PaymentChargebackEndpoint.php create mode 100644 assets/mollie/src/Endpoints/PaymentEndpoint.php create mode 100644 assets/mollie/src/Endpoints/PaymentLinkEndpoint.php create mode 100644 assets/mollie/src/Endpoints/PaymentRefundEndpoint.php create mode 100644 assets/mollie/src/Endpoints/PaymentRouteEndpoint.php create mode 100644 assets/mollie/src/Endpoints/PermissionEndpoint.php create mode 100644 assets/mollie/src/Endpoints/ProfileEndpoint.php create mode 100644 assets/mollie/src/Endpoints/ProfileMethodEndpoint.php create mode 100644 assets/mollie/src/Endpoints/RefundEndpoint.php create mode 100644 assets/mollie/src/Endpoints/SettlementPaymentEndpoint.php create mode 100644 assets/mollie/src/Endpoints/SettlementsEndpoint.php create mode 100644 assets/mollie/src/Endpoints/ShipmentEndpoint.php create mode 100644 assets/mollie/src/Endpoints/SubscriptionEndpoint.php create mode 100644 assets/mollie/src/Endpoints/TerminalEndpoint.php create mode 100644 assets/mollie/src/Endpoints/WalletEndpoint.php create mode 100644 assets/mollie/src/Exceptions/ApiException.php create mode 100644 assets/mollie/src/Exceptions/CurlConnectTimeoutException.php create mode 100644 assets/mollie/src/Exceptions/HttpAdapterDoesNotSupportDebuggingException.php create mode 100644 assets/mollie/src/Exceptions/IncompatiblePlatform.php create mode 100644 assets/mollie/src/Exceptions/UnrecognizedClientException.php create mode 100644 assets/mollie/src/HttpAdapter/CurlMollieHttpAdapter.php create mode 100644 assets/mollie/src/HttpAdapter/Guzzle6And7MollieHttpAdapter.php create mode 100644 assets/mollie/src/HttpAdapter/Guzzle6And7RetryMiddlewareFactory.php create mode 100644 assets/mollie/src/HttpAdapter/MollieHttpAdapterInterface.php create mode 100644 assets/mollie/src/HttpAdapter/MollieHttpAdapterPicker.php create mode 100644 assets/mollie/src/HttpAdapter/MollieHttpAdapterPickerInterface.php create mode 100644 assets/mollie/src/Idempotency/DefaultIdempotencyKeyGenerator.php create mode 100644 assets/mollie/src/Idempotency/FakeIdempotencyKeyGenerator.php create mode 100644 assets/mollie/src/Idempotency/IdempotencyKeyGeneratorContract.php create mode 100644 assets/mollie/src/MollieApiClient.php create mode 100644 assets/mollie/src/Resources/Balance.php create mode 100644 assets/mollie/src/Resources/BalanceCollection.php create mode 100644 assets/mollie/src/Resources/BalanceReport.php create mode 100644 assets/mollie/src/Resources/BalanceTransaction.php create mode 100644 assets/mollie/src/Resources/BalanceTransactionCollection.php create mode 100644 assets/mollie/src/Resources/BaseCollection.php create mode 100644 assets/mollie/src/Resources/BaseResource.php create mode 100644 assets/mollie/src/Resources/Capture.php create mode 100644 assets/mollie/src/Resources/CaptureCollection.php create mode 100644 assets/mollie/src/Resources/Chargeback.php create mode 100644 assets/mollie/src/Resources/ChargebackCollection.php create mode 100644 assets/mollie/src/Resources/Client.php create mode 100644 assets/mollie/src/Resources/ClientCollection.php create mode 100644 assets/mollie/src/Resources/ClientLink.php create mode 100644 assets/mollie/src/Resources/CurrentProfile.php create mode 100644 assets/mollie/src/Resources/CursorCollection.php create mode 100644 assets/mollie/src/Resources/Customer.php create mode 100644 assets/mollie/src/Resources/CustomerCollection.php create mode 100644 assets/mollie/src/Resources/Invoice.php create mode 100644 assets/mollie/src/Resources/InvoiceCollection.php create mode 100644 assets/mollie/src/Resources/Issuer.php create mode 100644 assets/mollie/src/Resources/IssuerCollection.php create mode 100644 assets/mollie/src/Resources/Mandate.php create mode 100644 assets/mollie/src/Resources/MandateCollection.php create mode 100644 assets/mollie/src/Resources/Method.php create mode 100644 assets/mollie/src/Resources/MethodCollection.php create mode 100644 assets/mollie/src/Resources/MethodPrice.php create mode 100644 assets/mollie/src/Resources/MethodPriceCollection.php create mode 100644 assets/mollie/src/Resources/Onboarding.php create mode 100644 assets/mollie/src/Resources/Order.php create mode 100644 assets/mollie/src/Resources/OrderCollection.php create mode 100644 assets/mollie/src/Resources/OrderLine.php create mode 100644 assets/mollie/src/Resources/OrderLineCollection.php create mode 100644 assets/mollie/src/Resources/Organization.php create mode 100644 assets/mollie/src/Resources/OrganizationCollection.php create mode 100644 assets/mollie/src/Resources/Partner.php create mode 100644 assets/mollie/src/Resources/Payment.php create mode 100644 assets/mollie/src/Resources/PaymentCollection.php create mode 100644 assets/mollie/src/Resources/PaymentLink.php create mode 100644 assets/mollie/src/Resources/PaymentLinkCollection.php create mode 100644 assets/mollie/src/Resources/Permission.php create mode 100644 assets/mollie/src/Resources/PermissionCollection.php create mode 100644 assets/mollie/src/Resources/Profile.php create mode 100644 assets/mollie/src/Resources/ProfileCollection.php create mode 100644 assets/mollie/src/Resources/Refund.php create mode 100644 assets/mollie/src/Resources/RefundCollection.php create mode 100644 assets/mollie/src/Resources/ResourceFactory.php create mode 100644 assets/mollie/src/Resources/Route.php create mode 100644 assets/mollie/src/Resources/RouteCollection.php create mode 100644 assets/mollie/src/Resources/Settlement.php create mode 100644 assets/mollie/src/Resources/SettlementCollection.php create mode 100644 assets/mollie/src/Resources/Shipment.php create mode 100644 assets/mollie/src/Resources/ShipmentCollection.php create mode 100644 assets/mollie/src/Resources/Subscription.php create mode 100644 assets/mollie/src/Resources/SubscriptionCollection.php create mode 100644 assets/mollie/src/Resources/Terminal.php create mode 100644 assets/mollie/src/Resources/TerminalCollection.php create mode 100644 assets/mollie/src/Types/ApprovalPrompt.php create mode 100644 assets/mollie/src/Types/BalanceTransferFrequency.php create mode 100644 assets/mollie/src/Types/InvoiceStatus.php create mode 100644 assets/mollie/src/Types/MandateMethod.php create mode 100644 assets/mollie/src/Types/MandateStatus.php create mode 100644 assets/mollie/src/Types/OnboardingStatus.php create mode 100644 assets/mollie/src/Types/OrderLineStatus.php create mode 100644 assets/mollie/src/Types/OrderLineType.php create mode 100644 assets/mollie/src/Types/OrderLineUpdateOperationType.php create mode 100644 assets/mollie/src/Types/OrderStatus.php create mode 100644 assets/mollie/src/Types/PaymentMethod.php create mode 100644 assets/mollie/src/Types/PaymentMethodStatus.php create mode 100644 assets/mollie/src/Types/PaymentStatus.php create mode 100644 assets/mollie/src/Types/ProfileStatus.php create mode 100644 assets/mollie/src/Types/RefundStatus.php create mode 100644 assets/mollie/src/Types/SequenceType.php create mode 100644 assets/mollie/src/Types/SettlementStatus.php create mode 100644 assets/mollie/src/Types/SubscriptionStatus.php create mode 100644 assets/mollie/src/Types/TerminalStatus.php create mode 100644 assets/mollie/vendor/autoload.php create mode 100644 assets/mollie/vendor/composer-autoload.php create mode 100644 assets/mollie/vendor/composer/ClassLoader.php create mode 100644 assets/mollie/vendor/composer/InstalledVersions.php create mode 100644 assets/mollie/vendor/composer/LICENSE create mode 100644 assets/mollie/vendor/composer/autoload_classmap.php create mode 100644 assets/mollie/vendor/composer/autoload_namespaces.php create mode 100644 assets/mollie/vendor/composer/autoload_psr4.php create mode 100644 assets/mollie/vendor/composer/autoload_real.php create mode 100644 assets/mollie/vendor/composer/autoload_static.php create mode 100644 assets/mollie/vendor/composer/ca-bundle/LICENSE create mode 100644 assets/mollie/vendor/composer/ca-bundle/README.md create mode 100644 assets/mollie/vendor/composer/ca-bundle/composer.json create mode 100644 assets/mollie/vendor/composer/ca-bundle/res/cacert.pem create mode 100644 assets/mollie/vendor/composer/ca-bundle/src/CaBundle.php create mode 100644 assets/mollie/vendor/composer/installed.json create mode 100644 assets/mollie/vendor/composer/installed.php create mode 100644 assets/mollie/vendor/composer/platform_check.php create mode 100644 assets/mollie/vendor/scoper-autoload.php.bak create mode 100644 initialize.php create mode 100644 webhook_mollie.php diff --git a/api/v2/get/payment.php b/api/v2/get/payment.php new file mode 100644 index 0000000..132e34d --- /dev/null +++ b/api/v2/get/payment.php @@ -0,0 +1,88 @@ + 'Missing required parameter: payment_id'], JSON_UNESCAPED_UNICODE); + exit; +} + +$payment_id = $criterias['payment_id']; + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 1: Fetch transaction +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +$sql = 'SELECT * FROM transactions WHERE txn_id = ?'; +$stmt = $pdo->prepare($sql); +$stmt->execute([$payment_id]); +$transaction = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$transaction) { + http_response_code(404); + echo json_encode(['error' => 'Payment not found'], JSON_UNESCAPED_UNICODE); + exit; +} + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 2: Fetch transaction item +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +$sql = 'SELECT * FROM transactions_items WHERE txn_id = ? LIMIT 1'; +$stmt = $pdo->prepare($sql); +$stmt->execute([$payment_id]); +$item = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$item) { + http_response_code(404); + echo json_encode(['error' => 'Payment item not found'], JSON_UNESCAPED_UNICODE); + exit; +} + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 3: Parse item_options JSON +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +$item_options = []; +if (!empty($item['item_options'])) { + $item_options = json_decode($item['item_options'], true); +} + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 4: Return payment details +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +$messages = json_encode([ + 'payment_id' => $transaction['txn_id'], + 'payment_status' => $transaction['payment_status'], + 'payment_amount' => $transaction['payment_amount'], + 'currency' => 'EUR', // Default currency + 'serial_number' => $item_options['serial_number'] ?? null, + 'equipment_id' => $item_options['equipment_id'] ?? null, + 'hw_version' => $item_options['hw_version'] ?? null, + 'version_id' => $item['item_id'], + 'payer_email' => $transaction['payer_email'], + 'customer_name' => trim(($transaction['first_name'] ?? '') . ' ' . ($transaction['last_name'] ?? '')), + 'created' => $transaction['created'] +], JSON_UNESCAPED_UNICODE); + +echo $messages; + +?> diff --git a/api/v2/post/payment.php b/api/v2/post/payment.php new file mode 100644 index 0000000..1087f40 --- /dev/null +++ b/api/v2/post/payment.php @@ -0,0 +1,280 @@ + 'Missing required fields: serial_number, version_id'], JSON_UNESCAPED_UNICODE); + exit; +} + +$serial_number = $post_content['serial_number']; +$version_id = $post_content['version_id']; +$user_data = $post_content['user_data'] ?? []; + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 1: Get equipment data from serial_number +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +$sql = 'SELECT rowID, sw_version, sw_version_license, hw_version FROM equipment WHERE serialnumber = ?'; +$stmt = $pdo->prepare($sql); +$stmt->execute([$serial_number]); +$equipment = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$equipment) { + http_response_code(404); + echo json_encode(['error' => 'Device not found with serial number: ' . $serial_number], JSON_UNESCAPED_UNICODE); + exit; +} + +$equipment_id = $equipment['rowID']; +$current_sw_version = trim(strtolower(ltrim($equipment['sw_version'], '0'))); +$sw_version_license = $equipment['sw_version_license'] ?? null; +$hw_version = $equipment['hw_version'] ?? ''; + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 2: Get version data from version_id +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +$sql = 'SELECT v.rowID as version_id, v.version, v.name, v.description, v.hw_version, p.productcode + FROM products_software_versions v + JOIN products_software p ON v.product_software_id = p.rowID + WHERE v.rowID = ? AND v.is_active = 1'; +$stmt = $pdo->prepare($sql); +$stmt->execute([$version_id]); +$version = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$version) { + http_response_code(404); + echo json_encode(['error' => 'Software version not found or inactive'], JSON_UNESCAPED_UNICODE); + exit; +} + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 3: Calculate price SERVER-SIDE (same logic as software_update.php) +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +$final_price = '0.00'; +$final_currency = ''; + +// Check if version has upgrade paths defined +$sql = 'SELECT COUNT(*) as path_count FROM products_software_upgrade_paths WHERE to_version_id = ? AND is_active = 1'; +$stmt = $pdo->prepare($sql); +$stmt->execute([$version_id]); +$path_count_result = $stmt->fetch(PDO::FETCH_ASSOC); +$has_upgrade_paths = ($path_count_result['path_count'] > 0); + +if (!$has_upgrade_paths) { + // No upgrade paths defined = FREE (lines 240-242 in software_update.php) + $final_price = '0.00'; +} else { + // Check for valid upgrade path FROM current version + $sql = 'SELECT pup.price, pup.currency + FROM products_software_upgrade_paths pup + JOIN products_software_versions from_ver ON pup.from_version_id = from_ver.rowID + WHERE pup.to_version_id = ? + AND LOWER(TRIM(LEADING "0" FROM from_ver.version)) = ? + AND pup.is_active = 1'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$version_id, $current_sw_version]); + $upgrade_path = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($upgrade_path) { + $final_price = $upgrade_path['price'] ?? '0.00'; + $final_currency = $upgrade_path['currency'] ?? 'EUR'; + } else { + // No upgrade path FROM current version + http_response_code(400); + echo json_encode(['error' => 'No valid upgrade path from current version'], JSON_UNESCAPED_UNICODE); + exit; + } +} + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 4: Check license validity (lines 280-311 in software_update.php) +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +if ($final_price > 0 && $sw_version_license) { + $sql = 'SELECT status, start_at, expires_at + FROM products_software_licenses + WHERE license_key = ? AND equipment_id = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$sw_version_license, $equipment_id]); + $license = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($license && $license['status'] == 1) { + $now = date('Y-m-d H:i:s'); + $start_at = $license['start_at']; + $expires_at = $license['expires_at']; + + // Check if license is within valid date range + if ((!$start_at || $start_at <= $now) && (!$expires_at || $expires_at >= $now)) { + $final_price = '0.00'; + } + } +} + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 5: Verify price > 0 (free upgrades shouldn't reach payment API) +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +if ($final_price <= 0) { + http_response_code(400); + echo json_encode(['error' => 'This upgrade is free. No payment required.'], JSON_UNESCAPED_UNICODE); + exit; +} + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 6: DEBUG MODE - Simulate payment without Mollie +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +if (debug) { + // Generate fake payment ID + $fake_payment_id = 'DEBUG_' . uniqid() . '_' . time(); + $checkout_url = 'https://'.$_SERVER['SERVER_NAME'].'/softwaretool.php?payment_return=1&payment_id=' . $fake_payment_id; + + // Store transaction in DB + $sql = 'INSERT INTO transactions (txn_id, payment_amount, payment_status, payer_email, first_name, last_name, + address_street, address_city, address_state, address_zip, address_country, account_id, payment_method, created) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + $stmt = $pdo->prepare($sql); + $stmt->execute([ + $fake_payment_id, + $final_price, + 0, // 0 = pending + $user_data['email'] ?? '', + $user_data['first_name'] ?? '', + $user_data['last_name'] ?? '', + $user_data['address_street'] ?? '', + $user_data['address_city'] ?? '', + $user_data['address_state'] ?? '', + $user_data['address_zip'] ?? '', + $user_data['address_country'] ?? '', + $serial_number, + 0, // payment method + date('Y-m-d H:i:s') + ]); + + // Store transaction item with serial_number in item_options + $item_options = json_encode([ + 'serial_number' => $serial_number, + 'equipment_id' => $equipment_id, + 'hw_version' => $hw_version + ], JSON_UNESCAPED_UNICODE); + + $sql = 'INSERT INTO transactions_items (txn_id, item_id, item_price, item_quantity, item_options, created) + VALUES (?, ?, ?, ?, ?, ?)'; + $stmt = $pdo->prepare($sql); + $stmt->execute([ + $fake_payment_id, + $version_id, + $final_price, + 1, + $item_options, + date('Y-m-d H:i:s') + ]); + + // Return fake checkout URL + $messages = json_encode([ + 'checkout_url' => $checkout_url, + 'payment_id' => $fake_payment_id, + 'debug_mode' => true + ], JSON_UNESCAPED_UNICODE); + echo $messages; + exit; +} + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// STEP 7: Call Mollie API to create payment +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +try { + // Initialize Mollie + require dirname(__FILE__, 3).'/initialize.php'; + + // Format price for Mollie (must be string with 2 decimals) + $formatted_price = number_format((float)$final_price, 2, '.', ''); + + // Create payment with Mollie + $payment = $mollie->payments->create([ + 'amount' => [ + 'currency' => $final_currency ?: 'EUR', + 'value' => $formatted_price + ], + 'description' => 'Software upgrade to ' . $version['name'] . ' (v' . $version['version'] . ')', + 'redirectUrl' => 'https://'.$_SERVER['SERVER_NAME'].'/softwaretool.php?payment_return=1&payment_id={id}', + 'webhookUrl' => 'https://'.$_SERVER['SERVER_NAME'].'/webhook_mollie.php', + 'metadata' => [ + 'order_id' => $payment->id // Store payment ID in metadata + ] + ]); + + $mollie_payment_id = $payment->id; + $checkout_url = $payment->getCheckoutUrl(); + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // STEP 8: Store transaction in DB + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + $sql = 'INSERT INTO transactions (txn_id, payment_amount, payment_status, payer_email, first_name, last_name, + address_street, address_city, address_state, address_zip, address_country, account_id, payment_method, created) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + $stmt = $pdo->prepare($sql); + $stmt->execute([ + $mollie_payment_id, + $final_price, + 0, // 0 = pending + $user_data['email'] ?? '', + $user_data['first_name'] ?? '', + $user_data['last_name'] ?? '', + $user_data['address_street'] ?? '', + $user_data['address_city'] ?? '', + $user_data['address_state'] ?? '', + $user_data['address_zip'] ?? '', + $user_data['address_country'] ?? '', + $serial_number, + 0, // payment method + date('Y-m-d H:i:s') + ]); + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // STEP 9: Store transaction item with serial_number in item_options + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + $item_options = json_encode([ + 'serial_number' => $serial_number, + 'equipment_id' => $equipment_id, + 'hw_version' => $hw_version + ], JSON_UNESCAPED_UNICODE); + + $sql = 'INSERT INTO transactions_items (txn_id, item_id, item_price, item_quantity, item_options, created) + VALUES (?, ?, ?, ?, ?, ?)'; + $stmt = $pdo->prepare($sql); + $stmt->execute([ + $mollie_payment_id, + $version_id, + $final_price, + 1, + $item_options, + date('Y-m-d H:i:s') + ]); + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // STEP 10: Return checkout URL and payment ID + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + $messages = json_encode([ + 'checkout_url' => $checkout_url, + 'payment_id' => $mollie_payment_id + ], JSON_UNESCAPED_UNICODE); + echo $messages; + +} catch (Exception $e) { + http_response_code(500); + echo json_encode(['error' => 'Payment creation failed: ' . $e->getMessage()], JSON_UNESCAPED_UNICODE); + exit; +} + +?> diff --git a/assets/functions.php b/assets/functions.php index 69c7486..a02c05f 100644 --- a/assets/functions.php +++ b/assets/functions.php @@ -5280,7 +5280,7 @@ function translateDeviceHardwareVersion($device_hw_version) { /** * Translates hardware version from database to match device format if needed * This can be used for display or API responses - * + * * @param string $db_hw_version - Hardware version from database * @return string - Hardware version (currently returns same as input) */ @@ -5288,4 +5288,258 @@ function translateDbHardwareVersion($db_hw_version) { // For now, we keep the standardized format from DB // This function exists for future reverse translation if needed return $db_hw_version; +} + +/** + * Generates a unique license key for software upgrades + * Format: XXXX-XXXX-XXXX-XXXX (16 uppercase alphanumeric characters) + * + * @return string - Unique license key + */ +function generateUniqueLicenseKey() { + include dirname(__FILE__,2).'/settings/settings_redirector.php'; + + $pdo = dbConnect($dbname); + $max_attempts = 10; + $attempt = 0; + + do { + // Generate 16 random bytes and convert to uppercase hex + $random_bytes = random_bytes(8); // 8 bytes = 16 hex characters + $hex = strtoupper(bin2hex($random_bytes)); + + // Format as XXXX-XXXX-XXXX-XXXX + $license_key = substr($hex, 0, 4) . '-' . + substr($hex, 4, 4) . '-' . + substr($hex, 8, 4) . '-' . + substr($hex, 12, 4); + + // Check if this key already exists + $sql = 'SELECT COUNT(*) as count FROM products_software_licenses WHERE license_key = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$license_key]); + $result = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($result['count'] == 0) { + return $license_key; + } + + $attempt++; + } while ($attempt < $max_attempts); + + // Fallback: append timestamp if collision persists (extremely unlikely) + return $license_key . '-' . time(); +} + +/** + * Generates HTML invoice for software upgrade payments + * Based on existing invoice template but customized for software licenses + * + * @param array $invoice_data - Invoice data from /v2/invoice API (includes customer, transaction, items) + * @param string $order_id - Transaction ID (txn_id) + * @param string $language - Invoice language code (e.g., 'US', 'NL') + * @return array - [$html_content, $customer_email, $order_id] + */ +function generateSoftwareInvoice($invoice_data, $order_id, $language = 'US') { + include dirname(__FILE__,2).'/settings/settings_redirector.php'; + + // Extract customer data + $customer = $invoice_data['customer'] ?? []; + $customer_email = $customer['email'] ?? $invoice_data['payer_email'] ?? ''; + $customer_name = trim(($customer['first_name'] ?? '') . ' ' . ($customer['last_name'] ?? '')); + $customer_address = $customer['address_street'] ?? ''; + $customer_city = $customer['address_city'] ?? ''; + $customer_state = $customer['address_state'] ?? ''; + $customer_zip = $customer['address_zip'] ?? ''; + $customer_country = $customer['address_country'] ?? ''; + + // Extract transaction data + $payment_amount = $invoice_data['payment_amount'] ?? 0; + $tax_amount = $invoice_data['tax_amount'] ?? 0; + $shipping_amount = $invoice_data['shipping_amount'] ?? 0; + $discount_amount = $invoice_data['discount_amount'] ?? 0; + $currency = 'EUR'; // Default currency + $invoice_date = $invoice_data['invoice_created'] ?? date('Y-m-d H:i:s'); + + // Extract item data (software upgrade details) + $items = []; + $serial_number = ''; + $software_version = ''; + $license_key = ''; + + if (isset($invoice_data['item_id'])) { + // Single item format from API + $item_options = !empty($invoice_data['item_options']) ? json_decode($invoice_data['item_options'], true) : []; + $serial_number = $item_options['serial_number'] ?? 'N/A'; + $software_version = $invoice_data['productname'] ?? 'Software Upgrade'; + + // Get license key from database + $pdo = dbConnect($dbname); + $sql = 'SELECT license_key FROM products_software_licenses WHERE transaction_id = ? LIMIT 1'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$order_id]); + $license_result = $stmt->fetch(PDO::FETCH_ASSOC); + $license_key = $license_result['license_key'] ?? 'Pending'; + + $items[] = [ + 'name' => $software_version, + 'quantity' => $invoice_data['item_quantity'] ?? 1, + 'price' => $invoice_data['item_price'] ?? $payment_amount, + 'serial_number' => $serial_number, + 'license_key' => $license_key + ]; + } + + // Load language translations + $translations = []; + $translation_file = dirname(__FILE__,2).'/settings/translations/translations_'.$language.'.php'; + if (file_exists($translation_file)) { + include $translation_file; + } else { + // Fallback to US English + include dirname(__FILE__,2).'/settings/translations/translations_US.php'; + } + + // Invoice labels (with fallbacks) + $lbl_invoice = $translations['invoice'] ?? 'Invoice'; + $lbl_invoice_number = $translations['invoice_number'] ?? 'Invoice Number'; + $lbl_invoice_date = $translations['invoice_date'] ?? 'Invoice Date'; + $lbl_customer = $translations['customer'] ?? 'Customer'; + $lbl_product = $translations['product'] ?? 'Product'; + $lbl_quantity = $translations['quantity'] ?? 'Quantity'; + $lbl_price = $translations['price'] ?? 'Price'; + $lbl_subtotal = $translations['subtotal'] ?? 'Subtotal'; + $lbl_tax = $translations['tax'] ?? 'Tax'; + $lbl_shipping = $translations['shipping'] ?? 'Shipping'; + $lbl_discount = $translations['discount'] ?? 'Discount'; + $lbl_total = $translations['total'] ?? 'Total'; + $lbl_device_serial = $translations['device_serial'] ?? 'Device Serial Number'; + $lbl_license_key = $translations['license_key'] ?? 'License Key'; + $lbl_license_expiry = $translations['license_expiry'] ?? 'License Expiry'; + + // Build HTML invoice + $html = ' + + + + + + +
+
' . htmlspecialchars($lbl_invoice) . '
+
+ ' . htmlspecialchars($lbl_invoice_number) . ': ' . htmlspecialchars($order_id) . '
+ ' . htmlspecialchars($lbl_invoice_date) . ': ' . htmlspecialchars(date('Y-m-d', strtotime($invoice_date))) . ' +
+
+ +
+ ' . htmlspecialchars($lbl_customer) . ':
+ ' . htmlspecialchars($customer_name) . '
'; + + if ($customer_address) { + $html .= htmlspecialchars($customer_address) . '
'; + } + if ($customer_city || $customer_zip) { + $html .= htmlspecialchars($customer_zip . ' ' . $customer_city) . '
'; + } + if ($customer_state) { + $html .= htmlspecialchars($customer_state) . '
'; + } + if ($customer_country) { + $html .= htmlspecialchars($customer_country) . '
'; + } + + $html .= htmlspecialchars($customer_email) . ' +
+ + + + + + + + + + '; + + foreach ($items as $item) { + $html .= ' + + + + '; + } + + // Subtotal + $subtotal = $payment_amount - $tax_amount - $shipping_amount + $discount_amount; + $html .= ' + + + '; + + // Tax + if ($tax_amount > 0) { + $html .= ' + + + '; + } + + // Shipping + if ($shipping_amount > 0) { + $html .= ' + + + '; + } + + // Discount + if ($discount_amount > 0) { + $html .= ' + + + '; + } + + // Total + $html .= ' + + + '; + + $html .= ' +
' . htmlspecialchars($lbl_product) . '' . htmlspecialchars($lbl_quantity) . '' . htmlspecialchars($lbl_price) . '
' . htmlspecialchars($item['name']) . '' . htmlspecialchars($item['quantity']) . '' . number_format($item['price'], 2) . ' ' . htmlspecialchars($currency) . '
' . htmlspecialchars($lbl_subtotal) . ':' . number_format($subtotal, 2) . ' ' . htmlspecialchars($currency) . '
' . htmlspecialchars($lbl_tax) . ':' . number_format($tax_amount, 2) . ' ' . htmlspecialchars($currency) . '
' . htmlspecialchars($lbl_shipping) . ':' . number_format($shipping_amount, 2) . ' ' . htmlspecialchars($currency) . '
' . htmlspecialchars($lbl_discount) . ':-' . number_format($discount_amount, 2) . ' ' . htmlspecialchars($currency) . '
' . htmlspecialchars($lbl_total) . ':' . number_format($payment_amount, 2) . ' ' . htmlspecialchars($currency) . '
'; + + // License information + if ($license_key && $serial_number) { + $html .= '
+ Software License Information:
+ ' . htmlspecialchars($lbl_device_serial) . ': ' . htmlspecialchars($serial_number) . '
+ ' . htmlspecialchars($lbl_license_key) . ': ' . htmlspecialchars($license_key) . '
+ ' . htmlspecialchars($lbl_license_expiry) . ': 2099-12-31 +
'; + } + + $html .= ' + +'; + + return [$html, $customer_email, $order_id]; } \ No newline at end of file diff --git a/assets/mollie/.DS_Store b/assets/mollie/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9c0e967f31d0281547eddca8985b83077aa7c9d4 GIT binary patch literal 6148 zcmeHKy-ve05I(mBr68n^jNX|02B8WQLJV0MP#aW+Ca!|$z?3IL4DbNF0qnd13*XsC znlzLVq3TXLf6o0lmoJf>BO)`o&&EU}B8s4ly&;Alg#D}?>51h4Xn2irI&=BbTL+zJ zHT*{g_}%sCj!K#>=FRtaezo@GE=i^fH-#noIC^+Hd3`x;db3}=%iG4P!zZMD-*1(c z#ljVHSn&1GKCS463d+b)*{b*1!9hb1%U;RxlQ<0>T3^ zAr%->jkFjhq{D6{E*7i;hIBI0d>Fa2kq*W9yJLOp!^y+}byNnFfi?sEa5>`h|7?5z z-%ipiWk4C&DF)0SNs|d4NzT^J!|_>bq1R9rj;jLJDVX@97_od5A49#sZg~QX1*?Ft QK=enz)1ZSg@TUxX0r^){uK)l5 literal 0 HcmV?d00001 diff --git a/assets/mollie/LICENSE b/assets/mollie/LICENSE new file mode 100644 index 0000000..12c9d8d --- /dev/null +++ b/assets/mollie/LICENSE @@ -0,0 +1,8 @@ +Copyright (c) 2013-2016, Mollie B.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/assets/mollie/README.md b/assets/mollie/README.md new file mode 100644 index 0000000..c291359 --- /dev/null +++ b/assets/mollie/README.md @@ -0,0 +1,231 @@ +

+ +

+

Mollie API client for PHP

+ + + +Accepting [iDEAL](https://www.mollie.com/payments/ideal/), [Apple Pay](https://www.mollie.com/payments/apple-pay), [Bancontact](https://www.mollie.com/payments/bancontact/), [SOFORT Banking](https://www.mollie.com/payments/sofort/), [Creditcard](https://www.mollie.com/payments/credit-card/), [SEPA Bank transfer](https://www.mollie.com/payments/bank-transfer/), [SEPA Direct debit](https://www.mollie.com/payments/direct-debit/), [PayPal](https://www.mollie.com/payments/paypal/), [Belfius Direct Net](https://www.mollie.com/payments/belfius/), [KBC/CBC](https://www.mollie.com/payments/kbc-cbc/), [paysafecard](https://www.mollie.com/payments/paysafecard/), [ING Home'Pay](https://www.mollie.com/payments/ing-homepay/), [Giropay](https://www.mollie.com/payments/giropay/), [EPS](https://www.mollie.com/payments/eps/), [Przelewy24](https://www.mollie.com/payments/przelewy24/), [Postepay](https://www.mollie.com/en/payments/postepay), [In3](https://www.mollie.com/payments/in3/), [Klarna](https://www.mollie.com/payments/klarna-pay-later/) ([Pay now](https://www.mollie.com/payments/klarna-pay-now/), [Pay later](https://www.mollie.com/payments/klarna-pay-later/), [Slice it](https://www.mollie.com/payments/klarna-slice-it/), [Pay in 3](https://www.mollie.com/payments/klarna-pay-in-3/)), [Giftcard](https://www.mollie.com/payments/gift-cards/) and [Voucher](https://www.mollie.com/en/payments/meal-eco-gift-vouchers) online payments without fixed monthly costs or any punishing registration procedures. Just use the Mollie API to receive payments directly on your website or easily refund transactions to your customers. + +[![Build Status](https://github.com/mollie/mollie-api-php/workflows/tests/badge.svg)](https://github.com/mollie/mollie-api-php/actions) +[![Latest Stable Version](https://poser.pugx.org/mollie/mollie-api-php/v/stable)](https://packagist.org/packages/mollie/mollie-api-php) +[![Total Downloads](https://poser.pugx.org/mollie/mollie-api-php/downloads)](https://packagist.org/packages/mollie/mollie-api-php) + +## Requirements ## +To use the Mollie API client, the following things are required: + ++ Get yourself a free [Mollie account](https://www.mollie.com/signup). No sign up costs. ++ Now you're ready to use the Mollie API client in test mode. ++ Follow [a few steps](https://www.mollie.com/dashboard/?modal=onboarding) to enable payment methods in live mode, and let us handle the rest. ++ PHP >= 7.0 ++ Up-to-date OpenSSL (or other SSL/TLS toolkit) + +For leveraging [Mollie Connect](https://docs.mollie.com/oauth/overview) (advanced use cases only), we recommend also installing our [OAuth2 client](https://github.com/mollie/oauth2-mollie-php). + +## Composer Installation ## + +By far the easiest way to install the Mollie API client is to require it with [Composer](http://getcomposer.org/doc/00-intro.md). + + $ composer require mollie/mollie-api-php:^2.0 + + { + "require": { + "mollie/mollie-api-php": "^2.0" + } + } + +The version of the API client corresponds to the version of the API it implements. Check the [notes on migration](https://docs.mollie.com/migrating-v1-to-v2) to see what changes you need to make if you want to start using a newer API version. + + +## Manual Installation ## +If you're not familiar with using composer we've added a ZIP file to the releases containing the API client and all the packages normally installed by composer. +Download the ``mollie-api-php.zip`` from the [releases page](https://github.com/mollie/mollie-api-php/releases). + +Include the ``vendor/autoload.php`` as shown in [Initialize example](https://github.com/mollie/mollie-api-php/blob/master/examples/initialize.php). + +## How to receive payments ## + +To successfully receive a payment, these steps should be implemented: + +1. Use the Mollie API client to create a payment with the requested amount, currency, description and optionally, a payment method. It is important to specify a unique redirect URL where the customer is supposed to return to after the payment is completed. + +2. Immediately after the payment is completed, our platform will send an asynchronous request to the configured webhook to allow the payment details to be retrieved, so you know when exactly to start processing the customer's order. + +3. The customer returns, and should be satisfied to see that the order was paid and is now being processed. + +Find our full documentation online on [docs.mollie.com](https://docs.mollie.com). + +## Getting started ## + +Initializing the Mollie API client, and setting your API key. + +```php +$mollie = new \Mollie\Api\MollieApiClient(); +$mollie->setApiKey("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM"); +``` + +Creating a new payment. + +```php +$payment = $mollie->payments->create([ + "amount" => [ + "currency" => "EUR", + "value" => "10.00" + ], + "description" => "My first API payment", + "redirectUrl" => "https://webshop.example.org/order/12345/", + "webhookUrl" => "https://webshop.example.org/mollie-webhook/", +]); +``` +_After creation, the payment id is available in the `$payment->id` property. You should store this id with your order._ + +After storing the payment id you can send the customer to the checkout using the `$payment->getCheckoutUrl()`. + +```php +header("Location: " . $payment->getCheckoutUrl(), true, 303); +``` +_This header location should always be a GET, thus we enforce 303 http response code_ + +For a payment create example, see [Example - New Payment](https://github.com/mollie/mollie-api-php/blob/master/examples/payments/create-payment.php). + +## Retrieving payments ## +We can use the `$payment->id` to retrieve a payment and check if the payment `isPaid`. + +```php +$payment = $mollie->payments->get($payment->id); + +if ($payment->isPaid()) +{ + echo "Payment received."; +} +``` + +Or retrieve a collection of payments. + +```php +$payments = $mollie->payments->page(); +``` + +For an extensive example of listing payments with the details and status, see [Example - List Payments](https://github.com/mollie/mollie-api-php/blob/master/examples/payments/list-payments.php). + +## Payment webhook ## + +When the status of a payment changes the `webhookUrl` we specified in the creation of the payment will be called. +There we can use the `id` from our POST parameters to check te status and act upon that, see [Example - Webhook](https://github.com/mollie/mollie-api-php/blob/master/examples/payments/webhook.php). + + +## Multicurrency ## +Since 2.0 it is now possible to create non-EUR payments for your customers. +A full list of available currencies can be found [in our documentation](https://docs.mollie.com/guides/multicurrency). + +```php +$payment = $mollie->payments->create([ + "amount" => [ + "currency" => "USD", + "value" => "10.00" + ], + "description" => "Order #12345", + "redirectUrl" => "https://webshop.example.org/order/12345/", + "webhookUrl" => "https://webshop.example.org/mollie-webhook/", +]); +``` +_After creation, the `settlementAmount` will contain the EUR amount that will be settled on your account._ + + +### Fully integrated iDEAL payments ### + +If you want to fully integrate iDEAL payments in your web site, some additional steps are required. First, you need to +retrieve the list of issuers (banks) that support iDEAL and have your customer pick the issuer he/she wants to use for +the payment. + +Retrieve the iDEAL method and include the issuers + +```php +$method = $mollie->methods->get(\Mollie\Api\Types\PaymentMethod::IDEAL, ["include" => "issuers"]); +``` + +_`$method->issuers` will be a list of objects. Use the property `$id` of this object in the + API call, and the property `$name` for displaying the issuer to your customer. For a more in-depth example, see [Example - iDEAL payment](https://github.com/mollie/mollie-api-php/blob/master/examples/payments/create-ideal-payment.php)._ + +Create a payment with the selected issuer: + +```php +$payment = $mollie->payments->create([ + "amount" => [ + "currency" => "EUR", + "value" => "10.00" + ], + "description" => "My first API payment", + "redirectUrl" => "https://webshop.example.org/order/12345/", + "webhookUrl" => "https://webshop.example.org/mollie-webhook/", + "method" => \Mollie\Api\Types\PaymentMethod::IDEAL, + "issuer" => $selectedIssuerId, // e.g. "ideal_INGBNL2A" +]); +``` + +_The `_links` property of the `$payment` object will contain an object `checkout` with a `href` property, which is a URL that points directly to the online banking environment of the selected issuer. +A short way of retrieving this URL can be achieved by using the `$payment->getCheckoutUrl()`._ + +### Refunding payments ### + +The API also supports refunding payments. Note that there is no confirmation and that all refunds are immediate and +definitive. refunds are supported for all methods except for paysafecard and gift cards. + +```php +$payment = $mollie->payments->get($payment->id); + +// Refund € 2 of this payment +$refund = $payment->refund([ + "amount" => [ + "currency" => "EUR", + "value" => "2.00" + ] +]); +``` + +For a working example, see [Example - Refund payment](https://github.com/mollie/mollie-api-php/blob/master/examples/payments/refund-payment.php). + +## Enabling debug mode + +When debugging it can be convenient to have the submitted request available on the `ApiException`. + +In order to prevent leaking sensitive request data into your local application logs, debugging is disabled by default. + +To enable debugging and inspect the request: + +```php +/** @var $mollie \Mollie\Api\MollieApiClient */ +$mollie->enableDebugging(); + +try { + $mollie->payments->get('tr_12345678'); +} catch (\Mollie\Api\Exceptions\ApiException $exception) { + $request = $exception->getRequest(); +} +``` + +If you're logging the `ApiException`, the request will also be logged. Make sure to not retain any sensitive data in +these logs and clean up after debugging. + +To disable debugging again: + +```php +/** @var $mollie \Mollie\Api\MollieApiClient */ +$mollie->disableDebugging(); +``` + +Note that debugging is only available when using the default Guzzle http adapter (`Guzzle6And7MollieHttpAdapter`). + +## API documentation ## +If you wish to learn more about our API, please visit the [Mollie Developer Portal](https://www.mollie.com/developers). API Documentation is available in English. + +## Want to help us make our API client even better? ## + +Want to help us make our API client even better? We take [pull requests](https://github.com/mollie/mollie-api-php/pulls?utf8=%E2%9C%93&q=is%3Apr), sure. But how would you like to contribute to a technology oriented organization? Mollie is hiring developers and system engineers. [Check out our vacancies](https://jobs.mollie.com/) or [get in touch](mailto:personeel@mollie.com). + +## License ## +[BSD (Berkeley Software Distribution) License](https://opensource.org/licenses/bsd-license.php). +Copyright (c) 2013-2018, Mollie B.V. + +## Support ## +Contact: [www.mollie.com](https://www.mollie.com) — info@mollie.com — +31 20 820 20 70 diff --git a/assets/mollie/composer.json b/assets/mollie/composer.json new file mode 100644 index 0000000..8b4dd00 --- /dev/null +++ b/assets/mollie/composer.json @@ -0,0 +1,84 @@ +{ + "name": "mollie\/mollie-api-php", + "description": "Mollie API client library for PHP. Mollie is a European Payment Service provider and offers international payment methods such as Mastercard, VISA, American Express and PayPal, and local payment methods such as iDEAL, Bancontact, SOFORT Banking, SEPA direct debit, Belfius Direct Net, KBC Payment Button and various gift cards such as Podiumcadeaukaart and fashioncheque.", + "keywords": [ + "mollie", + "payment", + "service", + "ideal", + "creditcard", + "apple pay", + "mistercash", + "bancontact", + "sofort", + "sofortbanking", + "sepa", + "paypal", + "paysafecard", + "podiumcadeaukaart", + "przelewy24", + "banktransfer", + "direct debit", + "belfius", + "belfius direct net", + "refunds", + "api", + "payments", + "gateway", + "subscriptions", + "recurring", + "charges", + "kbc", + "cbc", + "gift cards", + "intersolve", + "fashioncheque", + "inghomepay", + "klarna", + "paylater", + "sliceit" + ], + "homepage": "https:\/\/www.mollie.com\/en\/developers", + "license": "BSD-2-Clause", + "authors": [ + { + "name": "Mollie B.V.", + "email": "info@mollie.com" + } + ], + "require": { + "php": "^7.2|^8.0", + "ext-curl": "*", + "ext-json": "*", + "ext-openssl": "*", + "composer\/ca-bundle": "^1.2" + }, + "require-dev": { + "eloquent\/liberator": "^2.0||^3.0", + "friendsofphp\/php-cs-fixer": "^3.0", + "guzzlehttp\/guzzle": "^6.3", + "phpstan\/phpstan": "^1.4", + "phpunit\/phpunit": "^8.5 || ^9.5" + }, + "suggest": { + "mollie\/oauth2-mollie-php": "Use OAuth to authenticate with the Mollie API. This is needed for some endpoints. Visit https:\/\/docs.mollie.com\/ for more information." + }, + "config": { + "sort-packages": true + }, + "autoload": { + "psr-4": { + "Mollie\\Api\\": "src\/" + } + }, + "autoload-dev": { + "psr-4": { + "_PhpScoperf7c63b60b99d\\Tests\\": "tests\/", + "_PhpScoperf7c63b60b99d\\Tests\\Mollie\\Api\\": "tests\/Mollie\/API\/" + } + }, + "scripts": { + "test": ".\/vendor\/bin\/phpunit tests", + "format": ".\/vendor\/bin\/php-cs-fixer fix --allow-risky=yes" + } +} \ No newline at end of file diff --git a/assets/mollie/src/.DS_Store b/assets/mollie/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c6ec5837655044ebf2159e546cc74c086deb766e GIT binary patch literal 6148 zcmeHKyH3L}6umB?>SO5!Z21JbFfpW6EAiMUA5i)bAT>$V2Wq!`0umb^!iJdm4t|Am zuPumGTVg^8`AYV2?Q@-zlf+6?;Rg= z@h;ad^5}HT=ke6RwDd(okG_Y&BAewI?}peRX`ilX z3%79>w#z3k_NYg3Dc_^C#IO`9agbGh2P;C=4`r^b%n3!w)iHl8 zbW(}NPzMKs1GWQu`e%#x|GxkHZzqLc!GYkwzj8oDy+N;wTQYm=&du>&8>0+SIG9&x lloV8EJC+7-#fK;o7>l_9Obiwp(Srzo1jL3=1qXiBfltOd+L-_V literal 0 HcmV?d00001 diff --git a/assets/mollie/src/CompatibilityChecker.php b/assets/mollie/src/CompatibilityChecker.php new file mode 100644 index 0000000..1639156 --- /dev/null +++ b/assets/mollie/src/CompatibilityChecker.php @@ -0,0 +1,47 @@ +satisfiesPhpVersion()) { + throw new \Mollie\Api\Exceptions\IncompatiblePlatform("The client requires PHP version >= " . self::MIN_PHP_VERSION . ", you have " . \PHP_VERSION . ".", \Mollie\Api\Exceptions\IncompatiblePlatform::INCOMPATIBLE_PHP_VERSION); + } + if (!$this->satisfiesJsonExtension()) { + throw new \Mollie\Api\Exceptions\IncompatiblePlatform("PHP extension json is not enabled. Please make sure to enable 'json' in your PHP configuration.", \Mollie\Api\Exceptions\IncompatiblePlatform::INCOMPATIBLE_JSON_EXTENSION); + } + } + /** + * @return bool + * @codeCoverageIgnore + */ + public function satisfiesPhpVersion() + { + return (bool) \version_compare(\PHP_VERSION, self::MIN_PHP_VERSION, ">="); + } + /** + * @return bool + * @codeCoverageIgnore + */ + public function satisfiesJsonExtension() + { + // Check by extension_loaded + if (\function_exists('extension_loaded') && \extension_loaded('json')) { + return \true; + } elseif (\function_exists('json_encode')) { + return \true; + } + return \false; + } +} diff --git a/assets/mollie/src/Endpoints/BalanceEndpoint.php b/assets/mollie/src/Endpoints/BalanceEndpoint.php new file mode 100644 index 0000000..20a3562 --- /dev/null +++ b/assets/mollie/src/Endpoints/BalanceEndpoint.php @@ -0,0 +1,74 @@ +client, $count, $_links); + } + /** + * @inheritDoc + */ + protected function getResourceObject() + { + return new \Mollie\Api\Resources\Balance($this->client); + } + /** + * Retrieve a single balance from Mollie. + * + * Will throw an ApiException if the balance id is invalid or the resource cannot be found. + * + * @param string $balanceId + * @param array $parameters + * @return \Mollie\Api\Resources\Balance|\Mollie\Api\Resources\BaseResource + * @throws ApiException + */ + public function get(string $balanceId, array $parameters = []) + { + if (empty($balanceId) || \strpos($balanceId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid balance ID: '{$balanceId}'. A balance ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + return parent::rest_read($balanceId, $parameters); + } + /** + * Retrieve the primary balance from Mollie. + * + * Will throw an ApiException if the balance id is invalid or the resource cannot be found. + * + * @param array $parameters + * @return \Mollie\Api\Resources\Balance|\Mollie\Api\Resources\BaseResource + * @throws ApiException + */ + public function primary(array $parameters = []) + { + return parent::rest_read("primary", $parameters); + } + /** + * Retrieves a collection of Balances from Mollie. + * + * @param string|null $from The first Balance ID you want to include in your list. + * @param int|null $limit + * @param array $parameters + * + * @return BaseCollection|BalanceCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function page(?string $from = null, ?int $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/BalanceReportEndpoint.php b/assets/mollie/src/Endpoints/BalanceReportEndpoint.php new file mode 100644 index 0000000..0512f3b --- /dev/null +++ b/assets/mollie/src/Endpoints/BalanceReportEndpoint.php @@ -0,0 +1,57 @@ +client); + } + /** + * Retrieve a balance report for the provided balance id and parameters. + * + * @param string $balanceId + * @param array $parameters + * @return \Mollie\Api\Resources\BalanceReport|\Mollie\Api\Resources\BaseResource + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getForId(string $balanceId, array $parameters = []) + { + $this->parentId = $balanceId; + $result = $this->client->performHttpCall(self::REST_READ, $this->getResourcePath() . $this->buildQueryString($parameters)); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, $this->getResourceObject()); + } + /** + * Retrieve the primary balance. + * This is the balance of your account’s primary currency, where all payments are settled to by default. + * + * @param array $parameters + * @return \Mollie\Api\Resources\BalanceReport|\Mollie\Api\Resources\BaseResource + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getForPrimary(array $parameters = []) + { + return $this->getForId("primary", $parameters); + } + /** + * Retrieve a balance report for the provided balance resource and parameters. + * + * @param \Mollie\Api\Resources\Balance $balance + * @param array $parameters + * @return \Mollie\Api\Resources\BalanceReport|\Mollie\Api\Resources\BaseResource + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getFor(\Mollie\Api\Resources\Balance $balance, array $parameters = []) + { + return $this->getForId($balance->id, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/BalanceTransactionEndpoint.php b/assets/mollie/src/Endpoints/BalanceTransactionEndpoint.php new file mode 100644 index 0000000..24261f3 --- /dev/null +++ b/assets/mollie/src/Endpoints/BalanceTransactionEndpoint.php @@ -0,0 +1,73 @@ +client, $count, $_links); + } + /** + * @inheritDoc + */ + protected function getResourceObject() + { + return new \Mollie\Api\Resources\BalanceTransaction($this->client); + } + /** + * List the transactions for a specific Balance. + * + * @param Balance $balance + * @param array $parameters + * @return BalanceTransactionCollection|\Mollie\Api\Resources\BaseCollection + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listFor(\Mollie\Api\Resources\Balance $balance, array $parameters = []) + { + return $this->listForId($balance->id, $parameters); + } + /** + * List the transactions for a specific Balance ID. + * + * @param string $balanceId + * @param array $parameters + * @return BalanceTransactionCollection|\Mollie\Api\Resources\BaseCollection + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listForId(string $balanceId, array $parameters = []) + { + $this->parentId = $balanceId; + return parent::rest_list(null, null, $parameters); + } + /** + * List the transactions for the primary Balance. + * + * @param array $parameters + * @return BalanceTransactionCollection|\Mollie\Api\Resources\BaseCollection + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listForPrimary(array $parameters = []) + { + $this->parentId = "primary"; + return parent::rest_list(null, null, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/ChargebackEndpoint.php b/assets/mollie/src/Endpoints/ChargebackEndpoint.php new file mode 100644 index 0000000..51f1a7f --- /dev/null +++ b/assets/mollie/src/Endpoints/ChargebackEndpoint.php @@ -0,0 +1,46 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return ChargebackCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\ChargebackCollection($this->client, $count, $_links); + } + /** + * Retrieves a collection of Chargebacks from Mollie. + * + * @param string $from The first chargeback ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return ChargebackCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/ClientEndpoint.php b/assets/mollie/src/Endpoints/ClientEndpoint.php new file mode 100644 index 0000000..9d763bb --- /dev/null +++ b/assets/mollie/src/Endpoints/ClientEndpoint.php @@ -0,0 +1,63 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return ClientCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\ClientCollection($this->client, $count, $_links); + } + /** + * Retrieve a client from Mollie. + * + * Will throw an ApiException if the client id is invalid or the resource cannot be found. + * The client id corresponds to the organization id, for example "org_1337". + * + * @param string $clientId + * @param array $parameters + * + * @return Client + * @throws ApiException + */ + public function get($clientId, array $parameters = []) + { + if (empty($clientId)) { + throw new \Mollie\Api\Exceptions\ApiException("Client ID is empty."); + } + return parent::rest_read($clientId, $parameters); + } + /** + * Retrieves a page of clients from Mollie. + * + * @param string $from The first client ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return ClientCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/ClientLinkEndpoint.php b/assets/mollie/src/Endpoints/ClientLinkEndpoint.php new file mode 100644 index 0000000..2c3bec8 --- /dev/null +++ b/assets/mollie/src/Endpoints/ClientLinkEndpoint.php @@ -0,0 +1,36 @@ +client); + } + /** + * Creates a client link in Mollie. + * + * @param array $data An array containing details on the client link. + * + * @return ClientLink + * @throws ApiException + */ + public function create(array $data = []) : \Mollie\Api\Resources\ClientLink + { + return $this->rest_create($data, []); + } +} diff --git a/assets/mollie/src/Endpoints/CollectionEndpointAbstract.php b/assets/mollie/src/Endpoints/CollectionEndpointAbstract.php new file mode 100644 index 0000000..6fda3e0 --- /dev/null +++ b/assets/mollie/src/Endpoints/CollectionEndpointAbstract.php @@ -0,0 +1,41 @@ + $from, "limit" => $limit], $filters); + $apiPath = $this->getResourcePath() . $this->buildQueryString($filters); + $result = $this->client->performHttpCall(self::REST_LIST, $apiPath); + /** @var BaseCollection $collection */ + $collection = $this->getResourceCollectionObject($result->count, $result->_links); + foreach ($result->_embedded->{$collection->getCollectionResourceName()} as $dataResult) { + $collection[] = \Mollie\Api\Resources\ResourceFactory::createFromApiResult($dataResult, $this->getResourceObject()); + } + return $collection; + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return BaseCollection + */ + protected abstract function getResourceCollectionObject($count, $_links); +} diff --git a/assets/mollie/src/Endpoints/CustomerEndpoint.php b/assets/mollie/src/Endpoints/CustomerEndpoint.php new file mode 100644 index 0000000..0be4c5b --- /dev/null +++ b/assets/mollie/src/Endpoints/CustomerEndpoint.php @@ -0,0 +1,111 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return CustomerCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\CustomerCollection($this->client, $count, $_links); + } + /** + * Creates a customer in Mollie. + * + * @param array $data An array containing details on the customer. + * @param array $filters + * + * @return Customer + * @throws ApiException + */ + public function create(array $data = [], array $filters = []) + { + return $this->rest_create($data, $filters); + } + /** + * Retrieve a single customer from Mollie. + * + * Will throw a ApiException if the customer id is invalid or the resource cannot be found. + * + * @param string $customerId + * @param array $parameters + * @return Customer + * @throws ApiException + */ + public function get($customerId, array $parameters = []) + { + return $this->rest_read($customerId, $parameters); + } + /** + * Update a specific Customer resource. + * + * Will throw an ApiException if the customer id is invalid or the resource cannot be found. + * + * @param string $customerId + * + * @param array $data + * @return Customer + * @throws ApiException + */ + public function update($customerId, array $data = []) + { + if (empty($customerId) || \strpos($customerId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid order ID: '{$customerId}'. An order ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + return parent::rest_update($customerId, $data); + } + /** + * Deletes the given Customer. + * + * Will throw a ApiException if the customer id is invalid or the resource cannot be found. + * Returns with HTTP status No Content (204) if successful. + * + * @param string $customerId + * + * @param array $data + * @return null + * @throws ApiException + */ + public function delete($customerId, array $data = []) + { + return $this->rest_delete($customerId, $data); + } + /** + * Retrieves a collection of Customers from Mollie. + * + * @param string $from The first customer ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return CustomerCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/CustomerPaymentsEndpoint.php b/assets/mollie/src/Endpoints/CustomerPaymentsEndpoint.php new file mode 100644 index 0000000..0acacc1 --- /dev/null +++ b/assets/mollie/src/Endpoints/CustomerPaymentsEndpoint.php @@ -0,0 +1,88 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return PaymentCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\PaymentCollection($this->client, $count, $_links); + } + /** + * Create a subscription for a Customer + * + * @param Customer $customer + * @param array $options + * @param array $filters + * + * @return Payment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createFor(\Mollie\Api\Resources\Customer $customer, array $options = [], array $filters = []) + { + return $this->createForId($customer->id, $options, $filters); + } + /** + * Create a subscription for a Customer ID + * + * @param string $customerId + * @param array $options + * @param array $filters + * + * @return \Mollie\Api\Resources\Payment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createForId($customerId, array $options = [], array $filters = []) + { + $this->parentId = $customerId; + return parent::rest_create($options, $filters); + } + /** + * @param Customer $customer + * @param string $from The first resource ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return PaymentCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listFor(\Mollie\Api\Resources\Customer $customer, $from = null, $limit = null, array $parameters = []) + { + return $this->listForId($customer->id, $from, $limit, $parameters); + } + /** + * @param string $customerId + * @param string $from The first resource ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return \Mollie\Api\Resources\PaymentCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listForId($customerId, $from = null, $limit = null, array $parameters = []) + { + $this->parentId = $customerId; + return parent::rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/EndpointAbstract.php b/assets/mollie/src/Endpoints/EndpointAbstract.php new file mode 100644 index 0000000..6c8820a --- /dev/null +++ b/assets/mollie/src/Endpoints/EndpointAbstract.php @@ -0,0 +1,163 @@ +client = $api; + } + /** + * @param array $filters + * @return string + */ + protected function buildQueryString(array $filters) + { + if (empty($filters)) { + return ""; + } + foreach ($filters as $key => $value) { + if ($value === \true) { + $filters[$key] = "true"; + } + if ($value === \false) { + $filters[$key] = "false"; + } + } + return "?" . \http_build_query($filters, "", "&"); + } + /** + * @param array $body + * @param array $filters + * @return mixed + * @throws ApiException + */ + protected function rest_create(array $body, array $filters) + { + $result = $this->client->performHttpCall(self::REST_CREATE, $this->getResourcePath() . $this->buildQueryString($filters), $this->parseRequestBody($body)); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, $this->getResourceObject()); + } + /** + * Sends a PATCH request to a single Mollie API object. + * + * @param string $id + * @param array $body + * + * @return mixed + * @throws ApiException + */ + protected function rest_update($id, array $body = []) + { + if (empty($id)) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid resource id."); + } + $id = \urlencode($id); + $result = $this->client->performHttpCall(self::REST_UPDATE, "{$this->getResourcePath()}/{$id}", $this->parseRequestBody($body)); + if ($result == null) { + return null; + } + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, $this->getResourceObject()); + } + /** + * Retrieves a single object from the REST API. + * + * @param string $id Id of the object to retrieve. + * @param array $filters + * @return mixed + * @throws ApiException + */ + protected function rest_read($id, array $filters) + { + if (empty($id)) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid resource id."); + } + $id = \urlencode($id); + $result = $this->client->performHttpCall(self::REST_READ, "{$this->getResourcePath()}/{$id}" . $this->buildQueryString($filters)); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, $this->getResourceObject()); + } + /** + * Sends a DELETE request to a single Molle API object. + * + * @param string $id + * @param array $body + * + * @return mixed + * @throws ApiException + */ + protected function rest_delete($id, array $body = []) + { + if (empty($id)) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid resource id."); + } + $id = \urlencode($id); + $result = $this->client->performHttpCall(self::REST_DELETE, "{$this->getResourcePath()}/{$id}", $this->parseRequestBody($body)); + if ($result == null) { + return null; + } + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, $this->getResourceObject()); + } + /** + * Get the object that is used by this API endpoint. Every API endpoint uses one type of object. + * + * @return BaseResource + */ + protected abstract function getResourceObject(); + /** + * @param string $resourcePath + */ + public function setResourcePath($resourcePath) + { + $this->resourcePath = \strtolower($resourcePath); + } + /** + * @return string + * @throws ApiException + */ + public function getResourcePath() + { + if (\strpos($this->resourcePath, "_") !== \false) { + [$parentResource, $childResource] = \explode("_", $this->resourcePath, 2); + if (empty($this->parentId)) { + throw new \Mollie\Api\Exceptions\ApiException("Subresource '{$this->resourcePath}' used without parent '{$parentResource}' ID."); + } + return "{$parentResource}/{$this->parentId}/{$childResource}"; + } + return $this->resourcePath; + } + /** + * @param array $body + * @return null|string + */ + protected function parseRequestBody(array $body) + { + if (empty($body)) { + return null; + } + return @\json_encode($body); + } +} diff --git a/assets/mollie/src/Endpoints/InvoiceEndpoint.php b/assets/mollie/src/Endpoints/InvoiceEndpoint.php new file mode 100644 index 0000000..ae3dc0b --- /dev/null +++ b/assets/mollie/src/Endpoints/InvoiceEndpoint.php @@ -0,0 +1,73 @@ +client); + } + /** + * Get the collection object that is used by this API. Every API uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return \Mollie\Api\Resources\BaseCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\InvoiceCollection($this->client, $count, $_links); + } + /** + * Retrieve an Invoice from Mollie. + * + * Will throw a ApiException if the invoice id is invalid or the resource cannot be found. + * + * @param string $invoiceId + * @param array $parameters + * + * @return Invoice + * @throws ApiException + */ + public function get($invoiceId, array $parameters = []) + { + return $this->rest_read($invoiceId, $parameters); + } + /** + * Retrieves a collection of Invoices from Mollie. + * + * @param string $from The first invoice ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return InvoiceCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } + /** + * This is a wrapper method for page + * + * @param array $parameters + * + * @return \Mollie\Api\Resources\BaseCollection + * @throws ApiException + */ + public function all(array $parameters = []) + { + return $this->page(null, null, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/MandateEndpoint.php b/assets/mollie/src/Endpoints/MandateEndpoint.php new file mode 100644 index 0000000..b4118b3 --- /dev/null +++ b/assets/mollie/src/Endpoints/MandateEndpoint.php @@ -0,0 +1,134 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return MandateCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\MandateCollection($this->client, $count, $_links); + } + /** + * @param Customer $customer + * @param array $options + * @param array $filters + * + * @return \Mollie\Api\Resources\Mandate + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createFor(\Mollie\Api\Resources\Customer $customer, array $options = [], array $filters = []) + { + return $this->createForId($customer->id, $options, $filters); + } + /** + * @param string $customerId + * @param array $options + * @param array $filters + * + * @return \Mollie\Api\Resources\Mandate + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createForId($customerId, array $options = [], array $filters = []) + { + $this->parentId = $customerId; + return parent::rest_create($options, $filters); + } + /** + * @param Customer $customer + * @param string $mandateId + * @param array $parameters + * + * @return \Mollie\Api\Resources\Mandate + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getFor(\Mollie\Api\Resources\Customer $customer, $mandateId, array $parameters = []) + { + return $this->getForId($customer->id, $mandateId, $parameters); + } + /** + * @param string $customerId + * @param string $mandateId + * @param array $parameters + * + * @return \Mollie\Api\Resources\Mandate + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getForId($customerId, $mandateId, array $parameters = []) + { + $this->parentId = $customerId; + return parent::rest_read($mandateId, $parameters); + } + /** + * @param Customer $customer + * @param string $from The first resource ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return \Mollie\Api\Resources\MandateCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listFor(\Mollie\Api\Resources\Customer $customer, $from = null, $limit = null, array $parameters = []) + { + return $this->listForId($customer->id, $from, $limit, $parameters); + } + /** + * @param string $customerId + * @param null $from + * @param null $limit + * @param array $parameters + * + * @return \Mollie\Api\Resources\MandateCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listForId($customerId, $from = null, $limit = null, array $parameters = []) + { + $this->parentId = $customerId; + return parent::rest_list($from, $limit, $parameters); + } + /** + * @param Customer $customer + * @param string $mandateId + * @param array $data + * + * @return null + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function revokeFor(\Mollie\Api\Resources\Customer $customer, $mandateId, $data = []) + { + return $this->revokeForId($customer->id, $mandateId, $data); + } + /** + * @param string $customerId + * @param string $mandateId + * @param array $data + * + * @return null + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function revokeForId($customerId, $mandateId, $data = []) + { + $this->parentId = $customerId; + return parent::rest_delete($mandateId, $data); + } +} diff --git a/assets/mollie/src/Endpoints/MethodEndpoint.php b/assets/mollie/src/Endpoints/MethodEndpoint.php new file mode 100644 index 0000000..6f28ced --- /dev/null +++ b/assets/mollie/src/Endpoints/MethodEndpoint.php @@ -0,0 +1,88 @@ +client); + } + /** + * Retrieve all active methods. In test mode, this includes pending methods. The results are not paginated. + * + * @deprecated Use allActive() instead + * @param array $parameters + * + * @return \Mollie\Api\Resources\BaseCollection|\Mollie\Api\Resources\MethodCollection + * @throws ApiException + */ + public function all(array $parameters = []) + { + return $this->allActive($parameters); + } + /** + * Retrieve all active methods for the organization. In test mode, this includes pending methods. + * The results are not paginated. + * + * @param array $parameters + * + * @return \Mollie\Api\Resources\BaseCollection|\Mollie\Api\Resources\MethodCollection + * @throws ApiException + */ + public function allActive(array $parameters = []) + { + return parent::rest_list(null, null, $parameters); + } + /** + * Retrieve all available methods for the organization, including activated and not yet activated methods. The + * results are not paginated. Make sure to include the profileId parameter if using an OAuth Access Token. + * + * @param array $parameters Query string parameters. + * @return \Mollie\Api\Resources\BaseCollection|\Mollie\Api\Resources\MethodCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function allAvailable(array $parameters = []) + { + $url = 'methods/all' . $this->buildQueryString($parameters); + $result = $this->client->performHttpCall('GET', $url); + return \Mollie\Api\Resources\ResourceFactory::createBaseResourceCollection($this->client, \Mollie\Api\Resources\Method::class, $result->_embedded->methods, $result->_links); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return MethodCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\MethodCollection($count, $_links); + } + /** + * Retrieve a payment method from Mollie. + * + * Will throw a ApiException if the method id is invalid or the resource cannot be found. + * + * @param string $methodId + * @param array $parameters + * @return \Mollie\Api\Resources\Method + * @throws ApiException + */ + public function get($methodId, array $parameters = []) + { + if (empty($methodId)) { + throw new \Mollie\Api\Exceptions\ApiException("Method ID is empty."); + } + return parent::rest_read($methodId, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/OnboardingEndpoint.php b/assets/mollie/src/Endpoints/OnboardingEndpoint.php new file mode 100644 index 0000000..687a371 --- /dev/null +++ b/assets/mollie/src/Endpoints/OnboardingEndpoint.php @@ -0,0 +1,74 @@ +client); + } + /** + * Retrieve the organization's onboarding status from Mollie. + * + * Will throw a ApiException if the resource cannot be found. + * + * @return Onboarding + * @throws ApiException + */ + public function get() + { + return $this->rest_read('', []); + } + /** + * Submit data that will be prefilled in the merchant’s onboarding. + * Please note that the data you submit will only be processed when the onboarding status is needs-data. + * + * Information that the merchant has entered in their dashboard will not be overwritten. + * + * Will throw a ApiException if the resource cannot be found. + * + * @throws ApiException + */ + public function submit(array $parameters = []) + { + return $this->rest_create($parameters, []); + } + /** + * @param string $id + * @param array $filters + * + * @return mixed + * @throws \Mollie\Api\Exceptions\ApiException + */ + protected function rest_read($id, array $filters) + { + $result = $this->client->performHttpCall(self::REST_READ, $this->getResourcePath() . $this->buildQueryString($filters)); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, $this->getResourceObject()); + } + /** + * @param array $body + * @param array $filters + * + * @return mixed + * @throws \Mollie\Api\Exceptions\ApiException + */ + protected function rest_create(array $body, array $filters) + { + $this->client->performHttpCall(self::REST_CREATE, $this->getResourcePath() . $this->buildQueryString($filters), $this->parseRequestBody($body)); + } +} diff --git a/assets/mollie/src/Endpoints/OrderEndpoint.php b/assets/mollie/src/Endpoints/OrderEndpoint.php new file mode 100644 index 0000000..d59e4bd --- /dev/null +++ b/assets/mollie/src/Endpoints/OrderEndpoint.php @@ -0,0 +1,119 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API + * endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return OrderCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\OrderCollection($this->client, $count, $_links); + } + /** + * Creates a order in Mollie. + * + * @param array $data An array containing details on the order. + * @param array $filters + * + * @return Order + * @throws ApiException + */ + public function create(array $data = [], array $filters = []) + { + return $this->rest_create($data, $filters); + } + /** + * Update a specific Order resource + * + * Will throw a ApiException if the order id is invalid or the resource cannot be found. + * + * @param string $orderId + * + * @param array $data + * @return Order + * @throws ApiException + */ + public function update($orderId, array $data = []) + { + if (empty($orderId) || \strpos($orderId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid order ID: '{$orderId}'. An order ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + return parent::rest_update($orderId, $data); + } + /** + * Retrieve a single order from Mollie. + * + * Will throw a ApiException if the order id is invalid or the resource cannot + * be found. + * + * @param array $parameters + * @return Order + * @throws ApiException + */ + public function get($orderId, array $parameters = []) + { + if (empty($orderId) || \strpos($orderId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid order ID: '{$orderId}'. An order ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + return parent::rest_read($orderId, $parameters); + } + /** + * Cancel the given Order. + * + * If the order was partially shipped, the status will be "completed" instead of + * "canceled". + * Will throw a ApiException if the order id is invalid or the resource cannot + * be found. + * Returns the canceled order with HTTP status 200. + * + * @param string $orderId + * + * @param array $parameters + * @return Order + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function cancel($orderId, $parameters = []) + { + return $this->rest_delete($orderId, $parameters); + } + /** + * Retrieves a collection of Orders from Mollie. + * + * @param string $from The first order ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return OrderCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/OrderLineEndpoint.php b/assets/mollie/src/Endpoints/OrderLineEndpoint.php new file mode 100644 index 0000000..3e789bc --- /dev/null +++ b/assets/mollie/src/Endpoints/OrderLineEndpoint.php @@ -0,0 +1,115 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API + * endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return OrderLineCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\OrderLineCollection($count, $_links); + } + /** + * Update a specific OrderLine resource. + * + * Will throw an ApiException if the order line id is invalid or the resource cannot be found. + * + * @param string|null $orderId + * @param string $orderlineId + * + * @param array $data + * + * @return \Mollie\Api\Resources\BaseResource|null + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function update($orderId, $orderlineId, array $data = []) + { + $this->parentId = $orderId; + if (empty($orderlineId) || \strpos($orderlineId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid order line ID: '{$orderlineId}'. An order line ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + return parent::rest_update($orderlineId, $data); + } + /** + * @param string $orderId + * @param array $operations + * @param array $parameters + * @return Order|\Mollie\Api\Resources\BaseResource + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function updateMultiple(string $orderId, array $operations, array $parameters = []) + { + if (empty($orderId)) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid resource id."); + } + $this->parentId = $orderId; + $parameters['operations'] = $operations; + $result = $this->client->performHttpCall(self::REST_UPDATE, "{$this->getResourcePath()}", $this->parseRequestBody($parameters)); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Order($this->client)); + } + /** + * Cancel lines for the provided order. + * The data array must contain a lines array. + * You can pass an empty lines array if you want to cancel all eligible lines. + * Returns null if successful. + * + * @param Order $order + * @param array $data + * + * @return null + * @throws ApiException + */ + public function cancelFor(\Mollie\Api\Resources\Order $order, array $data) + { + return $this->cancelForId($order->id, $data); + } + /** + * Cancel lines for the provided order id. + * The data array must contain a lines array. + * You can pass an empty lines array if you want to cancel all eligible lines. + * Returns null if successful. + * + * @param string $orderId + * @param array $data + * + * @return null + * @throws ApiException + */ + public function cancelForId($orderId, array $data) + { + if (!isset($data['lines']) || !\is_array($data['lines'])) { + throw new \Mollie\Api\Exceptions\ApiException("A lines array is required."); + } + $this->parentId = $orderId; + $this->client->performHttpCall(self::REST_DELETE, "{$this->getResourcePath()}", $this->parseRequestBody($data)); + return null; + } +} diff --git a/assets/mollie/src/Endpoints/OrderPaymentEndpoint.php b/assets/mollie/src/Endpoints/OrderPaymentEndpoint.php new file mode 100644 index 0000000..2169d2a --- /dev/null +++ b/assets/mollie/src/Endpoints/OrderPaymentEndpoint.php @@ -0,0 +1,67 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API + * endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return \Mollie\Api\Resources\PaymentCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\PaymentCollection($this->client, $count, $_links); + } + /** + * Creates a payment in Mollie for a specific order. + * + * @param \Mollie\Api\Resources\Order $order + * @param array $data An array containing details on the order payment. + * @param array $filters + * + * @return \Mollie\Api\Resources\Payment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createFor(\Mollie\Api\Resources\Order $order, array $data, array $filters = []) + { + return $this->createForId($order->id, $data, $filters); + } + /** + * Creates a payment in Mollie for a specific order ID. + * + * @param string $orderId + * @param array $data An array containing details on the order payment. + * @param array $filters + * + * @return \Mollie\Api\Resources\Payment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createForId($orderId, array $data, array $filters = []) + { + $this->parentId = $orderId; + return $this->rest_create($data, $filters); + } +} diff --git a/assets/mollie/src/Endpoints/OrderRefundEndpoint.php b/assets/mollie/src/Endpoints/OrderRefundEndpoint.php new file mode 100644 index 0000000..5e3c58b --- /dev/null +++ b/assets/mollie/src/Endpoints/OrderRefundEndpoint.php @@ -0,0 +1,63 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return RefundCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\RefundCollection($this->client, $count, $_links); + } + /** + * Refund some order lines. You can provide an empty array for the + * "lines" data to refund all eligible lines for this order. + * + * @param Order $order + * @param array $data + * @param array $filters + * + * @return Refund + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createFor(\Mollie\Api\Resources\Order $order, array $data, array $filters = []) + { + return $this->createForId($order->id, $data, $filters); + } + /** + * Refund some order lines. You can provide an empty array for the + * "lines" data to refund all eligible lines for this order. + * + * @param string $orderId + * @param array $data + * @param array $filters + * + * @return \Mollie\Api\Resources\Refund + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createForId($orderId, array $data, array $filters = []) + { + $this->parentId = $orderId; + return parent::rest_create($data, $filters); + } +} diff --git a/assets/mollie/src/Endpoints/OrganizationEndpoint.php b/assets/mollie/src/Endpoints/OrganizationEndpoint.php new file mode 100644 index 0000000..c3b6779 --- /dev/null +++ b/assets/mollie/src/Endpoints/OrganizationEndpoint.php @@ -0,0 +1,58 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return OrganizationCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\OrganizationCollection($this->client, $count, $_links); + } + /** + * Retrieve an organization from Mollie. + * + * Will throw a ApiException if the organization id is invalid or the resource cannot be found. + * + * @param string $organizationId + * @param array $parameters + * @return Organization + * @throws ApiException + */ + public function get($organizationId, array $parameters = []) + { + if (empty($organizationId)) { + throw new \Mollie\Api\Exceptions\ApiException("Organization ID is empty."); + } + return parent::rest_read($organizationId, $parameters); + } + /** + * Retrieve the current organization from Mollie. + * + * @param array $parameters + * @return Organization + * @throws ApiException + */ + public function current(array $parameters = []) + { + return parent::rest_read('me', $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/OrganizationPartnerEndpoint.php b/assets/mollie/src/Endpoints/OrganizationPartnerEndpoint.php new file mode 100644 index 0000000..1516e46 --- /dev/null +++ b/assets/mollie/src/Endpoints/OrganizationPartnerEndpoint.php @@ -0,0 +1,49 @@ +client); + } + /** + * Retrieve details about the partner status of the currently authenticated organization. + * + * Will throw an ApiException if the resource cannot be found. + * + * @return Partner + * @throws ApiException + */ + public function get() + { + return $this->rest_read('', []); + } + /** + * @param string $id + * @param array $filters + * + * @return mixed + * @throws \Mollie\Api\Exceptions\ApiException + */ + protected function rest_read($id, array $filters) + { + $result = $this->client->performHttpCall(self::REST_READ, $this->getResourcePath() . $this->buildQueryString($filters)); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, $this->getResourceObject()); + } +} diff --git a/assets/mollie/src/Endpoints/PaymentCaptureEndpoint.php b/assets/mollie/src/Endpoints/PaymentCaptureEndpoint.php new file mode 100644 index 0000000..933aca9 --- /dev/null +++ b/assets/mollie/src/Endpoints/PaymentCaptureEndpoint.php @@ -0,0 +1,109 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return \Mollie\Api\Resources\CaptureCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\CaptureCollection($this->client, $count, $_links); + } + /** + * Creates a payment capture in Mollie. + * + * @param Payment $payment. + * @param array $data An array containing details on the capture. + * @param array $filters + * + * @return Capture + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createFor(\Mollie\Api\Resources\Payment $payment, array $data = [], array $filters = []) + { + return $this->createForId($payment->id, $data, $filters); + } + /** + * Creates a payment capture in Mollie. + * + * @param string $paymentId The payment's ID. + * @param array $data An array containing details on the capture. + * @param array $filters + * + * @return Capture + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createForId($paymentId, array $data = [], array $filters = []) + { + $this->parentId = $paymentId; + return $this->rest_create($data, $filters); + } + /** + * @param Payment $payment + * @param string $captureId + * @param array $parameters + * + * @return Capture + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getFor(\Mollie\Api\Resources\Payment $payment, $captureId, array $parameters = []) + { + return $this->getForId($payment->id, $captureId, $parameters); + } + /** + * @param string $paymentId + * @param string $captureId + * @param array $parameters + * + * @return \Mollie\Api\Resources\Capture + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getForId($paymentId, $captureId, array $parameters = []) + { + $this->parentId = $paymentId; + return parent::rest_read($captureId, $parameters); + } + /** + * @param Payment $payment + * @param array $parameters + * + * @return Capture + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listFor(\Mollie\Api\Resources\Payment $payment, array $parameters = []) + { + return $this->listForId($payment->id, $parameters); + } + /** + * @param string $paymentId + * @param array $parameters + * + * @return \Mollie\Api\Resources\BaseCollection|\Mollie\Api\Resources\Capture + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listForId($paymentId, array $parameters = []) + { + $this->parentId = $paymentId; + return parent::rest_list(null, null, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/PaymentChargebackEndpoint.php b/assets/mollie/src/Endpoints/PaymentChargebackEndpoint.php new file mode 100644 index 0000000..f4d3267 --- /dev/null +++ b/assets/mollie/src/Endpoints/PaymentChargebackEndpoint.php @@ -0,0 +1,80 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return ChargebackCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\ChargebackCollection($this->client, $count, $_links); + } + /** + * @param Payment $payment + * @param string $chargebackId + * @param array $parameters + * + * @return Chargeback + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getFor(\Mollie\Api\Resources\Payment $payment, $chargebackId, array $parameters = []) + { + return $this->getForId($payment->id, $chargebackId, $parameters); + } + /** + * @param string $paymentId + * @param string $chargebackId + * @param array $parameters + * + * @return Chargeback + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getForId($paymentId, $chargebackId, array $parameters = []) + { + $this->parentId = $paymentId; + return parent::rest_read($chargebackId, $parameters); + } + /** + * @param Payment $payment + * @param array $parameters + * + * @return Chargeback + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listFor(\Mollie\Api\Resources\Payment $payment, array $parameters = []) + { + return $this->listForId($payment->id, $parameters); + } + /** + * @param string $paymentId + * @param array $parameters + * + * @return \Mollie\Api\Resources\BaseCollection|\Mollie\Api\Resources\Chargeback + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listForId($paymentId, array $parameters = []) + { + $this->parentId = $paymentId; + return parent::rest_list(null, null, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/PaymentEndpoint.php b/assets/mollie/src/Endpoints/PaymentEndpoint.php new file mode 100644 index 0000000..a6a167f --- /dev/null +++ b/assets/mollie/src/Endpoints/PaymentEndpoint.php @@ -0,0 +1,152 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return PaymentCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\PaymentCollection($this->client, $count, $_links); + } + /** + * Creates a payment in Mollie. + * + * @param array $data An array containing details on the payment. + * @param array $filters + * + * @return Payment + * @throws ApiException + */ + public function create(array $data = [], array $filters = []) + { + return $this->rest_create($data, $filters); + } + /** + * Update the given Payment. + * + * Will throw a ApiException if the payment id is invalid or the resource cannot be found. + * + * @param string $paymentId + * + * @param array $data + * @return Payment + * @throws ApiException + */ + public function update($paymentId, array $data = []) + { + if (empty($paymentId) || \strpos($paymentId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid payment ID: '{$paymentId}'. A payment ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + return parent::rest_update($paymentId, $data); + } + /** + * Retrieve a single payment from Mollie. + * + * Will throw a ApiException if the payment id is invalid or the resource cannot be found. + * + * @param string $paymentId + * @param array $parameters + * @return Payment + * @throws ApiException + */ + public function get($paymentId, array $parameters = []) + { + if (empty($paymentId) || \strpos($paymentId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid payment ID: '{$paymentId}'. A payment ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + return parent::rest_read($paymentId, $parameters); + } + /** + * Deletes the given Payment. + * + * Will throw a ApiException if the payment id is invalid or the resource cannot be found. + * Returns with HTTP status No Content (204) if successful. + * + * @param string $paymentId + * + * @param array $data + * @return Payment + * @throws ApiException + */ + public function delete($paymentId, array $data = []) + { + return $this->rest_delete($paymentId, $data); + } + /** + * Cancel the given Payment. This is just an alias of the 'delete' method. + * + * Will throw a ApiException if the payment id is invalid or the resource cannot be found. + * Returns with HTTP status No Content (204) if successful. + * + * @param string $paymentId + * + * @param array $data + * @return Payment + * @throws ApiException + */ + public function cancel($paymentId, array $data = []) + { + return $this->rest_delete($paymentId, $data); + } + /** + * Retrieves a collection of Payments from Mollie. + * + * @param string $from The first payment ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return PaymentCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } + /** + * Issue a refund for the given payment. + * + * The $data parameter may either be an array of endpoint parameters, a float value to + * initiate a partial refund, or empty to do a full refund. + * + * @param Payment $payment + * @param array|float|null $data + * + * @return Refund + * @throws ApiException + */ + public function refund(\Mollie\Api\Resources\Payment $payment, $data = []) + { + $resource = "{$this->getResourcePath()}/" . \urlencode($payment->id) . "/refunds"; + $body = null; + if (($data === null ? 0 : \count($data)) > 0) { + $body = \json_encode($data); + } + $result = $this->client->performHttpCall(self::REST_CREATE, $resource, $body); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Refund($this->client)); + } +} diff --git a/assets/mollie/src/Endpoints/PaymentLinkEndpoint.php b/assets/mollie/src/Endpoints/PaymentLinkEndpoint.php new file mode 100644 index 0000000..74f105d --- /dev/null +++ b/assets/mollie/src/Endpoints/PaymentLinkEndpoint.php @@ -0,0 +1,79 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return PaymentLinkCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\PaymentLinkCollection($this->client, $count, $_links); + } + /** + * Creates a payment link in Mollie. + * + * @param array $data An array containing details on the payment link. + * @param array $filters + * + * @return PaymentLink + * @throws ApiException + */ + public function create(array $data = [], array $filters = []) + { + return $this->rest_create($data, $filters); + } + /** + * Retrieve payment link from Mollie. + * + * Will throw a ApiException if the payment link id is invalid or the resource cannot be found. + * + * @param string $paymentLinkId + * @param array $parameters + * @return PaymentLink + * @throws ApiException + */ + public function get($paymentLinkId, array $parameters = []) + { + if (empty($paymentLinkId) || \strpos($paymentLinkId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid payment link ID: '{$paymentLinkId}'. A payment link ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + return parent::rest_read($paymentLinkId, $parameters); + } + /** + * Retrieves a collection of Payment Links from Mollie. + * + * @param string $from The first payment link ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return PaymentLinkCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/PaymentRefundEndpoint.php b/assets/mollie/src/Endpoints/PaymentRefundEndpoint.php new file mode 100644 index 0000000..ab13a6a --- /dev/null +++ b/assets/mollie/src/Endpoints/PaymentRefundEndpoint.php @@ -0,0 +1,109 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return RefundCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\RefundCollection($this->client, $count, $_links); + } + /** + * @param Payment $payment + * @param string $refundId + * @param array $parameters + * + * @return Refund + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getFor(\Mollie\Api\Resources\Payment $payment, $refundId, array $parameters = []) + { + return $this->getForId($payment->id, $refundId, $parameters); + } + /** + * @param string $paymentId + * @param string $refundId + * @param array $parameters + * + * @return \Mollie\Api\Resources\Refund + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getForId($paymentId, $refundId, array $parameters = []) + { + $this->parentId = $paymentId; + return parent::rest_read($refundId, $parameters); + } + /** + * @param Payment $payment + * @param array $parameters + * + * @return Refund + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listFor(\Mollie\Api\Resources\Payment $payment, array $parameters = []) + { + return $this->listForId($payment->id, $parameters); + } + /** + * @param string $paymentId + * @param array $parameters + * + * @return \Mollie\Api\Resources\BaseCollection|\Mollie\Api\Resources\Refund + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listForId($paymentId, array $parameters = []) + { + $this->parentId = $paymentId; + return parent::rest_list(null, null, $parameters); + } + /** + * Creates a refund for a specific payment. + * + * @param Payment $payment + * @param array $data + * @param array $filters + * + * @return Refund + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createFor(\Mollie\Api\Resources\Payment $payment, array $data, array $filters = []) + { + return $this->createForId($payment->id, $data, $filters); + } + /** + * Creates a refund for a specific payment. + * + * @param string $paymentId + * @param array $data + * @param array $filters + * + * @return \Mollie\Api\Resources\Refund + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createForId(string $paymentId, array $data, array $filters = []) + { + $this->parentId = $paymentId; + return parent::rest_create($data, $filters); + } +} diff --git a/assets/mollie/src/Endpoints/PaymentRouteEndpoint.php b/assets/mollie/src/Endpoints/PaymentRouteEndpoint.php new file mode 100644 index 0000000..abf2fd1 --- /dev/null +++ b/assets/mollie/src/Endpoints/PaymentRouteEndpoint.php @@ -0,0 +1,60 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return \Mollie\Api\Resources\RouteCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\RouteCollection($this->client, $count, $_links); + } + /** + * @param Payment $payment + * @param string $routeId + * @param string $releaseDate - UTC datetime in ISO-8601 format when the funds for the following payment will become available on + * the balance of the connected account + * + * @return Route + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function updateReleaseDateFor(\Mollie\Api\Resources\Payment $payment, $routeId, $releaseDate) + { + return $this->updateReleaseDateForPaymentId($payment->id, $routeId, $releaseDate); + } + /** + * @param string $paymentId + * @param string $routeId + * @param string $releaseDate - UTC datetime in ISO-8601 format when the funds for the following payment will become available on + * the balance of the connected account + * + * @return \Mollie\Api\Resources\Route + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function updateReleaseDateForPaymentId($paymentId, $routeId, $releaseDate, $testmode = \false) + { + $this->parentId = $paymentId; + $params = ['releaseDate' => $releaseDate, 'testmode' => $testmode]; + return parent::rest_update($routeId, $params); + } +} diff --git a/assets/mollie/src/Endpoints/PermissionEndpoint.php b/assets/mollie/src/Endpoints/PermissionEndpoint.php new file mode 100644 index 0000000..eda8e3f --- /dev/null +++ b/assets/mollie/src/Endpoints/PermissionEndpoint.php @@ -0,0 +1,60 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API + * endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return PermissionCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\PermissionCollection($count, $_links); + } + /** + * Retrieve a single Permission from Mollie. + * + * Will throw an ApiException if the permission id is invalid. + * + * @param string $permissionId + * @param array $parameters + * @return Permission + * @throws ApiException + */ + public function get($permissionId, array $parameters = []) + { + return $this->rest_read($permissionId, $parameters); + } + /** + * Retrieve all permissions. + * + * @param array $parameters + * + * @return PermissionCollection + * @throws ApiException + */ + public function all(array $parameters = []) + { + return parent::rest_list(null, null, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/ProfileEndpoint.php b/assets/mollie/src/Endpoints/ProfileEndpoint.php new file mode 100644 index 0000000..fb30a2f --- /dev/null +++ b/assets/mollie/src/Endpoints/ProfileEndpoint.php @@ -0,0 +1,130 @@ +resourceClass($this->client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return ProfileCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\ProfileCollection($this->client, $count, $_links); + } + /** + * Creates a Profile in Mollie. + * + * @param array $data An array containing details on the profile. + * @param array $filters + * + * @return Profile + * @throws ApiException + */ + public function create(array $data = [], array $filters = []) + { + return $this->rest_create($data, $filters); + } + /** + * Retrieve a Profile from Mollie. + * + * Will throw an ApiException if the profile id is invalid or the resource cannot be found. + * + * @param string $profileId + * @param array $parameters + * + * @return Profile + * @throws ApiException + */ + public function get($profileId, array $parameters = []) + { + if ($profileId === 'me') { + return $this->getCurrent($parameters); + } + return $this->rest_read($profileId, $parameters); + } + /** + * Update a specific Profile resource. + * + * Will throw an ApiException if the profile id is invalid or the resource cannot be found. + * + * @param string $profileId + * + * @param array $data + * @return Profile + * @throws ApiException + */ + public function update($profileId, array $data = []) + { + if (empty($profileId) || \strpos($profileId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid profile id: '{$profileId}'. An profile id should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + return parent::rest_update($profileId, $data); + } + /** + * Retrieve the current Profile from Mollie. + * + * @param array $parameters + * + * @return CurrentProfile + * @throws ApiException + */ + public function getCurrent(array $parameters = []) + { + $this->resourceClass = \Mollie\Api\Resources\CurrentProfile::class; + return $this->rest_read('me', $parameters); + } + /** + * Delete a Profile from Mollie. + * + * Will throw a ApiException if the profile id is invalid or the resource cannot be found. + * Returns with HTTP status No Content (204) if successful. + * + * @param string $profileId + * + * @param array $data + * @return Profile + * @throws ApiException + */ + public function delete($profileId, array $data = []) + { + return $this->rest_delete($profileId, $data); + } + /** + * Retrieves a collection of Profiles from Mollie. + * + * @param string $from The first profile ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return ProfileCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/ProfileMethodEndpoint.php b/assets/mollie/src/Endpoints/ProfileMethodEndpoint.php new file mode 100644 index 0000000..82235d8 --- /dev/null +++ b/assets/mollie/src/Endpoints/ProfileMethodEndpoint.php @@ -0,0 +1,116 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return MethodCollection() + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\MethodCollection($count, $_links); + } + /** + * Enable a method for the provided Profile ID. + * + * @param string $profileId + * @param string $methodId + * @param array $data + * @return \Mollie\Api\Resources\Method + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createForId($profileId, $methodId, array $data = []) + { + $this->parentId = $profileId; + $resource = $this->getResourcePath() . '/' . \urlencode($methodId); + $body = null; + if (\count($data) > 0) { + $body = \json_encode($data); + } + $result = $this->client->performHttpCall(self::REST_CREATE, $resource, $body); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Method($this->client)); + } + /** + * Enable a method for the provided Profile object. + * + * @param Profile $profile + * @param string $methodId + * @param array $data + * @return Method + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createFor($profile, $methodId, array $data = []) + { + return $this->createForId($profile->id, $methodId, $data); + } + /** + * Enable a method for the current profile. + * + * @param string $methodId + * @param array $data + * @return \Mollie\Api\Resources\Method + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createForCurrentProfile($methodId, array $data = []) + { + return $this->createForId('me', $methodId, $data); + } + /** + * Disable a method for the provided Profile ID. + * + * @param string $profileId + * @param string $methodId + * @param array $data + * @return mixed + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function deleteForId($profileId, $methodId, array $data = []) + { + $this->parentId = $profileId; + return $this->rest_delete($methodId, $data); + } + /** + * Disable a method for the provided Profile object. + * + * @param Profile $profile + * @param string $methodId + * @param array $data + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function deleteFor($profile, $methodId, array $data = []) + { + return $this->deleteForId($profile->id, $methodId, $data); + } + /** + * Disable a method for the current profile. + * + * @param string $methodId + * @param array $data + * @return \Mollie\Api\Resources\Method + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function deleteForCurrentProfile($methodId, array $data) + { + return $this->deleteForId('me', $methodId, $data); + } +} diff --git a/assets/mollie/src/Endpoints/RefundEndpoint.php b/assets/mollie/src/Endpoints/RefundEndpoint.php new file mode 100644 index 0000000..00ea583 --- /dev/null +++ b/assets/mollie/src/Endpoints/RefundEndpoint.php @@ -0,0 +1,46 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return RefundCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\RefundCollection($this->client, $count, $_links); + } + /** + * Retrieves a collection of Refunds from Mollie. + * + * @param string $from The first refund ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return RefundCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/SettlementPaymentEndpoint.php b/assets/mollie/src/Endpoints/SettlementPaymentEndpoint.php new file mode 100644 index 0000000..c70785f --- /dev/null +++ b/assets/mollie/src/Endpoints/SettlementPaymentEndpoint.php @@ -0,0 +1,40 @@ +client); + } + /** + * @inheritDoc + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\PaymentCollection($this->client, $count, $_links); + } + /** + * Retrieves a collection of Payments from Mollie. + * + * @param string $settlementId + * @param string $from The first payment ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return mixed + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function pageForId($settlementId, $from = null, $limit = null, array $parameters = []) + { + $this->parentId = $settlementId; + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/SettlementsEndpoint.php b/assets/mollie/src/Endpoints/SettlementsEndpoint.php new file mode 100644 index 0000000..66daccd --- /dev/null +++ b/assets/mollie/src/Endpoints/SettlementsEndpoint.php @@ -0,0 +1,80 @@ +client); + } + /** + * Get the collection object that is used by this API. Every API uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return \Mollie\Api\Resources\BaseCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\SettlementCollection($this->client, $count, $_links); + } + /** + * Retrieve a single settlement from Mollie. + * + * Will throw a ApiException if the settlement id is invalid or the resource cannot be found. + * + * @param string $settlementId + * @param array $parameters + * @return Settlement + * @throws ApiException + */ + public function get($settlementId, array $parameters = []) + { + return parent::rest_read($settlementId, $parameters); + } + /** + * Retrieve the details of the current settlement that has not yet been paid out. + * + * @return Settlement + * @throws ApiException + */ + public function next() + { + return parent::rest_read("next", []); + } + /** + * Retrieve the details of the open balance of the organization. + * + * @return Settlement + * @throws ApiException + */ + public function open() + { + return parent::rest_read("open", []); + } + /** + * Retrieves a collection of Settlements from Mollie. + * + * @param string $from The first settlement ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return SettlementCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/ShipmentEndpoint.php b/assets/mollie/src/Endpoints/ShipmentEndpoint.php new file mode 100644 index 0000000..1ae13bc --- /dev/null +++ b/assets/mollie/src/Endpoints/ShipmentEndpoint.php @@ -0,0 +1,145 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API + * endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return ShipmentCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\ShipmentCollection($count, $_links); + } + /** + * Create a shipment for some order lines. You can provide an empty array for the + * "lines" option to include all unshipped lines for this order. + * + * @param Order $order + * @param array $options + * @param array $filters + * + * @return Shipment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createFor(\Mollie\Api\Resources\Order $order, array $options = [], array $filters = []) + { + return $this->createForId($order->id, $options, $filters); + } + /** + * Create a shipment for some order lines. You can provide an empty array for the + * "lines" option to include all unshipped lines for this order. + * + * @param string $orderId + * @param array $options + * @param array $filters + * + * @return Shipment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createForId($orderId, array $options = [], array $filters = []) + { + $this->parentId = $orderId; + return parent::rest_create($options, $filters); + } + /** + * Retrieve a single shipment and the order lines shipped by a shipment’s ID. + * + * @param Order $order + * @param string $shipmentId + * @param array $parameters + * + * @return Shipment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getFor(\Mollie\Api\Resources\Order $order, $shipmentId, array $parameters = []) + { + return $this->getForId($order->id, $shipmentId, $parameters); + } + /** + * Retrieve a single shipment and the order lines shipped by a shipment’s ID. + * + * @param string $orderId + * @param string $shipmentId + * @param array $parameters + * + * @return \Mollie\Api\Resources\Shipment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function getForId($orderId, $shipmentId, array $parameters = []) + { + $this->parentId = $orderId; + return parent::rest_read($shipmentId, $parameters); + } + /** + * Update a specific Order Shipment resource. + * + * Will throw an ApiException if the shipment id is invalid or the resource cannot be found. + * + * @param string $shipmentId + * @param string $orderId + * + * @param array $data + * @return Shipment + * @throws ApiException + */ + public function update($orderId, $shipmentId, array $data = []) + { + if (empty($shipmentId) || \strpos($shipmentId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid subscription ID: '{$shipmentId}'. An subscription ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + $this->parentId = $orderId; + return parent::rest_update($shipmentId, $data); + } + /** + * Return all shipments for the Order provided. + * + * @param Order $order + * @param array $parameters + * + * @return ShipmentCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listFor(\Mollie\Api\Resources\Order $order, array $parameters = []) + { + return $this->listForId($order->id, $parameters); + } + /** + * Return all shipments for the provided Order id. + * + * @param string $orderId + * @param array $parameters + * + * @return \Mollie\Api\Resources\ShipmentCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function listForId($orderId, array $parameters = []) + { + $this->parentId = $orderId; + return parent::rest_list(null, null, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/SubscriptionEndpoint.php b/assets/mollie/src/Endpoints/SubscriptionEndpoint.php new file mode 100644 index 0000000..d2f8358 --- /dev/null +++ b/assets/mollie/src/Endpoints/SubscriptionEndpoint.php @@ -0,0 +1,187 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return SubscriptionCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\SubscriptionCollection($this->client, $count, $_links); + } + /** + * Create a subscription for a Customer + * + * @param Customer $customer + * @param array $options + * @param array $filters + * + * @return Subscription + * @throws ApiException + */ + public function createFor(\Mollie\Api\Resources\Customer $customer, array $options = [], array $filters = []) + { + return $this->createForId($customer->id, $options, $filters); + } + /** + * Create a subscription for a Customer + * + * @param string $customerId + * @param array $options + * @param array $filters + * + * @return Subscription + * @throws ApiException + */ + public function createForId($customerId, array $options = [], array $filters = []) + { + $this->parentId = $customerId; + return parent::rest_create($options, $filters); + } + /** + * Update a specific Subscription resource. + * + * Will throw an ApiException if the subscription id is invalid or the resource cannot be found. + * + * @param string $subscriptionId + * @param string $customerId + * + * @param array $data + * + * @return Subscription + * @throws ApiException + */ + public function update($customerId, $subscriptionId, array $data = []) + { + if (empty($subscriptionId) || \strpos($subscriptionId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid subscription ID: '{$subscriptionId}'. An subscription ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + $this->parentId = $customerId; + return parent::rest_update($subscriptionId, $data); + } + /** + * @param Customer $customer + * @param string $subscriptionId + * @param array $parameters + * + * @return Subscription + * @throws ApiException + */ + public function getFor(\Mollie\Api\Resources\Customer $customer, $subscriptionId, array $parameters = []) + { + return $this->getForId($customer->id, $subscriptionId, $parameters); + } + /** + * @param string $customerId + * @param string $subscriptionId + * @param array $parameters + * + * @return Subscription + * @throws ApiException + */ + public function getForId($customerId, $subscriptionId, array $parameters = []) + { + $this->parentId = $customerId; + return parent::rest_read($subscriptionId, $parameters); + } + /** + * @param Customer $customer + * @param string $from The first resource ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return SubscriptionCollection + * @throws ApiException + */ + public function listFor(\Mollie\Api\Resources\Customer $customer, $from = null, $limit = null, array $parameters = []) + { + return $this->listForId($customer->id, $from, $limit, $parameters); + } + /** + * @param string $customerId + * @param string $from The first resource ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return SubscriptionCollection + * @throws ApiException + */ + public function listForId($customerId, $from = null, $limit = null, array $parameters = []) + { + $this->parentId = $customerId; + return parent::rest_list($from, $limit, $parameters); + } + /** + * @param Customer $customer + * @param string $subscriptionId + * @param array $data + * + * @return null + * @throws ApiException + */ + public function cancelFor(\Mollie\Api\Resources\Customer $customer, $subscriptionId, array $data = []) + { + return $this->cancelForId($customer->id, $subscriptionId, $data); + } + /** + * @param string $customerId + * @param string $subscriptionId + * @param array $data + * + * @return null + * @throws ApiException + */ + public function cancelForId($customerId, $subscriptionId, array $data = []) + { + $this->parentId = $customerId; + return parent::rest_delete($subscriptionId, $data); + } + /** + * Retrieves a collection of Subscriptions from Mollie. + * + * @param string $from The first payment ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return SubscriptionCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + $filters = \array_merge(["from" => $from, "limit" => $limit], $parameters); + $apiPath = 'subscriptions' . $this->buildQueryString($filters); + $result = $this->client->performHttpCall(self::REST_LIST, $apiPath); + /** @var SubscriptionCollection $collection */ + $collection = $this->getResourceCollectionObject($result->count, $result->_links); + foreach ($result->_embedded->{$collection->getCollectionResourceName()} as $dataResult) { + $collection[] = \Mollie\Api\Resources\ResourceFactory::createFromApiResult($dataResult, $this->getResourceObject()); + } + return $collection; + } +} diff --git a/assets/mollie/src/Endpoints/TerminalEndpoint.php b/assets/mollie/src/Endpoints/TerminalEndpoint.php new file mode 100644 index 0000000..73b39c2 --- /dev/null +++ b/assets/mollie/src/Endpoints/TerminalEndpoint.php @@ -0,0 +1,65 @@ +client); + } + /** + * Get the collection object that is used by this API endpoint. Every API endpoint uses one type of collection object. + * + * @param int $count + * @param \stdClass $_links + * + * @return TerminalCollection + */ + protected function getResourceCollectionObject($count, $_links) + { + return new \Mollie\Api\Resources\TerminalCollection($this->client, $count, $_links); + } + /** + * Retrieve terminal from Mollie. + * + * Will throw a ApiException if the terminal id is invalid or the resource cannot be found. + * + * @param string $terminalId + * @param array $parameters + * @return Terminal + * @throws ApiException + */ + public function get($terminalId, array $parameters = []) + { + if (empty($terminalId) || \strpos($terminalId, self::RESOURCE_ID_PREFIX) !== 0) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid terminal ID: '{$terminalId}'. A terminal ID should start with '" . self::RESOURCE_ID_PREFIX . "'."); + } + return parent::rest_read($terminalId, $parameters); + } + /** + * Retrieves a collection of Terminals from Mollie for the current organization / profile, ordered from newest to oldest. + * + * @param string $from The first terminal ID you want to include in your list. + * @param int $limit + * @param array $parameters + * + * @return TerminalCollection + * @throws ApiException + */ + public function page($from = null, $limit = null, array $parameters = []) + { + return $this->rest_list($from, $limit, $parameters); + } +} diff --git a/assets/mollie/src/Endpoints/WalletEndpoint.php b/assets/mollie/src/Endpoints/WalletEndpoint.php new file mode 100644 index 0000000..7b685a0 --- /dev/null +++ b/assets/mollie/src/Endpoints/WalletEndpoint.php @@ -0,0 +1,33 @@ +parseRequestBody(\array_merge(['domain' => $domain, 'validationUrl' => $validationUrl], $parameters)); + $response = $this->client->performHttpCall(self::REST_CREATE, 'wallets/applepay/sessions', $body); + return \json_encode($response); + } +} diff --git a/assets/mollie/src/Exceptions/ApiException.php b/assets/mollie/src/Exceptions/ApiException.php new file mode 100644 index 0000000..e8581db --- /dev/null +++ b/assets/mollie/src/Exceptions/ApiException.php @@ -0,0 +1,194 @@ +plainMessage = $message; + $this->raisedAt = new \DateTimeImmutable(); + $formattedRaisedAt = $this->raisedAt->format(\DateTime::ISO8601); + $message = "[{$formattedRaisedAt}] " . $message; + if (!empty($field)) { + $this->field = (string) $field; + $message .= ". Field: {$this->field}"; + } + if (!empty($response)) { + $this->response = $response; + $object = static::parseResponseBody($this->response); + if (isset($object->_links)) { + foreach ($object->_links as $key => $value) { + $this->links[$key] = $value; + } + } + } + if ($this->hasLink('documentation')) { + $message .= ". Documentation: {$this->getDocumentationUrl()}"; + } + $this->request = $request; + if ($request) { + $requestBody = $request->getBody()->__toString(); + if ($requestBody) { + $message .= ". Request body: {$requestBody}"; + } + } + parent::__construct($message, $code, $previous); + } + /** + * @param \Psr\Http\Message\ResponseInterface $response + * @param \Psr\Http\Message\RequestInterface $request + * @param \Throwable|null $previous + * @return \Mollie\Api\Exceptions\ApiException + * @throws \Mollie\Api\Exceptions\ApiException + */ + public static function createFromResponse($response, $request = null, $previous = null) + { + $object = static::parseResponseBody($response); + $field = null; + if (!empty($object->field)) { + $field = $object->field; + } + return new self("Error executing API call ({$object->status}: {$object->title}): {$object->detail}", $response->getStatusCode(), $field, $request, $response, $previous); + } + /** + * @return string|null + */ + public function getField() + { + return $this->field; + } + /** + * @return string|null + */ + public function getDocumentationUrl() + { + return $this->getUrl('documentation'); + } + /** + * @return string|null + */ + public function getDashboardUrl() + { + return $this->getUrl('dashboard'); + } + /** + * @return \Psr\Http\Message\ResponseInterface|null + */ + public function getResponse() + { + return $this->response; + } + /** + * @return bool + */ + public function hasResponse() + { + return $this->response !== null; + } + /** + * @param string $key + * @return bool + */ + public function hasLink($key) + { + return \array_key_exists($key, $this->links); + } + /** + * @param string $key + * @return mixed|null + */ + public function getLink($key) + { + if ($this->hasLink($key)) { + return $this->links[$key]; + } + return null; + } + /** + * @param string $key + * @return null + */ + public function getUrl($key) + { + if ($this->hasLink($key)) { + return $this->getLink($key)->href; + } + return null; + } + /** + * @return \Psr\Http\Message\RequestInterface + */ + public function getRequest() + { + return $this->request; + } + /** + * Get the ISO8601 representation of the moment this exception was thrown + * + * @return \DateTimeImmutable + */ + public function getRaisedAt() + { + return $this->raisedAt; + } + /** + * @param \Psr\Http\Message\ResponseInterface $response + * @return \stdClass + * @throws \Mollie\Api\Exceptions\ApiException + */ + protected static function parseResponseBody($response) + { + $body = (string) $response->getBody(); + $object = @\json_decode($body); + if (\json_last_error() !== \JSON_ERROR_NONE) { + throw new self("Unable to decode Mollie response: '{$body}'."); + } + return $object; + } + /** + * Retrieve the plain exception message. + * + * @return string + */ + public function getPlainMessage() + { + return $this->plainMessage; + } +} diff --git a/assets/mollie/src/Exceptions/CurlConnectTimeoutException.php b/assets/mollie/src/Exceptions/CurlConnectTimeoutException.php new file mode 100644 index 0000000..ac2107e --- /dev/null +++ b/assets/mollie/src/Exceptions/CurlConnectTimeoutException.php @@ -0,0 +1,7 @@ +attemptRequest($httpMethod, $url, $headers, $httpBody); + } catch (\Mollie\Api\Exceptions\CurlConnectTimeoutException $e) { + // Nothing + } + } + throw new \Mollie\Api\Exceptions\CurlConnectTimeoutException("Unable to connect to Mollie. Maximum number of retries (" . self::MAX_RETRIES . ") reached."); + } + /** + * @param string $httpMethod + * @param string $url + * @param array $headers + * @param string $httpBody + * @return \stdClass|void|null + * @throws \Mollie\Api\Exceptions\ApiException + */ + protected function attemptRequest($httpMethod, $url, $headers, $httpBody) + { + $curl = \curl_init($url); + $headers["Content-Type"] = "application/json"; + \curl_setopt($curl, \CURLOPT_RETURNTRANSFER, \true); + \curl_setopt($curl, \CURLOPT_HTTPHEADER, $this->parseHeaders($headers)); + \curl_setopt($curl, \CURLOPT_CONNECTTIMEOUT, self::DEFAULT_CONNECT_TIMEOUT); + \curl_setopt($curl, \CURLOPT_TIMEOUT, self::DEFAULT_TIMEOUT); + \curl_setopt($curl, \CURLOPT_SSL_VERIFYPEER, \true); + \curl_setopt($curl, \CURLOPT_CAINFO, \_PhpScoperf7c63b60b99d\Composer\CaBundle\CaBundle::getBundledCaBundlePath()); + switch ($httpMethod) { + case \Mollie\Api\MollieApiClient::HTTP_POST: + \curl_setopt($curl, \CURLOPT_POST, \true); + \curl_setopt($curl, \CURLOPT_POSTFIELDS, $httpBody); + break; + case \Mollie\Api\MollieApiClient::HTTP_GET: + break; + case \Mollie\Api\MollieApiClient::HTTP_PATCH: + \curl_setopt($curl, \CURLOPT_CUSTOMREQUEST, 'PATCH'); + \curl_setopt($curl, \CURLOPT_POSTFIELDS, $httpBody); + break; + case \Mollie\Api\MollieApiClient::HTTP_DELETE: + \curl_setopt($curl, \CURLOPT_CUSTOMREQUEST, 'DELETE'); + \curl_setopt($curl, \CURLOPT_POSTFIELDS, $httpBody); + break; + default: + throw new \InvalidArgumentException("Invalid http method: " . $httpMethod); + } + $startTime = \microtime(\true); + $response = \curl_exec($curl); + $endTime = \microtime(\true); + if ($response === \false) { + $executionTime = $endTime - $startTime; + $curlErrorNumber = \curl_errno($curl); + $curlErrorMessage = "Curl error: " . \curl_error($curl); + if ($this->isConnectTimeoutError($curlErrorNumber, $executionTime)) { + throw new \Mollie\Api\Exceptions\CurlConnectTimeoutException("Unable to connect to Mollie. " . $curlErrorMessage); + } + throw new \Mollie\Api\Exceptions\ApiException($curlErrorMessage); + } + $statusCode = \curl_getinfo($curl, \CURLINFO_RESPONSE_CODE); + \curl_close($curl); + return $this->parseResponseBody($response, $statusCode, $httpBody); + } + /** + * The version number for the underlying http client, if available. + * @example Guzzle/6.3 + * + * @return string|null + */ + public function versionString() + { + return 'Curl/*'; + } + /** + * Whether this http adapter provides a debugging mode. If debugging mode is enabled, the + * request will be included in the ApiException. + * + * @return false + */ + public function supportsDebugging() + { + return \false; + } + /** + * @param int $curlErrorNumber + * @param string|float $executionTime + * @return bool + */ + protected function isConnectTimeoutError($curlErrorNumber, $executionTime) + { + $connectErrors = [\CURLE_COULDNT_RESOLVE_HOST => \true, \CURLE_COULDNT_CONNECT => \true, \CURLE_SSL_CONNECT_ERROR => \true, \CURLE_GOT_NOTHING => \true]; + if (isset($connectErrors[$curlErrorNumber])) { + return \true; + } + if ($curlErrorNumber === \CURLE_OPERATION_TIMEOUTED) { + if ($executionTime > self::DEFAULT_TIMEOUT) { + return \false; + } + return \true; + } + return \false; + } + /** + * @param string $response + * @param int $statusCode + * @param string $httpBody + * @return \stdClass|null + * @throws \Mollie\Api\Exceptions\ApiException + */ + protected function parseResponseBody($response, $statusCode, $httpBody) + { + if (empty($response)) { + if ($statusCode === self::HTTP_NO_CONTENT) { + return null; + } + throw new \Mollie\Api\Exceptions\ApiException("No response body found."); + } + $body = @\json_decode($response); + // GUARDS + if (\json_last_error() !== \JSON_ERROR_NONE) { + throw new \Mollie\Api\Exceptions\ApiException("Unable to decode Mollie response: '{$response}'."); + } + if (isset($body->error)) { + throw new \Mollie\Api\Exceptions\ApiException($body->error->message); + } + if ($statusCode >= 400) { + $message = "Error executing API call ({$body->status}: {$body->title}): {$body->detail}"; + $field = null; + if (!empty($body->field)) { + $field = $body->field; + } + if (isset($body->_links, $body->_links->documentation)) { + $message .= ". Documentation: {$body->_links->documentation->href}"; + } + if ($httpBody) { + $message .= ". Request body: {$httpBody}"; + } + throw new \Mollie\Api\Exceptions\ApiException($message, $statusCode, $field); + } + return $body; + } + protected function parseHeaders($headers) + { + $result = []; + foreach ($headers as $key => $value) { + $result[] = $key . ': ' . $value; + } + return $result; + } +} diff --git a/assets/mollie/src/HttpAdapter/Guzzle6And7MollieHttpAdapter.php b/assets/mollie/src/HttpAdapter/Guzzle6And7MollieHttpAdapter.php new file mode 100644 index 0000000..a23a06d --- /dev/null +++ b/assets/mollie/src/HttpAdapter/Guzzle6And7MollieHttpAdapter.php @@ -0,0 +1,169 @@ +httpClient = $httpClient; + } + /** + * Instantiate a default adapter with sane configuration for Guzzle 6 or 7. + * + * @return static + */ + public static function createDefault() + { + $retryMiddlewareFactory = new \Mollie\Api\HttpAdapter\Guzzle6And7RetryMiddlewareFactory(); + $handlerStack = \_PhpScoperf7c63b60b99d\GuzzleHttp\HandlerStack::create(); + $handlerStack->push($retryMiddlewareFactory->retry()); + $client = new \_PhpScoperf7c63b60b99d\GuzzleHttp\Client([\_PhpScoperf7c63b60b99d\GuzzleHttp\RequestOptions::VERIFY => \_PhpScoperf7c63b60b99d\Composer\CaBundle\CaBundle::getBundledCaBundlePath(), \_PhpScoperf7c63b60b99d\GuzzleHttp\RequestOptions::TIMEOUT => self::DEFAULT_TIMEOUT, \_PhpScoperf7c63b60b99d\GuzzleHttp\RequestOptions::CONNECT_TIMEOUT => self::DEFAULT_CONNECT_TIMEOUT, 'handler' => $handlerStack]); + return new \Mollie\Api\HttpAdapter\Guzzle6And7MollieHttpAdapter($client); + } + /** + * Send a request to the specified Mollie api url. + * + * @param string $httpMethod + * @param string $url + * @param array $headers + * @param string $httpBody + * @return \stdClass|null + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function send($httpMethod, $url, $headers, $httpBody) + { + $request = new \_PhpScoperf7c63b60b99d\GuzzleHttp\Psr7\Request($httpMethod, $url, $headers, $httpBody); + try { + $response = $this->httpClient->send($request, ['http_errors' => \false]); + } catch (\_PhpScoperf7c63b60b99d\GuzzleHttp\Exception\GuzzleException $e) { + // Prevent sensitive request data from ending up in exception logs unintended + if (!$this->debugging) { + $request = null; + } + // Not all Guzzle Exceptions implement hasResponse() / getResponse() + if (\method_exists($e, 'hasResponse') && \method_exists($e, 'getResponse')) { + if ($e->hasResponse()) { + throw \Mollie\Api\Exceptions\ApiException::createFromResponse($e->getResponse(), $request); + } + } + throw new \Mollie\Api\Exceptions\ApiException($e->getMessage(), $e->getCode(), null, $request, null); + } + return $this->parseResponseBody($response); + } + /** + * Whether this http adapter provides a debugging mode. If debugging mode is enabled, the + * request will be included in the ApiException. + * + * @return true + */ + public function supportsDebugging() + { + return \true; + } + /** + * Whether debugging is enabled. If debugging mode is enabled, the request will + * be included in the ApiException. By default, debugging is disabled to prevent + * sensitive request data from leaking into exception logs. + * + * @return bool + */ + public function debugging() + { + return $this->debugging; + } + /** + * Enable debugging. If debugging mode is enabled, the request will + * be included in the ApiException. By default, debugging is disabled to prevent + * sensitive request data from leaking into exception logs. + */ + public function enableDebugging() + { + $this->debugging = \true; + } + /** + * Disable debugging. If debugging mode is enabled, the request will + * be included in the ApiException. By default, debugging is disabled to prevent + * sensitive request data from leaking into exception logs. + */ + public function disableDebugging() + { + $this->debugging = \false; + } + /** + * Parse the PSR-7 Response body + * + * @param ResponseInterface $response + * @return \stdClass|null + * @throws ApiException + */ + private function parseResponseBody(\_PhpScoperf7c63b60b99d\Psr\Http\Message\ResponseInterface $response) + { + $body = (string) $response->getBody(); + if (empty($body)) { + if ($response->getStatusCode() === self::HTTP_NO_CONTENT) { + return null; + } + throw new \Mollie\Api\Exceptions\ApiException("No response body found."); + } + $object = @\json_decode($body); + if (\json_last_error() !== \JSON_ERROR_NONE) { + throw new \Mollie\Api\Exceptions\ApiException("Unable to decode Mollie response: '{$body}'."); + } + if ($response->getStatusCode() >= 400) { + throw \Mollie\Api\Exceptions\ApiException::createFromResponse($response, null); + } + return $object; + } + /** + * The version number for the underlying http client, if available. This is used to report the UserAgent to Mollie, + * for convenient support. + * @example Guzzle/6.3 + * + * @return string|null + */ + public function versionString() + { + if (\defined('\\GuzzleHttp\\ClientInterface::MAJOR_VERSION')) { + // Guzzle 7 + return "Guzzle/" . \_PhpScoperf7c63b60b99d\GuzzleHttp\ClientInterface::MAJOR_VERSION; + } elseif (\defined('\\GuzzleHttp\\ClientInterface::VERSION')) { + // Before Guzzle 7 + return "Guzzle/" . \_PhpScoperf7c63b60b99d\GuzzleHttp\ClientInterface::VERSION; + } + return null; + } +} diff --git a/assets/mollie/src/HttpAdapter/Guzzle6And7RetryMiddlewareFactory.php b/assets/mollie/src/HttpAdapter/Guzzle6And7RetryMiddlewareFactory.php new file mode 100644 index 0000000..8bd8e92 --- /dev/null +++ b/assets/mollie/src/HttpAdapter/Guzzle6And7RetryMiddlewareFactory.php @@ -0,0 +1,67 @@ +newRetryDecider(), $delay ? $this->getRetryDelay() : $this->getZeroRetryDelay()); + } + /** + * Returns a method that takes the number of retries and returns the number of milliseconds + * to wait + * + * @return callable + */ + private function getRetryDelay() + { + return function ($numberOfRetries) { + return static::DELAY_INCREASE_MS * $numberOfRetries; + }; + } + /** + * Returns a method that returns zero milliseconds to wait + * + * @return callable + */ + private function getZeroRetryDelay() + { + return function ($numberOfRetries) { + return 0; + }; + } + /** + * @return callable + */ + private function newRetryDecider() + { + return function ($retries, \_PhpScoperf7c63b60b99d\GuzzleHttp\Psr7\Request $request, \_PhpScoperf7c63b60b99d\GuzzleHttp\Psr7\Response $response = null, \_PhpScoperf7c63b60b99d\GuzzleHttp\Exception\TransferException $exception = null) { + if ($retries >= static::MAX_RETRIES) { + return \false; + } + if ($exception instanceof \_PhpScoperf7c63b60b99d\GuzzleHttp\Exception\ConnectException) { + return \true; + } + return \false; + }; + } +} diff --git a/assets/mollie/src/HttpAdapter/MollieHttpAdapterInterface.php b/assets/mollie/src/HttpAdapter/MollieHttpAdapterInterface.php new file mode 100644 index 0000000..8cca0ea --- /dev/null +++ b/assets/mollie/src/HttpAdapter/MollieHttpAdapterInterface.php @@ -0,0 +1,25 @@ +guzzleIsDetected()) { + $guzzleVersion = $this->guzzleMajorVersionNumber(); + if ($guzzleVersion && \in_array($guzzleVersion, [6, 7])) { + return \Mollie\Api\HttpAdapter\Guzzle6And7MollieHttpAdapter::createDefault(); + } + } + return new \Mollie\Api\HttpAdapter\CurlMollieHttpAdapter(); + } + if ($httpClient instanceof \Mollie\Api\HttpAdapter\MollieHttpAdapterInterface) { + return $httpClient; + } + if ($httpClient instanceof \_PhpScoperf7c63b60b99d\GuzzleHttp\ClientInterface) { + return new \Mollie\Api\HttpAdapter\Guzzle6And7MollieHttpAdapter($httpClient); + } + throw new \Mollie\Api\Exceptions\UnrecognizedClientException('The provided http client or adapter was not recognized.'); + } + /** + * @return bool + */ + private function guzzleIsDetected() + { + return \interface_exists('\\' . \_PhpScoperf7c63b60b99d\GuzzleHttp\ClientInterface::class); + } + /** + * @return int|null + */ + private function guzzleMajorVersionNumber() + { + // Guzzle 7 + if (\defined('\\GuzzleHttp\\ClientInterface::MAJOR_VERSION')) { + return (int) \_PhpScoperf7c63b60b99d\GuzzleHttp\ClientInterface::MAJOR_VERSION; + } + // Before Guzzle 7 + if (\defined('\\GuzzleHttp\\ClientInterface::VERSION')) { + return (int) \_PhpScoperf7c63b60b99d\GuzzleHttp\ClientInterface::VERSION[0]; + } + return null; + } +} diff --git a/assets/mollie/src/HttpAdapter/MollieHttpAdapterPickerInterface.php b/assets/mollie/src/HttpAdapter/MollieHttpAdapterPickerInterface.php new file mode 100644 index 0000000..b91542d --- /dev/null +++ b/assets/mollie/src/HttpAdapter/MollieHttpAdapterPickerInterface.php @@ -0,0 +1,13 @@ +length = $length; + } + /** + * @throws \Mollie\Api\Exceptions\IncompatiblePlatform + * @return string + */ + public function generate() + { + $length = $this->length; + $string = ''; + while (($len = \strlen($string)) < $length) { + $size = $length - $len; + try { + $bytes = \random_bytes($size); + } catch (\Exception $e) { + throw new \Mollie\Api\Exceptions\IncompatiblePlatform('PHP function random_bytes missing. Consider overriding the DefaultIdempotencyKeyGenerator with your own.', \Mollie\Api\Exceptions\IncompatiblePlatform::INCOMPATIBLE_RANDOM_BYTES_FUNCTION); + } + $string .= \substr(\str_replace(['/', '+', '='], '', \base64_encode($bytes)), 0, $size); + } + return $string; + } +} diff --git a/assets/mollie/src/Idempotency/FakeIdempotencyKeyGenerator.php b/assets/mollie/src/Idempotency/FakeIdempotencyKeyGenerator.php new file mode 100644 index 0000000..2fbfc15 --- /dev/null +++ b/assets/mollie/src/Idempotency/FakeIdempotencyKeyGenerator.php @@ -0,0 +1,18 @@ +fakeKey = $fakeKey; + } + public function generate() + { + return $this->fakeKey; + } +} diff --git a/assets/mollie/src/Idempotency/IdempotencyKeyGeneratorContract.php b/assets/mollie/src/Idempotency/IdempotencyKeyGeneratorContract.php new file mode 100644 index 0000000..170ee20 --- /dev/null +++ b/assets/mollie/src/Idempotency/IdempotencyKeyGeneratorContract.php @@ -0,0 +1,8 @@ +httpClient = $httpAdapterPicker->pickHttpAdapter($httpClient); + $compatibilityChecker = new \Mollie\Api\CompatibilityChecker(); + $compatibilityChecker->checkCompatibility(); + $this->initializeEndpoints(); + $this->initializeVersionStrings(); + $this->initializeIdempotencyKeyGenerator($idempotencyKeyGenerator); + } + public function initializeEndpoints() + { + $this->payments = new \Mollie\Api\Endpoints\PaymentEndpoint($this); + $this->methods = new \Mollie\Api\Endpoints\MethodEndpoint($this); + $this->profileMethods = new \Mollie\Api\Endpoints\ProfileMethodEndpoint($this); + $this->customers = new \Mollie\Api\Endpoints\CustomerEndpoint($this); + $this->settlements = new \Mollie\Api\Endpoints\SettlementsEndpoint($this); + $this->settlementPayments = new \Mollie\Api\Endpoints\SettlementPaymentEndpoint($this); + $this->subscriptions = new \Mollie\Api\Endpoints\SubscriptionEndpoint($this); + $this->customerPayments = new \Mollie\Api\Endpoints\CustomerPaymentsEndpoint($this); + $this->mandates = new \Mollie\Api\Endpoints\MandateEndpoint($this); + $this->balances = new \Mollie\Api\Endpoints\BalanceEndpoint($this); + $this->balanceTransactions = new \Mollie\Api\Endpoints\BalanceTransactionEndpoint($this); + $this->balanceReports = new \Mollie\Api\Endpoints\BalanceReportEndpoint($this); + $this->invoices = new \Mollie\Api\Endpoints\InvoiceEndpoint($this); + $this->permissions = new \Mollie\Api\Endpoints\PermissionEndpoint($this); + $this->profiles = new \Mollie\Api\Endpoints\ProfileEndpoint($this); + $this->onboarding = new \Mollie\Api\Endpoints\OnboardingEndpoint($this); + $this->organizations = new \Mollie\Api\Endpoints\OrganizationEndpoint($this); + $this->orders = new \Mollie\Api\Endpoints\OrderEndpoint($this); + $this->orderLines = new \Mollie\Api\Endpoints\OrderLineEndpoint($this); + $this->orderPayments = new \Mollie\Api\Endpoints\OrderPaymentEndpoint($this); + $this->orderRefunds = new \Mollie\Api\Endpoints\OrderRefundEndpoint($this); + $this->shipments = new \Mollie\Api\Endpoints\ShipmentEndpoint($this); + $this->refunds = new \Mollie\Api\Endpoints\RefundEndpoint($this); + $this->paymentRefunds = new \Mollie\Api\Endpoints\PaymentRefundEndpoint($this); + $this->paymentCaptures = new \Mollie\Api\Endpoints\PaymentCaptureEndpoint($this); + $this->paymentRoutes = new \Mollie\Api\Endpoints\PaymentRouteEndpoint($this); + $this->chargebacks = new \Mollie\Api\Endpoints\ChargebackEndpoint($this); + $this->paymentChargebacks = new \Mollie\Api\Endpoints\PaymentChargebackEndpoint($this); + $this->wallets = new \Mollie\Api\Endpoints\WalletEndpoint($this); + $this->paymentLinks = new \Mollie\Api\Endpoints\PaymentLinkEndpoint($this); + $this->terminals = new \Mollie\Api\Endpoints\TerminalEndpoint($this); + $this->organizationPartners = new \Mollie\Api\Endpoints\OrganizationPartnerEndpoint($this); + $this->clients = new \Mollie\Api\Endpoints\ClientEndpoint($this); + $this->clientLinks = new \Mollie\Api\Endpoints\ClientLinkEndpoint($this); + } + protected function initializeVersionStrings() + { + $this->addVersionString("Mollie/" . self::CLIENT_VERSION); + $this->addVersionString("PHP/" . \phpversion()); + $httpClientVersionString = $this->httpClient->versionString(); + if ($httpClientVersionString) { + $this->addVersionString($httpClientVersionString); + } + } + /** + * @param \Mollie\Api\Idempotency\IdempotencyKeyGeneratorContract $generator + * @return void + */ + protected function initializeIdempotencyKeyGenerator($generator) + { + $this->idempotencyKeyGenerator = $generator ? $generator : new \Mollie\Api\Idempotency\DefaultIdempotencyKeyGenerator(); + } + /** + * @param string $url + * + * @return MollieApiClient + */ + public function setApiEndpoint($url) + { + $this->apiEndpoint = \rtrim(\trim($url), '/'); + return $this; + } + /** + * @return string + */ + public function getApiEndpoint() + { + return $this->apiEndpoint; + } + /** + * @return array + */ + public function getVersionStrings() + { + return $this->versionStrings; + } + /** + * @param string $apiKey The Mollie API key, starting with 'test_' or 'live_' + * + * @return MollieApiClient + * @throws ApiException + */ + public function setApiKey($apiKey) + { + $apiKey = \trim($apiKey); + if (!\preg_match('/^(live|test)_\\w{30,}$/', $apiKey)) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid API key: '{$apiKey}'. An API key must start with 'test_' or 'live_' and must be at least 30 characters long."); + } + $this->apiKey = $apiKey; + $this->oauthAccess = \false; + return $this; + } + /** + * @param string $accessToken OAuth access token, starting with 'access_' + * + * @return MollieApiClient + * @throws ApiException + */ + public function setAccessToken($accessToken) + { + $accessToken = \trim($accessToken); + if (!\preg_match('/^access_\\w+$/', $accessToken)) { + throw new \Mollie\Api\Exceptions\ApiException("Invalid OAuth access token: '{$accessToken}'. An access token must start with 'access_'."); + } + $this->apiKey = $accessToken; + $this->oauthAccess = \true; + return $this; + } + /** + * Returns null if no API key has been set yet. + * + * @return bool|null + */ + public function usesOAuth() + { + return $this->oauthAccess; + } + /** + * @param string $versionString + * + * @return MollieApiClient + */ + public function addVersionString($versionString) + { + $this->versionStrings[] = \str_replace([" ", "\t", "\n", "\r"], '-', $versionString); + return $this; + } + /** + * Enable debugging mode. If debugging mode is enabled, the attempted request will be included in the ApiException. + * By default, debugging is disabled to prevent leaking sensitive request data into exception logs. + * + * @throws \Mollie\Api\Exceptions\HttpAdapterDoesNotSupportDebuggingException + */ + public function enableDebugging() + { + if (!\method_exists($this->httpClient, 'supportsDebugging') || !$this->httpClient->supportsDebugging()) { + throw new \Mollie\Api\Exceptions\HttpAdapterDoesNotSupportDebuggingException("Debugging is not supported by " . \get_class($this->httpClient) . "."); + } + $this->httpClient->enableDebugging(); + } + /** + * Disable debugging mode. If debugging mode is enabled, the attempted request will be included in the ApiException. + * By default, debugging is disabled to prevent leaking sensitive request data into exception logs. + * + * @throws \Mollie\Api\Exceptions\HttpAdapterDoesNotSupportDebuggingException + */ + public function disableDebugging() + { + if (!\method_exists($this->httpClient, 'supportsDebugging') || !$this->httpClient->supportsDebugging()) { + throw new \Mollie\Api\Exceptions\HttpAdapterDoesNotSupportDebuggingException("Debugging is not supported by " . \get_class($this->httpClient) . "."); + } + $this->httpClient->disableDebugging(); + } + /** + * Set the idempotency key used on the next request. The idempotency key is a unique string ensuring a request to a + * mutating Mollie endpoint is processed only once. The idempotency key resets to null after each request. Using + * the setIdempotencyKey method supersedes the IdempotencyKeyGenerator. + * + * @param $key + * @return $this + */ + public function setIdempotencyKey($key) + { + $this->idempotencyKey = $key; + return $this; + } + /** + * Retrieve the idempotency key. The idempotency key is a unique string ensuring a request to a + * mutating Mollie endpoint is processed only once. Note that the idempotency key gets reset to null after each + * request. + * + * @return string|null + */ + public function getIdempotencyKey() + { + return $this->idempotencyKey; + } + /** + * Reset the idempotency key. Note that the idempotency key automatically resets to null after each request. + * @return $this + */ + public function resetIdempotencyKey() + { + $this->idempotencyKey = null; + return $this; + } + /** + * @param \Mollie\Api\Idempotency\IdempotencyKeyGeneratorContract $generator + * @return \Mollie\Api\MollieApiClient + */ + public function setIdempotencyKeyGenerator($generator) + { + $this->idempotencyKeyGenerator = $generator; + return $this; + } + /** + * @return \Mollie\Api\MollieApiClient + */ + public function clearIdempotencyKeyGenerator() + { + $this->idempotencyKeyGenerator = null; + return $this; + } + /** + * Perform a http call. This method is used by the resource specific classes. Please use the $payments property to + * perform operations on payments. + * + * @param string $httpMethod + * @param string $apiMethod + * @param string|null $httpBody + * + * @return \stdClass + * @throws ApiException + * + * @codeCoverageIgnore + */ + public function performHttpCall($httpMethod, $apiMethod, $httpBody = null) + { + $url = $this->apiEndpoint . "/" . self::API_VERSION . "/" . $apiMethod; + return $this->performHttpCallToFullUrl($httpMethod, $url, $httpBody); + } + /** + * Perform a http call to a full url. This method is used by the resource specific classes. + * + * @see $payments + * @see $isuers + * + * @param string $httpMethod + * @param string $url + * @param string|null $httpBody + * + * @return \stdClass|null + * @throws ApiException + * + * @codeCoverageIgnore + */ + public function performHttpCallToFullUrl($httpMethod, $url, $httpBody = null) + { + if (empty($this->apiKey)) { + throw new \Mollie\Api\Exceptions\ApiException("You have not set an API key or OAuth access token. Please use setApiKey() to set the API key."); + } + $userAgent = \implode(' ', $this->versionStrings); + if ($this->usesOAuth()) { + $userAgent .= " OAuth/2.0"; + } + $headers = ['Accept' => "application/json", 'Authorization' => "Bearer {$this->apiKey}", 'User-Agent' => $userAgent]; + if ($httpBody !== null) { + $headers['Content-Type'] = "application/json"; + } + if (\function_exists("php_uname")) { + $headers['X-Mollie-Client-Info'] = \php_uname(); + } + $headers = $this->applyIdempotencyKey($headers, $httpMethod); + $response = $this->httpClient->send($httpMethod, $url, $headers, $httpBody); + $this->resetIdempotencyKey(); + return $response; + } + /** + * Conditionally apply the idempotency key to the request headers + * + * @param array $headers + * @param string $httpMethod + * @return array + */ + private function applyIdempotencyKey(array $headers, string $httpMethod) + { + if (!\in_array($httpMethod, [self::HTTP_POST, self::HTTP_PATCH, self::HTTP_DELETE])) { + unset($headers['Idempotency-Key']); + return $headers; + } + if ($this->idempotencyKey) { + $headers['Idempotency-Key'] = $this->idempotencyKey; + return $headers; + } + if ($this->idempotencyKeyGenerator) { + $headers['Idempotency-Key'] = $this->idempotencyKeyGenerator->generate(); + return $headers; + } + unset($headers['Idempotency-Key']); + return $headers; + } + /** + * Serialization can be used for caching. Of course doing so can be dangerous but some like to live dangerously. + * + * \serialize() should be called on the collections or object you want to cache. + * + * We don't need any property that can be set by the constructor, only properties that are set by setters. + * + * Note that the API key is not serialized, so you need to set the key again after unserializing if you want to do + * more API calls. + * + * @deprecated + * @return string[] + */ + public function __sleep() + { + return ["apiEndpoint"]; + } + /** + * When unserializing a collection or a resource, this class should restore itself. + * + * Note that if you have set an HttpAdapter, this adapter is lost on wakeup and reset to the default one. + * + * @throws IncompatiblePlatform If suddenly unserialized on an incompatible platform. + */ + public function __wakeup() + { + $this->__construct(); + } +} diff --git a/assets/mollie/src/Resources/Balance.php b/assets/mollie/src/Resources/Balance.php new file mode 100644 index 0000000..bee7940 --- /dev/null +++ b/assets/mollie/src/Resources/Balance.php @@ -0,0 +1,101 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/BalanceReport.php b/assets/mollie/src/Resources/BalanceReport.php new file mode 100644 index 0000000..4a2f40d --- /dev/null +++ b/assets/mollie/src/Resources/BalanceReport.php @@ -0,0 +1,72 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/BaseCollection.php b/assets/mollie/src/Resources/BaseCollection.php new file mode 100644 index 0000000..20dfc98 --- /dev/null +++ b/assets/mollie/src/Resources/BaseCollection.php @@ -0,0 +1,31 @@ +count = $count; + $this->_links = $_links; + parent::__construct(); + } + /** + * @return string|null + */ + public abstract function getCollectionResourceName(); +} diff --git a/assets/mollie/src/Resources/BaseResource.php b/assets/mollie/src/Resources/BaseResource.php new file mode 100644 index 0000000..8927d41 --- /dev/null +++ b/assets/mollie/src/Resources/BaseResource.php @@ -0,0 +1,28 @@ +client = $client; + } +} diff --git a/assets/mollie/src/Resources/Capture.php b/assets/mollie/src/Resources/Capture.php new file mode 100644 index 0000000..f2a9509 --- /dev/null +++ b/assets/mollie/src/Resources/Capture.php @@ -0,0 +1,62 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/Chargeback.php b/assets/mollie/src/Resources/Chargeback.php new file mode 100644 index 0000000..0fc7ff5 --- /dev/null +++ b/assets/mollie/src/Resources/Chargeback.php @@ -0,0 +1,67 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/Client.php b/assets/mollie/src/Resources/Client.php new file mode 100644 index 0000000..6bdea31 --- /dev/null +++ b/assets/mollie/src/Resources/Client.php @@ -0,0 +1,32 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/ClientLink.php b/assets/mollie/src/Resources/ClientLink.php new file mode 100644 index 0000000..1771277 --- /dev/null +++ b/assets/mollie/src/Resources/ClientLink.php @@ -0,0 +1,38 @@ + $client_id, 'state' => $state, 'approval_prompt' => $approval_prompt, 'scope' => \implode(' ', $scopes)], '', '&', \PHP_QUERY_RFC3986); + return "{$this->_links->clientLink->href}?{$query}"; + } +} diff --git a/assets/mollie/src/Resources/CurrentProfile.php b/assets/mollie/src/Resources/CurrentProfile.php new file mode 100644 index 0000000..2e01dca --- /dev/null +++ b/assets/mollie/src/Resources/CurrentProfile.php @@ -0,0 +1,32 @@ +client->profileMethods->createForCurrentProfile($methodId, $data); + } + /** + * Disable a payment method for this profile. + * + * @param string $methodId + * @param array $data + * @return Method + * @throws ApiException + */ + public function disableMethod($methodId, array $data = []) + { + return $this->client->profileMethods->deleteForCurrentProfile($methodId, $data); + } +} diff --git a/assets/mollie/src/Resources/CursorCollection.php b/assets/mollie/src/Resources/CursorCollection.php new file mode 100644 index 0000000..f7384fb --- /dev/null +++ b/assets/mollie/src/Resources/CursorCollection.php @@ -0,0 +1,80 @@ +client = $client; + } + /** + * @return BaseResource + */ + protected abstract function createResourceObject(); + /** + * Return the next set of resources when available + * + * @return CursorCollection|null + * @throws \Mollie\Api\Exceptions\ApiException + */ + public final function next() + { + if (!$this->hasNext()) { + return null; + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->next->href); + $collection = new static($this->client, $result->count, $result->_links); + foreach ($result->_embedded->{$collection->getCollectionResourceName()} as $dataResult) { + $collection[] = \Mollie\Api\Resources\ResourceFactory::createFromApiResult($dataResult, $this->createResourceObject()); + } + return $collection; + } + /** + * Return the previous set of resources when available + * + * @return CursorCollection|null + * @throws \Mollie\Api\Exceptions\ApiException + */ + public final function previous() + { + if (!$this->hasPrevious()) { + return null; + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->previous->href); + $collection = new static($this->client, $result->count, $result->_links); + foreach ($result->_embedded->{$collection->getCollectionResourceName()} as $dataResult) { + $collection[] = \Mollie\Api\Resources\ResourceFactory::createFromApiResult($dataResult, $this->createResourceObject()); + } + return $collection; + } + /** + * Determine whether the collection has a next page available. + * + * @return bool + */ + public function hasNext() + { + return isset($this->_links->next->href); + } + /** + * Determine whether the collection has a previous page available. + * + * @return bool + */ + public function hasPrevious() + { + return isset($this->_links->previous->href); + } +} diff --git a/assets/mollie/src/Resources/Customer.php b/assets/mollie/src/Resources/Customer.php new file mode 100644 index 0000000..5dd0749 --- /dev/null +++ b/assets/mollie/src/Resources/Customer.php @@ -0,0 +1,216 @@ + $this->name, "email" => $this->email, "locale" => $this->locale, "metadata" => $this->metadata]; + $result = $this->client->customers->update($this->id, $body); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Customer($this->client)); + } + /** + * @param array $options + * @param array $filters + * + * @return Payment + * @throws ApiException + */ + public function createPayment(array $options = [], array $filters = []) + { + return $this->client->customerPayments->createFor($this, $this->withPresetOptions($options), $filters); + } + /** + * Get all payments for this customer + * + * @return PaymentCollection + * @throws ApiException + */ + public function payments() + { + return $this->client->customerPayments->listFor($this, null, null, $this->getPresetOptions()); + } + /** + * @param array $options + * @param array $filters + * + * @return Subscription + * @throws ApiException + */ + public function createSubscription(array $options = [], array $filters = []) + { + return $this->client->subscriptions->createFor($this, $this->withPresetOptions($options), $filters); + } + /** + * @param string $subscriptionId + * @param array $parameters + * + * @return Subscription + * @throws ApiException + */ + public function getSubscription($subscriptionId, array $parameters = []) + { + return $this->client->subscriptions->getFor($this, $subscriptionId, $this->withPresetOptions($parameters)); + } + /** + * @param string $subscriptionId + * + * @return null + * @throws ApiException + */ + public function cancelSubscription($subscriptionId) + { + return $this->client->subscriptions->cancelFor($this, $subscriptionId, $this->getPresetOptions()); + } + /** + * Get all subscriptions for this customer + * + * @return SubscriptionCollection + * @throws ApiException + */ + public function subscriptions() + { + return $this->client->subscriptions->listFor($this, null, null, $this->getPresetOptions()); + } + /** + * @param array $options + * @param array $filters + * + * @return Mandate + * @throws ApiException + */ + public function createMandate(array $options = [], array $filters = []) + { + return $this->client->mandates->createFor($this, $this->withPresetOptions($options), $filters); + } + /** + * @param string $mandateId + * @param array $parameters + * + * @return Mandate + * @throws ApiException + */ + public function getMandate($mandateId, array $parameters = []) + { + return $this->client->mandates->getFor($this, $mandateId, $parameters); + } + /** + * @param string $mandateId + * + * @return null + * @throws ApiException + */ + public function revokeMandate($mandateId) + { + return $this->client->mandates->revokeFor($this, $mandateId, $this->getPresetOptions()); + } + /** + * Get all mandates for this customer + * + * @return MandateCollection + * @throws ApiException + */ + public function mandates() + { + return $this->client->mandates->listFor($this, null, null, $this->getPresetOptions()); + } + /** + * Helper function to check for mandate with status valid + * + * @return bool + */ + public function hasValidMandate() + { + $mandates = $this->mandates(); + foreach ($mandates as $mandate) { + if ($mandate->isValid()) { + return \true; + } + } + return \false; + } + /** + * Helper function to check for specific payment method mandate with status valid + * + * @return bool + */ + public function hasValidMandateForMethod($method) + { + $mandates = $this->mandates(); + foreach ($mandates as $mandate) { + if ($mandate->method === $method && $mandate->isValid()) { + return \true; + } + } + return \false; + } + /** + * When accessed by oAuth we want to pass the testmode by default + * + * @return array + */ + private function getPresetOptions() + { + $options = []; + if ($this->client->usesOAuth()) { + $options["testmode"] = $this->mode === "test" ? \true : \false; + } + return $options; + } + /** + * Apply the preset options. + * + * @param array $options + * @return array + */ + private function withPresetOptions(array $options) + { + return \array_merge($this->getPresetOptions(), $options); + } +} diff --git a/assets/mollie/src/Resources/CustomerCollection.php b/assets/mollie/src/Resources/CustomerCollection.php new file mode 100644 index 0000000..c81edee --- /dev/null +++ b/assets/mollie/src/Resources/CustomerCollection.php @@ -0,0 +1,21 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/Invoice.php b/assets/mollie/src/Resources/Invoice.php new file mode 100644 index 0000000..1941305 --- /dev/null +++ b/assets/mollie/src/Resources/Invoice.php @@ -0,0 +1,94 @@ +status == \Mollie\Api\Types\InvoiceStatus::STATUS_PAID; + } + /** + * @return bool + */ + public function isOpen() + { + return $this->status == \Mollie\Api\Types\InvoiceStatus::STATUS_OPEN; + } + /** + * @return bool + */ + public function isOverdue() + { + return $this->status == \Mollie\Api\Types\InvoiceStatus::STATUS_OVERDUE; + } +} diff --git a/assets/mollie/src/Resources/InvoiceCollection.php b/assets/mollie/src/Resources/InvoiceCollection.php new file mode 100644 index 0000000..46595a8 --- /dev/null +++ b/assets/mollie/src/Resources/InvoiceCollection.php @@ -0,0 +1,21 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/Issuer.php b/assets/mollie/src/Resources/Issuer.php new file mode 100644 index 0000000..c756b26 --- /dev/null +++ b/assets/mollie/src/Resources/Issuer.php @@ -0,0 +1,32 @@ +status === \Mollie\Api\Types\MandateStatus::STATUS_VALID; + } + /** + * @return bool + */ + public function isPending() + { + return $this->status === \Mollie\Api\Types\MandateStatus::STATUS_PENDING; + } + /** + * @return bool + */ + public function isInvalid() + { + return $this->status === \Mollie\Api\Types\MandateStatus::STATUS_INVALID; + } + /** + * Revoke the mandate + * + * @return null|\stdClass|\Mollie\Api\Resources\Mandate + */ + public function revoke() + { + if (!isset($this->_links->self->href)) { + return $this; + } + $body = null; + if ($this->client->usesOAuth()) { + $body = \json_encode(["testmode" => $this->mode === "test" ? \true : \false]); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_DELETE, $this->_links->self->href, $body); + return $result; + } +} diff --git a/assets/mollie/src/Resources/MandateCollection.php b/assets/mollie/src/Resources/MandateCollection.php new file mode 100644 index 0000000..4f0a7a0 --- /dev/null +++ b/assets/mollie/src/Resources/MandateCollection.php @@ -0,0 +1,36 @@ +client); + } + /** + * @param string $status + * @return array|\Mollie\Api\Resources\MandateCollection + */ + public function whereStatus($status) + { + $collection = new self($this->client, 0, $this->_links); + foreach ($this as $item) { + if ($item->status === $status) { + $collection[] = $item; + $collection->count++; + } + } + return $collection; + } +} diff --git a/assets/mollie/src/Resources/Method.php b/assets/mollie/src/Resources/Method.php new file mode 100644 index 0000000..a273b54 --- /dev/null +++ b/assets/mollie/src/Resources/Method.php @@ -0,0 +1,82 @@ +size1x and $image->size2x to display the payment method logo. + * + * @var \stdClass + */ + public $image; + /** + * The issuers available for this payment method. Only for the methods iDEAL, KBC/CBC and gift cards. + * Will only be filled when explicitly requested using the query string `include` parameter. + * + * @var array|object[] + */ + public $issuers; + /** + * The pricing for this payment method. Will only be filled when explicitly requested using the query string + * `include` parameter. + * + * @var array|object[] + */ + public $pricing; + /** + * The activation status the method is in. + * If the method has status "null", this value will be returned as a null value, not as a string. + * + * @var string | null + */ + public $status; + /** + * @var \stdClass + */ + public $_links; + /** + * Get the issuer value objects + * + * @return IssuerCollection + */ + public function issuers() + { + return \Mollie\Api\Resources\ResourceFactory::createBaseResourceCollection($this->client, \Mollie\Api\Resources\Issuer::class, $this->issuers); + } + /** + * Get the method price value objects. + * + * @return MethodPriceCollection + */ + public function pricing() + { + return \Mollie\Api\Resources\ResourceFactory::createBaseResourceCollection($this->client, \Mollie\Api\Resources\MethodPrice::class, $this->pricing); + } +} diff --git a/assets/mollie/src/Resources/MethodCollection.php b/assets/mollie/src/Resources/MethodCollection.php new file mode 100644 index 0000000..6e59bb4 --- /dev/null +++ b/assets/mollie/src/Resources/MethodCollection.php @@ -0,0 +1,14 @@ +status === \Mollie\Api\Types\OnboardingStatus::NEEDS_DATA; + } + /** + * @return bool + */ + public function isInReview() + { + return $this->status === \Mollie\Api\Types\OnboardingStatus::IN_REVIEW; + } + /** + * @return bool + */ + public function isCompleted() + { + return $this->status === \Mollie\Api\Types\OnboardingStatus::COMPLETED; + } +} diff --git a/assets/mollie/src/Resources/Order.php b/assets/mollie/src/Resources/Order.php new file mode 100644 index 0000000..86aa732 --- /dev/null +++ b/assets/mollie/src/Resources/Order.php @@ -0,0 +1,485 @@ +status === \Mollie\Api\Types\OrderStatus::STATUS_CREATED; + } + /** + * Is this order paid for? + * + * @return bool + */ + public function isPaid() + { + return $this->status === \Mollie\Api\Types\OrderStatus::STATUS_PAID; + } + /** + * Is this order authorized? + * + * @return bool + */ + public function isAuthorized() + { + return $this->status === \Mollie\Api\Types\OrderStatus::STATUS_AUTHORIZED; + } + /** + * Is this order canceled? + * + * @return bool + */ + public function isCanceled() + { + return $this->status === \Mollie\Api\Types\OrderStatus::STATUS_CANCELED; + } + /** + * (Deprecated) Is this order refunded? + * @deprecated 2018-11-27 + * + * @return bool + */ + public function isRefunded() + { + return $this->status === \Mollie\Api\Types\OrderStatus::STATUS_REFUNDED; + } + /** + * Is this order shipping? + * + * @return bool + */ + public function isShipping() + { + return $this->status === \Mollie\Api\Types\OrderStatus::STATUS_SHIPPING; + } + /** + * Is this order completed? + * + * @return bool + */ + public function isCompleted() + { + return $this->status === \Mollie\Api\Types\OrderStatus::STATUS_COMPLETED; + } + /** + * Is this order expired? + * + * @return bool + */ + public function isExpired() + { + return $this->status === \Mollie\Api\Types\OrderStatus::STATUS_EXPIRED; + } + /** + * Is this order completed? + * + * @return bool + */ + public function isPending() + { + return $this->status === \Mollie\Api\Types\OrderStatus::STATUS_PENDING; + } + /** + * Cancels this order. + * If the order was partially shipped, the status will be "completed" instead of + * "canceled". + * Will throw a ApiException if the order id is invalid or the resource cannot + * be found. + * + * @return Order + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function cancel() + { + return $this->client->orders->cancel($this->id, $this->getPresetOptions()); + } + /** + * Cancel a line for this order. + * The data array must contain a lines array. + * You can pass an empty lines array if you want to cancel all eligible lines. + * Returns null if successful. + * + * @param array $data + * @return null + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function cancelLines(array $data) + { + return $this->client->orderLines->cancelFor($this, $data); + } + /** + * Cancels all eligible lines for this order. + * Returns null if successful. + * + * @param array|null $data + * @return null + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function cancelAllLines($data = []) + { + $data['lines'] = []; + return $this->client->orderLines->cancelFor($this, $data); + } + /** + * Get the line value objects + * + * @return OrderLineCollection + */ + public function lines() + { + return \Mollie\Api\Resources\ResourceFactory::createBaseResourceCollection($this->client, \Mollie\Api\Resources\OrderLine::class, $this->lines); + } + /** + * Create a shipment for some order lines. You can provide an empty array for the + * "lines" option to include all unshipped lines for this order. + * + * @param array $options + * + * @return Shipment + * @throws ApiException + */ + public function createShipment(array $options = []) + { + return $this->client->shipments->createFor($this, $this->withPresetOptions($options)); + } + /** + * Create a shipment for all unshipped order lines. + * + * @param array $options + * + * @return Shipment + */ + public function shipAll(array $options = []) + { + $options['lines'] = []; + return $this->createShipment($options); + } + /** + * Retrieve a specific shipment for this order. + * + * @param string $shipmentId + * @param array $parameters + * + * @return Shipment + * @throws ApiException + */ + public function getShipment($shipmentId, array $parameters = []) + { + return $this->client->shipments->getFor($this, $shipmentId, $this->withPresetOptions($parameters)); + } + /** + * Get all shipments for this order. + * + * @param array $parameters + * + * @return ShipmentCollection + * @throws ApiException + */ + public function shipments(array $parameters = []) + { + return $this->client->shipments->listFor($this, $this->withPresetOptions($parameters)); + } + /** + * Get the checkout URL where the customer can complete the payment. + * + * @return string|null + */ + public function getCheckoutUrl() + { + if (empty($this->_links->checkout)) { + return null; + } + return $this->_links->checkout->href; + } + /** + * Refund specific order lines. + * + * @param array $data + * @return Refund + * @throws ApiException + */ + public function refund(array $data) + { + return $this->client->orderRefunds->createFor($this, $this->withPresetOptions($data)); + } + /** + * Refund all eligible order lines. + * + * @param array $data + * @return Refund + */ + public function refundAll(array $data = []) + { + $data['lines'] = []; + return $this->refund($data); + } + /** + * Retrieves all refunds associated with this order + * + * @return RefundCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function refunds() + { + if (!isset($this->_links->refunds->href)) { + return new \Mollie\Api\Resources\RefundCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->refunds->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->refunds, \Mollie\Api\Resources\Refund::class, $result->_links); + } + /** + * Saves the order's updated billingAddress and/or shippingAddress. + * + * @return \Mollie\Api\Resources\Order + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function update() + { + $body = ["billingAddress" => $this->billingAddress, "shippingAddress" => $this->shippingAddress, "orderNumber" => $this->orderNumber, "redirectUrl" => $this->redirectUrl, "cancelUrl" => $this->cancelUrl, "webhookUrl" => $this->webhookUrl]; + $result = $this->client->orders->update($this->id, $body); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Order($this->client)); + } + /** + * Create a new payment for this Order. + * + * @param array $data + * @param array $filters + * @return \Mollie\Api\Resources\Payment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function createPayment($data, $filters = []) + { + return $this->client->orderPayments->createFor($this, $data, $filters); + } + /** + * Retrieve the payments for this order. + * Requires the order to be retrieved using the embed payments parameter. + * + * @return null|\Mollie\Api\Resources\PaymentCollection + */ + public function payments() + { + if (!isset($this->_embedded, $this->_embedded->payments)) { + return null; + } + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $this->_embedded->payments, \Mollie\Api\Resources\Payment::class); + } + /** + * When accessed by oAuth we want to pass the testmode by default + * + * @return array + */ + private function getPresetOptions() + { + $options = []; + if ($this->client->usesOAuth()) { + $options["testmode"] = $this->mode === "test" ? \true : \false; + } + return $options; + } + /** + * Apply the preset options. + * + * @param array $options + * @return array + */ + private function withPresetOptions(array $options) + { + return \array_merge($this->getPresetOptions(), $options); + } +} diff --git a/assets/mollie/src/Resources/OrderCollection.php b/assets/mollie/src/Resources/OrderCollection.php new file mode 100644 index 0000000..ccbf529 --- /dev/null +++ b/assets/mollie/src/Resources/OrderCollection.php @@ -0,0 +1,21 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/OrderLine.php b/assets/mollie/src/Resources/OrderLine.php new file mode 100644 index 0000000..0e4c75a --- /dev/null +++ b/assets/mollie/src/Resources/OrderLine.php @@ -0,0 +1,358 @@ +_links->productUrl)) { + return null; + } + return $this->_links->productUrl; + } + /** + * Get the image URL of the product sold. + * + * @return string|null + */ + public function getImageUrl() + { + if (empty($this->_links->imageUrl)) { + return null; + } + return $this->_links->imageUrl; + } + /** + * Is this order line created? + * + * @return bool + */ + public function isCreated() + { + return $this->status === \Mollie\Api\Types\OrderLineStatus::STATUS_CREATED; + } + /** + * Is this order line paid for? + * + * @return bool + */ + public function isPaid() + { + return $this->status === \Mollie\Api\Types\OrderLineStatus::STATUS_PAID; + } + /** + * Is this order line authorized? + * + * @return bool + */ + public function isAuthorized() + { + return $this->status === \Mollie\Api\Types\OrderLineStatus::STATUS_AUTHORIZED; + } + /** + * Is this order line canceled? + * + * @return bool + */ + public function isCanceled() + { + return $this->status === \Mollie\Api\Types\OrderLineStatus::STATUS_CANCELED; + } + /** + * (Deprecated) Is this order line refunded? + * @deprecated 2018-11-27 + * + * @return bool + */ + public function isRefunded() + { + return $this->status === \Mollie\Api\Types\OrderLineStatus::STATUS_REFUNDED; + } + /** + * Is this order line shipping? + * + * @return bool + */ + public function isShipping() + { + return $this->status === \Mollie\Api\Types\OrderLineStatus::STATUS_SHIPPING; + } + /** + * Is this order line completed? + * + * @return bool + */ + public function isCompleted() + { + return $this->status === \Mollie\Api\Types\OrderLineStatus::STATUS_COMPLETED; + } + /** + * Is this order line for a physical product? + * + * @return bool + */ + public function isPhysical() + { + return $this->type === \Mollie\Api\Types\OrderLineType::TYPE_PHYSICAL; + } + /** + * Is this order line for applying a discount? + * + * @return bool + */ + public function isDiscount() + { + return $this->type === \Mollie\Api\Types\OrderLineType::TYPE_DISCOUNT; + } + /** + * Is this order line for a digital product? + * + * @return bool + */ + public function isDigital() + { + return $this->type === \Mollie\Api\Types\OrderLineType::TYPE_DIGITAL; + } + /** + * Is this order line for applying a shipping fee? + * + * @return bool + */ + public function isShippingFee() + { + return $this->type === \Mollie\Api\Types\OrderLineType::TYPE_SHIPPING_FEE; + } + /** + * Is this order line for store credit? + * + * @return bool + */ + public function isStoreCredit() + { + return $this->type === \Mollie\Api\Types\OrderLineType::TYPE_STORE_CREDIT; + } + /** + * Is this order line for a gift card? + * + * @return bool + */ + public function isGiftCard() + { + return $this->type === \Mollie\Api\Types\OrderLineType::TYPE_GIFT_CARD; + } + /** + * Is this order line for a surcharge? + * + * @return bool + */ + public function isSurcharge() + { + return $this->type === \Mollie\Api\Types\OrderLineType::TYPE_SURCHARGE; + } + /** + * Update an orderline by supplying one or more parameters in the data array + * + * @return BaseResource + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function update() + { + $result = $this->client->orderLines->update($this->orderId, $this->id, $this->getUpdateData()); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Order($this->client)); + } + /** + * Get sanitized array of order line data + * + * @return array + */ + public function getUpdateData() + { + $data = ["name" => $this->name, 'imageUrl' => $this->imageUrl, 'productUrl' => $this->productUrl, 'metadata' => $this->metadata, 'sku' => $this->sku, 'quantity' => $this->quantity, 'unitPrice' => $this->unitPrice, 'discountAmount' => $this->discountAmount, 'totalAmount' => $this->totalAmount, 'vatAmount' => $this->vatAmount, 'vatRate' => $this->vatRate]; + // Explicitly filter only NULL values to keep "vatRate => 0" intact + return \array_filter($data, function ($value) { + return $value !== null; + }); + } +} diff --git a/assets/mollie/src/Resources/OrderLineCollection.php b/assets/mollie/src/Resources/OrderLineCollection.php new file mode 100644 index 0000000..74b7ee9 --- /dev/null +++ b/assets/mollie/src/Resources/OrderLineCollection.php @@ -0,0 +1,30 @@ +id === $lineId) { + return $line; + } + } + return null; + } +} diff --git a/assets/mollie/src/Resources/Organization.php b/assets/mollie/src/Resources/Organization.php new file mode 100644 index 0000000..447344e --- /dev/null +++ b/assets/mollie/src/Resources/Organization.php @@ -0,0 +1,62 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/Partner.php b/assets/mollie/src/Resources/Partner.php new file mode 100644 index 0000000..9a2e523 --- /dev/null +++ b/assets/mollie/src/Resources/Partner.php @@ -0,0 +1,45 @@ +consumerName and $details->consumerAccount. + * + * @var \stdClass|null + */ + public $details; + /** + * Used to restrict the payment methods available to your customer to those from a single country. + * + * @var string|null; + */ + public $restrictPaymentMethodsToCountry; + /** + * @var \stdClass + */ + public $_links; + /** + * @var \stdClass[] + */ + public $_embedded; + /** + * Whether or not this payment can be canceled. + * + * @var bool|null + */ + public $isCancelable; + /** + * The total amount that is already captured for this payment. Only available + * when this payment supports captures. + * + * @var \stdClass|null + */ + public $amountCaptured; + /** + * Indicates whether the capture will be scheduled automatically or not. Set + * to manual to capture the payment manually using the Create capture endpoint. + * + * Possible values: "automatic", "manual" + * + * @var string|null + */ + public $captureMode; + /** + * Indicates the interval to wait before the payment is + * captured, for example `8 hours` or `2 days. The capture delay + * will be added to the date and time the payment became authorized. + * + * Possible values: ... hours ... days + * @example 8 hours + * @var string|null + */ + public $captureDelay; + /** + * UTC datetime on which the merchant has to have captured the payment in + * ISO-8601 format. This parameter is omitted if the payment is not authorized (yet). + * + * @example "2013-12-25T10:30:54+00:00" + * @var string|null + */ + public $captureBefore; + /** + * The application fee, if the payment was created with one. Contains amount + * (the value and currency) and description. + * + * @var \stdClass|null + */ + public $applicationFee; + /** + * An optional routing configuration which enables you to route a successful payment, + * or part of the payment, to one or more connected accounts. Additionally, you can + * schedule (parts of) the payment to become available on the connected account on a + * future date. + * + * @var array|null + */ + public $routing; + /** + * The date and time the payment became authorized, in ISO 8601 format. This + * parameter is omitted if the payment is not authorized (yet). + * + * @example "2013-12-25T10:30:54+00:00" + * @var string|null + */ + public $authorizedAt; + /** + * The date and time the payment was expired, in ISO 8601 format. This + * parameter is omitted if the payment did not expire (yet). + * + * @example "2013-12-25T10:30:54+00:00" + * @var string|null + */ + public $expiredAt; + /** + * If a customer was specified upon payment creation, the customer’s token will + * be available here as well. + * + * @example cst_XPn78q9CfT + * @var string|null + */ + public $customerId; + /** + * This optional field contains your customer’s ISO 3166-1 alpha-2 country code, + * detected by us during checkout. For example: BE. This field is omitted if the + * country code was not detected. + * + * @var string|null + */ + public $countryCode; + /** + * Is this payment canceled? + * + * @return bool + */ + public function isCanceled() + { + return $this->status === \Mollie\Api\Types\PaymentStatus::STATUS_CANCELED; + } + /** + * Is this payment expired? + * + * @return bool + */ + public function isExpired() + { + return $this->status === \Mollie\Api\Types\PaymentStatus::STATUS_EXPIRED; + } + /** + * Is this payment still open / ongoing? + * + * @return bool + */ + public function isOpen() + { + return $this->status === \Mollie\Api\Types\PaymentStatus::STATUS_OPEN; + } + /** + * Is this payment pending? + * + * @return bool + */ + public function isPending() + { + return $this->status === \Mollie\Api\Types\PaymentStatus::STATUS_PENDING; + } + /** + * Is this payment authorized? + * + * @return bool + */ + public function isAuthorized() + { + return $this->status === \Mollie\Api\Types\PaymentStatus::STATUS_AUTHORIZED; + } + /** + * Is this payment paid for? + * + * @return bool + */ + public function isPaid() + { + return !empty($this->paidAt); + } + /** + * Does the payment have refunds + * + * @return bool + */ + public function hasRefunds() + { + return !empty($this->_links->refunds); + } + /** + * Does this payment has chargebacks + * + * @return bool + */ + public function hasChargebacks() + { + return !empty($this->_links->chargebacks); + } + /** + * Is this payment failing? + * + * @return bool + */ + public function isFailed() + { + return $this->status === \Mollie\Api\Types\PaymentStatus::STATUS_FAILED; + } + /** + * Check whether 'sequenceType' is set to 'first'. If a 'first' payment has been + * completed successfully, the consumer's account may be charged automatically + * using recurring payments. + * + * @return bool + */ + public function hasSequenceTypeFirst() + { + return $this->sequenceType === \Mollie\Api\Types\SequenceType::SEQUENCETYPE_FIRST; + } + /** + * Check whether 'sequenceType' is set to 'recurring'. This type of payment is + * processed without involving + * the consumer. + * + * @return bool + */ + public function hasSequenceTypeRecurring() + { + return $this->sequenceType === \Mollie\Api\Types\SequenceType::SEQUENCETYPE_RECURRING; + } + /** + * Get the checkout URL where the customer can complete the payment. + * + * @return string|null + */ + public function getCheckoutUrl() + { + if (empty($this->_links->checkout)) { + return null; + } + return $this->_links->checkout->href; + } + /** + * Get the mobile checkout URL where the customer can complete the payment. + * + * @return string|null + */ + public function getMobileAppCheckoutUrl() + { + if (empty($this->_links->mobileAppCheckout)) { + return null; + } + return $this->_links->mobileAppCheckout->href; + } + /** + * @return bool + */ + public function canBeRefunded() + { + return $this->amountRemaining !== null; + } + /** + * @return bool + */ + public function canBePartiallyRefunded() + { + return $this->canBeRefunded(); + } + /** + * Get the amount that is already refunded + * + * @return float + */ + public function getAmountRefunded() + { + if ($this->amountRefunded) { + return (float) $this->amountRefunded->value; + } + return 0.0; + } + /** + * Get the remaining amount that can be refunded. For some payment methods this + * amount can be higher than the payment amount. This is possible to reimburse + * the costs for a return shipment to your customer for example. + * + * @return float + */ + public function getAmountRemaining() + { + if ($this->amountRemaining) { + return (float) $this->amountRemaining->value; + } + return 0.0; + } + /** + * Get the total amount that was charged back for this payment. Only available when the + * total charged back amount is not zero. + * + * @return float + */ + public function getAmountChargedBack() + { + if ($this->amountChargedBack) { + return (float) $this->amountChargedBack->value; + } + return 0.0; + } + /** + * Does the payment have split payments + * + * @return bool + */ + public function hasSplitPayments() + { + return !empty($this->routing); + } + /** + * Retrieves all refunds associated with this payment + * + * @return RefundCollection + * @throws ApiException + */ + public function refunds() + { + if (!isset($this->_links->refunds->href)) { + return new \Mollie\Api\Resources\RefundCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->refunds->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->refunds, \Mollie\Api\Resources\Refund::class, $result->_links); + } + /** + * @param string $refundId + * @param array $parameters + * + * @return Refund + * @throws ApiException + */ + public function getRefund($refundId, array $parameters = []) + { + return $this->client->paymentRefunds->getFor($this, $refundId, $this->withPresetOptions($parameters)); + } + /** + * @param array $parameters + * + * @return Refund + * @throws ApiException + */ + public function listRefunds(array $parameters = []) + { + return $this->client->paymentRefunds->listFor($this, $this->withPresetOptions($parameters)); + } + /** + * Retrieves all captures associated with this payment + * + * @return CaptureCollection + * @throws ApiException + */ + public function captures() + { + if (!isset($this->_links->captures->href)) { + return new \Mollie\Api\Resources\CaptureCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->captures->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->captures, \Mollie\Api\Resources\Capture::class, $result->_links); + } + /** + * @param string $captureId + * @param array $parameters + * + * @return Capture + * @throws ApiException + */ + public function getCapture($captureId, array $parameters = []) + { + return $this->client->paymentCaptures->getFor($this, $captureId, $this->withPresetOptions($parameters)); + } + /** + * Retrieves all chargebacks associated with this payment + * + * @return ChargebackCollection + * @throws ApiException + */ + public function chargebacks() + { + if (!isset($this->_links->chargebacks->href)) { + return new \Mollie\Api\Resources\ChargebackCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->chargebacks->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->chargebacks, \Mollie\Api\Resources\Chargeback::class, $result->_links); + } + /** + * Retrieves a specific chargeback for this payment. + * + * @param string $chargebackId + * @param array $parameters + * + * @return Chargeback + * @throws ApiException + */ + public function getChargeback($chargebackId, array $parameters = []) + { + return $this->client->paymentChargebacks->getFor($this, $chargebackId, $this->withPresetOptions($parameters)); + } + /** + * Issue a refund for this payment. + * + * @param array $data + * + * @return \Mollie\Api\Resources\Refund + * @throws ApiException + */ + public function refund($data) + { + return $this->client->paymentRefunds->createFor($this, $data); + } + /** + * @return \Mollie\Api\Resources\Payment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function update() + { + $body = ["description" => $this->description, "cancelUrl" => $this->cancelUrl, "redirectUrl" => $this->redirectUrl, "webhookUrl" => $this->webhookUrl, "metadata" => $this->metadata, "restrictPaymentMethodsToCountry" => $this->restrictPaymentMethodsToCountry, "locale" => $this->locale, "dueDate" => $this->dueDate]; + $result = $this->client->payments->update($this->id, $body); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Payment($this->client)); + } + /** + * When accessed by oAuth we want to pass the testmode by default + * + * @return array + */ + private function getPresetOptions() + { + $options = []; + if ($this->client->usesOAuth()) { + $options["testmode"] = $this->mode === "test" ? \true : \false; + } + return $options; + } + /** + * Apply the preset options. + * + * @param array $options + * @return array + */ + private function withPresetOptions(array $options) + { + return \array_merge($this->getPresetOptions(), $options); + } + /** + * The total amount that is already captured for this payment. Only available + * when this payment supports captures. + * + * @return float + */ + public function getAmountCaptured() + { + if ($this->amountCaptured) { + return (float) $this->amountCaptured->value; + } + return 0.0; + } + /** + * The amount that has been settled. + * + * @return float + */ + public function getSettlementAmount() + { + if ($this->settlementAmount) { + return (float) $this->settlementAmount->value; + } + return 0.0; + } + /** + * The total amount that is already captured for this payment. Only available + * when this payment supports captures. + * + * @return float + */ + public function getApplicationFeeAmount() + { + if ($this->applicationFee) { + return (float) $this->applicationFee->amount->value; + } + return 0.0; + } +} diff --git a/assets/mollie/src/Resources/PaymentCollection.php b/assets/mollie/src/Resources/PaymentCollection.php new file mode 100644 index 0000000..93c9b56 --- /dev/null +++ b/assets/mollie/src/Resources/PaymentCollection.php @@ -0,0 +1,21 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/PaymentLink.php b/assets/mollie/src/Resources/PaymentLink.php new file mode 100644 index 0000000..f83eab3 --- /dev/null +++ b/assets/mollie/src/Resources/PaymentLink.php @@ -0,0 +1,112 @@ +paidAt); + } + /** + * Get the checkout URL where the customer can complete the payment. + * + * @return string|null + */ + public function getCheckoutUrl() + { + if (empty($this->_links->paymentLink)) { + return null; + } + return $this->_links->paymentLink->href; + } +} diff --git a/assets/mollie/src/Resources/PaymentLinkCollection.php b/assets/mollie/src/Resources/PaymentLinkCollection.php new file mode 100644 index 0000000..4e9d29f --- /dev/null +++ b/assets/mollie/src/Resources/PaymentLinkCollection.php @@ -0,0 +1,21 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/Permission.php b/assets/mollie/src/Resources/Permission.php new file mode 100644 index 0000000..53eafe2 --- /dev/null +++ b/assets/mollie/src/Resources/Permission.php @@ -0,0 +1,24 @@ +status == \Mollie\Api\Types\ProfileStatus::STATUS_UNVERIFIED; + } + /** + * @return bool + */ + public function isVerified() + { + return $this->status == \Mollie\Api\Types\ProfileStatus::STATUS_VERIFIED; + } + /** + * @return bool + */ + public function isBlocked() + { + return $this->status == \Mollie\Api\Types\ProfileStatus::STATUS_BLOCKED; + } + /** + * @return \Mollie\Api\Resources\Profile + * @throws ApiException + */ + public function update() + { + $body = ["name" => $this->name, "website" => $this->website, "email" => $this->email, "phone" => $this->phone, "businessCategory" => $this->businessCategory, "mode" => $this->mode]; + $result = $this->client->profiles->update($this->id, $body); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Profile($this->client)); + } + /** + * Retrieves all chargebacks associated with this profile + * + * @return ChargebackCollection + * @throws ApiException + */ + public function chargebacks() + { + if (!isset($this->_links->chargebacks->href)) { + return new \Mollie\Api\Resources\ChargebackCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->chargebacks->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->chargebacks, \Mollie\Api\Resources\Chargeback::class, $result->_links); + } + /** + * Retrieves all methods activated on this profile + * + * @return MethodCollection + * @throws ApiException + */ + public function methods() + { + if (!isset($this->_links->methods->href)) { + return new \Mollie\Api\Resources\MethodCollection(0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->methods->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->methods, \Mollie\Api\Resources\Method::class, $result->_links); + } + /** + * Enable a payment method for this profile. + * + * @param string $methodId + * @param array $data + * @return Method + * @throws ApiException + */ + public function enableMethod($methodId, array $data = []) + { + return $this->client->profileMethods->createFor($this, $methodId, $data); + } + /** + * Disable a payment method for this profile. + * + * @param string $methodId + * @param array $data + * @return Method + * @throws ApiException + */ + public function disableMethod($methodId, array $data = []) + { + return $this->client->profileMethods->deleteFor($this, $methodId, $data); + } + /** + * Retrieves all payments associated with this profile + * + * @return PaymentCollection + * @throws ApiException + */ + public function payments() + { + if (!isset($this->_links->payments->href)) { + return new \Mollie\Api\Resources\PaymentCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->payments->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->methods, \Mollie\Api\Resources\Method::class, $result->_links); + } + /** + * Retrieves all refunds associated with this profile + * + * @return RefundCollection + * @throws ApiException + */ + public function refunds() + { + if (!isset($this->_links->refunds->href)) { + return new \Mollie\Api\Resources\RefundCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->refunds->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->refunds, \Mollie\Api\Resources\Refund::class, $result->_links); + } +} diff --git a/assets/mollie/src/Resources/ProfileCollection.php b/assets/mollie/src/Resources/ProfileCollection.php new file mode 100644 index 0000000..0d207d3 --- /dev/null +++ b/assets/mollie/src/Resources/ProfileCollection.php @@ -0,0 +1,21 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/Refund.php b/assets/mollie/src/Resources/Refund.php new file mode 100644 index 0000000..7045507 --- /dev/null +++ b/assets/mollie/src/Resources/Refund.php @@ -0,0 +1,153 @@ +isQueued() || $this->isPending(); + } + /** + * Is this refund queued? + * + * @return bool + */ + public function isQueued() + { + return $this->status === \Mollie\Api\Types\RefundStatus::STATUS_QUEUED; + } + /** + * Is this refund pending? + * + * @return bool + */ + public function isPending() + { + return $this->status === \Mollie\Api\Types\RefundStatus::STATUS_PENDING; + } + /** + * Is this refund processing? + * + * @return bool + */ + public function isProcessing() + { + return $this->status === \Mollie\Api\Types\RefundStatus::STATUS_PROCESSING; + } + /** + * Is this refund transferred to consumer? + * + * @return bool + */ + public function isTransferred() + { + return $this->status === \Mollie\Api\Types\RefundStatus::STATUS_REFUNDED; + } + /** + * Is this refund failed? + * + * @return bool + */ + public function isFailed() + { + return $this->status === \Mollie\Api\Types\RefundStatus::STATUS_FAILED; + } + /** + * Is this refund canceled? + * + * @return bool + */ + public function isCanceled() + { + return $this->status === \Mollie\Api\Types\RefundStatus::STATUS_CANCELED; + } + /** + * Cancel the refund. + * Returns null if successful. + * + * @return null + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function cancel() + { + $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_DELETE, $this->_links->self->href); + return null; + } +} diff --git a/assets/mollie/src/Resources/RefundCollection.php b/assets/mollie/src/Resources/RefundCollection.php new file mode 100644 index 0000000..26e053d --- /dev/null +++ b/assets/mollie/src/Resources/RefundCollection.php @@ -0,0 +1,21 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/ResourceFactory.php b/assets/mollie/src/Resources/ResourceFactory.php new file mode 100644 index 0000000..50ff356 --- /dev/null +++ b/assets/mollie/src/Resources/ResourceFactory.php @@ -0,0 +1,61 @@ + $value) { + $resource->{$property} = $value; + } + return $resource; + } + /** + * @param MollieApiClient $client + * @param string $resourceClass + * @param array $data + * @param null $_links + * @param string $resourceCollectionClass + * @return mixed + */ + public static function createBaseResourceCollection(\Mollie\Api\MollieApiClient $client, $resourceClass, $data, $_links = null, $resourceCollectionClass = null) + { + $resourceCollectionClass = $resourceCollectionClass ?: $resourceClass . 'Collection'; + $data = $data ?: []; + $result = new $resourceCollectionClass(\count($data), $_links); + foreach ($data as $item) { + $result[] = static::createFromApiResult($item, new $resourceClass($client)); + } + return $result; + } + /** + * @param MollieApiClient $client + * @param array $input + * @param string $resourceClass + * @param null $_links + * @param null $resourceCollectionClass + * @return mixed + */ + public static function createCursorResourceCollection($client, array $input, $resourceClass, $_links = null, $resourceCollectionClass = null) + { + if (null === $resourceCollectionClass) { + $resourceCollectionClass = $resourceClass . 'Collection'; + } + $data = new $resourceCollectionClass($client, \count($input), $_links); + foreach ($input as $item) { + $data[] = static::createFromApiResult($item, new $resourceClass($client)); + } + return $data; + } +} diff --git a/assets/mollie/src/Resources/Route.php b/assets/mollie/src/Resources/Route.php new file mode 100644 index 0000000..876f584 --- /dev/null +++ b/assets/mollie/src/Resources/Route.php @@ -0,0 +1,32 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/Settlement.php b/assets/mollie/src/Resources/Settlement.php new file mode 100644 index 0000000..fd085ce --- /dev/null +++ b/assets/mollie/src/Resources/Settlement.php @@ -0,0 +1,154 @@ +status === \Mollie\Api\Types\SettlementStatus::STATUS_OPEN; + } + /** + * Is this settlement pending? + * + * @return bool + */ + public function isPending() + { + return $this->status === \Mollie\Api\Types\SettlementStatus::STATUS_PENDING; + } + /** + * Is this settlement paidout? + * + * @return bool + */ + public function isPaidout() + { + return $this->status === \Mollie\Api\Types\SettlementStatus::STATUS_PAIDOUT; + } + /** + * Is this settlement failed? + * + * @return bool + */ + public function isFailed() + { + return $this->status === \Mollie\Api\Types\SettlementStatus::STATUS_FAILED; + } + /** + * Retrieves all payments associated with this settlement + * + * @param int|null $limit + * @param array $parameters + * @return PaymentCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function payments(int $limit = null, array $parameters = []) : \Mollie\Api\Resources\PaymentCollection + { + return $this->client->settlementPayments->pageForId($this->id, null, $limit, $parameters); + } + /** + * Retrieves all refunds associated with this settlement + * + * @return RefundCollection + * @throws ApiException + */ + public function refunds() + { + if (!isset($this->_links->refunds->href)) { + return new \Mollie\Api\Resources\RefundCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->refunds->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->refunds, \Mollie\Api\Resources\Refund::class, $result->_links); + } + /** + * Retrieves all chargebacks associated with this settlement + * + * @return ChargebackCollection + * @throws ApiException + */ + public function chargebacks() + { + if (!isset($this->_links->chargebacks->href)) { + return new \Mollie\Api\Resources\ChargebackCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->chargebacks->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->chargebacks, \Mollie\Api\Resources\Chargeback::class, $result->_links); + } + /** + * Retrieves all captures associated with this settlement + * + * @return CaptureCollection + * @throws ApiException + */ + public function captures() + { + if (!isset($this->_links->captures->href)) { + return new \Mollie\Api\Resources\CaptureCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->captures->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->captures, \Mollie\Api\Resources\Capture::class, $result->_links); + } +} diff --git a/assets/mollie/src/Resources/SettlementCollection.php b/assets/mollie/src/Resources/SettlementCollection.php new file mode 100644 index 0000000..a2b0ffb --- /dev/null +++ b/assets/mollie/src/Resources/SettlementCollection.php @@ -0,0 +1,21 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/Shipment.php b/assets/mollie/src/Resources/Shipment.php new file mode 100644 index 0000000..621e9b2 --- /dev/null +++ b/assets/mollie/src/Resources/Shipment.php @@ -0,0 +1,104 @@ +tracking !== null; + } + /** + * Does this shipment offer a track and trace code? + * + * @return bool + */ + public function hasTrackingUrl() + { + return $this->hasTracking() && !empty($this->tracking->url); + } + /** + * Retrieve the track and trace url. Returns null if there is no url available. + * + * @return string|null + */ + public function getTrackingUrl() + { + if (!$this->hasTrackingUrl()) { + return null; + } + return $this->tracking->url; + } + /** + * Get the line value objects + * + * @return OrderLineCollection + */ + public function lines() + { + return \Mollie\Api\Resources\ResourceFactory::createBaseResourceCollection($this->client, \Mollie\Api\Resources\OrderLine::class, $this->lines); + } + /** + * Get the Order object for this shipment + * + * @return Order + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function order() + { + return $this->client->orders->get($this->orderId); + } + /** + * Save changes made to this shipment. + * + * @return BaseResource|Shipment + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function update() + { + $body = ["tracking" => $this->tracking]; + $result = $this->client->shipments->update($this->orderId, $this->id, $body); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Shipment($this->client)); + } +} diff --git a/assets/mollie/src/Resources/ShipmentCollection.php b/assets/mollie/src/Resources/ShipmentCollection.php new file mode 100644 index 0000000..3029c84 --- /dev/null +++ b/assets/mollie/src/Resources/ShipmentCollection.php @@ -0,0 +1,14 @@ + $this->amount, "times" => $this->times, "startDate" => $this->startDate, "webhookUrl" => $this->webhookUrl, "description" => $this->description, "mandateId" => $this->mandateId, "metadata" => $this->metadata, "interval" => $this->interval]; + $result = $this->client->subscriptions->update($this->customerId, $this->id, $body); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Subscription($this->client)); + } + /** + * Returns whether the Subscription is active or not. + * + * @return bool + */ + public function isActive() + { + return $this->status === \Mollie\Api\Types\SubscriptionStatus::STATUS_ACTIVE; + } + /** + * Returns whether the Subscription is pending or not. + * + * @return bool + */ + public function isPending() + { + return $this->status === \Mollie\Api\Types\SubscriptionStatus::STATUS_PENDING; + } + /** + * Returns whether the Subscription is canceled or not. + * + * @return bool + */ + public function isCanceled() + { + return $this->status === \Mollie\Api\Types\SubscriptionStatus::STATUS_CANCELED; + } + /** + * Returns whether the Subscription is suspended or not. + * + * @return bool + */ + public function isSuspended() + { + return $this->status === \Mollie\Api\Types\SubscriptionStatus::STATUS_SUSPENDED; + } + /** + * Returns whether the Subscription is completed or not. + * + * @return bool + */ + public function isCompleted() + { + return $this->status === \Mollie\Api\Types\SubscriptionStatus::STATUS_COMPLETED; + } + /** + * Cancels this subscription + * + * @return Subscription + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function cancel() + { + if (!isset($this->_links->self->href)) { + return $this; + } + $body = null; + if ($this->client->usesOAuth()) { + $body = \json_encode(["testmode" => $this->mode === "test" ? \true : \false]); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_DELETE, $this->_links->self->href, $body); + return \Mollie\Api\Resources\ResourceFactory::createFromApiResult($result, new \Mollie\Api\Resources\Subscription($this->client)); + } + /** + * Get subscription payments + * + * @return \Mollie\Api\Resources\PaymentCollection + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function payments() + { + if (!isset($this->_links->payments->href)) { + return new \Mollie\Api\Resources\PaymentCollection($this->client, 0, null); + } + $result = $this->client->performHttpCallToFullUrl(\Mollie\Api\MollieApiClient::HTTP_GET, $this->_links->payments->href); + return \Mollie\Api\Resources\ResourceFactory::createCursorResourceCollection($this->client, $result->_embedded->payments, \Mollie\Api\Resources\Payment::class, $result->_links); + } +} diff --git a/assets/mollie/src/Resources/SubscriptionCollection.php b/assets/mollie/src/Resources/SubscriptionCollection.php new file mode 100644 index 0000000..83159d1 --- /dev/null +++ b/assets/mollie/src/Resources/SubscriptionCollection.php @@ -0,0 +1,21 @@ +client); + } +} diff --git a/assets/mollie/src/Resources/Terminal.php b/assets/mollie/src/Resources/Terminal.php new file mode 100644 index 0000000..954d61e --- /dev/null +++ b/assets/mollie/src/Resources/Terminal.php @@ -0,0 +1,138 @@ +status === \Mollie\Api\Types\TerminalStatus::STATUS_PENDING; + } + /** + * @return bool + */ + public function isActive() + { + return $this->status === \Mollie\Api\Types\TerminalStatus::STATUS_ACTIVE; + } + /** + * @return bool + */ + public function isInactive() + { + return $this->status === \Mollie\Api\Types\TerminalStatus::STATUS_INACTIVE; + } +} diff --git a/assets/mollie/src/Resources/TerminalCollection.php b/assets/mollie/src/Resources/TerminalCollection.php new file mode 100644 index 0000000..b314854 --- /dev/null +++ b/assets/mollie/src/Resources/TerminalCollection.php @@ -0,0 +1,21 @@ +client); + } +} diff --git a/assets/mollie/src/Types/ApprovalPrompt.php b/assets/mollie/src/Types/ApprovalPrompt.php new file mode 100644 index 0000000..df2a528 --- /dev/null +++ b/assets/mollie/src/Types/ApprovalPrompt.php @@ -0,0 +1,13 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> + */ + private $prefixesPsr0 = array(); + /** + * @var list + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/assets/mollie/vendor/composer/InstalledVersions.php b/assets/mollie/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000..5474c96 --- /dev/null +++ b/assets/mollie/vendor/composer/InstalledVersions.php @@ -0,0 +1,313 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace _PhpScoperf7c63b60b99d\Composer; + +use _PhpScoperf7c63b60b99d\Composer\Autoload\ClassLoader; +use _PhpScoperf7c63b60b99d\Composer\Semver\VersionParser; +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + /** + * @var bool|null + */ + private static $canGetVendors; + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = \array_keys($installed['versions']); + } + if (1 === \count($packages)) { + return $packages[0]; + } + return \array_keys(\array_flip(\call_user_func_array('array_merge', $packages))); + } + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + return $packagesByType; + } + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = \true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === \false; + } + } + return \false; + } + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(\_PhpScoperf7c63b60b99d\Composer\Semver\VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + return $provided->matches($constraint); + } + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (\array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = \array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (\array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = \array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (\array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = \array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + return \implode(' || ', $ranges); + } + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + return $installed['versions'][$packageName]['version']; + } + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + return $installed['versions'][$packageName]['pretty_version']; + } + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + return $installed['versions'][$packageName]['reference']; + } + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + return $installed[0]['root']; + } + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @\trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', \E_USER_DEPRECATED); + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (\substr(__DIR__, -8, 1) !== 'C') { + self::$installed = (include __DIR__ . '/installed.php'); + } else { + self::$installed = array(); + } + } + return self::$installed; + } + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = \method_exists('_PhpScoperf7c63b60b99d\\Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders'); + } + $installed = array(); + if (self::$canGetVendors) { + foreach (\_PhpScoperf7c63b60b99d\Composer\Autoload\ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (\is_file($vendorDir . '/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = (require $vendorDir . '/composer/installed.php'); + $installed[] = self::$installedByVendor[$vendorDir] = $required; + if (null === self::$installed && \strtr($vendorDir . '/composer', '\\', '/') === \strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[\count($installed) - 1]; + } + } + } + } + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (\substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = (require __DIR__ . '/installed.php'); + self::$installed = $required; + } else { + self::$installed = array(); + } + } + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + return $installed; + } +} diff --git a/assets/mollie/vendor/composer/LICENSE b/assets/mollie/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/assets/mollie/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/assets/mollie/vendor/composer/autoload_classmap.php b/assets/mollie/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..07a217f --- /dev/null +++ b/assets/mollie/vendor/composer/autoload_classmap.php @@ -0,0 +1,139 @@ + $vendorDir . '/composer/InstalledVersions.php', + 'Mollie\\Api\\CompatibilityChecker' => $baseDir . '/src/CompatibilityChecker.php', + 'Mollie\\Api\\Endpoints\\BalanceEndpoint' => $baseDir . '/src/Endpoints/BalanceEndpoint.php', + 'Mollie\\Api\\Endpoints\\BalanceReportEndpoint' => $baseDir . '/src/Endpoints/BalanceReportEndpoint.php', + 'Mollie\\Api\\Endpoints\\BalanceTransactionEndpoint' => $baseDir . '/src/Endpoints/BalanceTransactionEndpoint.php', + 'Mollie\\Api\\Endpoints\\ChargebackEndpoint' => $baseDir . '/src/Endpoints/ChargebackEndpoint.php', + 'Mollie\\Api\\Endpoints\\ClientEndpoint' => $baseDir . '/src/Endpoints/ClientEndpoint.php', + 'Mollie\\Api\\Endpoints\\ClientLinkEndpoint' => $baseDir . '/src/Endpoints/ClientLinkEndpoint.php', + 'Mollie\\Api\\Endpoints\\CollectionEndpointAbstract' => $baseDir . '/src/Endpoints/CollectionEndpointAbstract.php', + 'Mollie\\Api\\Endpoints\\CustomerEndpoint' => $baseDir . '/src/Endpoints/CustomerEndpoint.php', + 'Mollie\\Api\\Endpoints\\CustomerPaymentsEndpoint' => $baseDir . '/src/Endpoints/CustomerPaymentsEndpoint.php', + 'Mollie\\Api\\Endpoints\\EndpointAbstract' => $baseDir . '/src/Endpoints/EndpointAbstract.php', + 'Mollie\\Api\\Endpoints\\InvoiceEndpoint' => $baseDir . '/src/Endpoints/InvoiceEndpoint.php', + 'Mollie\\Api\\Endpoints\\MandateEndpoint' => $baseDir . '/src/Endpoints/MandateEndpoint.php', + 'Mollie\\Api\\Endpoints\\MethodEndpoint' => $baseDir . '/src/Endpoints/MethodEndpoint.php', + 'Mollie\\Api\\Endpoints\\OnboardingEndpoint' => $baseDir . '/src/Endpoints/OnboardingEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrderEndpoint' => $baseDir . '/src/Endpoints/OrderEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrderLineEndpoint' => $baseDir . '/src/Endpoints/OrderLineEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrderPaymentEndpoint' => $baseDir . '/src/Endpoints/OrderPaymentEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrderRefundEndpoint' => $baseDir . '/src/Endpoints/OrderRefundEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrganizationEndpoint' => $baseDir . '/src/Endpoints/OrganizationEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrganizationPartnerEndpoint' => $baseDir . '/src/Endpoints/OrganizationPartnerEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentCaptureEndpoint' => $baseDir . '/src/Endpoints/PaymentCaptureEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentChargebackEndpoint' => $baseDir . '/src/Endpoints/PaymentChargebackEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentEndpoint' => $baseDir . '/src/Endpoints/PaymentEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentLinkEndpoint' => $baseDir . '/src/Endpoints/PaymentLinkEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentRefundEndpoint' => $baseDir . '/src/Endpoints/PaymentRefundEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentRouteEndpoint' => $baseDir . '/src/Endpoints/PaymentRouteEndpoint.php', + 'Mollie\\Api\\Endpoints\\PermissionEndpoint' => $baseDir . '/src/Endpoints/PermissionEndpoint.php', + 'Mollie\\Api\\Endpoints\\ProfileEndpoint' => $baseDir . '/src/Endpoints/ProfileEndpoint.php', + 'Mollie\\Api\\Endpoints\\ProfileMethodEndpoint' => $baseDir . '/src/Endpoints/ProfileMethodEndpoint.php', + 'Mollie\\Api\\Endpoints\\RefundEndpoint' => $baseDir . '/src/Endpoints/RefundEndpoint.php', + 'Mollie\\Api\\Endpoints\\SettlementPaymentEndpoint' => $baseDir . '/src/Endpoints/SettlementPaymentEndpoint.php', + 'Mollie\\Api\\Endpoints\\SettlementsEndpoint' => $baseDir . '/src/Endpoints/SettlementsEndpoint.php', + 'Mollie\\Api\\Endpoints\\ShipmentEndpoint' => $baseDir . '/src/Endpoints/ShipmentEndpoint.php', + 'Mollie\\Api\\Endpoints\\SubscriptionEndpoint' => $baseDir . '/src/Endpoints/SubscriptionEndpoint.php', + 'Mollie\\Api\\Endpoints\\TerminalEndpoint' => $baseDir . '/src/Endpoints/TerminalEndpoint.php', + 'Mollie\\Api\\Endpoints\\WalletEndpoint' => $baseDir . '/src/Endpoints/WalletEndpoint.php', + 'Mollie\\Api\\Exceptions\\ApiException' => $baseDir . '/src/Exceptions/ApiException.php', + 'Mollie\\Api\\Exceptions\\CurlConnectTimeoutException' => $baseDir . '/src/Exceptions/CurlConnectTimeoutException.php', + 'Mollie\\Api\\Exceptions\\HttpAdapterDoesNotSupportDebuggingException' => $baseDir . '/src/Exceptions/HttpAdapterDoesNotSupportDebuggingException.php', + 'Mollie\\Api\\Exceptions\\IncompatiblePlatform' => $baseDir . '/src/Exceptions/IncompatiblePlatform.php', + 'Mollie\\Api\\Exceptions\\UnrecognizedClientException' => $baseDir . '/src/Exceptions/UnrecognizedClientException.php', + 'Mollie\\Api\\HttpAdapter\\CurlMollieHttpAdapter' => $baseDir . '/src/HttpAdapter/CurlMollieHttpAdapter.php', + 'Mollie\\Api\\HttpAdapter\\Guzzle6And7MollieHttpAdapter' => $baseDir . '/src/HttpAdapter/Guzzle6And7MollieHttpAdapter.php', + 'Mollie\\Api\\HttpAdapter\\Guzzle6And7RetryMiddlewareFactory' => $baseDir . '/src/HttpAdapter/Guzzle6And7RetryMiddlewareFactory.php', + 'Mollie\\Api\\HttpAdapter\\MollieHttpAdapterInterface' => $baseDir . '/src/HttpAdapter/MollieHttpAdapterInterface.php', + 'Mollie\\Api\\HttpAdapter\\MollieHttpAdapterPicker' => $baseDir . '/src/HttpAdapter/MollieHttpAdapterPicker.php', + 'Mollie\\Api\\HttpAdapter\\MollieHttpAdapterPickerInterface' => $baseDir . '/src/HttpAdapter/MollieHttpAdapterPickerInterface.php', + 'Mollie\\Api\\Idempotency\\DefaultIdempotencyKeyGenerator' => $baseDir . '/src/Idempotency/DefaultIdempotencyKeyGenerator.php', + 'Mollie\\Api\\Idempotency\\FakeIdempotencyKeyGenerator' => $baseDir . '/src/Idempotency/FakeIdempotencyKeyGenerator.php', + 'Mollie\\Api\\Idempotency\\IdempotencyKeyGeneratorContract' => $baseDir . '/src/Idempotency/IdempotencyKeyGeneratorContract.php', + 'Mollie\\Api\\MollieApiClient' => $baseDir . '/src/MollieApiClient.php', + 'Mollie\\Api\\Resources\\Balance' => $baseDir . '/src/Resources/Balance.php', + 'Mollie\\Api\\Resources\\BalanceCollection' => $baseDir . '/src/Resources/BalanceCollection.php', + 'Mollie\\Api\\Resources\\BalanceReport' => $baseDir . '/src/Resources/BalanceReport.php', + 'Mollie\\Api\\Resources\\BalanceTransaction' => $baseDir . '/src/Resources/BalanceTransaction.php', + 'Mollie\\Api\\Resources\\BalanceTransactionCollection' => $baseDir . '/src/Resources/BalanceTransactionCollection.php', + 'Mollie\\Api\\Resources\\BaseCollection' => $baseDir . '/src/Resources/BaseCollection.php', + 'Mollie\\Api\\Resources\\BaseResource' => $baseDir . '/src/Resources/BaseResource.php', + 'Mollie\\Api\\Resources\\Capture' => $baseDir . '/src/Resources/Capture.php', + 'Mollie\\Api\\Resources\\CaptureCollection' => $baseDir . '/src/Resources/CaptureCollection.php', + 'Mollie\\Api\\Resources\\Chargeback' => $baseDir . '/src/Resources/Chargeback.php', + 'Mollie\\Api\\Resources\\ChargebackCollection' => $baseDir . '/src/Resources/ChargebackCollection.php', + 'Mollie\\Api\\Resources\\Client' => $baseDir . '/src/Resources/Client.php', + 'Mollie\\Api\\Resources\\ClientCollection' => $baseDir . '/src/Resources/ClientCollection.php', + 'Mollie\\Api\\Resources\\ClientLink' => $baseDir . '/src/Resources/ClientLink.php', + 'Mollie\\Api\\Resources\\CurrentProfile' => $baseDir . '/src/Resources/CurrentProfile.php', + 'Mollie\\Api\\Resources\\CursorCollection' => $baseDir . '/src/Resources/CursorCollection.php', + 'Mollie\\Api\\Resources\\Customer' => $baseDir . '/src/Resources/Customer.php', + 'Mollie\\Api\\Resources\\CustomerCollection' => $baseDir . '/src/Resources/CustomerCollection.php', + 'Mollie\\Api\\Resources\\Invoice' => $baseDir . '/src/Resources/Invoice.php', + 'Mollie\\Api\\Resources\\InvoiceCollection' => $baseDir . '/src/Resources/InvoiceCollection.php', + 'Mollie\\Api\\Resources\\Issuer' => $baseDir . '/src/Resources/Issuer.php', + 'Mollie\\Api\\Resources\\IssuerCollection' => $baseDir . '/src/Resources/IssuerCollection.php', + 'Mollie\\Api\\Resources\\Mandate' => $baseDir . '/src/Resources/Mandate.php', + 'Mollie\\Api\\Resources\\MandateCollection' => $baseDir . '/src/Resources/MandateCollection.php', + 'Mollie\\Api\\Resources\\Method' => $baseDir . '/src/Resources/Method.php', + 'Mollie\\Api\\Resources\\MethodCollection' => $baseDir . '/src/Resources/MethodCollection.php', + 'Mollie\\Api\\Resources\\MethodPrice' => $baseDir . '/src/Resources/MethodPrice.php', + 'Mollie\\Api\\Resources\\MethodPriceCollection' => $baseDir . '/src/Resources/MethodPriceCollection.php', + 'Mollie\\Api\\Resources\\Onboarding' => $baseDir . '/src/Resources/Onboarding.php', + 'Mollie\\Api\\Resources\\Order' => $baseDir . '/src/Resources/Order.php', + 'Mollie\\Api\\Resources\\OrderCollection' => $baseDir . '/src/Resources/OrderCollection.php', + 'Mollie\\Api\\Resources\\OrderLine' => $baseDir . '/src/Resources/OrderLine.php', + 'Mollie\\Api\\Resources\\OrderLineCollection' => $baseDir . '/src/Resources/OrderLineCollection.php', + 'Mollie\\Api\\Resources\\Organization' => $baseDir . '/src/Resources/Organization.php', + 'Mollie\\Api\\Resources\\OrganizationCollection' => $baseDir . '/src/Resources/OrganizationCollection.php', + 'Mollie\\Api\\Resources\\Partner' => $baseDir . '/src/Resources/Partner.php', + 'Mollie\\Api\\Resources\\Payment' => $baseDir . '/src/Resources/Payment.php', + 'Mollie\\Api\\Resources\\PaymentCollection' => $baseDir . '/src/Resources/PaymentCollection.php', + 'Mollie\\Api\\Resources\\PaymentLink' => $baseDir . '/src/Resources/PaymentLink.php', + 'Mollie\\Api\\Resources\\PaymentLinkCollection' => $baseDir . '/src/Resources/PaymentLinkCollection.php', + 'Mollie\\Api\\Resources\\Permission' => $baseDir . '/src/Resources/Permission.php', + 'Mollie\\Api\\Resources\\PermissionCollection' => $baseDir . '/src/Resources/PermissionCollection.php', + 'Mollie\\Api\\Resources\\Profile' => $baseDir . '/src/Resources/Profile.php', + 'Mollie\\Api\\Resources\\ProfileCollection' => $baseDir . '/src/Resources/ProfileCollection.php', + 'Mollie\\Api\\Resources\\Refund' => $baseDir . '/src/Resources/Refund.php', + 'Mollie\\Api\\Resources\\RefundCollection' => $baseDir . '/src/Resources/RefundCollection.php', + 'Mollie\\Api\\Resources\\ResourceFactory' => $baseDir . '/src/Resources/ResourceFactory.php', + 'Mollie\\Api\\Resources\\Route' => $baseDir . '/src/Resources/Route.php', + 'Mollie\\Api\\Resources\\RouteCollection' => $baseDir . '/src/Resources/RouteCollection.php', + 'Mollie\\Api\\Resources\\Settlement' => $baseDir . '/src/Resources/Settlement.php', + 'Mollie\\Api\\Resources\\SettlementCollection' => $baseDir . '/src/Resources/SettlementCollection.php', + 'Mollie\\Api\\Resources\\Shipment' => $baseDir . '/src/Resources/Shipment.php', + 'Mollie\\Api\\Resources\\ShipmentCollection' => $baseDir . '/src/Resources/ShipmentCollection.php', + 'Mollie\\Api\\Resources\\Subscription' => $baseDir . '/src/Resources/Subscription.php', + 'Mollie\\Api\\Resources\\SubscriptionCollection' => $baseDir . '/src/Resources/SubscriptionCollection.php', + 'Mollie\\Api\\Resources\\Terminal' => $baseDir . '/src/Resources/Terminal.php', + 'Mollie\\Api\\Resources\\TerminalCollection' => $baseDir . '/src/Resources/TerminalCollection.php', + 'Mollie\\Api\\Types\\ApprovalPrompt' => $baseDir . '/src/Types/ApprovalPrompt.php', + 'Mollie\\Api\\Types\\BalanceTransferFrequency' => $baseDir . '/src/Types/BalanceTransferFrequency.php', + 'Mollie\\Api\\Types\\InvoiceStatus' => $baseDir . '/src/Types/InvoiceStatus.php', + 'Mollie\\Api\\Types\\MandateMethod' => $baseDir . '/src/Types/MandateMethod.php', + 'Mollie\\Api\\Types\\MandateStatus' => $baseDir . '/src/Types/MandateStatus.php', + 'Mollie\\Api\\Types\\OnboardingStatus' => $baseDir . '/src/Types/OnboardingStatus.php', + 'Mollie\\Api\\Types\\OrderLineStatus' => $baseDir . '/src/Types/OrderLineStatus.php', + 'Mollie\\Api\\Types\\OrderLineType' => $baseDir . '/src/Types/OrderLineType.php', + 'Mollie\\Api\\Types\\OrderLineUpdateOperationType' => $baseDir . '/src/Types/OrderLineUpdateOperationType.php', + 'Mollie\\Api\\Types\\OrderStatus' => $baseDir . '/src/Types/OrderStatus.php', + 'Mollie\\Api\\Types\\PaymentMethod' => $baseDir . '/src/Types/PaymentMethod.php', + 'Mollie\\Api\\Types\\PaymentMethodStatus' => $baseDir . '/src/Types/PaymentMethodStatus.php', + 'Mollie\\Api\\Types\\PaymentStatus' => $baseDir . '/src/Types/PaymentStatus.php', + 'Mollie\\Api\\Types\\ProfileStatus' => $baseDir . '/src/Types/ProfileStatus.php', + 'Mollie\\Api\\Types\\RefundStatus' => $baseDir . '/src/Types/RefundStatus.php', + 'Mollie\\Api\\Types\\SequenceType' => $baseDir . '/src/Types/SequenceType.php', + 'Mollie\\Api\\Types\\SettlementStatus' => $baseDir . '/src/Types/SettlementStatus.php', + 'Mollie\\Api\\Types\\SubscriptionStatus' => $baseDir . '/src/Types/SubscriptionStatus.php', + 'Mollie\\Api\\Types\\TerminalStatus' => $baseDir . '/src/Types/TerminalStatus.php', + '_PhpScoperf7c63b60b99d\\Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php', +); diff --git a/assets/mollie/vendor/composer/autoload_namespaces.php b/assets/mollie/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..15a2ff3 --- /dev/null +++ b/assets/mollie/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/composer/ca-bundle/src'), + 'Mollie\\Api\\' => array($baseDir . '/src'), +); diff --git a/assets/mollie/vendor/composer/autoload_real.php b/assets/mollie/vendor/composer/autoload_real.php new file mode 100644 index 0000000..cf1c194 --- /dev/null +++ b/assets/mollie/vendor/composer/autoload_real.php @@ -0,0 +1,39 @@ +setClassMapAuthoritative(true); + $loader->register(true); + + return $loader; + } +} diff --git a/assets/mollie/vendor/composer/autoload_static.php b/assets/mollie/vendor/composer/autoload_static.php new file mode 100644 index 0000000..37b3479 --- /dev/null +++ b/assets/mollie/vendor/composer/autoload_static.php @@ -0,0 +1,173 @@ + + array ( + '_PhpScoperf7c63b60b99d\\Composer\\CaBundle\\' => 41, + ), + 'M' => + array ( + 'Mollie\\Api\\' => 11, + ), + ); + + public static $prefixDirsPsr4 = array ( + '_PhpScoperf7c63b60b99d\\Composer\\CaBundle\\' => + array ( + 0 => __DIR__ . '/..' . '/composer/ca-bundle/src', + ), + 'Mollie\\Api\\' => + array ( + 0 => __DIR__ . '/../..' . '/src', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Mollie\\Api\\CompatibilityChecker' => __DIR__ . '/../..' . '/src/CompatibilityChecker.php', + 'Mollie\\Api\\Endpoints\\BalanceEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/BalanceEndpoint.php', + 'Mollie\\Api\\Endpoints\\BalanceReportEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/BalanceReportEndpoint.php', + 'Mollie\\Api\\Endpoints\\BalanceTransactionEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/BalanceTransactionEndpoint.php', + 'Mollie\\Api\\Endpoints\\ChargebackEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/ChargebackEndpoint.php', + 'Mollie\\Api\\Endpoints\\ClientEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/ClientEndpoint.php', + 'Mollie\\Api\\Endpoints\\ClientLinkEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/ClientLinkEndpoint.php', + 'Mollie\\Api\\Endpoints\\CollectionEndpointAbstract' => __DIR__ . '/../..' . '/src/Endpoints/CollectionEndpointAbstract.php', + 'Mollie\\Api\\Endpoints\\CustomerEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/CustomerEndpoint.php', + 'Mollie\\Api\\Endpoints\\CustomerPaymentsEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/CustomerPaymentsEndpoint.php', + 'Mollie\\Api\\Endpoints\\EndpointAbstract' => __DIR__ . '/../..' . '/src/Endpoints/EndpointAbstract.php', + 'Mollie\\Api\\Endpoints\\InvoiceEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/InvoiceEndpoint.php', + 'Mollie\\Api\\Endpoints\\MandateEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/MandateEndpoint.php', + 'Mollie\\Api\\Endpoints\\MethodEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/MethodEndpoint.php', + 'Mollie\\Api\\Endpoints\\OnboardingEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/OnboardingEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrderEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/OrderEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrderLineEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/OrderLineEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrderPaymentEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/OrderPaymentEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrderRefundEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/OrderRefundEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrganizationEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/OrganizationEndpoint.php', + 'Mollie\\Api\\Endpoints\\OrganizationPartnerEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/OrganizationPartnerEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentCaptureEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/PaymentCaptureEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentChargebackEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/PaymentChargebackEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/PaymentEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentLinkEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/PaymentLinkEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentRefundEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/PaymentRefundEndpoint.php', + 'Mollie\\Api\\Endpoints\\PaymentRouteEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/PaymentRouteEndpoint.php', + 'Mollie\\Api\\Endpoints\\PermissionEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/PermissionEndpoint.php', + 'Mollie\\Api\\Endpoints\\ProfileEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/ProfileEndpoint.php', + 'Mollie\\Api\\Endpoints\\ProfileMethodEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/ProfileMethodEndpoint.php', + 'Mollie\\Api\\Endpoints\\RefundEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/RefundEndpoint.php', + 'Mollie\\Api\\Endpoints\\SettlementPaymentEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/SettlementPaymentEndpoint.php', + 'Mollie\\Api\\Endpoints\\SettlementsEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/SettlementsEndpoint.php', + 'Mollie\\Api\\Endpoints\\ShipmentEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/ShipmentEndpoint.php', + 'Mollie\\Api\\Endpoints\\SubscriptionEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/SubscriptionEndpoint.php', + 'Mollie\\Api\\Endpoints\\TerminalEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/TerminalEndpoint.php', + 'Mollie\\Api\\Endpoints\\WalletEndpoint' => __DIR__ . '/../..' . '/src/Endpoints/WalletEndpoint.php', + 'Mollie\\Api\\Exceptions\\ApiException' => __DIR__ . '/../..' . '/src/Exceptions/ApiException.php', + 'Mollie\\Api\\Exceptions\\CurlConnectTimeoutException' => __DIR__ . '/../..' . '/src/Exceptions/CurlConnectTimeoutException.php', + 'Mollie\\Api\\Exceptions\\HttpAdapterDoesNotSupportDebuggingException' => __DIR__ . '/../..' . '/src/Exceptions/HttpAdapterDoesNotSupportDebuggingException.php', + 'Mollie\\Api\\Exceptions\\IncompatiblePlatform' => __DIR__ . '/../..' . '/src/Exceptions/IncompatiblePlatform.php', + 'Mollie\\Api\\Exceptions\\UnrecognizedClientException' => __DIR__ . '/../..' . '/src/Exceptions/UnrecognizedClientException.php', + 'Mollie\\Api\\HttpAdapter\\CurlMollieHttpAdapter' => __DIR__ . '/../..' . '/src/HttpAdapter/CurlMollieHttpAdapter.php', + 'Mollie\\Api\\HttpAdapter\\Guzzle6And7MollieHttpAdapter' => __DIR__ . '/../..' . '/src/HttpAdapter/Guzzle6And7MollieHttpAdapter.php', + 'Mollie\\Api\\HttpAdapter\\Guzzle6And7RetryMiddlewareFactory' => __DIR__ . '/../..' . '/src/HttpAdapter/Guzzle6And7RetryMiddlewareFactory.php', + 'Mollie\\Api\\HttpAdapter\\MollieHttpAdapterInterface' => __DIR__ . '/../..' . '/src/HttpAdapter/MollieHttpAdapterInterface.php', + 'Mollie\\Api\\HttpAdapter\\MollieHttpAdapterPicker' => __DIR__ . '/../..' . '/src/HttpAdapter/MollieHttpAdapterPicker.php', + 'Mollie\\Api\\HttpAdapter\\MollieHttpAdapterPickerInterface' => __DIR__ . '/../..' . '/src/HttpAdapter/MollieHttpAdapterPickerInterface.php', + 'Mollie\\Api\\Idempotency\\DefaultIdempotencyKeyGenerator' => __DIR__ . '/../..' . '/src/Idempotency/DefaultIdempotencyKeyGenerator.php', + 'Mollie\\Api\\Idempotency\\FakeIdempotencyKeyGenerator' => __DIR__ . '/../..' . '/src/Idempotency/FakeIdempotencyKeyGenerator.php', + 'Mollie\\Api\\Idempotency\\IdempotencyKeyGeneratorContract' => __DIR__ . '/../..' . '/src/Idempotency/IdempotencyKeyGeneratorContract.php', + 'Mollie\\Api\\MollieApiClient' => __DIR__ . '/../..' . '/src/MollieApiClient.php', + 'Mollie\\Api\\Resources\\Balance' => __DIR__ . '/../..' . '/src/Resources/Balance.php', + 'Mollie\\Api\\Resources\\BalanceCollection' => __DIR__ . '/../..' . '/src/Resources/BalanceCollection.php', + 'Mollie\\Api\\Resources\\BalanceReport' => __DIR__ . '/../..' . '/src/Resources/BalanceReport.php', + 'Mollie\\Api\\Resources\\BalanceTransaction' => __DIR__ . '/../..' . '/src/Resources/BalanceTransaction.php', + 'Mollie\\Api\\Resources\\BalanceTransactionCollection' => __DIR__ . '/../..' . '/src/Resources/BalanceTransactionCollection.php', + 'Mollie\\Api\\Resources\\BaseCollection' => __DIR__ . '/../..' . '/src/Resources/BaseCollection.php', + 'Mollie\\Api\\Resources\\BaseResource' => __DIR__ . '/../..' . '/src/Resources/BaseResource.php', + 'Mollie\\Api\\Resources\\Capture' => __DIR__ . '/../..' . '/src/Resources/Capture.php', + 'Mollie\\Api\\Resources\\CaptureCollection' => __DIR__ . '/../..' . '/src/Resources/CaptureCollection.php', + 'Mollie\\Api\\Resources\\Chargeback' => __DIR__ . '/../..' . '/src/Resources/Chargeback.php', + 'Mollie\\Api\\Resources\\ChargebackCollection' => __DIR__ . '/../..' . '/src/Resources/ChargebackCollection.php', + 'Mollie\\Api\\Resources\\Client' => __DIR__ . '/../..' . '/src/Resources/Client.php', + 'Mollie\\Api\\Resources\\ClientCollection' => __DIR__ . '/../..' . '/src/Resources/ClientCollection.php', + 'Mollie\\Api\\Resources\\ClientLink' => __DIR__ . '/../..' . '/src/Resources/ClientLink.php', + 'Mollie\\Api\\Resources\\CurrentProfile' => __DIR__ . '/../..' . '/src/Resources/CurrentProfile.php', + 'Mollie\\Api\\Resources\\CursorCollection' => __DIR__ . '/../..' . '/src/Resources/CursorCollection.php', + 'Mollie\\Api\\Resources\\Customer' => __DIR__ . '/../..' . '/src/Resources/Customer.php', + 'Mollie\\Api\\Resources\\CustomerCollection' => __DIR__ . '/../..' . '/src/Resources/CustomerCollection.php', + 'Mollie\\Api\\Resources\\Invoice' => __DIR__ . '/../..' . '/src/Resources/Invoice.php', + 'Mollie\\Api\\Resources\\InvoiceCollection' => __DIR__ . '/../..' . '/src/Resources/InvoiceCollection.php', + 'Mollie\\Api\\Resources\\Issuer' => __DIR__ . '/../..' . '/src/Resources/Issuer.php', + 'Mollie\\Api\\Resources\\IssuerCollection' => __DIR__ . '/../..' . '/src/Resources/IssuerCollection.php', + 'Mollie\\Api\\Resources\\Mandate' => __DIR__ . '/../..' . '/src/Resources/Mandate.php', + 'Mollie\\Api\\Resources\\MandateCollection' => __DIR__ . '/../..' . '/src/Resources/MandateCollection.php', + 'Mollie\\Api\\Resources\\Method' => __DIR__ . '/../..' . '/src/Resources/Method.php', + 'Mollie\\Api\\Resources\\MethodCollection' => __DIR__ . '/../..' . '/src/Resources/MethodCollection.php', + 'Mollie\\Api\\Resources\\MethodPrice' => __DIR__ . '/../..' . '/src/Resources/MethodPrice.php', + 'Mollie\\Api\\Resources\\MethodPriceCollection' => __DIR__ . '/../..' . '/src/Resources/MethodPriceCollection.php', + 'Mollie\\Api\\Resources\\Onboarding' => __DIR__ . '/../..' . '/src/Resources/Onboarding.php', + 'Mollie\\Api\\Resources\\Order' => __DIR__ . '/../..' . '/src/Resources/Order.php', + 'Mollie\\Api\\Resources\\OrderCollection' => __DIR__ . '/../..' . '/src/Resources/OrderCollection.php', + 'Mollie\\Api\\Resources\\OrderLine' => __DIR__ . '/../..' . '/src/Resources/OrderLine.php', + 'Mollie\\Api\\Resources\\OrderLineCollection' => __DIR__ . '/../..' . '/src/Resources/OrderLineCollection.php', + 'Mollie\\Api\\Resources\\Organization' => __DIR__ . '/../..' . '/src/Resources/Organization.php', + 'Mollie\\Api\\Resources\\OrganizationCollection' => __DIR__ . '/../..' . '/src/Resources/OrganizationCollection.php', + 'Mollie\\Api\\Resources\\Partner' => __DIR__ . '/../..' . '/src/Resources/Partner.php', + 'Mollie\\Api\\Resources\\Payment' => __DIR__ . '/../..' . '/src/Resources/Payment.php', + 'Mollie\\Api\\Resources\\PaymentCollection' => __DIR__ . '/../..' . '/src/Resources/PaymentCollection.php', + 'Mollie\\Api\\Resources\\PaymentLink' => __DIR__ . '/../..' . '/src/Resources/PaymentLink.php', + 'Mollie\\Api\\Resources\\PaymentLinkCollection' => __DIR__ . '/../..' . '/src/Resources/PaymentLinkCollection.php', + 'Mollie\\Api\\Resources\\Permission' => __DIR__ . '/../..' . '/src/Resources/Permission.php', + 'Mollie\\Api\\Resources\\PermissionCollection' => __DIR__ . '/../..' . '/src/Resources/PermissionCollection.php', + 'Mollie\\Api\\Resources\\Profile' => __DIR__ . '/../..' . '/src/Resources/Profile.php', + 'Mollie\\Api\\Resources\\ProfileCollection' => __DIR__ . '/../..' . '/src/Resources/ProfileCollection.php', + 'Mollie\\Api\\Resources\\Refund' => __DIR__ . '/../..' . '/src/Resources/Refund.php', + 'Mollie\\Api\\Resources\\RefundCollection' => __DIR__ . '/../..' . '/src/Resources/RefundCollection.php', + 'Mollie\\Api\\Resources\\ResourceFactory' => __DIR__ . '/../..' . '/src/Resources/ResourceFactory.php', + 'Mollie\\Api\\Resources\\Route' => __DIR__ . '/../..' . '/src/Resources/Route.php', + 'Mollie\\Api\\Resources\\RouteCollection' => __DIR__ . '/../..' . '/src/Resources/RouteCollection.php', + 'Mollie\\Api\\Resources\\Settlement' => __DIR__ . '/../..' . '/src/Resources/Settlement.php', + 'Mollie\\Api\\Resources\\SettlementCollection' => __DIR__ . '/../..' . '/src/Resources/SettlementCollection.php', + 'Mollie\\Api\\Resources\\Shipment' => __DIR__ . '/../..' . '/src/Resources/Shipment.php', + 'Mollie\\Api\\Resources\\ShipmentCollection' => __DIR__ . '/../..' . '/src/Resources/ShipmentCollection.php', + 'Mollie\\Api\\Resources\\Subscription' => __DIR__ . '/../..' . '/src/Resources/Subscription.php', + 'Mollie\\Api\\Resources\\SubscriptionCollection' => __DIR__ . '/../..' . '/src/Resources/SubscriptionCollection.php', + 'Mollie\\Api\\Resources\\Terminal' => __DIR__ . '/../..' . '/src/Resources/Terminal.php', + 'Mollie\\Api\\Resources\\TerminalCollection' => __DIR__ . '/../..' . '/src/Resources/TerminalCollection.php', + 'Mollie\\Api\\Types\\ApprovalPrompt' => __DIR__ . '/../..' . '/src/Types/ApprovalPrompt.php', + 'Mollie\\Api\\Types\\BalanceTransferFrequency' => __DIR__ . '/../..' . '/src/Types/BalanceTransferFrequency.php', + 'Mollie\\Api\\Types\\InvoiceStatus' => __DIR__ . '/../..' . '/src/Types/InvoiceStatus.php', + 'Mollie\\Api\\Types\\MandateMethod' => __DIR__ . '/../..' . '/src/Types/MandateMethod.php', + 'Mollie\\Api\\Types\\MandateStatus' => __DIR__ . '/../..' . '/src/Types/MandateStatus.php', + 'Mollie\\Api\\Types\\OnboardingStatus' => __DIR__ . '/../..' . '/src/Types/OnboardingStatus.php', + 'Mollie\\Api\\Types\\OrderLineStatus' => __DIR__ . '/../..' . '/src/Types/OrderLineStatus.php', + 'Mollie\\Api\\Types\\OrderLineType' => __DIR__ . '/../..' . '/src/Types/OrderLineType.php', + 'Mollie\\Api\\Types\\OrderLineUpdateOperationType' => __DIR__ . '/../..' . '/src/Types/OrderLineUpdateOperationType.php', + 'Mollie\\Api\\Types\\OrderStatus' => __DIR__ . '/../..' . '/src/Types/OrderStatus.php', + 'Mollie\\Api\\Types\\PaymentMethod' => __DIR__ . '/../..' . '/src/Types/PaymentMethod.php', + 'Mollie\\Api\\Types\\PaymentMethodStatus' => __DIR__ . '/../..' . '/src/Types/PaymentMethodStatus.php', + 'Mollie\\Api\\Types\\PaymentStatus' => __DIR__ . '/../..' . '/src/Types/PaymentStatus.php', + 'Mollie\\Api\\Types\\ProfileStatus' => __DIR__ . '/../..' . '/src/Types/ProfileStatus.php', + 'Mollie\\Api\\Types\\RefundStatus' => __DIR__ . '/../..' . '/src/Types/RefundStatus.php', + 'Mollie\\Api\\Types\\SequenceType' => __DIR__ . '/../..' . '/src/Types/SequenceType.php', + 'Mollie\\Api\\Types\\SettlementStatus' => __DIR__ . '/../..' . '/src/Types/SettlementStatus.php', + 'Mollie\\Api\\Types\\SubscriptionStatus' => __DIR__ . '/../..' . '/src/Types/SubscriptionStatus.php', + 'Mollie\\Api\\Types\\TerminalStatus' => __DIR__ . '/../..' . '/src/Types/TerminalStatus.php', + '_PhpScoperf7c63b60b99d\\Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit617dbc66d182e97844e7363117763c69::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit617dbc66d182e97844e7363117763c69::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit617dbc66d182e97844e7363117763c69::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/assets/mollie/vendor/composer/ca-bundle/LICENSE b/assets/mollie/vendor/composer/ca-bundle/LICENSE new file mode 100644 index 0000000..c5b5220 --- /dev/null +++ b/assets/mollie/vendor/composer/ca-bundle/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2016 Composer + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/assets/mollie/vendor/composer/ca-bundle/README.md b/assets/mollie/vendor/composer/ca-bundle/README.md new file mode 100644 index 0000000..d8205ec --- /dev/null +++ b/assets/mollie/vendor/composer/ca-bundle/README.md @@ -0,0 +1,85 @@ +composer/ca-bundle +================== + +Small utility library that lets you find a path to the system CA bundle, +and includes a fallback to the Mozilla CA bundle. + +Originally written as part of [composer/composer](https://github.com/composer/composer), +now extracted and made available as a stand-alone library. + + +Installation +------------ + +Install the latest version with: + +```bash +$ composer require composer/ca-bundle +``` + + +Requirements +------------ + +* PHP 5.3.2 is required but using the latest version of PHP is highly recommended. + + +Basic usage +----------- + +### `Composer\CaBundle\CaBundle` + +- `CaBundle::getSystemCaRootBundlePath()`: Returns the system CA bundle path, or a path to the bundled one as fallback +- `CaBundle::getBundledCaBundlePath()`: Returns the path to the bundled CA file +- `CaBundle::validateCaFile($filename)`: Validates a CA file using openssl_x509_parse only if it is safe to use +- `CaBundle::isOpensslParseSafe()`: Test if it is safe to use the PHP function openssl_x509_parse() +- `CaBundle::reset()`: Resets the static caches + + +#### To use with curl + +```php +$curl = curl_init("https://example.org/"); + +$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); +if (is_dir($caPathOrFile)) { + curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile); +} else { + curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile); +} + +$result = curl_exec($curl); +``` + +#### To use with php streams + +```php +$opts = array( + 'http' => array( + 'method' => "GET" + ) +); + +$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); +if (is_dir($caPathOrFile)) { + $opts['ssl']['capath'] = $caPathOrFile; +} else { + $opts['ssl']['cafile'] = $caPathOrFile; +} + +$context = stream_context_create($opts); +$result = file_get_contents('https://example.com', false, $context); +``` + +#### To use with Guzzle + +```php +$client = new \GuzzleHttp\Client([ + \GuzzleHttp\RequestOptions::VERIFY => \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath() +]); +``` + +License +------- + +composer/ca-bundle is licensed under the MIT License, see the LICENSE file for details. diff --git a/assets/mollie/vendor/composer/ca-bundle/composer.json b/assets/mollie/vendor/composer/ca-bundle/composer.json new file mode 100644 index 0000000..58960e2 --- /dev/null +++ b/assets/mollie/vendor/composer/ca-bundle/composer.json @@ -0,0 +1,54 @@ +{ + "name": "composer\/ca-bundle", + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "type": "library", + "license": "MIT", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http:\/\/seld.be" + } + ], + "support": { + "irc": "irc:\/\/irc.freenode.org\/composer", + "issues": "https:\/\/github.com\/composer\/ca-bundle\/issues" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "symfony\/phpunit-bridge": "^4.2 || ^5", + "phpstan\/phpstan": "^0.12.55", + "psr\/log": "^1.0", + "symfony\/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "autoload": { + "psr-4": { + "_PhpScoperf7c63b60b99d\\Composer\\CaBundle\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "_PhpScoperf7c63b60b99d\\Composer\\CaBundle\\": "tests" + } + }, + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "scripts": { + "test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor\/bin\/simple-phpunit", + "phpstan": "vendor\/bin\/phpstan analyse" + } +} \ No newline at end of file diff --git a/assets/mollie/vendor/composer/ca-bundle/res/cacert.pem b/assets/mollie/vendor/composer/ca-bundle/res/cacert.pem new file mode 100644 index 0000000..6b93dc3 --- /dev/null +++ b/assets/mollie/vendor/composer/ca-bundle/res/cacert.pem @@ -0,0 +1,3363 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Tue May 30 03:12:04 2023 GMT +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.29. +## SHA256: c47475103fb05bb562bbadff0d1e72346b03236154e1448a6ca191b740f83507 +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +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 +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +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 +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +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 +dBb9HxEGmpv0 +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G4 +========================================= +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu +bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 +dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT +AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D +umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV +3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds +8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ +e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 +ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X +xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV +7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW +Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n +MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q +jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht +7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK +YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt +jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ +m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW +RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA +JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G ++TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT +kcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +Microsoft ECC Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND +IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 +MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 +thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB +eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM ++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf +Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR +eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +Microsoft RSA Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg +UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw +NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml +7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e +S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 +1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ +dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F +yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS +MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr +lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ +0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ +ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og +6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 +dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk ++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex +/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy +AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW +ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE +7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT +c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D +5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +e-Szigno Root CA 2017 +===================== +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw +DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt +MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa +Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE +CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp +Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx +s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv +vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA +tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO +svxyqltZ+efcMQ== +-----END CERTIFICATE----- + +certSIGN Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw +EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy +MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH +TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 +N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk +abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg +wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp +dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh +ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 +jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf +95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc +z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL +iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud +DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB +ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB +/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 +8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 +BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW +atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU +Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M +NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N +0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +Trustwave Global Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 +zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf +LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq +stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o +WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ +OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 +Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE +uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm ++9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj +ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB +BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H +PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H +ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla +4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R +vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd +zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O +856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH +Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu +3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP +29FpHOTKyeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +Trustwave Global ECC P256 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +Trustwave Global ECC P384 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== +-----END CERTIFICATE----- + +NAVER Global Root Certification Authority +========================================= +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +GLOBALTRUST 2020 +================ +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx +IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT +VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh +BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy +MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi +D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO +VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM +CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm +fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA +A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR +JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG +DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU +clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ +mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud +IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw +4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 +iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS +8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 +HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS +vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 +oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF +YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl +gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +vTrus ECC Root CA +================= +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE----- + +vTrus Root CA +============= +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE----- + +ISRG Root X2 +============ +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +HiPKI Root CA - G1 +================== +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl +e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb +a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS ++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M +kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG +r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q +S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV +J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL +dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD +ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh +swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel +/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn +jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 +9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M +7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 +0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR +WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW +HYbL +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +Telia Root CA v2 +================ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +D-TRUST EV Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +DigiCert TLS ECC P384 Root G5 +============================= +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +DigiCert TLS RSA4096 Root G5 +============================ +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +Certainly Root R1 +================= +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +Certainly Root E1 +================= +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +E-Tugra Global Root CA RSA v3 +============================= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +E-Tugra Global Root CA ECC v3 +============================= +-----BEGIN CERTIFICATE----- +MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV +BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB +IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP +MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1 +Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2 +w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31 +Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ +zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W +Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3 +-----END CERTIFICATE----- + +Security Communication RootCA3 +============================== +-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw +IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD +b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw +CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE +AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r +hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE +NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2 +/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm +npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY +XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK +p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC +3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf +GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw +CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS +YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu +Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O +H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx +YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ +XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml ++LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn +KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9 +dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm +6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg== +-----END CERTIFICATE----- + +Security Communication ECC RootCA1 +================================== +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE----- + +BJCA Global Root CA1 +==================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE----- + +BJCA Global Root CA2 +==================== +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- diff --git a/assets/mollie/vendor/composer/ca-bundle/src/CaBundle.php b/assets/mollie/vendor/composer/ca-bundle/src/CaBundle.php new file mode 100644 index 0000000..09f346a --- /dev/null +++ b/assets/mollie/vendor/composer/ca-bundle/src/CaBundle.php @@ -0,0 +1,361 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ +namespace _PhpScoperf7c63b60b99d\Composer\CaBundle; + +use _PhpScoperf7c63b60b99d\Psr\Log\LoggerInterface; +use _PhpScoperf7c63b60b99d\Symfony\Component\Process\PhpProcess; +/** + * @author Chris Smith + * @author Jordi Boggiano + */ +class CaBundle +{ + /** @var string|null */ + private static $caPath; + /** @var array */ + private static $caFileValidity = array(); + /** @var bool|null */ + private static $useOpensslParse; + /** + * Returns the system CA bundle path, or a path to the bundled one + * + * This method was adapted from Sslurp. + * https://github.com/EvanDotPro/Sslurp + * + * (c) Evan Coury + * + * For the full copyright and license information, please see below: + * + * Copyright (c) 2013, Evan Coury + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @param LoggerInterface $logger optional logger for information about which CA files were loaded + * @return string path to a CA bundle file or directory + */ + public static function getSystemCaRootBundlePath(\_PhpScoperf7c63b60b99d\Psr\Log\LoggerInterface $logger = null) + { + if (self::$caPath !== null) { + return self::$caPath; + } + $caBundlePaths = array(); + // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that. + // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. + $caBundlePaths[] = self::getEnvVariable('SSL_CERT_FILE'); + // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that. + // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. + $caBundlePaths[] = self::getEnvVariable('SSL_CERT_DIR'); + $caBundlePaths[] = \ini_get('openssl.cafile'); + $caBundlePaths[] = \ini_get('openssl.capath'); + $otherLocations = array( + '/etc/pki/tls/certs/ca-bundle.crt', + // Fedora, RHEL, CentOS (ca-certificates package) + '/etc/ssl/certs/ca-certificates.crt', + // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package) + '/etc/ssl/ca-bundle.pem', + // SUSE, openSUSE (ca-certificates package) + '/usr/local/share/certs/ca-root-nss.crt', + // FreeBSD (ca_root_nss_package) + '/usr/ssl/certs/ca-bundle.crt', + // Cygwin + '/opt/local/share/curl/curl-ca-bundle.crt', + // OS X macports, curl-ca-bundle package + '/usr/local/share/curl/curl-ca-bundle.crt', + // Default cURL CA bunde path (without --with-ca-bundle option) + '/usr/share/ssl/certs/ca-bundle.crt', + // Really old RedHat? + '/etc/ssl/cert.pem', + // OpenBSD + '/usr/local/etc/ssl/cert.pem', + // FreeBSD 10.x + '/usr/local/etc/openssl/cert.pem', + // OS X homebrew, openssl package + '/usr/local/etc/openssl@1.1/cert.pem', + ); + foreach ($otherLocations as $location) { + $otherLocations[] = \dirname($location); + } + $caBundlePaths = \array_merge($caBundlePaths, $otherLocations); + foreach ($caBundlePaths as $caBundle) { + if ($caBundle && self::caFileUsable($caBundle, $logger)) { + return self::$caPath = $caBundle; + } + if ($caBundle && self::caDirUsable($caBundle, $logger)) { + return self::$caPath = $caBundle; + } + } + return self::$caPath = static::getBundledCaBundlePath(); + // Bundled CA file, last resort + } + /** + * Returns the path to the bundled CA file + * + * In case you don't want to trust the user or the system, you can use this directly + * + * @return string path to a CA bundle file + */ + public static function getBundledCaBundlePath() + { + $caBundleFile = __DIR__ . '/../res/cacert.pem'; + // cURL does not understand 'phar://' paths + // see https://github.com/composer/ca-bundle/issues/10 + if (0 === \strpos($caBundleFile, 'phar://')) { + $tempCaBundleFile = \tempnam(\sys_get_temp_dir(), 'openssl-ca-bundle-'); + if (\false === $tempCaBundleFile) { + throw new \RuntimeException('Could not create a temporary file to store the bundled CA file'); + } + \file_put_contents($tempCaBundleFile, \file_get_contents($caBundleFile)); + \register_shutdown_function(function () use($tempCaBundleFile) { + @\unlink($tempCaBundleFile); + }); + $caBundleFile = $tempCaBundleFile; + } + return $caBundleFile; + } + /** + * Validates a CA file using opensl_x509_parse only if it is safe to use + * + * @param string $filename + * @param LoggerInterface $logger optional logger for information about which CA files were loaded + * + * @return bool + */ + public static function validateCaFile($filename, \_PhpScoperf7c63b60b99d\Psr\Log\LoggerInterface $logger = null) + { + static $warned = \false; + if (isset(self::$caFileValidity[$filename])) { + return self::$caFileValidity[$filename]; + } + $contents = \file_get_contents($filename); + // assume the CA is valid if php is vulnerable to + // https://www.sektioneins.de/advisories/advisory-012013-php-openssl_x509_parse-memory-corruption-vulnerability.html + if (!static::isOpensslParseSafe()) { + if (!$warned && $logger) { + $logger->warning(\sprintf('Your version of PHP, %s, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.', \PHP_VERSION)); + $warned = \true; + } + $isValid = !empty($contents); + } elseif (\is_string($contents) && \strlen($contents) > 0) { + $contents = \preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents); + if (null === $contents) { + // regex extraction failed + $isValid = \false; + } else { + $isValid = (bool) \openssl_x509_parse($contents); + } + } else { + $isValid = \false; + } + if ($logger) { + $logger->debug('Checked CA file ' . \realpath($filename) . ': ' . ($isValid ? 'valid' : 'invalid')); + } + return self::$caFileValidity[$filename] = $isValid; + } + /** + * Test if it is safe to use the PHP function openssl_x509_parse(). + * + * This checks if OpenSSL extensions is vulnerable to remote code execution + * via the exploit documented as CVE-2013-6420. + * + * @return bool + */ + public static function isOpensslParseSafe() + { + if (null !== self::$useOpensslParse) { + return self::$useOpensslParse; + } + if (\PHP_VERSION_ID >= 50600) { + return self::$useOpensslParse = \true; + } + // Vulnerable: + // PHP 5.3.0 - PHP 5.3.27 + // PHP 5.4.0 - PHP 5.4.22 + // PHP 5.5.0 - PHP 5.5.6 + if (\PHP_VERSION_ID < 50400 && \PHP_VERSION_ID >= 50328 || \PHP_VERSION_ID < 50500 && \PHP_VERSION_ID >= 50423 || \PHP_VERSION_ID >= 50507) { + // This version of PHP has the fix for CVE-2013-6420 applied. + return self::$useOpensslParse = \true; + } + if (\defined('PHP_WINDOWS_VERSION_BUILD')) { + // Windows is probably insecure in this case. + return self::$useOpensslParse = \false; + } + $compareDistroVersionPrefix = function ($prefix, $fixedVersion) { + $regex = '{^' . \preg_quote($prefix) . '([0-9]+)$}'; + if (\preg_match($regex, \PHP_VERSION, $m)) { + return (int) $m[1] >= $fixedVersion; + } + return \false; + }; + // Hard coded list of PHP distributions with the fix backported. + if ($compareDistroVersionPrefix('5.3.3-7+squeeze', 18) || $compareDistroVersionPrefix('5.4.4-14+deb7u', 7) || $compareDistroVersionPrefix('5.3.10-1ubuntu3.', 9)) { + return self::$useOpensslParse = \true; + } + // Symfony Process component is missing so we assume it is unsafe at this point + if (!\class_exists('_PhpScoperf7c63b60b99d\\Symfony\\Component\\Process\\PhpProcess')) { + return self::$useOpensslParse = \false; + } + // This is where things get crazy, because distros backport security + // fixes the chances are on NIX systems the fix has been applied but + // it's not possible to verify that from the PHP version. + // + // To verify exec a new PHP process and run the issue testcase with + // known safe input that replicates the bug. + // Based on testcase in https://github.com/php/php-src/commit/c1224573c773b6845e83505f717fbf820fc18415 + // changes in https://github.com/php/php-src/commit/76a7fd893b7d6101300cc656058704a73254d593 + $cert = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVwRENDQTR5Z0F3SUJBZ0lKQUp6dThyNnU2ZUJjTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhETVFzd0NRWUQKVlFRR0V3SkVSVEVjTUJvR0ExVUVDQXdUVG05eVpISm9aV2x1TFZkbGMzUm1ZV3hsYmpFUU1BNEdBMVVFQnd3SApTOE9Ed3Jac2JqRVVNQklHQTFVRUNnd0xVMlZyZEdsdmJrVnBibk14SHpBZEJnTlZCQXNNRmsxaGJHbGphVzkxCmN5QkRaWEowSUZObFkzUnBiMjR4SVRBZkJnTlZCQU1NR0cxaGJHbGphVzkxY3k1elpXdDBhVzl1WldsdWN5NWsKWlRFcU1DZ0dDU3FHU0liM0RRRUpBUlliYzNSbFptRnVMbVZ6YzJWeVFITmxhM1JwYjI1bGFXNXpMbVJsTUhVWQpaREU1TnpBd01UQXhNREF3TURBd1dnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKQUFBQUFBQVhEVEUwTVRFeU9ERXhNemt6TlZvd2djTXhDekFKQmdOVkJBWVRBa1JGTVJ3d0dnWURWUVFJREJOTwpiM0prY21obGFXNHRWMlZ6ZEdaaGJHVnVNUkF3RGdZRFZRUUhEQWRMdzRQQ3RteHVNUlF3RWdZRFZRUUtEQXRUClpXdDBhVzl1UldsdWN6RWZNQjBHQTFVRUN3d1dUV0ZzYVdOcGIzVnpJRU5sY25RZ1UyVmpkR2x2YmpFaE1COEcKQTFVRUF3d1liV0ZzYVdOcGIzVnpMbk5sYTNScGIyNWxhVzV6TG1SbE1Tb3dLQVlKS29aSWh2Y05BUWtCRmh0egpkR1ZtWVc0dVpYTnpaWEpBYzJWcmRHbHZibVZwYm5NdVpHVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCCkR3QXdnZ0VLQW9JQkFRRERBZjNobDdKWTBYY0ZuaXlFSnBTU0RxbjBPcUJyNlFQNjV1c0pQUnQvOFBhRG9xQnUKd0VZVC9OYSs2ZnNnUGpDMHVLOURaZ1dnMnRIV1dvYW5TYmxBTW96NVBINlorUzRTSFJaN2UyZERJalBqZGhqaAowbUxnMlVNTzV5cDBWNzk3R2dzOWxOdDZKUmZIODFNTjJvYlhXczROdHp0TE11RDZlZ3FwcjhkRGJyMzRhT3M4CnBrZHVpNVVhd1Raa3N5NXBMUEhxNWNNaEZHbTA2djY1Q0xvMFYyUGQ5K0tBb2tQclBjTjVLTEtlYno3bUxwazYKU01lRVhPS1A0aWRFcXh5UTdPN2ZCdUhNZWRzUWh1K3ByWTNzaTNCVXlLZlF0UDVDWm5YMmJwMHdLSHhYMTJEWAoxbmZGSXQ5RGJHdkhUY3lPdU4rblpMUEJtM3ZXeG50eUlJdlZBZ01CQUFHalFqQkFNQWtHQTFVZEV3UUNNQUF3CkVRWUpZSVpJQVliNFFnRUJCQVFEQWdlQU1Bc0dBMVVkRHdRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFHMGZaWVlDVGJkajFYWWMrMVNub2FQUit2SThDOENhRAo4KzBVWWhkbnlVNGdnYTBCQWNEclk5ZTk0ZUVBdTZacXljRjZGakxxWFhkQWJvcHBXb2NyNlQ2R0QxeDMzQ2tsClZBcnpHL0t4UW9oR0QySmVxa2hJTWxEb214SE83a2EzOStPYThpMnZXTFZ5alU4QVp2V01BcnVIYTRFRU55RzcKbFcyQWFnYUZLRkNyOVRuWFRmcmR4R1ZFYnY3S1ZRNmJkaGc1cDVTanBXSDErTXEwM3VSM1pYUEJZZHlWODMxOQpvMGxWajFLRkkyRENML2xpV2lzSlJvb2YrMWNSMzVDdGQwd1lCY3BCNlRac2xNY09QbDc2ZHdLd0pnZUpvMlFnClpzZm1jMnZDMS9xT2xOdU5xLzBUenprVkd2OEVUVDNDZ2FVK1VYZTRYT1Z2a2NjZWJKbjJkZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K'; + $script = <<<'EOT' + +error_reporting(-1); +$info = openssl_x509_parse(base64_decode('%s')); +var_dump(PHP_VERSION, $info['issuer']['emailAddress'], $info['validFrom_time_t']); + +EOT; + $script = '<' . "?php\n" . \sprintf($script, $cert); + try { + $process = new \_PhpScoperf7c63b60b99d\Symfony\Component\Process\PhpProcess($script); + $process->mustRun(); + } catch (\Exception $e) { + // In the case of any exceptions just accept it is not possible to + // determine the safety of openssl_x509_parse and bail out. + return self::$useOpensslParse = \false; + } + $output = \preg_split('{\\r?\\n}', \trim($process->getOutput())); + $errorOutput = \trim($process->getErrorOutput()); + if (\is_array($output) && \count($output) === 3 && $output[0] === \sprintf('string(%d) "%s"', \strlen(\PHP_VERSION), \PHP_VERSION) && $output[1] === 'string(27) "stefan.esser@sektioneins.de"' && $output[2] === 'int(-1)' && \preg_match('{openssl_x509_parse\\(\\): illegal (?:ASN1 data type for|length in) timestamp in - on line \\d+}', $errorOutput)) { + // This PHP has the fix backported probably by a distro security team. + return self::$useOpensslParse = \true; + } + return self::$useOpensslParse = \false; + } + /** + * Resets the static caches + * @return void + */ + public static function reset() + { + self::$caFileValidity = array(); + self::$caPath = null; + self::$useOpensslParse = null; + } + /** + * @param string $name + * @return string|false + */ + private static function getEnvVariable($name) + { + if (isset($_SERVER[$name])) { + return (string) $_SERVER[$name]; + } + if (\PHP_SAPI === 'cli' && ($value = \getenv($name)) !== \false && $value !== null) { + return (string) $value; + } + return \false; + } + /** + * @param string|false $certFile + * @param LoggerInterface|null $logger + * @return bool + */ + private static function caFileUsable($certFile, \_PhpScoperf7c63b60b99d\Psr\Log\LoggerInterface $logger = null) + { + return $certFile && static::isFile($certFile, $logger) && static::isReadable($certFile, $logger) && static::validateCaFile($certFile, $logger); + } + /** + * @param string|false $certDir + * @param LoggerInterface|null $logger + * @return bool + */ + private static function caDirUsable($certDir, \_PhpScoperf7c63b60b99d\Psr\Log\LoggerInterface $logger = null) + { + return $certDir && static::isDir($certDir, $logger) && static::isReadable($certDir, $logger) && static::glob($certDir . '/*', $logger); + } + /** + * @param string $certFile + * @param LoggerInterface|null $logger + * @return bool + */ + private static function isFile($certFile, \_PhpScoperf7c63b60b99d\Psr\Log\LoggerInterface $logger = null) + { + $isFile = @\is_file($certFile); + if (!$isFile && $logger) { + $logger->debug(\sprintf('Checked CA file %s does not exist or it is not a file.', $certFile)); + } + return $isFile; + } + /** + * @param string $certDir + * @param LoggerInterface|null $logger + * @return bool + */ + private static function isDir($certDir, \_PhpScoperf7c63b60b99d\Psr\Log\LoggerInterface $logger = null) + { + $isDir = @\is_dir($certDir); + if (!$isDir && $logger) { + $logger->debug(\sprintf('Checked directory %s does not exist or it is not a directory.', $certDir)); + } + return $isDir; + } + /** + * @param string $certFileOrDir + * @param LoggerInterface|null $logger + * @return bool + */ + private static function isReadable($certFileOrDir, \_PhpScoperf7c63b60b99d\Psr\Log\LoggerInterface $logger = null) + { + $isReadable = @\is_readable($certFileOrDir); + if (!$isReadable && $logger) { + $logger->debug(\sprintf('Checked file or directory %s is not readable.', $certFileOrDir)); + } + return $isReadable; + } + /** + * @param string $pattern + * @param LoggerInterface|null $logger + * @return bool + */ + private static function glob($pattern, \_PhpScoperf7c63b60b99d\Psr\Log\LoggerInterface $logger = null) + { + $certs = \glob($pattern); + if ($certs === \false) { + if ($logger) { + $logger->debug(\sprintf("An error occurred while trying to find certificates for pattern: %s", $pattern)); + } + return \false; + } + if (\count($certs) === 0) { + if ($logger) { + $logger->debug(\sprintf("No CA files found for pattern: %s", $pattern)); + } + return \false; + } + return \true; + } +} diff --git a/assets/mollie/vendor/composer/installed.json b/assets/mollie/vendor/composer/installed.json new file mode 100644 index 0000000..389c5af --- /dev/null +++ b/assets/mollie/vendor/composer/installed.json @@ -0,0 +1,85 @@ +{ + "packages": [ + { + "name": "composer\/ca-bundle", + "version": "1.3.6", + "version_normalized": "1.3.6.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/composer\/ca-bundle.git", + "reference": "90d087e988ff194065333d16bc5cf649872d9cdb" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/composer\/ca-bundle\/zipball\/90d087e988ff194065333d16bc5cf649872d9cdb", + "reference": "90d087e988ff194065333d16bc5cf649872d9cdb", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan\/phpstan": "^0.12.55", + "psr\/log": "^1.0", + "symfony\/phpunit-bridge": "^4.2 || ^5", + "symfony\/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "time": "2023-06-06T12:02:59+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "_PhpScoperf7c63b60b99d\\Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http:\/\/seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc:\/\/irc.freenode.org\/composer", + "issues": "https:\/\/github.com\/composer\/ca-bundle\/issues", + "source": "https:\/\/github.com\/composer\/ca-bundle\/tree\/1.3.6" + }, + "funding": [ + { + "url": "https:\/\/packagist.com", + "type": "custom" + }, + { + "url": "https:\/\/github.com\/composer", + "type": "github" + }, + { + "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/composer\/composer", + "type": "tidelift" + } + ], + "install-path": ".\/ca-bundle" + } + ], + "dev": false, + "dev-package-names": [] +} \ No newline at end of file diff --git a/assets/mollie/vendor/composer/installed.php b/assets/mollie/vendor/composer/installed.php new file mode 100644 index 0000000..a1461c4 --- /dev/null +++ b/assets/mollie/vendor/composer/installed.php @@ -0,0 +1,5 @@ + array('name' => 'mollie/mollie-api-php', 'pretty_version' => 'v2.61.0', 'version' => '2.61.0.0', 'reference' => 'd3ec7a191985aa57bec9b4425a665e95b4ba346a', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => \false), 'versions' => array('composer/ca-bundle' => array('pretty_version' => '1.3.6', 'version' => '1.3.6.0', 'reference' => '90d087e988ff194065333d16bc5cf649872d9cdb', 'type' => 'library', 'install_path' => __DIR__ . '/./ca-bundle', 'aliases' => array(), 'dev_requirement' => \false), 'mollie/mollie-api-php' => array('pretty_version' => 'v2.61.0', 'version' => '2.61.0.0', 'reference' => 'd3ec7a191985aa57bec9b4425a665e95b4ba346a', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => \false))); diff --git a/assets/mollie/vendor/composer/platform_check.php b/assets/mollie/vendor/composer/platform_check.php new file mode 100644 index 0000000..589e9e7 --- /dev/null +++ b/assets/mollie/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 70200)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.0". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/assets/mollie/vendor/scoper-autoload.php.bak b/assets/mollie/vendor/scoper-autoload.php.bak new file mode 100644 index 0000000..579582b --- /dev/null +++ b/assets/mollie/vendor/scoper-autoload.php.bak @@ -0,0 +1,31 @@ + setTimeout(resolve, 2000)); + // Call payment API to create Mollie payment + const response = await fetch(link + "/v2/post/payment", { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + document.getElementById("servicetoken").textContent + }, + body: JSON.stringify(paymentRequest) + }); - await logCommunication(`Payment successful`, 'received'); + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.error || "Failed to create payment"); + } - // Close payment modal - document.body.removeChild(modal); + const result = await response.json(); - // Proceed to download and install - await downloadAndInstallSoftware(option); + if (result.checkout_url) { + await logCommunication(`Redirecting to payment provider`, 'sent'); + + // Close modal before redirect + document.body.removeChild(modal); + + // Redirect to Mollie checkout page + window.location.href = result.checkout_url; + } else { + throw new Error(result.error || "No checkout URL received"); + } } catch (error) { await logCommunication(`Payment error: ${error.message}`, 'error'); @@ -1005,6 +1019,51 @@ async function processPayment(paymentData, option, modal) { } async function downloadAndInstallSoftware(option, customerData = null) { + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // SECURITY: Check if returning from payment - verify serial number + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + const urlParams = new URLSearchParams(window.location.search); + const paymentId = urlParams.get('payment_id'); + + if (paymentId) { + try { + // Verify serial number matches payment + const response = await fetch(link + `/v2/get/payment?payment_id=${paymentId}`, { + method: "GET", + headers: { + "Authorization": "Bearer " + document.getElementById("servicetoken").textContent + } + }); + + if (response.ok) { + const paymentData = await response.json(); + + // Check if device serial number matches the one from payment + if (paymentData.serial_number && paymentData.serial_number !== deviceSerialNumber) { + const confirmed = confirm( + `WARNING: Different device detected!\n\n` + + `License was created for device: ${paymentData.serial_number}\n` + + `Currently connected device: ${deviceSerialNumber}\n\n` + + `The license is already applied to the original device. ` + + `Do you want to continue with this device anyway?` + ); + + if (!confirmed) { + progressBar("0", "Upload canceled by user", "#ff6666"); + await logCommunication('Upload canceled - serial number mismatch', 'error'); + return; + } + + await logCommunication(`WARNING: Serial number mismatch detected (payment: ${paymentData.serial_number}, device: ${deviceSerialNumber})`, 'warning'); + } + } + } catch (error) { + console.error("Error verifying payment:", error); + // Don't block if verification fails - log and continue + await logCommunication(`Payment verification failed: ${error.message}`, 'warning'); + } + } + selectedSoftwareUrl = option.source; if (!selectedSoftwareUrl) { diff --git a/initialize.php b/initialize.php new file mode 100644 index 0000000..371afbc --- /dev/null +++ b/initialize.php @@ -0,0 +1,18 @@ +setApiKey(mollie_api_key); diff --git a/softwaretool.php b/softwaretool.php index ca754d1..66ea983 100644 --- a/softwaretool.php +++ b/softwaretool.php @@ -15,10 +15,30 @@ if (isAllowed($page,$_SESSION['profile'],$_SESSION['permission'],'R') === 0){ } $bearertoken = createCommunicationToken($_SESSION['userkey']); +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// PAYMENT RETURN DETECTION +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +$payment_return = isset($_GET['payment_id']) ? $_GET['payment_id'] : null; +$payment_return_status = isset($_GET['payment_return']) ? $_GET['payment_return'] : null; template_header('Softwaretool', 'softwaretool','view'); -$view = ' +// Show payment return message if returning from payment +if ($payment_return && $payment_return_status) { + $view = ' +
+
+ + Payment Successful! +

Your payment has been processed. Please reconnect your device to apply the software upgrade.

+

Payment ID: '.htmlspecialchars($payment_return).'

+
+
'; +} else { + $view = ''; +} + +$view .= '
diff --git a/webhook_mollie.php b/webhook_mollie.php new file mode 100644 index 0000000..07280da --- /dev/null +++ b/webhook_mollie.php @@ -0,0 +1,210 @@ + software_update_user, "clientsecret" => software_update_pw), JSON_UNESCAPED_UNICODE); +$responses = ioAPIv2('/v2/authorization', $data,''); +if (!empty($responses)){$responses = json_decode($responses,true);}else{$responses = '400';} +$clientsecret = $responses['token']; + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BASEURL is required for invoice template +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +$base_url = 'https://'.$_SERVER['SERVER_NAME'].'/'; +define('base_url', $base_url); + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Initialize DomPDF for invoice generation +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +use Dompdf\Dompdf; +use Dompdf\Options; +$options = new Options(); +$options->set('isRemoteEnabled', true); +$dompdf = new Dompdf($options); + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Language mapping for invoices +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +$available_languages = [ + 'NL' => 'NL', + 'BE' => 'NL', + 'US' => 'US', + 'GB' => 'US', + 'DE' => 'DE', + 'FR' => 'FR', + 'ES' => 'ES' +]; + +try { + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // Initialize the Mollie API library + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + require "initialize.php"; // Mollie initialization + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // DEBUG MODE - Handle fake payment IDs + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + if (debug && isset($_POST["id"]) && strpos($_POST["id"], 'DEBUG_') === 0) { + // In DEBUG mode, simulate webhook callback + $payment_id = $_POST["id"]; + $orderId = $payment_id; + + // Simulate payment status as paid + $payment_status = 1; // Paid + + } else { + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // PRODUCTION MODE - Retrieve the payment's current state from Mollie + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + $payment = $mollie->payments->get($_POST["id"]); + $orderId = $payment->metadata->order_id; + $payment_status = null; + + if ($payment->isPaid() && !$payment->hasRefunds() && !$payment->hasChargebacks()) { + $payment_status = 1; // Paid + } elseif ($payment->isOpen() || $payment->isPending()) { + $payment_status = 101; // Open/Pending + } elseif ($payment->isFailed()) { + $payment_status = 102; // Failed + } elseif ($payment->isExpired()) { + $payment_status = 103; // Expired + } elseif ($payment->isCanceled()) { + $payment_status = 999; // Canceled + } + } + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // Update transaction status via API + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + if ($payment_status !== null) { + $payload = json_encode(array("txn_id" => $orderId, "payment_status" => $payment_status), JSON_UNESCAPED_UNICODE); + $transaction = ioAPIv2('/v2/transactions/',$payload,$clientsecret); + $transaction = json_decode($transaction,true); + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // Only create license and invoice if payment is PAID + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + if ($payment_status == 1 && $transaction !== null && !empty($transaction)) { + if(count($transaction) > 0) { + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // CREATE LICENSE for software upgrade + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + $pdo = dbConnect($dbname); + + // Fetch transaction items to find software upgrade + $sql = 'SELECT * FROM transactions_items WHERE txn_id = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$orderId]); + $items = $stmt->fetchAll(PDO::FETCH_ASSOC); + + foreach ($items as $item) { + if (!empty($item['item_options'])) { + $options = json_decode($item['item_options'], true); + + // Check if this is a software upgrade (has serial_number and equipment_id) + if (isset($options['serial_number']) && isset($options['equipment_id'])) { + + // Check if license already exists for this transaction + $sql = 'SELECT rowID FROM products_software_licenses WHERE transaction_id = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$orderId]); + $existing_license = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$existing_license) { + // Generate unique license key + $license_key = generateUniqueLicenseKey(); + + // Create license + $sql = 'INSERT INTO products_software_licenses + (license_key, equipment_id, license_type, status, start_at, expires_at, transaction_id, created, createdby) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)'; + $stmt = $pdo->prepare($sql); + $stmt->execute([ + $license_key, + $options['equipment_id'], + 'upgrade', + 1, // active + date('Y-m-d H:i:s'), + '2099-12-31 23:59:59', // effectively permanent + $orderId, + date('Y-m-d H:i:s'), + 'webhook' // created by webhook + ]); + + // Update equipment.sw_version_license + $sql = 'UPDATE equipment SET sw_version_license = ? WHERE rowID = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$license_key, $options['equipment_id']]); + } + } + } + } + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // Generate INVOICE via API + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + $payload = json_encode(array("txn_id" => $transaction['transaction_id']), JSON_UNESCAPED_UNICODE); + $invoice = ioAPIv2('/v2/invoice/',$payload,$clientsecret); + $invoice = json_decode($invoice,true); + + if ($invoice !== null && !empty($invoice)) { + // Fetch full invoice data with customer details + $invoice_cust = ioAPIv2('/v2/invoice/list=invoice&id='.$invoice['invoice_id'],'',$clientsecret); + $invoice_cust = json_decode($invoice_cust,true); + + // Determine invoice language + if (!empty($invoice_cust['customer']['language'])) { + $invoice_language = strtoupper($invoice_cust['customer']['language']); + } elseif (!empty($invoice_cust['customer']['country']) && isset($available_languages[strtoupper($invoice_cust['customer']['country'])])) { + $invoice_language = $available_languages[strtoupper($invoice_cust['customer']['country'])]; + } else { + $invoice_language = 'US'; // Default fallback + } + + // Generate invoice HTML (using custom template for software upgrades) + list($data,$customer_email,$order_id) = generateSoftwareInvoice($invoice_cust,$orderId,$invoice_language); + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + //CREATE PDF using DomPDF + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + $dompdf->loadHtml($data); + $dompdf->setPaper('A4', 'portrait'); + $dompdf->render(); + $subject = 'Software Upgrade - Invoice: '.$order_id; + $attachment = $dompdf->output(); + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + //Send email via PHPMailer + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + send_mail($customer_email, $subject, $data, $attachment, $subject); + + // Send to bookkeeping if configured + if(invoice_bookkeeping){ + send_mail(email_bookkeeping, $subject, $data, $attachment, $subject); + } + } + } + } + } + + // Return 200 OK to Mollie + http_response_code(200); + echo "OK"; + +} catch (\Mollie\Api\Exceptions\ApiException $e) { + error_log("Webhook API call failed: " . htmlspecialchars($e->getMessage())); + http_response_code(500); +} catch (Exception $e) { + error_log("Webhook error: " . htmlspecialchars($e->getMessage())); + http_response_code(500); +} + +?> From 543f0b3cac919fab07159862e1876d61d62a723f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CVeLiTi=E2=80=9D?= <“info@veliti.nl”> Date: Wed, 24 Dec 2025 14:07:28 +0100 Subject: [PATCH 2/2] feat: Add software licenses management page and update payment handling - Introduced a new licenses management page with functionality to create, update, and view software licenses. - Updated payment return handling in softwaretool.php to check payment status from the database and display appropriate modals for success, pending, and failure states. - Enhanced webhook_mollie.php to log webhook calls, handle payment status updates directly in the database, and generate invoices based on payment status. - Improved CSS styles for better alignment of buttons and modal components. - Added JavaScript for modal interactions and bulk license creation functionality. --- .gitignore | 3 + api/v2/get/equipments.php | 4 + api/v2/get/products_software_licenses.php | 22 +- api/v2/get/software_available.php | 8 +- api/v2/get/software_update.php | 8 +- api/v2/post/dealers.php | 36 ++ api/v2/post/payment.php | 166 +++--- api/v2/post/products_software_licenses.php | 120 +++- api/v2/post/products_software_versions.php | 19 +- assets/functions.php | 68 ++- assets/softwaretool.js | 173 ++++-- custom/bewellwell/style/bewellwell.css | 47 ++ custom/soveliti/style/soveliti.css | 47 ++ equipment.php | 3 +- licenses.php | 606 +++++++++++++++++++++ settings/settingsmenu.php | 6 + settings/settingsprofiles.php | 4 +- settings/settingsviews.php | 5 + softwaretool.php | 99 +++- style/admin.css | 44 ++ webhook_mollie.php | 150 ++++- 21 files changed, 1400 insertions(+), 238 deletions(-) create mode 100644 licenses.php diff --git a/.gitignore b/.gitignore index 689a894..3d559fe 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ settings/config.php variable_scan.php settings/soveliti/soveliti_config.php settings/soveliti/soveliti_settings.php +assets/database/dev_schema.sql +assets/database/migration.sql +assets/database/prod_schema.sql diff --git a/api/v2/get/equipments.php b/api/v2/get/equipments.php index ff797aa..d02c76d 100644 --- a/api/v2/get/equipments.php +++ b/api/v2/get/equipments.php @@ -49,6 +49,9 @@ if(isset($get_content) && $get_content!=''){ elseif ($v[0] == 'equipmentid') { //build up search $clause .= ' AND e.rowID = :'.$v[0]; + + //UPDATE VERSION STATUS + $sw_version_latest_update = 1; } elseif ($v[0] == 'servicedate') { //build up service coverage @@ -69,6 +72,7 @@ if(isset($get_content) && $get_content!=''){ elseif ($v[0] == 'h_equipmentid') { //build up search $clause .= ' AND h.equipmentid = :'.$v[0]; + } elseif ($v[0] == 'status') { //Update status based on status diff --git a/api/v2/get/products_software_licenses.php b/api/v2/get/products_software_licenses.php index 85e6e67..f47175d 100644 --- a/api/v2/get/products_software_licenses.php +++ b/api/v2/get/products_software_licenses.php @@ -1,6 +1,8 @@ soldto) || $partner->soldto == ''){$soldto_search = '%';} else {$soldto_search = '-%';} //default whereclause -list($whereclause,$condition) = getWhereclauselvl2("software_licenses",$permission,$partner,'get'); +list($whereclause,$condition) = getWhereclauselvl2("products_software_licenses",$permission,$partner,'get'); //NEW ARRAY $criterias = []; @@ -52,12 +54,20 @@ if(isset($criterias['totals']) && $criterias['totals'] ==''){ $sql = 'SELECT count(*) as count FROM products_software_licenses '.$whereclause.''; } elseif (isset($criterias['list']) && $criterias['list'] =='') { - //SQL for list - $sql = 'SELECT l.*, u.username, v.name as version_name FROM products_software_licenses l LEFT JOIN users u ON l.user_id = u.id LEFT JOIN products_software_versions v ON l.version_id = v.rowID '.$whereclause.' ORDER BY l.created DESC'; + //SQL for list + $sql = 'SELECT l.*, v.name as version_name, v.version, e.serialnumber as assigned_serial + FROM products_software_licenses l + LEFT JOIN products_software_versions v ON l.version_id = v.rowID + LEFT JOIN equipment e ON l.license_key = e.sw_version_license + '.$whereclause.' ORDER BY l.created DESC'; } else { - //SQL for paged - $sql = 'SELECT l.*, u.username, v.name as version_name FROM products_software_licenses l LEFT JOIN users u ON l.user_id = u.id LEFT JOIN products_software_versions v ON l.version_id = v.rowID '.$whereclause.' ORDER BY l.created DESC LIMIT :page,:num_licenses'; + //SQL for paged + $sql = 'SELECT l.*, v.name as version_name, v.version, e.serialnumber as assigned_serial + FROM products_software_licenses l + LEFT JOIN products_software_versions v ON l.version_id = v.rowID + LEFT JOIN equipment e ON l.license_key = e.sw_version_license + '.$whereclause.' ORDER BY l.created DESC LIMIT :page,:num_licenses'; } $stmt = $pdo->prepare($sql); diff --git a/api/v2/get/software_available.php b/api/v2/get/software_available.php index 3cb21b4..3513575 100644 --- a/api/v2/get/software_available.php +++ b/api/v2/get/software_available.php @@ -245,16 +245,16 @@ if (isset($criterias['sn']) && $criterias['sn'] != ''){ //Check if there's a valid license for this upgrade if ($final_price > 0 && $sw_version_license) { //Check if the license is valid - $sql = 'SELECT status, start_at, expires_at + $sql = 'SELECT status, starts_at, expires_at FROM products_software_licenses - WHERE license_key = ? AND equipment_id = ?'; + WHERE license_key = ?'; $stmt = $pdo->prepare($sql); - $stmt->execute([$sw_version_license, $equipment_rowid]); + $stmt->execute([$sw_version_license]); $license = $stmt->fetch(PDO::FETCH_ASSOC); if ($license && $license['status'] == 1) { $now = date('Y-m-d H:i:s'); - $start_at = $license['start_at']; + $start_at = $license['starts_at']; $expires_at = $license['expires_at']; //Check if license is within valid date range diff --git a/api/v2/get/software_update.php b/api/v2/get/software_update.php index 3a71457..2f4696b 100644 --- a/api/v2/get/software_update.php +++ b/api/v2/get/software_update.php @@ -281,16 +281,16 @@ if (isset($criterias['sn']) && $criterias['sn'] != ''){ $license_applied = false; if ($final_price > 0 && $sw_version_license) { //Check if the license is valid - $sql = 'SELECT status, start_at, expires_at + $sql = 'SELECT status, starts_at, expires_at FROM products_software_licenses - WHERE license_key = ? AND equipment_id = ?'; + WHERE license_key = ?'; $stmt = $pdo->prepare($sql); - $stmt->execute([$sw_version_license, $equipment_rowid]); + $stmt->execute([$sw_version_license]); $license = $stmt->fetch(PDO::FETCH_ASSOC); if ($license && $license['status'] == 1) { $now = date('Y-m-d H:i:s'); - $start_at = $license['start_at']; + $start_at = $license['starts_at']; $expires_at = $license['expires_at']; //Check if license is within valid date range diff --git a/api/v2/post/dealers.php b/api/v2/post/dealers.php index 51f517e..d748cb0 100644 --- a/api/v2/post/dealers.php +++ b/api/v2/post/dealers.php @@ -354,6 +354,42 @@ elseif(isset($post_content['dealer_closeby'])){ echo json_encode(['error' => "Latitude or longitude not provided."]); } } +elseif(isset($post_content['action']) && $post_content['action']=='unsubscribe'){ + //++++++++++++++++++++++ + //Process DEALER UNSUBSCRIBE + //++++++++++++++++++++++ + + // Check if email is provided + if (isset($post_content['email']) && !empty($post_content['email'])) { + $email = $post_content['email']; + + try { + // Update dealer status to 0 (inactive) where email matches + $sql = 'UPDATE dealers SET status = 0 WHERE email = ?'; + $stmt = $pdo->prepare($sql); + + if ($stmt->execute([$email])) { + // Check if any rows were affected + if ($stmt->rowCount() > 0) { + header('Content-Type: application/json'); + echo json_encode(['status' => 'success', 'message' => 'Dealer unsubscribed successfully']); + } else { + header('Content-Type: application/json'); + echo json_encode(['status' => 'error', 'message' => 'No dealer found with this email']); + } + } else { + header('Content-Type: application/json'); + echo json_encode(['status' => 'error', 'message' => 'Database update failed']); + } + } catch (PDOException $e) { + header('Content-Type: application/json'); + echo json_encode(['status' => 'error', 'message' => 'Database error occurred']); + } + } else { + header('Content-Type: application/json'); + echo json_encode(['status' => 'error', 'message' => 'Email not provided']); + } +} else { //++++++++++++++++++++++ diff --git a/api/v2/post/payment.php b/api/v2/post/payment.php index 1087f40..84b4c54 100644 --- a/api/v2/post/payment.php +++ b/api/v2/post/payment.php @@ -1,11 +1,12 @@ execute([$serial_number]); $equipment = $stmt->fetch(PDO::FETCH_ASSOC); if (!$equipment) { + http_response_code(404); echo json_encode(['error' => 'Device not found with serial number: ' . $serial_number], JSON_UNESCAPED_UNICODE); exit; @@ -46,15 +49,15 @@ $hw_version = $equipment['hw_version'] ?? ''; //+++++++++++++++++++++++++++++++++++++++++++++++++++++ // STEP 2: Get version data from version_id //+++++++++++++++++++++++++++++++++++++++++++++++++++++ -$sql = 'SELECT v.rowID as version_id, v.version, v.name, v.description, v.hw_version, p.productcode - FROM products_software_versions v - JOIN products_software p ON v.product_software_id = p.rowID - WHERE v.rowID = ? AND v.is_active = 1'; +$sql = 'SELECT rowID as version_id, version, name, description, hw_version + FROM products_software_versions + WHERE rowID = ? AND status = 1'; $stmt = $pdo->prepare($sql); $stmt->execute([$version_id]); $version = $stmt->fetch(PDO::FETCH_ASSOC); if (!$version) { + http_response_code(404); echo json_encode(['error' => 'Software version not found or inactive'], JSON_UNESCAPED_UNICODE); exit; @@ -93,6 +96,7 @@ if (!$has_upgrade_paths) { $final_currency = $upgrade_path['currency'] ?? 'EUR'; } else { // No upgrade path FROM current version + http_response_code(400); echo json_encode(['error' => 'No valid upgrade path from current version'], JSON_UNESCAPED_UNICODE); exit; @@ -103,20 +107,20 @@ if (!$has_upgrade_paths) { // STEP 4: Check license validity (lines 280-311 in software_update.php) //+++++++++++++++++++++++++++++++++++++++++++++++++++++ if ($final_price > 0 && $sw_version_license) { - $sql = 'SELECT status, start_at, expires_at + $sql = 'SELECT status, starts_at, expires_at FROM products_software_licenses - WHERE license_key = ? AND equipment_id = ?'; + WHERE license_key = ?'; $stmt = $pdo->prepare($sql); - $stmt->execute([$sw_version_license, $equipment_id]); + $stmt->execute([$sw_version_license]); $license = $stmt->fetch(PDO::FETCH_ASSOC); if ($license && $license['status'] == 1) { $now = date('Y-m-d H:i:s'); - $start_at = $license['start_at']; + $starts_at = $license['starts_at']; $expires_at = $license['expires_at']; // Check if license is within valid date range - if ((!$start_at || $start_at <= $now) && (!$expires_at || $expires_at >= $now)) { + if ((!$starts_at || $starts_at <= $now) && (!$expires_at || $expires_at >= $now)) { $final_price = '0.00'; } } @@ -126,68 +130,18 @@ if ($final_price > 0 && $sw_version_license) { // STEP 5: Verify price > 0 (free upgrades shouldn't reach payment API) //+++++++++++++++++++++++++++++++++++++++++++++++++++++ if ($final_price <= 0) { + http_response_code(400); echo json_encode(['error' => 'This upgrade is free. No payment required.'], JSON_UNESCAPED_UNICODE); exit; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ -// STEP 6: DEBUG MODE - Simulate payment without Mollie +// STEP 6: DEBUG MODE - Log but continue to real Mollie //+++++++++++++++++++++++++++++++++++++++++++++++++++++ if (debug) { - // Generate fake payment ID - $fake_payment_id = 'DEBUG_' . uniqid() . '_' . time(); - $checkout_url = 'https://'.$_SERVER['SERVER_NAME'].'/softwaretool.php?payment_return=1&payment_id=' . $fake_payment_id; - - // Store transaction in DB - $sql = 'INSERT INTO transactions (txn_id, payment_amount, payment_status, payer_email, first_name, last_name, - address_street, address_city, address_state, address_zip, address_country, account_id, payment_method, created) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; - $stmt = $pdo->prepare($sql); - $stmt->execute([ - $fake_payment_id, - $final_price, - 0, // 0 = pending - $user_data['email'] ?? '', - $user_data['first_name'] ?? '', - $user_data['last_name'] ?? '', - $user_data['address_street'] ?? '', - $user_data['address_city'] ?? '', - $user_data['address_state'] ?? '', - $user_data['address_zip'] ?? '', - $user_data['address_country'] ?? '', - $serial_number, - 0, // payment method - date('Y-m-d H:i:s') - ]); - - // Store transaction item with serial_number in item_options - $item_options = json_encode([ - 'serial_number' => $serial_number, - 'equipment_id' => $equipment_id, - 'hw_version' => $hw_version - ], JSON_UNESCAPED_UNICODE); - - $sql = 'INSERT INTO transactions_items (txn_id, item_id, item_price, item_quantity, item_options, created) - VALUES (?, ?, ?, ?, ?, ?)'; - $stmt = $pdo->prepare($sql); - $stmt->execute([ - $fake_payment_id, - $version_id, - $final_price, - 1, - $item_options, - date('Y-m-d H:i:s') - ]); - - // Return fake checkout URL - $messages = json_encode([ - 'checkout_url' => $checkout_url, - 'payment_id' => $fake_payment_id, - 'debug_mode' => true - ], JSON_UNESCAPED_UNICODE); - echo $messages; - exit; + debuglog("DEBUG MODE: Creating real Mollie payment for testing"); + debuglog("DEBUG: Serial Number: $serial_number, Version ID: $version_id, Price: $final_price"); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -195,66 +149,110 @@ if (debug) { //+++++++++++++++++++++++++++++++++++++++++++++++++++++ try { // Initialize Mollie - require dirname(__FILE__, 3).'/initialize.php'; + require dirname(__FILE__, 4).'/initialize.php'; // Format price for Mollie (must be string with 2 decimals) $formatted_price = number_format((float)$final_price, 2, '.', ''); + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // STEP 7A: Generate transaction ID BEFORE creating Mollie payment + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // Generate unique transaction ID (same as placeorder.php) + $txn_id = strtoupper(uniqid('SC') . substr(md5(mt_rand()), 0, 5)); + + // Build webhook URL and redirect URL with actual transaction ID + $protocol = 'https'; + $hostname = $_SERVER['SERVER_NAME']; + $path = '/'; + $webhook_url = "{$protocol}://{$hostname}{$path}webhook_mollie.php"; + $redirect_url = "{$protocol}://{$hostname}{$path}?page=softwaretool&payment_return=1&order_id={$txn_id}"; + + if (debug) { + debuglog("DEBUG: Transaction ID: {$txn_id}"); + debuglog("DEBUG: redirectUrl being sent to Mollie: " . $redirect_url); + } + // Create payment with Mollie $payment = $mollie->payments->create([ 'amount' => [ 'currency' => $final_currency ?: 'EUR', - 'value' => $formatted_price + 'value' => "{$formatted_price}" ], - 'description' => 'Software upgrade to ' . $version['name'] . ' (v' . $version['version'] . ')', - 'redirectUrl' => 'https://'.$_SERVER['SERVER_NAME'].'/softwaretool.php?payment_return=1&payment_id={id}', - 'webhookUrl' => 'https://'.$_SERVER['SERVER_NAME'].'/webhook_mollie.php', + 'description' => "Software upgrade Order #{$txn_id}", + 'redirectUrl' => "{$redirect_url}", + 'webhookUrl' => "{$webhook_url}", 'metadata' => [ - 'order_id' => $payment->id // Store payment ID in metadata + 'order_id' => $txn_id, + 'serial_number' => $serial_number, + 'version_id' => $version_id, + 'equipment_id' => $equipment_id ] ]); $mollie_payment_id = $payment->id; $checkout_url = $payment->getCheckoutUrl(); + if (debug) { + debuglog("DEBUG: Mollie payment created successfully"); + debuglog("DEBUG: Payment ID: $mollie_payment_id"); + debuglog("DEBUG: Redirect URL sent: $redirect_url"); + debuglog("DEBUG: Redirect URL from Mollie object: " . $payment->redirectUrl); + debuglog("DEBUG: Full payment object: " . json_encode($payment)); + debuglog("DEBUG: Checkout URL: $checkout_url"); + } + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ - // STEP 8: Store transaction in DB + // STEP 8: Store transaction in DB using txn_id (order ID) //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + // Split name into first/last (simple split on first space) + $full_name = $user_data['name'] ?? ''; + $name_parts = explode(' ', $full_name, 2); + $first_name = $name_parts[0] ?? ''; + $last_name = $name_parts[1] ?? ''; + + // BUILD UP PARTNERHIERARCHY FROM USER + $partner_product = json_encode(array("salesid"=>$partner->salesid,"soldto"=>$partner->soldto), JSON_UNESCAPED_UNICODE); + $sql = 'INSERT INTO transactions (txn_id, payment_amount, payment_status, payer_email, first_name, last_name, - address_street, address_city, address_state, address_zip, address_country, account_id, payment_method, created) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + address_street, address_city, address_state, address_zip, address_country, account_id, payment_method, accounthierarchy, created) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; $stmt = $pdo->prepare($sql); $stmt->execute([ - $mollie_payment_id, + $txn_id, // Use generated transaction ID, not Mollie payment ID $final_price, 0, // 0 = pending $user_data['email'] ?? '', - $user_data['first_name'] ?? '', - $user_data['last_name'] ?? '', - $user_data['address_street'] ?? '', - $user_data['address_city'] ?? '', - $user_data['address_state'] ?? '', - $user_data['address_zip'] ?? '', - $user_data['address_country'] ?? '', + $first_name, + $last_name, + $user_data['address'] ?? '', + $user_data['city'] ?? '', + '', // address_state (not collected) + $user_data['postal'] ?? '', + $user_data['country'] ?? '', $serial_number, 0, // payment method + $partner_product, date('Y-m-d H:i:s') ]); + // Get the database ID + $transaction_id = $pdo->lastInsertId(); + //+++++++++++++++++++++++++++++++++++++++++++++++++++++ // STEP 9: Store transaction item with serial_number in item_options //+++++++++++++++++++++++++++++++++++++++++++++++++++++ $item_options = json_encode([ 'serial_number' => $serial_number, 'equipment_id' => $equipment_id, - 'hw_version' => $hw_version + 'hw_version' => $hw_version, + 'mollie_payment_id' => $mollie_payment_id // Store Mollie payment ID in options ], JSON_UNESCAPED_UNICODE); $sql = 'INSERT INTO transactions_items (txn_id, item_id, item_price, item_quantity, item_options, created) VALUES (?, ?, ?, ?, ?, ?)'; $stmt = $pdo->prepare($sql); $stmt->execute([ - $mollie_payment_id, + $transaction_id, // Use database transaction ID (not txn_id string, not mollie_payment_id) $version_id, $final_price, 1, diff --git a/api/v2/post/products_software_licenses.php b/api/v2/post/products_software_licenses.php index faf6fd3..1b3a6fe 100644 --- a/api/v2/post/products_software_licenses.php +++ b/api/v2/post/products_software_licenses.php @@ -14,12 +14,16 @@ $post_content = json_decode($input,true); if (empty($partner->soldto) || $partner->soldto == ''){$soldto_search = '%';} else {$soldto_search = '-%';} //default whereclause -list($whereclause,$condition) = getWhereclauselvl2("software_licenses",$permission,$partner,''); +list($whereclause,$condition) = getWhereclauselvl2("products_software_licenses",$permission,$partner,''); //SET PARAMETERS FOR QUERY $id = $post_content['rowID'] ?? ''; //check for rowID $command = ($id == '')? 'insert' : 'update'; //IF rowID = empty then INSERT if (isset($post_content['delete'])){$command = 'delete';} //change command to delete + +// Check for bulk creation +$is_bulk = isset($post_content['bulk']) && $post_content['bulk'] === true; + $date = date('Y-m-d H:i:s'); //CREATE EMPTY STRINGS @@ -27,12 +31,90 @@ $clause = ''; $clause_insert =''; $input_insert = ''; +//------------------------------------------ +// BULK LICENSE CREATION +//------------------------------------------ +if ($command == 'insert' && $is_bulk && isAllowed('products_software_licenses',$profile,$permission,'C') === 1){ + + $version_id = $post_content['version_id'] ?? ''; + $serials = $post_content['serials'] ?? []; + $transaction_id = $post_content['transaction_id'] ?? ''; + $license_type = $post_content['license_type'] ?? 0; + $status = $post_content['status'] ?? 0; + + if (empty($version_id) || empty($serials) || !is_array($serials)) { + http_response_code(400); + echo json_encode(['error' => 'Invalid parameters for bulk creation']); + exit; + } + + $accounthierarchy = json_encode(array("salesid"=>$partner->salesid,"soldto"=>$partner->soldto), JSON_UNESCAPED_UNICODE); + + // Prepare statement for bulk insert + $sql = 'INSERT INTO products_software_licenses (version_id, license_key, license_type, status, transaction_id, accounthierarchy, created, createdby) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)'; + $stmt = $pdo->prepare($sql); + + $created_count = 0; + foreach ($serials as $serial) { + if (empty($serial)) continue; + + // Generate UUID for license key + $license_key = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', + mt_rand(0, 0xffff), mt_rand(0, 0xffff), + mt_rand(0, 0xffff), + mt_rand(0, 0x0fff) | 0x4000, + mt_rand(0, 0x3fff) | 0x8000, + mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) + ); + + try { + $stmt->execute([ + $version_id, + $license_key, + $license_type, + $status, + $transaction_id, + $accounthierarchy, + $date, + $username + ]); + + // Assign license to equipment if serial number exists + $eq_sql = 'UPDATE equipment SET sw_version_license = ? WHERE serialnumber = ? AND accounthierarchy LIKE ?'; + $eq_stmt = $pdo->prepare($eq_sql); + $eq_stmt->execute([$license_key, $serial, '%'.$partner->soldto.'%']); + + $created_count++; + } catch (Exception $e) { + debuglog("Error creating license for serial $serial: " . $e->getMessage()); + } + } + + echo json_encode(['success' => true, 'created' => $created_count]); + exit; +} + +//------------------------------------------ +// SINGLE LICENSE CREATION OR UPDATE +//------------------------------------------ //ADD STANDARD PARAMETERS TO ARRAY BASED ON INSERT OR UPDATE if ($command == 'update'){ $post_content['updated'] = $date; $post_content['updatedby'] = $username; } elseif ($command == 'insert'){ + // Generate UUID for license key if not provided + if (empty($post_content['license_key'])) { + $post_content['license_key'] = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', + mt_rand(0, 0xffff), mt_rand(0, 0xffff), + mt_rand(0, 0xffff), + mt_rand(0, 0x0fff) | 0x4000, + mt_rand(0, 0x3fff) | 0x8000, + mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) + ); + } + $post_content['created'] = $date; $post_content['createdby'] = $username; $post_content['accounthierarchy'] = json_encode(array("salesid"=>$partner->salesid,"soldto"=>$partner->soldto), JSON_UNESCAPED_UNICODE); @@ -42,10 +124,10 @@ else { } //CREATE NEW ARRAY AND MAP TO CLAUSE -if(isset($post_content) && $post_content!=''){ +if(isset($post_content) && $post_content!=''){ foreach ($post_content as $key => $var){ - if ($key == 'submit' || $key == 'rowID'){ - //do nothing + if ($key == 'submit' || $key == 'rowID' || $key == 'serial' || $key == 'bulk' || $key == 'serials'){ + //do nothing - skip these fields } else { $criterias[$key] = $var; @@ -64,27 +146,43 @@ $input_insert = substr($input_insert, 1); //Clean clause - remove first comma //QUERY AND VERIFY ALLOWED if ($command == 'update' && isAllowed('products_software_licenses',$profile,$permission,'U') === 1){ - + $sql = 'UPDATE products_software_licenses SET '.$clause.' WHERE rowID = ? '; $execute_input[] = $id; $stmt = $pdo->prepare($sql); $stmt->execute($execute_input); -} + + echo json_encode(['success' => true]); +} elseif ($command == 'insert' && isAllowed('products_software_licenses',$profile,$permission,'C') === 1){ - - //INSERT NEW ITEM + + //INSERT NEW ITEM $sql = 'INSERT INTO products_software_licenses ('.$clause_insert.') VALUES ('.$input_insert.')'; $stmt = $pdo->prepare($sql); $stmt->execute($execute_input); + + $new_license_id = $pdo->lastInsertId(); + $license_key = $post_content['license_key']; + + // Assign license to equipment if serial number provided + if (!empty($post_content['serial'])) { + $serial = $post_content['serial']; + $eq_sql = 'UPDATE equipment SET sw_version_license = ? WHERE serialnumber = ? AND accounthierarchy LIKE ?'; + $eq_stmt = $pdo->prepare($eq_sql); + $eq_stmt->execute([$license_key, $serial, '%'.$partner->soldto.'%']); + } + + echo json_encode(['success' => true, 'license_id' => $new_license_id, 'license_key' => $license_key]); } elseif ($command == 'delete' && isAllowed('products_software_licenses',$profile,$permission,'D') === 1){ - + $stmt = $pdo->prepare('DELETE FROM products_software_licenses WHERE rowID = ? '); - $stmt->execute([ $id ]); + $stmt->execute([ $id ]); //Add deletion to changelog changelog($dbname,'products_software_licenses',$id,'Delete','Delete',$username); - + + echo json_encode(['success' => true]); } else { //do nothing diff --git a/api/v2/post/products_software_versions.php b/api/v2/post/products_software_versions.php index 60417ab..18a3163 100644 --- a/api/v2/post/products_software_versions.php +++ b/api/v2/post/products_software_versions.php @@ -72,10 +72,9 @@ $hw_version = (isset($criterias['hw_version']))? $criterias['hw_version']:''; if ($command == 'update' && isAllowed('products_software_versions',$profile,$permission,'U') === 1){ //REMOVE LATEST FLAG FROM OTHER WHEN SEND + //Max 2 latest flags per hw_version: 1 with price (has upgrade path with price) and 1 without if (isset($criterias['latest']) && $criterias['latest'] == 1){ - $sql = 'UPDATE products_software_versions SET latest = 0 WHERE hw_version = ? AND rowID != ?'; - $stmt = $pdo->prepare($sql); - $stmt->execute([$hw_version, $id]); + updateSoftwareLatestFlags($pdo, $id, $hw_version); } $sql = 'UPDATE products_software_versions SET '.$clause.' WHERE rowID = ? '; @@ -84,18 +83,18 @@ if ($command == 'update' && isAllowed('products_software_versions',$profile,$per $stmt->execute($execute_input); } elseif ($command == 'insert' && isAllowed('products_software_versions',$profile,$permission,'C') === 1){ - - //REMOVE LATEST FLAG FROM OTHER IF SET - if (isset($criterias['latest']) && $criterias['latest'] == 1){ - $sql = 'UPDATE products_software_versions SET latest = 0 WHERE hw_version = ?'; - $stmt = $pdo->prepare($sql); - $stmt->execute([$hw_version]); - } //INSERT NEW ITEM $sql = 'INSERT INTO products_software_versions ('.$clause_insert.') VALUES ('.$input_insert.')'; $stmt = $pdo->prepare($sql); $stmt->execute($execute_input); + $new_id = $pdo->lastInsertId(); + + //REMOVE LATEST FLAG FROM OTHER IF SET + //Max 2 latest flags per hw_version: 1 with price (has upgrade path with price) and 1 without + if (isset($criterias['latest']) && $criterias['latest'] == 1){ + updateSoftwareLatestFlags($pdo, $new_id, $hw_version); + } } elseif ($command == 'delete' && isAllowed('products_software_versions',$profile,$permission,'D') === 1){ diff --git a/assets/functions.php b/assets/functions.php index a02c05f..6e50226 100644 --- a/assets/functions.php +++ b/assets/functions.php @@ -1418,7 +1418,8 @@ function getWhereclauselvl2($table_name,$permission,$partner,$method){ "software" => "p.accounthierarchy", "transactions" => "tx.accounthierarchy", "dealers" => "d.accounthierarchy", - "categories" => "c.accounthierarchy" + "categories" => "c.accounthierarchy", + "products_software_licenses" => "l.accounthierarchy" ]; $table = ($table_name != '') ? $table[$table_name] : 'accounthierarchy'; @@ -5154,23 +5155,7 @@ function updateSoftwareVersionStatus($pdo, $serialnumber = null) { $stmt->execute($bind_params); //------------------------------------------ - // STEP 3: Set sw_version_latest = 0 for equipment NOT matching latest version - //------------------------------------------ - $sql = 'UPDATE equipment e - JOIN products_software_assignment psa ON e.productrowid = psa.product_id AND psa.status = 1 - JOIN products_software_versions psv ON psa.software_version_id = psv.rowID - SET e.sw_version_latest = 0 - WHERE psv.latest = 1 - AND psv.status = 1 - AND lower(e.sw_version) <> lower(psv.version) - AND (psv.hw_version = e.hw_version OR psv.hw_version IS NULL OR psv.hw_version = "") - AND e.sw_version_latest = 1' . $sn_clause; - - $stmt = $pdo->prepare($sql); - $stmt->execute($bind_params); - - //------------------------------------------ - // STEP 4: Set sw_version_latest = 1 for equipment matching latest version + // STEP 3: Set sw_version_latest = 1 for equipment matching latest version //------------------------------------------ $sql = 'UPDATE equipment e JOIN products_software_assignment psa ON e.productrowid = psa.product_id AND psa.status = 1 @@ -5179,7 +5164,7 @@ function updateSoftwareVersionStatus($pdo, $serialnumber = null) { WHERE psv.latest = 1 AND psv.status = 1 AND lower(e.sw_version) = lower(psv.version) - AND (psv.hw_version = e.hw_version OR psv.hw_version IS NULL OR psv.hw_version = "") + AND (lower(psv.hw_version) = lower(e.hw_version) OR lower(psv.hw_version) IS NULL OR lower(psv.hw_version) = "") AND e.sw_version_latest = 0' . $sn_clause; $stmt = $pdo->prepare($sql); @@ -5542,4 +5527,49 @@ function generateSoftwareInvoice($invoice_data, $order_id, $language = 'US') { '; return [$html, $customer_email, $order_id]; +} + +/** + * Update latest flags for software versions + * Max 2 latest flags per hw_version: 1 with price (has upgrade path with price) and 1 without + * + * @param PDO $pdo - Database connection + * @param int $version_id - The version ID being set as latest + * @param string $hw_version - Hardware version + */ +function updateSoftwareLatestFlags($pdo, $version_id, $hw_version) { + //Check if current version has a priced upgrade path + $sql = 'SELECT COUNT(*) as has_price + FROM products_software_upgrade_paths + WHERE to_version_id = ? AND is_active = 1 AND price > 0'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$version_id]); + $current_has_price = $stmt->fetch(PDO::FETCH_ASSOC)['has_price'] > 0; + + //Remove latest flag only from versions in the same category (priced or free) + //Get all versions with same hw_version and check their pricing + $sql = 'SELECT psv.rowID, + CASE + WHEN EXISTS( + SELECT 1 FROM products_software_upgrade_paths pup + WHERE pup.to_version_id = psv.rowID + AND pup.is_active = 1 + AND pup.price > 0 + ) THEN 1 + ELSE 0 + END as has_price + FROM products_software_versions psv + WHERE psv.hw_version = ? AND psv.rowID != ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$hw_version, $version_id]); + $versions = $stmt->fetchAll(PDO::FETCH_ASSOC); + + //Update only versions in the same price category + foreach ($versions as $version) { + if ($version['has_price'] == ($current_has_price ? 1 : 0)) { + $sql = 'UPDATE products_software_versions SET latest = 0 WHERE rowID = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$version['rowID']]); + } + } } \ No newline at end of file diff --git a/assets/softwaretool.js b/assets/softwaretool.js index f4e9b4e..0194de5 100644 --- a/assets/softwaretool.js +++ b/assets/softwaretool.js @@ -459,132 +459,143 @@ function displaySoftwareOptions(options) { const isFree = price === 0; const isCurrent = option.is_current === true || option.is_current === 1; - // Create card + // Create card with gradient background const card = document.createElement("div"); card.style.cssText = ` - background: ${isCurrent ? '#f5f5f5' : 'white'}; - border: 2px solid ${isCurrent ? '#bbb' : (isFree ? '#e0e0e0' : '#e0e0e0')}; + background: ${isCurrent ? 'linear-gradient(135deg, #f5f5f5 0%, #e8e8e8 100%)' : 'linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%)'}; border-radius: 4px; - padding: 15px; - transition: 0.3s; + padding: 25px 20px; + transition: all 0.3s ease; display: flex; flex-direction: column; position: relative; - overflow: hidden; + overflow: visible; transform: translateY(0px); - box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px; - opacity: ${isCurrent ? '0.6' : '1'}; + box-shadow: ${isCurrent ? '0 4px 12px rgba(0,0,0,0.08)' : '0 8px 20px rgba(0,0,0,0.12)'}; + opacity: ${isCurrent ? '0.7' : '1'}; pointer-events: ${isCurrent ? 'none' : 'auto'}; + min-height: 320px; `; if (!isCurrent) { card.onmouseenter = () => { - card.style.transform = 'translateY(-5px)'; - card.style.boxShadow = '0 8px 16px rgba(0,0,0,0.15)'; + card.style.transform = 'translateY(-8px) scale(1.02)'; + card.style.boxShadow = '0 12px 28px rgba(0,0,0,0.2)'; + card.style.borderColor = isFree ? '#038f5a' : '#FF4500'; }; card.onmouseleave = () => { - card.style.transform = 'translateY(0)'; - card.style.boxShadow = '0 4px 6px rgba(0,0,0,0.1)'; + card.style.transform = 'translateY(0) scale(1)'; + card.style.boxShadow = '0 8px 20px rgba(0,0,0,0.12)'; + card.style.borderColor = isFree ? '#04AA6D' : '#FF6B35'; }; } - // Badge for current/free/paid + // Badge for current/free/paid - VISIBLE const badge = document.createElement("div"); badge.style.cssText = ` position: absolute; - top: 15px; - right: 15px; - background: ${isCurrent ? '#6c757d' : '#04AA6D'}; + top: -10px; + right: 20px; + background: ${isCurrent ? '#6c757d' : (isFree ? 'linear-gradient(135deg, #04AA6D 0%, #038f5a 100%)' : 'linear-gradient(135deg, #FF6B35 0%, #FF4500 100%)')}; color: white; - padding: 5px 12px; + padding: 8px 16px; border-radius: 20px; - font-size: 12px; - font-weight: bold; - display:none; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.5px; + text-transform: uppercase; + box-shadow: 0 4px 12px rgba(0,0,0,0.15); `; if (isCurrent) { - badge.textContent = "CURRENT VERSION"; + badge.textContent = "INSTALLED"; } else if (isFree) { - badge.textContent = "Included"; + badge.textContent = "FREE"; + } else { + badge.textContent = "PREMIUM"; } - if (isCurrent || isFree) { - card.appendChild(badge); - } + card.appendChild(badge); - // Name + // Name with icon const name = document.createElement("h4"); name.style.cssText = ` - margin: 0 0 10px 0; + margin: 0 0 12px 0; color: #333; - font-size: 20px; - font-weight: 600; + font-size: 22px; + font-weight: 700; `; - name.textContent = option.name || "Software Update"; + name.innerHTML = `${option.name || "Software Update"}`; card.appendChild(name); - // Version + // Version with enhanced styling const version = document.createElement("div"); version.style.cssText = ` color: #666; font-size: 14px; margin-bottom: 15px; + display: flex; + align-items: center; + gap: 6px; `; - version.innerHTML = ` Version: ${option.version || "N/A"}`; + version.innerHTML = ` Version: ${option.version || "N/A"}`; card.appendChild(version); - // Description - const desc = document.createElement("p"); - desc.style.cssText = ` + // Description with preserved newlines + const descContainer = document.createElement("div"); + descContainer.style.cssText = ` color: #555; - font-size: 14px; - line-height: 1.6; + font-size: 13px; + line-height: 1.7; margin: 0 0 20px 0; flex-grow: 1; + white-space: pre-line; `; - desc.textContent = option.description || "No description available"; - card.appendChild(desc); + descContainer.textContent = option.description || "No description available"; + card.appendChild(descContainer); // Price section const priceSection = document.createElement("div"); priceSection.style.cssText = ` - border-top: 1px solid #e0e0e0; - padding-top: 15px; + border-top: 2px solid ${isFree ? '#04AA6D20' : '#FF6B3520'}; + padding-top: 20px; margin-top: auto; `; const priceText = document.createElement("div"); priceText.style.cssText = ` - font-size: 24px; - font-weight: bold; - color: ${isCurrent ? '#6c757d' : (isFree ? '#04AA6D' : '#333')}; + font-size: ${isCurrent ? '18px' : '28px'}; + font-weight: ${isCurrent ? '600' : '800'}; + color: ${isCurrent ? '#6c757d' : (isFree ? '#04AA6D' : '#FF6B35')}; margin-bottom: 15px; + text-align: center; + letter-spacing: 0.5px; `; if (isCurrent) { - priceText.textContent = "INSTALLED"; + priceText.innerHTML = ' INSTALLED'; } else { - priceText.textContent = isFree ? "Included" : `${option.currency || "€"} ${price.toFixed(2)}`; + priceText.innerHTML = isFree + ? 'Free' + : `${option.currency || "€"} ${price.toFixed(2)}`; } priceSection.appendChild(priceText); - // Action button + // Action button with gradient for paid const actionBtn = document.createElement("button"); actionBtn.className = "btn"; actionBtn.style.cssText = ` width: 100%; - background: ${isCurrent ? '#6c757d' : '#04AA6D'}; + background: ${isCurrent ? '#6c757d' : (isFree ? 'linear-gradient(135deg, #04AA6D 0%, #038f5a 100%)' : 'linear-gradient(135deg, #FF6B35 0%, #FF4500 100%)')}; color: white; border: none; - padding: 12px; - border-radius: 6px; - font-size: 16px; - font-weight: 600; cursor: ${isCurrent ? 'not-allowed' : 'pointer'}; - transition: background 0.3s ease; + transition: all 0.3s ease; opacity: ${isCurrent ? '0.5' : '1'}; + box-shadow: ${isCurrent ? 'none' : '0 4px 12px rgba(0,0,0,0.15)'}; + letter-spacing: 0.5px; + text-transform: uppercase; `; if (isCurrent) { @@ -593,13 +604,29 @@ function displaySoftwareOptions(options) { } else if (isFree) { actionBtn.innerHTML = ''; actionBtn.onclick = () => selectUpgrade(option); - actionBtn.onmouseenter = () => actionBtn.style.background = '#038f5a'; - actionBtn.onmouseleave = () => actionBtn.style.background = '#04AA6D'; + actionBtn.onmouseenter = () => { + actionBtn.style.background = 'linear-gradient(135deg, #038f5a 0%, #026b43 100%)'; + actionBtn.style.transform = 'translateY(-2px)'; + actionBtn.style.boxShadow = '0 6px 16px rgba(0,0,0,0.2)'; + }; + actionBtn.onmouseleave = () => { + actionBtn.style.background = 'linear-gradient(135deg, #04AA6D 0%, #038f5a 100%)'; + actionBtn.style.transform = 'translateY(0)'; + actionBtn.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)'; + }; } else { actionBtn.innerHTML = ''; actionBtn.onclick = () => selectUpgrade(option); - actionBtn.onmouseenter = () => actionBtn.style.background = '#038f5a'; - actionBtn.onmouseleave = () => actionBtn.style.background = '#04AA6D'; + actionBtn.onmouseenter = () => { + actionBtn.style.background = 'linear-gradient(135deg, #FF4500 0%, #CC3700 100%)'; + actionBtn.style.transform = 'translateY(-2px)'; + actionBtn.style.boxShadow = '0 6px 16px rgba(255,107,53,0.4)'; + }; + actionBtn.onmouseleave = () => { + actionBtn.style.background = 'linear-gradient(135deg, #FF6B35 0%, #FF4500 100%)'; + actionBtn.style.transform = 'translateY(0)'; + actionBtn.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)'; + }; } priceSection.appendChild(actionBtn); @@ -980,10 +1007,19 @@ async function processPayment(paymentData, option, modal) { user_data: paymentData // name, email, address only }; + // Debug logging + if (typeof DEBUG !== 'undefined' && DEBUG) { + console.log("=== DEBUG: Payment Request ==="); + console.log("Serial Number:", deviceSerialNumber); + console.log("Version ID:", option.version_id); + console.log("User Data:", paymentData); + console.log("Request payload:", paymentRequest); + } + await logCommunication(`Payment initiated for version ${option.version_id}`, 'sent'); // Call payment API to create Mollie payment - const response = await fetch(link + "/v2/post/payment", { + const response = await fetch(link + "/v2/payment", { method: "POST", headers: { "Content-Type": "application/json", @@ -994,13 +1030,27 @@ async function processPayment(paymentData, option, modal) { if (!response.ok) { const errorData = await response.json(); + if (typeof DEBUG !== 'undefined' && DEBUG) { + console.error("DEBUG: Payment API error:", errorData); + } throw new Error(errorData.error || "Failed to create payment"); } const result = await response.json(); + if (typeof DEBUG !== 'undefined' && DEBUG) { + console.log("=== DEBUG: Payment Response ==="); + console.log("Result:", result); + console.log("Checkout URL:", result.checkout_url); + console.log("Payment ID:", result.payment_id); + } + if (result.checkout_url) { - await logCommunication(`Redirecting to payment provider`, 'sent'); + await logCommunication(`Redirecting to Mollie payment: ${result.payment_id}`, 'sent'); + + if (typeof DEBUG !== 'undefined' && DEBUG) { + console.log("DEBUG: Redirecting to Mollie checkout..."); + } // Close modal before redirect document.body.removeChild(modal); @@ -1012,6 +1062,9 @@ async function processPayment(paymentData, option, modal) { } } catch (error) { + if (typeof DEBUG !== 'undefined' && DEBUG) { + console.error("DEBUG: Payment processing error:", error); + } await logCommunication(`Payment error: ${error.message}`, 'error'); progressBar("0", "Payment failed: " + error.message, "#ff6666"); alert("Payment failed: " + error.message); @@ -1028,7 +1081,7 @@ async function downloadAndInstallSoftware(option, customerData = null) { if (paymentId) { try { // Verify serial number matches payment - const response = await fetch(link + `/v2/get/payment?payment_id=${paymentId}`, { + const response = await fetch(link + `/v2/payment?payment_id=${paymentId}`, { method: "GET", headers: { "Authorization": "Bearer " + document.getElementById("servicetoken").textContent diff --git a/custom/bewellwell/style/bewellwell.css b/custom/bewellwell/style/bewellwell.css index 23d0932..c08265f 100644 --- a/custom/bewellwell/style/bewellwell.css +++ b/custom/bewellwell/style/bewellwell.css @@ -2919,4 +2919,51 @@ main .products .product .price, main .products .products-wrapper .product .price width: 25px; height: 25px; margin: 1px; +} + +/* Button alignment styles */ +.form-actions, +.modal-actions, +.dialog-actions, +.button-actions { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + margin-top: 20px; +} + +.title-actions { + display: flex; + gap: 10px; + align-items: center; + justify-content: flex-end; +} + +.filter-actions { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + flex-wrap: wrap; +} + +main .form .button-container, +main .form .form-actions, +main .content-block .button-container { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + margin-top: 15px; +} + +.dialog .content .footer, +.modal .modal-footer { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + padding: 20px; + border-top: 1px solid #eee; } \ No newline at end of file diff --git a/custom/soveliti/style/soveliti.css b/custom/soveliti/style/soveliti.css index fcc5e9a..0ed2857 100644 --- a/custom/soveliti/style/soveliti.css +++ b/custom/soveliti/style/soveliti.css @@ -2921,4 +2921,51 @@ main .products .product .price, main .products .products-wrapper .product .price width: 25px; height: 25px; margin: 1px; +} + +/* Button alignment styles */ +.form-actions, +.modal-actions, +.dialog-actions, +.button-actions { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + margin-top: 20px; +} + +.title-actions { + display: flex; + gap: 10px; + align-items: center; + justify-content: flex-end; +} + +.filter-actions { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + flex-wrap: wrap; +} + +main .form .button-container, +main .form .form-actions, +main .content-block .button-container { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + margin-top: 15px; +} + +.dialog .content .footer, +.modal .modal-footer { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + padding: 20px; + border-top: 1px solid #eee; } \ No newline at end of file diff --git a/equipment.php b/equipment.php index 8944854..058404f 100644 --- a/equipment.php +++ b/equipment.php @@ -127,6 +127,7 @@ $view = '

'.$view_asset_h2.' - '.$responses->equipmentID.'

+ '; //------------------------------------ @@ -395,7 +396,7 @@ $view .= '
'.$view_asset_actions.'
- '.$button_history.' + '.$view_communication.' '.$view_users.' '; diff --git a/licenses.php b/licenses.php new file mode 100644 index 0000000..e95c97c --- /dev/null +++ b/licenses.php @@ -0,0 +1,606 @@ + +
+ +
+

Software Licenses ('.$query_total.')

+

Manage and create software licenses for devices

+
+
+
'; + +if ($create_allowed === 1){ + $view .= ''; +} + +$view .= ' +
+
'; + +if (isset($success_msg)){ +$view .= '
+ +

'.$success_msg.'

+ +
'; +} + +$view .= ' + +'; + +$view .= ' +
+
+ + + + + + + + + + + + + + '; + + if (empty($responses)){ + + $view .= ' + + + '; + } + else { + foreach ($responses as $response){ + // Check if license is expired based on timestamp + $actual_status = $response->status; + if (!empty($response->expires_at)) { + $expiry_time = strtotime($response->expires_at); + $current_time = time(); + if ($current_time > $expiry_time) { + // License is expired - override status + $actual_status = 2; + } + } + + // Status display based on actual status + $status_text = ''; + if ($actual_status == 0) { + $status_text = 'Inactive'; + } elseif ($actual_status == 1) { + $status_text = 'Assigned'; + } elseif ($actual_status == 2) { + $status_text = 'Expired'; + } + + // Format dates + $starts_display = '-'; + if (!empty($response->starts_at)) { + $starts_display = date('Y-m-d', strtotime($response->starts_at)); + } + + $expires_display = '-'; + if (!empty($response->expires_at)) { + $expires_display = date('Y-m-d', strtotime($response->expires_at)); + } + + $view .= ' + + + + + + + + + + '; + } + } +$view .= ' + +
License KeySoftware VersionStatusTransaction IDStarts AtExpiresAssigned To (Serial)
No licenses found
'.$response->license_key.''.$response->version_name.''.$status_text.''.($response->transaction_id ?? '-').''.$starts_display.''.$expires_display.''.($response->assigned_serial ?? '-').'
+
+
+'; + +$view.=''; + + + +// Bulk License Modal +$view .= ' +'; + +// License Details Modal +$view .= ' +'; + +//OUTPUT +echo $view; + +// Add JavaScript for modals and API calls +echo ' + + + +'; + +template_footer(); +?> diff --git a/settings/settingsmenu.php b/settings/settingsmenu.php index 89595f2..85cf303 100644 --- a/settings/settingsmenu.php +++ b/settings/settingsmenu.php @@ -47,6 +47,12 @@ $main_menu = [ "icon" => "fas fa-tachometer-alt", "name" => "menu_sales_orders" ], + "licenses" => [ + "url" => "licenses", + "selected" => "licenses", + "icon" => "fas fa-tachometer-alt", + "name" => "menu_sales_licenses" + ], "identity" => [ "url" => "identity", "selected" => "identity", diff --git a/settings/settingsprofiles.php b/settings/settingsprofiles.php index a819374..4ec0352 100644 --- a/settings/settingsprofiles.php +++ b/settings/settingsprofiles.php @@ -6,7 +6,7 @@ define('superuser_profile','admin,dashboard,profile,application,assets,firmwaret /*Admin*/ define('admin_profile','account,accounts,admin,dashboard,profile,application,assets,buildtool,buildtool,cartest,cartest_manage,cartests,changelog,communication,communication_send,communications,firmwaretool,histories,history,history_manage,marketing,partner,partners,sales,servicereport,servicereports,contract,contract_manage,contracts,equipment,equipment_data,equipment_healthindex,equipment_manage,equipment_manage_edit,equipments,equipments_mass_update,product,product_manage,products,products_software,products_versions,report_build,report_contracts_billing,report_healthindex,reporting,rma,rma_history,rma_history_manage,rma_manage,rmas,user,user_manage,users'); /*AdminPlus*/ -define('adminplus_profile','account,account_manage,accounts,admin,config,dashboard,profile,settings,api,application,appointment,assets,billing,buildtool,buildtool,cartest,cartest_manage,cartests,catalog,categories,category,changelog,checkout,com_log,communication,communication_send,communications,cronjob,debug,dev,discount,discounts,firmwaretool,generate_download_token,histories,history,history_manage,identity,identity_dealers,invoice,language,logfile,mailer,maintenance,marketing,media,media_manage,media_scanner,media_upload,order,orders,partner,partners,placeorder,pricelists,pricelists_items,pricelists_manage,profiles,register,render_service_report,reset,sales,security,servicereport,servicereports,shipping,shipping_manage,shopping_cart,software_available,software_download,software_update,tax,taxes,test,transactions,transactions_items,translation_manage,translations,translations_details,unscribe,upgrades,uploader,vin,contract,contract_manage,contracts,dealer,dealer_manage,dealers,dealers_media,equipment,equipment_data,equipment_healthindex,equipment_manage,equipment_manage_edit,equipments,equipments_mass_update,product,product_manage,products,products_attributes,products_attributes_items,products_attributes_manage,products_categories,products_configurations,products_media,products_software,products_software_assignment,products_software_assignments,products_software_assignments,products_software_licenses,products_software_upgrade_paths,products_software_upgrade_paths_manage,products_software_version,products_software_version_access_rules_manage,products_software_version_manage,products_software_versions,products_versions,report_build,report_contracts_billing,report_healthindex,report_usage,reporting,rma,rma_history,rma_history_manage,rma_manage,rmas,user,user_credentials,user_manage,users'); +define('adminplus_profile','account,account_manage,accounts,admin,config,dashboard,profile,settings,api,application,appointment,assets,billing,buildtool,buildtool,cartest,cartest_manage,cartests,catalog,categories,category,changelog,checkout,com_log,communication,communication_send,communications,cronjob,debug,dev,discount,discounts,firmwaretool,generate_download_token,histories,history,history_manage,identity,identity_dealers,language,licenses,logfile,mailer,maintenance,marketing,media,media_manage,media_scanner,media_upload,order,orders,partner,partners,payment,placeorder,pricelists,pricelists_items,pricelists_manage,profiles,register,render_service_report,reset,sales,security,servicereport,servicereports,shipping,shipping_manage,shopping_cart,software_available,software_download,software_update,softwaretool,tax,taxes,test,transactions,transactions_items,translation_manage,translations,translations_details,unscribe,upgrades,uploader,vin,contract,contract_manage,contracts,dealer,dealer_manage,dealers,dealers_media,equipment,equipment_data,equipment_healthindex,equipment_manage,equipment_manage_edit,equipments,equipments_mass_update,product,product_manage,products,products_attributes,products_attributes_items,products_attributes_manage,products_categories,products_configurations,products_media,products_software,products_software_assignment,products_software_assignments,products_software_assignments,products_software_licenses,products_software_upgrade_paths,products_software_upgrade_paths_manage,products_software_version,products_software_version_access_rules_manage,products_software_version_manage,products_software_versions,products_versions,report_build,report_contracts_billing,report_healthindex,report_usage,reporting,rma,rma_history,rma_history_manage,rma_manage,rmas,user,user_credentials,user_manage,users'); /*Build*/ define('build','dashboard,profile,application,buildtool,buildtool,firmwaretool,products_software'); /*Commerce*/ @@ -18,7 +18,7 @@ define('firmware','application,firmwaretool,products_software'); /*Garage*/ define('garage','dashboard,profile,application,cartest,cartest_manage,cartests,products_versions'); /*Interface*/ -define('interface','application,firmwaretool,contract,contracts,equipment_manage,equipments,products_software,products_versions,users'); +define('interface','application,firmwaretool,invoice,payment,transactions,transactions_items,contract,contracts,equipment_manage,equipments,products_software,products_versions,users'); /*Service*/ define('service','admin,dashboard,profile,application,assets,firmwaretool,histories,history,history_manage,marketing,partner,partners,servicereport,servicereports,equipment,equipment_manage,equipments,products_software,user,user_manage,users'); /*Other*/ diff --git a/settings/settingsviews.php b/settings/settingsviews.php index 014f3a9..0e7e408 100644 --- a/settings/settingsviews.php +++ b/settings/settingsviews.php @@ -55,8 +55,10 @@ $all_views = [ "history_manage", "identity", "identity_dealers", + "initialize", "invoice", "language", + "licenses", "logfile", "mailer", "maintenance", @@ -69,6 +71,7 @@ $all_views = [ "orders", "partner", "partners", + "payment", "placeorder", "pricelists", "pricelists_items", @@ -120,6 +123,7 @@ $all_views = [ "software_available", "software_download", "software_update", + "softwaretool", "tax", "taxes", "test", @@ -136,6 +140,7 @@ $all_views = [ "user_manage", "users", "vin", + "webhook_mollie", ]; ?> \ No newline at end of file diff --git a/softwaretool.php b/softwaretool.php index 66ea983..c419d56 100644 --- a/softwaretool.php +++ b/softwaretool.php @@ -18,24 +18,73 @@ $bearertoken = createCommunicationToken($_SESSION['userkey']); //+++++++++++++++++++++++++++++++++++++++++++++++++++++ // PAYMENT RETURN DETECTION //+++++++++++++++++++++++++++++++++++++++++++++++++++++ -$payment_return = isset($_GET['payment_id']) ? $_GET['payment_id'] : null; +$payment_return = isset($_GET['order_id']) ? $_GET['order_id'] : null; $payment_return_status = isset($_GET['payment_return']) ? $_GET['payment_return'] : null; template_header('Softwaretool', 'softwaretool','view'); // Show payment return message if returning from payment +$view = ''; +$payment_modal = ''; if ($payment_return && $payment_return_status) { - $view = ' -
-
- - Payment Successful! -

Your payment has been processed. Please reconnect your device to apply the software upgrade.

-

Payment ID: '.htmlspecialchars($payment_return).'

-
-
'; -} else { - $view = ''; + // Check actual payment status in database + $pdo = dbConnect($dbname); + $sql = 'SELECT payment_status FROM transactions WHERE txn_id = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$payment_return]); + $transaction = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($transaction) { + if ($transaction['payment_status'] == 1) { + // Payment confirmed as paid + $payment_modal = ' + '; + } else if ($transaction['payment_status'] == 0 || $transaction['payment_status'] == 101) { + // Payment pending + $payment_modal = ' + + '; + } else { + // Payment failed/cancelled + $payment_modal = ' + '; + } + } } $view .= ' @@ -90,7 +139,7 @@ $view .= '
'; //OUTPUT echo $view; +// Output payment modal if exists +echo $payment_modal; + echo ' @@ -169,12 +221,29 @@ echo ' } }; + // Payment modal functions + window.closePaymentModal = function() { + const modal = document.getElementById("paymentModal"); + if (modal) { + modal.style.display = "none"; + // Clean URL by removing payment_return and order_id parameters + const url = new URL(window.location); + url.searchParams.delete("payment_return"); + url.searchParams.delete("order_id"); + window.history.replaceState({}, document.title, url); + } + }; + // Close modal on background click document.addEventListener("click", function(e) { - const modal = document.getElementById("helpModal"); - if (modal && e.target === modal) { + const helpModal = document.getElementById("helpModal"); + if (helpModal && e.target === helpModal) { closeInstructions(); } + const paymentModal = document.getElementById("paymentModal"); + if (paymentModal && e.target === paymentModal) { + closePaymentModal(); + } }); '; diff --git a/style/admin.css b/style/admin.css index 8988e13..34cbd5e 100644 --- a/style/admin.css +++ b/style/admin.css @@ -2937,6 +2937,7 @@ main .products .product .price, main .products .products-wrapper .product .price display: flex; gap: 10px; align-items: center; + justify-content: flex-end; } .filter-panel { @@ -2979,6 +2980,7 @@ main .products .product .price, main .products .products-wrapper .product .price display: flex; gap: 10px; justify-content: flex-end; + align-items: center; flex-wrap: wrap; } @@ -3084,4 +3086,46 @@ main .products .product .price, main .products .products-wrapper .product .price font-size: 12px; color: #6c757d; font-style: italic; +} + +/* Button alignment styles */ +.form-actions, +.modal-actions, +.dialog-actions, +.button-actions { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + margin-top: 20px; +} + +/* Ensure title-actions stay right-aligned */ +.title-actions { + display: flex; + gap: 10px; + align-items: center; + justify-content: flex-end; +} + +/* Form button containers should be right-aligned */ +main .form .button-container, +main .form .form-actions, +main .content-block .button-container { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + margin-top: 15px; +} + +/* Right-align buttons in dialog footers */ +.dialog .content .footer, +.modal .modal-footer { + display: flex; + gap: 10px; + justify-content: flex-end; + align-items: center; + padding: 20px; + border-top: 1px solid #eee; } \ No newline at end of file diff --git a/webhook_mollie.php b/webhook_mollie.php index 07280da..8ab0333 100644 --- a/webhook_mollie.php +++ b/webhook_mollie.php @@ -5,14 +5,22 @@ require_once 'settings/config_redirector.php'; require_once 'assets/functions.php'; +include dirname(__FILE__).'/settings/settings_redirector.php'; + +// DEBUG: Log webhook call +debuglog("WEBHOOK CALLED - POST data: " . print_r($_POST, true)); //+++++++++++++++++++++++++++++++++++++++++++++++++++++ //LOGIN TO API (same as commerce webhook.php) //+++++++++++++++++++++++++++++++++++++++++++++++++++++ -$data = json_encode(array("clientID" => software_update_user, "clientsecret" => software_update_pw), JSON_UNESCAPED_UNICODE); +debuglog("WEBHOOK: Attempting API authorization..."); +debuglog("WEBHOOK: Interface user: " . interface_user); +$data = json_encode(array("clientID" => interface_user, "clientsecret" => interface_pw), JSON_UNESCAPED_UNICODE); $responses = ioAPIv2('/v2/authorization', $data,''); +debuglog("WEBHOOK: Authorization response: " . $responses); if (!empty($responses)){$responses = json_decode($responses,true);}else{$responses = '400';} $clientsecret = $responses['token']; +debuglog("WEBHOOK: Token obtained: " . ($clientsecret ? 'YES' : 'NO')); //+++++++++++++++++++++++++++++++++++++++++++++++++++++ // BASEURL is required for invoice template @@ -64,7 +72,16 @@ try { // PRODUCTION MODE - Retrieve the payment's current state from Mollie //+++++++++++++++++++++++++++++++++++++++++++++++++++++ $payment = $mollie->payments->get($_POST["id"]); - $orderId = $payment->metadata->order_id; + // Get order ID from metadata (same as commerce product) + $orderId = $payment->metadata->order_id ?? null; + + if (!$orderId) { + debuglog("WEBHOOK ERROR: No order_id in payment metadata"); + http_response_code(400); + exit; + } + + debuglog("WEBHOOK: Payment ID: {$payment->id}, Order ID: {$orderId}"); $payment_status = null; if ($payment->isPaid() && !$payment->hasRefunds() && !$payment->hasChargebacks()) { @@ -81,18 +98,33 @@ try { } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ - // Update transaction status via API + // Update transaction status directly in database //+++++++++++++++++++++++++++++++++++++++++++++++++++++ if ($payment_status !== null) { - $payload = json_encode(array("txn_id" => $orderId, "payment_status" => $payment_status), JSON_UNESCAPED_UNICODE); - $transaction = ioAPIv2('/v2/transactions/',$payload,$clientsecret); - $transaction = json_decode($transaction,true); + debuglog("WEBHOOK: Order ID: $orderId, Payment Status: $payment_status"); + + $pdo = dbConnect($dbname); + + // Update transaction status + $sql = 'UPDATE transactions SET payment_status = ? WHERE txn_id = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$payment_status, $orderId]); + + debuglog("WEBHOOK: Transaction status updated in database"); + + // Fetch transaction data for license creation + $sql = 'SELECT * FROM transactions WHERE txn_id = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$orderId]); + $transaction = $stmt->fetch(PDO::FETCH_ASSOC); + + debuglog("WEBHOOK: Transaction data: " . print_r($transaction, true)); //+++++++++++++++++++++++++++++++++++++++++++++++++++++ // Only create license and invoice if payment is PAID //+++++++++++++++++++++++++++++++++++++++++++++++++++++ if ($payment_status == 1 && $transaction !== null && !empty($transaction)) { - if(count($transaction) > 0) { + debuglog("WEBHOOK: Payment is PAID, processing license..."); //+++++++++++++++++++++++++++++++++++++++++++++++++++++ // CREATE LICENSE for software upgrade @@ -100,9 +132,10 @@ try { $pdo = dbConnect($dbname); // Fetch transaction items to find software upgrade + // Note: transactions_items.txn_id is the database ID (transaction.id), not the txn_id string $sql = 'SELECT * FROM transactions_items WHERE txn_id = ?'; $stmt = $pdo->prepare($sql); - $stmt->execute([$orderId]); + $stmt->execute([$transaction['id']]); $items = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($items as $item) { @@ -124,14 +157,14 @@ try { // Create license $sql = 'INSERT INTO products_software_licenses - (license_key, equipment_id, license_type, status, start_at, expires_at, transaction_id, created, createdby) + (version_id, license_type, license_key, status, starts_at, expires_at, transaction_id, created, createdby) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)'; $stmt = $pdo->prepare($sql); $stmt->execute([ + $item['item_id'], // version_id + 1, // license_type (1 = upgrade) $license_key, - $options['equipment_id'], - 'upgrade', - 1, // active + 1, // status = active date('Y-m-d H:i:s'), '2099-12-31 23:59:59', // effectively permanent $orderId, @@ -139,26 +172,79 @@ try { 'webhook' // created by webhook ]); + debuglog("WEBHOOK: License created: $license_key"); + // Update equipment.sw_version_license $sql = 'UPDATE equipment SET sw_version_license = ? WHERE rowID = ?'; $stmt = $pdo->prepare($sql); $stmt->execute([$license_key, $options['equipment_id']]); + + debuglog("WEBHOOK: Equipment updated with license: {$options['equipment_id']}"); + } else { + debuglog("WEBHOOK: License already exists for order: $orderId"); } + } else { + debuglog("WEBHOOK: Not a software upgrade item (no serial_number/equipment_id)"); } + } else { + debuglog("WEBHOOK: No item_options found"); } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ - // Generate INVOICE via API + // Generate INVOICE directly in database //+++++++++++++++++++++++++++++++++++++++++++++++++++++ - $payload = json_encode(array("txn_id" => $transaction['transaction_id']), JSON_UNESCAPED_UNICODE); - $invoice = ioAPIv2('/v2/invoice/',$payload,$clientsecret); - $invoice = json_decode($invoice,true); - if ($invoice !== null && !empty($invoice)) { - // Fetch full invoice data with customer details - $invoice_cust = ioAPIv2('/v2/invoice/list=invoice&id='.$invoice['invoice_id'],'',$clientsecret); - $invoice_cust = json_decode($invoice_cust,true); + // Check if invoice already exists for this transaction + $sql = 'SELECT id FROM invoice WHERE txn_id = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$transaction['txn_id']]); + $existing_invoice = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$existing_invoice) { + // Create invoice + $sql = 'INSERT INTO invoice (txn_id, payment_status, payment_amount, shipping_amount, discount_amount, tax_amount, created) + VALUES (?, ?, ?, ?, ?, ?, ?)'; + $stmt = $pdo->prepare($sql); + $stmt->execute([ + $transaction['txn_id'], + $transaction['payment_status'], + $transaction['payment_amount'], + $transaction['shipping_amount'] ?? 0.00, + $transaction['discount_amount'] ?? 0.00, + $transaction['tax_amount'] ?? 0.00, + date('Y-m-d H:i:s') + ]); + $invoice_id = $pdo->lastInsertId(); + debuglog("WEBHOOK: Invoice created with ID: $invoice_id"); + } else { + $invoice_id = $existing_invoice['id']; + debuglog("WEBHOOK: Invoice already exists with ID: $invoice_id"); + } + + // Fetch full invoice data with customer details for email + // Note: invoice.txn_id = transactions.txn_id (VARCHAR order ID) + // transactions_items.txn_id = transactions.id (INT database ID) + $sql = 'SELECT tx.*, txi.item_id, txi.item_price, txi.item_quantity, txi.item_options, + p.productcode, p.productname, inv.id as invoice, inv.created as invoice_created, + i.language as user_language + FROM invoice inv + LEFT JOIN transactions tx ON tx.txn_id = inv.txn_id + LEFT JOIN transactions_items txi ON txi.txn_id = tx.id + LEFT JOIN products p ON p.rowID = txi.item_id + LEFT JOIN identity i ON i.userkey = tx.account_id + WHERE inv.id = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$invoice_id]); + $invoice_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + debuglog("WEBHOOK: Invoice data fetched: " . print_r($invoice_data, true)); + + if (!empty($invoice_data)) { + debuglog("WEBHOOK: Transforming invoice data..."); + // Transform the data (group items like the API does) + $invoice_cust = transformOrderData($invoice_data); + debuglog("WEBHOOK: Transformed invoice data: " . print_r($invoice_cust, true)); // Determine invoice language if (!empty($invoice_cust['customer']['language'])) { @@ -170,28 +256,44 @@ try { } // Generate invoice HTML (using custom template for software upgrades) + debuglog("WEBHOOK: Calling generateSoftwareInvoice with language: $invoice_language"); list($data,$customer_email,$order_id) = generateSoftwareInvoice($invoice_cust,$orderId,$invoice_language); + debuglog("WEBHOOK: Invoice generated - Customer email: $customer_email, Order ID: $order_id"); + debuglog("WEBHOOK: Invoice HTML length: " . strlen($data)); //+++++++++++++++++++++++++++++++++++++++++++++++++++++ //CREATE PDF using DomPDF //+++++++++++++++++++++++++++++++++++++++++++++++++++++ + debuglog("WEBHOOK: Creating PDF..."); $dompdf->loadHtml($data); $dompdf->setPaper('A4', 'portrait'); $dompdf->render(); $subject = 'Software Upgrade - Invoice: '.$order_id; $attachment = $dompdf->output(); + debuglog("WEBHOOK: PDF created, size: " . strlen($attachment) . " bytes"); //+++++++++++++++++++++++++++++++++++++++++++++++++++++ //Send email via PHPMailer //+++++++++++++++++++++++++++++++++++++++++++++++++++++ - send_mail($customer_email, $subject, $data, $attachment, $subject); + debuglog("WEBHOOK: Attempting to send email to: $customer_email"); + debuglog("WEBHOOK: Email subject: $subject"); + debuglog("WEBHOOK: Email config - Host: " . (defined('email_host_name') ? email_host_name : 'NOT DEFINED')); + debuglog("WEBHOOK: Email config - Port: " . (defined('email_outgoing_port') ? email_outgoing_port : 'NOT DEFINED')); + debuglog("WEBHOOK: Email config - Security: " . (defined('email_outgoing_security') ? email_outgoing_security : 'NOT DEFINED')); + debuglog("WEBHOOK: Email config - Username: " . (defined('email') ? email : 'NOT DEFINED')); + + // The send_mail function will exit on error and debuglog the error + $mail_result = send_mail($customer_email, $subject, $data, $attachment, $subject); + debuglog("WEBHOOK: Email sent successfully to: $customer_email"); // Send to bookkeeping if configured if(invoice_bookkeeping){ + debuglog("WEBHOOK: Sending to bookkeeping: " . email_bookkeeping); send_mail(email_bookkeeping, $subject, $data, $attachment, $subject); } + } else { + debuglog("WEBHOOK: No invoice data found for invoice_id: $invoice_id"); } - } } } @@ -200,9 +302,13 @@ try { echo "OK"; } catch (\Mollie\Api\Exceptions\ApiException $e) { + debuglog("WEBHOOK ERROR (Mollie API): " . $e->getMessage()); + debuglog("WEBHOOK ERROR TRACE: " . $e->getTraceAsString()); error_log("Webhook API call failed: " . htmlspecialchars($e->getMessage())); http_response_code(500); } catch (Exception $e) { + debuglog("WEBHOOK ERROR (General): " . $e->getMessage()); + debuglog("WEBHOOK ERROR TRACE: " . $e->getTraceAsString()); error_log("Webhook error: " . htmlspecialchars($e->getMessage())); http_response_code(500); }