diff --git a/composer.json b/composer.json
index 552d5d173aac314e9aeedb86cec1dabaa390d66c..966607a55638f1e9cd6704250f5156740b7d157c 100644
--- a/composer.json
+++ b/composer.json
@@ -159,7 +159,7 @@
         "drupal/simple_gmap": "3.0.1",
         "drupal/simple_instagram_feed": "^3.11",
         "drupal/simple_sitemap": "3.11",
-        "drupal/simplesamlphp_auth": "3.2",
+        "drupal/simplesamlphp_auth": "3.3",
         "drupal/smtp": "1.0",
         "drupal/social_media": "1.9-rc2",
         "drupal/social_media_links": "^2.8",
diff --git a/composer.lock b/composer.lock
index a31ad59ee7514ee41ee8270e54a979e90a812d5a..2db3334baaf43e7c4e4dc597093cf67f3e543a0d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "10632cd97951938338443651ced5fe69",
+    "content-hash": "498e2291a483b2c415c3ff2bad152944",
     "packages": [
         {
             "name": "alchemy/zippy",
@@ -1415,16 +1415,16 @@
         },
         {
             "name": "doctrine/collections",
-            "version": "1.7.3",
+            "version": "1.8.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/collections.git",
-                "reference": "09dde3eb237756190f2de738d3c97cff10a8407b"
+                "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/collections/zipball/09dde3eb237756190f2de738d3c97cff10a8407b",
-                "reference": "09dde3eb237756190f2de738d3c97cff10a8407b",
+                "url": "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e",
+                "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e",
                 "shasum": ""
             },
             "require": {
@@ -1479,9 +1479,9 @@
             ],
             "support": {
                 "issues": "https://github.com/doctrine/collections/issues",
-                "source": "https://github.com/doctrine/collections/tree/1.7.3"
+                "source": "https://github.com/doctrine/collections/tree/1.8.0"
             },
-            "time": "2022-09-01T19:34:23+00:00"
+            "time": "2022-09-01T20:12:10+00:00"
         },
         {
             "name": "doctrine/deprecations",
@@ -6922,28 +6922,28 @@
         },
         {
             "name": "drupal/simplesamlphp_auth",
-            "version": "3.2.0",
+            "version": "3.3.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/simplesamlphp_auth.git",
-                "reference": "8.x-3.2"
+                "reference": "8.x-3.3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/simplesamlphp_auth-8.x-3.2.zip",
-                "reference": "8.x-3.2",
-                "shasum": "a5a2b10fc873eb8669929ad1a6d9599e47a2ca99"
+                "url": "https://ftp.drupal.org/files/projects/simplesamlphp_auth-8.x-3.3.zip",
+                "reference": "8.x-3.3",
+                "shasum": "14b33fc4e7c9a6a72de5a4ec32722200e7203d43"
             },
             "require": {
-                "drupal/core": "^8.7|^9.0",
-                "drupal/externalauth": "^1.1",
-                "simplesamlphp/simplesamlphp": "^1.18.2"
+                "drupal/core": "^8.7||^9.0",
+                "drupal/externalauth": "^1.1||^2.0",
+                "simplesamlphp/simplesamlphp": "^1.18.2||^1.19"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-3.2",
-                    "datestamp": "1580423953",
+                    "version": "8.x-3.3",
+                    "datestamp": "1660687554",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -8501,16 +8501,16 @@
         },
         {
             "name": "gettext/gettext",
-            "version": "v4.8.3",
+            "version": "4.x-dev",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-gettext/Gettext.git",
-                "reference": "57ff4fb16647e78e80a5909fe3c190f1c3110321"
+                "reference": "3f7bc5ef23302a9059e64934f3d59e454516bec0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/57ff4fb16647e78e80a5909fe3c190f1c3110321",
-                "reference": "57ff4fb16647e78e80a5909fe3c190f1c3110321",
+                "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/3f7bc5ef23302a9059e64934f3d59e454516bec0",
+                "reference": "3f7bc5ef23302a9059e64934f3d59e454516bec0",
                 "shasum": ""
             },
             "require": {
@@ -8518,7 +8518,7 @@
                 "php": ">=5.4.0"
             },
             "require-dev": {
-                "illuminate/view": "*",
+                "illuminate/view": "^5.0.x-dev",
                 "phpunit/phpunit": "^4.8|^5.7|^6.5",
                 "squizlabs/php_codesniffer": "^3.0",
                 "symfony/yaml": "~2",
@@ -8562,29 +8562,42 @@
             "support": {
                 "email": "oom@oscarotero.com",
                 "issues": "https://github.com/oscarotero/Gettext/issues",
-                "source": "https://github.com/php-gettext/Gettext/tree/v4.8.3"
+                "source": "https://github.com/php-gettext/Gettext/tree/4.x"
             },
-            "time": "2020-11-18T22:35:49+00:00"
+            "funding": [
+                {
+                    "url": "https://paypal.me/oscarotero",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/oscarotero",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/misteroom",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2022-08-02T09:42:10+00:00"
         },
         {
             "name": "gettext/languages",
-            "version": "2.6.0",
+            "version": "2.9.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-gettext/Languages.git",
-                "reference": "38ea0482f649e0802e475f0ed19fa993bcb7a618"
+                "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-gettext/Languages/zipball/38ea0482f649e0802e475f0ed19fa993bcb7a618",
-                "reference": "38ea0482f649e0802e475f0ed19fa993bcb7a618",
+                "url": "https://api.github.com/repos/php-gettext/Languages/zipball/ed56dd2c7f4024cc953ed180d25f02f2640e3ffa",
+                "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3"
             },
             "require-dev": {
-                "friendsofphp/php-cs-fixer": "^2.16.0",
                 "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4"
             },
             "bin": [
@@ -8627,9 +8640,19 @@
             ],
             "support": {
                 "issues": "https://github.com/php-gettext/Languages/issues",
-                "source": "https://github.com/php-gettext/Languages/tree/2.6.0"
+                "source": "https://github.com/php-gettext/Languages/tree/2.9.0"
             },
-            "time": "2019-11-13T10:30:21+00:00"
+            "funding": [
+                {
+                    "url": "https://paypal.me/mlocati",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/mlocati",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-11-11T17:30:39+00:00"
         },
         {
             "name": "google/recaptcha",
@@ -10136,16 +10159,16 @@
         },
         {
             "name": "phpmailer/phpmailer",
-            "version": "v6.2.0",
+            "version": "v6.6.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHPMailer/PHPMailer.git",
-                "reference": "e38888a75c070304ca5514197d4847a59a5c853f"
+                "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e38888a75c070304ca5514197d4847a59a5c853f",
-                "reference": "e38888a75c070304ca5514197d4847a59a5c853f",
+                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a94fdebaea6bd17f51be0c2373ab80d3d681269b",
+                "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b",
                 "shasum": ""
             },
             "require": {
@@ -10157,13 +10180,15 @@
             "require-dev": {
                 "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
                 "doctrine/annotations": "^1.2",
+                "php-parallel-lint/php-console-highlighter": "^1.0.0",
+                "php-parallel-lint/php-parallel-lint": "^1.3.2",
                 "phpcompatibility/php-compatibility": "^9.3.5",
                 "roave/security-advisories": "dev-latest",
-                "squizlabs/php_codesniffer": "^3.5.6",
-                "yoast/phpunit-polyfills": "^0.2.0"
+                "squizlabs/php_codesniffer": "^3.6.2",
+                "yoast/phpunit-polyfills": "^1.0.0"
             },
             "suggest": {
-                "ext-mbstring": "Needed to send email in multibyte encoding charset",
+                "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
                 "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
                 "league/oauth2-google": "Needed for Google XOAUTH2 authentication",
                 "psr/log": "For optional PSR-3 debug logging",
@@ -10200,7 +10225,7 @@
             "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
             "support": {
                 "issues": "https://github.com/PHPMailer/PHPMailer/issues",
-                "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.2.0"
+                "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.4"
             },
             "funding": [
                 {
@@ -10208,7 +10233,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2020-11-25T15:24:57+00:00"
+            "time": "2022-08-22T09:22:00+00:00"
         },
         {
             "name": "psr/cache",
@@ -10626,6 +10651,64 @@
             },
             "time": "2020-09-05T13:00:25+00:00"
         },
+        {
+            "name": "simplesamlphp/assert",
+            "version": "v0.0.13",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/simplesamlphp/assert.git",
+                "reference": "5429921b320ca4f9d1844225884ac52f649ea1e3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/5429921b320ca4f9d1844225884ac52f649ea1e3",
+                "reference": "5429921b320ca4f9d1844225884ac52f649ea1e3",
+                "shasum": ""
+            },
+            "require": {
+                "ext-spl": "*",
+                "php": "^7.1 || ^8.0",
+                "webmozart/assert": "^1.9"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5",
+                "sensiolabs/security-checker": "~6.0",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.2.7",
+                "squizlabs/php_codesniffer": "~3.5",
+                "vimeo/psalm": "~3.13"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "v0.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "SimpleSAML\\Assert\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-2.1-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "Tim van Dijen",
+                    "email": "tvdijen@gmail.com"
+                },
+                {
+                    "name": "Jaime Perez Crespo",
+                    "email": "jaimepc@gmail.com"
+                }
+            ],
+            "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments",
+            "support": {
+                "issues": "https://github.com/simplesamlphp/assert/issues",
+                "source": "https://github.com/simplesamlphp/assert/tree/master"
+            },
+            "time": "2020-08-17T20:40:49+00:00"
+        },
         {
             "name": "simplesamlphp/composer-module-installer",
             "version": "v1.1.8",
@@ -10666,39 +10749,38 @@
         },
         {
             "name": "simplesamlphp/saml2",
-            "version": "v4.2.0",
+            "version": "v4.6.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/saml2.git",
-                "reference": "d4038b83be50ccd64ecdc0b7c68e66d63c899d2c"
+                "reference": "bfc9c79dd6b728a41d1de988f545f6e64728a51d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/d4038b83be50ccd64ecdc0b7c68e66d63c899d2c",
-                "reference": "d4038b83be50ccd64ecdc0b7c68e66d63c899d2c",
+                "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/bfc9c79dd6b728a41d1de988f545f6e64728a51d",
+                "reference": "bfc9c79dd6b728a41d1de988f545f6e64728a51d",
                 "shasum": ""
             },
             "require": {
                 "ext-dom": "*",
                 "ext-openssl": "*",
                 "ext-zlib": "*",
-                "php": ">=7.1",
-                "psr/log": "~1.1",
-                "robrichards/xmlseclibs": "^3.1.0",
-                "webmozart/assert": "^1.5"
+                "php": ">=7.1 || ^8.0",
+                "psr/log": "~1.1 || ^2.0 || ^3.0",
+                "robrichards/xmlseclibs": "^3.1.1",
+                "webmozart/assert": "^1.9"
             },
             "require-dev": {
-                "mockery/mockery": "~1.2",
-                "phpunit/phpunit": "^7.5",
-                "sebastian/phpcpd": "~4.1",
-                "sensiolabs/security-checker": "~6.0",
+                "mockery/mockery": "^1.3",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "sebastian/phpcpd": "~4.1 || ^5.0 || ^6.0",
                 "simplesamlphp/simplesamlphp-test-framework": "~0.1.0",
                 "squizlabs/php_codesniffer": "~3.5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "v4.0.x-dev"
+                    "dev-master": "v4.2.x-dev"
                 }
             },
             "autoload": {
@@ -10719,22 +10801,22 @@
             "description": "SAML2 PHP library from SimpleSAMLphp",
             "support": {
                 "issues": "https://github.com/simplesamlphp/saml2/issues",
-                "source": "https://github.com/simplesamlphp/saml2/tree/v4.2.0"
+                "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.3"
             },
-            "time": "2021-01-28T21:35:22+00:00"
+            "time": "2022-06-13T14:04:10+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp",
-            "version": "v1.18.8",
+            "version": "v1.19.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp.git",
-                "reference": "ebb6d15bb8e8b45504adc26fd3872073d1e5cd9b"
+                "reference": "76a18dd3d0f64bfd1d249f713fb6eefc0b62a0f0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp/zipball/ebb6d15bb8e8b45504adc26fd3872073d1e5cd9b",
-                "reference": "ebb6d15bb8e8b45504adc26fd3872073d1e5cd9b",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp/zipball/76a18dd3d0f64bfd1d249f713fb6eefc0b62a0f0",
+                "reference": "76a18dd3d0f64bfd1d249f713fb6eefc0b62a0f0",
                 "shasum": ""
             },
             "require": {
@@ -10747,12 +10829,13 @@
                 "ext-pcre": "*",
                 "ext-spl": "*",
                 "ext-zlib": "*",
-                "gettext/gettext": "^4.6",
-                "php": ">=5.6",
-                "phpmailer/phpmailer": "^6.0",
-                "robrichards/xmlseclibs": "^3.0.4",
-                "simplesamlphp/saml2": "^3.4 || ^4.0",
-                "simplesamlphp/simplesamlphp-module-adfs": "^0.9",
+                "gettext/gettext": "v4.x-dev#3e7460f8d9c90174824e3f39240bd578bb3d376a",
+                "php": ">=7.1|^8",
+                "phpmailer/phpmailer": "^6.1",
+                "robrichards/xmlseclibs": "^3.1",
+                "simplesamlphp/assert": "^0.0.13",
+                "simplesamlphp/saml2": "^4.5",
+                "simplesamlphp/simplesamlphp-module-adfs": "^1.0",
                 "simplesamlphp/simplesamlphp-module-authcrypt": "^0.9",
                 "simplesamlphp/simplesamlphp-module-authfacebook": "^0.9",
                 "simplesamlphp/simplesamlphp-module-authorize": "^0.9",
@@ -10764,15 +10847,15 @@
                 "simplesamlphp/simplesamlphp-module-cdc": "^0.9",
                 "simplesamlphp/simplesamlphp-module-consent": "^0.9",
                 "simplesamlphp/simplesamlphp-module-consentadmin": "^0.9",
-                "simplesamlphp/simplesamlphp-module-discopower": "^0.9",
+                "simplesamlphp/simplesamlphp-module-discopower": "^0.10",
                 "simplesamlphp/simplesamlphp-module-exampleattributeserver": "^1.0",
                 "simplesamlphp/simplesamlphp-module-expirycheck": "^0.9",
-                "simplesamlphp/simplesamlphp-module-ldap": "^0.9",
+                "simplesamlphp/simplesamlphp-module-ldap": "^0.9 | ^1.0",
                 "simplesamlphp/simplesamlphp-module-memcachemonitor": "^0.9",
                 "simplesamlphp/simplesamlphp-module-memcookie": "^1.2",
-                "simplesamlphp/simplesamlphp-module-metarefresh": "^0.9",
+                "simplesamlphp/simplesamlphp-module-metarefresh": "^0.10",
                 "simplesamlphp/simplesamlphp-module-negotiate": "^0.9",
-                "simplesamlphp/simplesamlphp-module-oauth": "^0.9",
+                "simplesamlphp/simplesamlphp-module-oauth": "^0.9.3",
                 "simplesamlphp/simplesamlphp-module-preprodwarning": "^0.9",
                 "simplesamlphp/simplesamlphp-module-radius": "^0.9",
                 "simplesamlphp/simplesamlphp-module-riak": "^0.9",
@@ -10780,23 +10863,26 @@
                 "simplesamlphp/simplesamlphp-module-smartattributes": "^0.9",
                 "simplesamlphp/simplesamlphp-module-sqlauth": "^0.9",
                 "simplesamlphp/simplesamlphp-module-statistics": "^0.9",
-                "simplesamlphp/twig-configurable-i18n": "^2.2",
-                "symfony/config": "^3.4 || ^4.0",
-                "symfony/dependency-injection": "^3.4 || ^4.0",
-                "symfony/http-foundation": "^3.4 || ^4.0",
-                "symfony/http-kernel": "^3.4 || ^4.0",
-                "symfony/routing": "^3.4 || ^4.0",
-                "symfony/yaml": "^3.4 || ^4.0",
-                "twig/twig": "~1.0 || ~2.0"
+                "simplesamlphp/twig-configurable-i18n": "~2.3.3",
+                "symfony/cache": "^4.4 || ^5.0",
+                "symfony/config": "^4.4 || ^5.0",
+                "symfony/console": "^4.4 || ^5.0",
+                "symfony/dependency-injection": "^4.4 || ^5.0",
+                "symfony/finder": "^4.4 || ^5.0",
+                "symfony/framework-bundle": "^4.4 || ^5.0",
+                "symfony/http-foundation": "^4.4 || ^5.0",
+                "symfony/http-kernel": "^4.4 || ^5.0",
+                "symfony/routing": "^4.4 || ^5.0",
+                "symfony/var-exporter": "^4.4 || ^5.0",
+                "symfony/yaml": "^4.4 || ^5.0",
+                "twig/twig": "^2.14.11"
             },
             "require-dev": {
                 "ext-curl": "*",
                 "mikey179/vfsstream": "~1.6",
-                "phpunit/phpunit": "~5.7",
-                "sensiolabs/security-checker": "^5.0.3",
-                "simplesamlphp/simplesamlphp-test-framework": "^0.0.14",
-                "squizlabs/php_codesniffer": "^3.5",
-                "vimeo/psalm": "~1.1.9"
+                "phpunit/phpunit": "^7.5",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.1.2",
+                "vimeo/psalm": "~3.14"
             },
             "suggest": {
                 "ext-curl": "Needed in order to check for updates automatically",
@@ -10849,30 +10935,30 @@
                 "issues": "https://github.com/simplesamlphp/simplesamlphp/issues",
                 "source": "https://github.com/simplesamlphp/simplesamlphp"
             },
-            "time": "2020-09-02T12:07:28+00:00"
+            "time": "2022-07-01T19:19:48+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-adfs",
-            "version": "v0.9.6",
+            "version": "v1.0.9",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-adfs.git",
-                "reference": "425e5ebbdd097c92fe5265a6b48d32a3095c7237"
+                "reference": "c47daabc262b7e14a76879015fd9db85319752ec"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/425e5ebbdd097c92fe5265a6b48d32a3095c7237",
-                "reference": "425e5ebbdd097c92fe5265a6b48d32a3095c7237",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/c47daabc262b7e14a76879015fd9db85319752ec",
+                "reference": "c47daabc262b7e14a76879015fd9db85319752ec",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
-                "simplesamlphp/composer-module-installer": "~1.1"
+                "php": ">=7.1",
+                "simplesamlphp/assert": "^0.0.13",
+                "simplesamlphp/composer-module-installer": "^1.1.7"
             },
             "require-dev": {
-                "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17",
-                "webmozart/assert": "<1.7"
+                "simplesamlphp/simplesamlphp": "^1.18",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.1.2"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -10896,23 +10982,23 @@
                 "simplesamlphp"
             ],
             "support": {
-                "issues": "https://github.com/tvdijen/simplesamlphp-module-adfs/issues",
-                "source": "https://github.com/tvdijen/simplesamlphp-module-adfs"
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-adfs/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-adfs"
             },
-            "time": "2020-03-31T14:29:24+00:00"
+            "time": "2022-04-11T10:24:25+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authcrypt",
-            "version": "v0.9.3",
+            "version": "v0.9.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authcrypt.git",
-                "reference": "9a2c1a761e2d94394a4f2d3499fd6f0853899530"
+                "reference": "62555123e61b11463be3cd7adb708562023cff28"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authcrypt/zipball/9a2c1a761e2d94394a4f2d3499fd6f0853899530",
-                "reference": "9a2c1a761e2d94394a4f2d3499fd6f0853899530",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authcrypt/zipball/62555123e61b11463be3cd7adb708562023cff28",
+                "reference": "62555123e61b11463be3cd7adb708562023cff28",
                 "shasum": ""
             },
             "require": {
@@ -10950,7 +11036,7 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-authcrypt/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-authcrypt"
             },
-            "time": "2021-01-08T09:09:33+00:00"
+            "time": "2022-01-03T20:50:47+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authfacebook",
@@ -11008,16 +11094,16 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authorize",
-            "version": "v0.9.2",
+            "version": "v0.9.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authorize.git",
-                "reference": "c2607a5252ee1256b50ce7795e35513b116998d4"
+                "reference": "4c7ce4eaa54fc301f131c62e803fc843e4d88056"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authorize/zipball/c2607a5252ee1256b50ce7795e35513b116998d4",
-                "reference": "c2607a5252ee1256b50ce7795e35513b116998d4",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authorize/zipball/4c7ce4eaa54fc301f131c62e803fc843e4d88056",
+                "reference": "4c7ce4eaa54fc301f131c62e803fc843e4d88056",
                 "shasum": ""
             },
             "require": {
@@ -11036,7 +11122,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11053,20 +11139,20 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-authorize/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-authorize"
             },
-            "time": "2020-02-25T15:16:57+00:00"
+            "time": "2022-01-03T20:56:53+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authtwitter",
-            "version": "v0.9.1",
+            "version": "v0.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authtwitter.git",
-                "reference": "29a15e58061222632fea9eb2c807aef5e2c0d54a"
+                "reference": "6e178e7aae7827a64dc462b5bb2f28d6eddc4381"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authtwitter/zipball/29a15e58061222632fea9eb2c807aef5e2c0d54a",
-                "reference": "29a15e58061222632fea9eb2c807aef5e2c0d54a",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authtwitter/zipball/6e178e7aae7827a64dc462b5bb2f28d6eddc4381",
+                "reference": "6e178e7aae7827a64dc462b5bb2f28d6eddc4381",
                 "shasum": ""
             },
             "require": {
@@ -11076,7 +11162,8 @@
             },
             "require-dev": {
                 "phpunit/phpunit": "~4.8.35",
-                "simplesamlphp/simplesamlphp": "^1.17"
+                "simplesamlphp/simplesamlphp": "^1.17",
+                "webmozart/assert": "<1.7"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -11086,7 +11173,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11107,7 +11194,7 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-authtwitter/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-authtwitter"
             },
-            "time": "2019-12-03T09:00:09+00:00"
+            "time": "2022-01-03T23:01:48+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authwindowslive",
@@ -11167,16 +11254,16 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authx509",
-            "version": "v0.9.8",
+            "version": "v0.9.9",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authX509.git",
-                "reference": "66525b1ec4145ec8d0d0e9db4534624b6be4c1fb"
+                "reference": "b138f41b2bc725371f42abb63b5a39ac11b5432a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authX509/zipball/66525b1ec4145ec8d0d0e9db4534624b6be4c1fb",
-                "reference": "66525b1ec4145ec8d0d0e9db4534624b6be4c1fb",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authX509/zipball/b138f41b2bc725371f42abb63b5a39ac11b5432a",
+                "reference": "b138f41b2bc725371f42abb63b5a39ac11b5432a",
                 "shasum": ""
             },
             "require": {
@@ -11220,20 +11307,20 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-authx509/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-authx509"
             },
-            "time": "2020-12-15T23:06:47+00:00"
+            "time": "2022-01-06T19:02:38+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authyubikey",
-            "version": "v0.9.1",
+            "version": "v0.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authyubikey.git",
-                "reference": "8c27bfeb4981d2e6fa40a831e945f40c5a4ad3d2"
+                "reference": "414e2a73da4adfee6d97ba66e852ec7c85369913"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authyubikey/zipball/8c27bfeb4981d2e6fa40a831e945f40c5a4ad3d2",
-                "reference": "8c27bfeb4981d2e6fa40a831e945f40c5a4ad3d2",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authyubikey/zipball/414e2a73da4adfee6d97ba66e852ec7c85369913",
+                "reference": "414e2a73da4adfee6d97ba66e852ec7c85369913",
                 "shasum": ""
             },
             "require": {
@@ -11247,7 +11334,7 @@
             },
             "type": "simplesamlphp-module",
             "extra": {
-                "ssp-mixedcase-module-name": "authYubikey"
+                "ssp-mixedcase-module-name": "authYubiKey"
             },
             "autoload": {
                 "psr-4": {
@@ -11256,7 +11343,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11273,7 +11360,7 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-authyubikey/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-authyubikey"
             },
-            "time": "2019-12-03T08:52:49+00:00"
+            "time": "2022-01-06T19:07:32+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-cas",
@@ -11328,16 +11415,16 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-cdc",
-            "version": "v0.9.1",
+            "version": "v0.9.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-cdc.git",
-                "reference": "16a5bfac7299e04e5feb472af328e07598708166"
+                "reference": "92498fc3004c02849d96da29ca472d99ed23af73"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-cdc/zipball/16a5bfac7299e04e5feb472af328e07598708166",
-                "reference": "16a5bfac7299e04e5feb472af328e07598708166",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-cdc/zipball/92498fc3004c02849d96da29ca472d99ed23af73",
+                "reference": "92498fc3004c02849d96da29ca472d99ed23af73",
                 "shasum": ""
             },
             "require": {
@@ -11345,7 +11432,8 @@
             },
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17"
+                "simplesamlphp/simplesamlphp": "^1.17",
+                "webmozart/assert": "<1.7"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -11355,7 +11443,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11377,20 +11465,20 @@
                 "issues": "https://github.com/simplesamlphp/simplesamlphp-module-cdc/issues",
                 "source": "https://github.com/simplesamlphp/simplesamlphp-module-cdc/"
             },
-            "time": "2019-12-03T09:04:11+00:00"
+            "time": "2022-01-06T19:27:16+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-consent",
-            "version": "v0.9.6",
+            "version": "v0.9.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-consent.git",
-                "reference": "2f84d15e96afb5a32b6d1cff93370f501ca7867d"
+                "reference": "8466b0b7c6207b15ca5e265f436299ff2dec85da"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consent/zipball/2f84d15e96afb5a32b6d1cff93370f501ca7867d",
-                "reference": "2f84d15e96afb5a32b6d1cff93370f501ca7867d",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consent/zipball/8466b0b7c6207b15ca5e265f436299ff2dec85da",
+                "reference": "8466b0b7c6207b15ca5e265f436299ff2dec85da",
                 "shasum": ""
             },
             "require": {
@@ -11400,7 +11488,7 @@
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17",
-                "webmozart/assert": "<1.7"
+                "webmozart/assert": "<1.6"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -11427,20 +11515,20 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-consent/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-consent"
             },
-            "time": "2020-06-15T14:26:23+00:00"
+            "time": "2022-01-06T19:17:22+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-consentadmin",
-            "version": "v0.9.1",
+            "version": "v0.9.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin.git",
-                "reference": "466e8d0d751f0080162d78e63ab2e125b24d17a1"
+                "reference": "62dc5e9d5b1a12a73549c80140b7224d7f7d1c2e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consentadmin/zipball/466e8d0d751f0080162d78e63ab2e125b24d17a1",
-                "reference": "466e8d0d751f0080162d78e63ab2e125b24d17a1",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consentadmin/zipball/62dc5e9d5b1a12a73549c80140b7224d7f7d1c2e",
+                "reference": "62dc5e9d5b1a12a73549c80140b7224d7f7d1c2e",
                 "shasum": ""
             },
             "require": {
@@ -11459,7 +11547,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11480,30 +11568,29 @@
                 "issues": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin/issues",
                 "source": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin"
             },
-            "time": "2019-12-03T09:06:40+00:00"
+            "time": "2022-01-06T19:19:38+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-discopower",
-            "version": "v0.9.3",
+            "version": "v0.10.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-discopower.git",
-                "reference": "c892926e8186d0a2c638f7032dfc30540c1f92fb"
+                "reference": "4cb6b7c648b455586903b8932a171397375b50b0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-discopower/zipball/c892926e8186d0a2c638f7032dfc30540c1f92fb",
-                "reference": "c892926e8186d0a2c638f7032dfc30540c1f92fb",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-discopower/zipball/4cb6b7c648b455586903b8932a171397375b50b0",
+                "reference": "4cb6b7c648b455586903b8932a171397375b50b0",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
-                "simplesamlphp/composer-module-installer": "~1.1",
-                "webmozart/assert": "~1.4 <1.6"
+                "php": ">=7.1",
+                "simplesamlphp/composer-module-installer": "~1.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17"
+                "simplesamlphp/simplesamlphp": "^1.19",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.1.2"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -11513,7 +11600,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11531,7 +11618,7 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-discopower/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-discopower"
             },
-            "time": "2019-12-13T07:51:43+00:00"
+            "time": "2021-08-17T14:29:22+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-exampleattributeserver",
@@ -11584,26 +11671,25 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-expirycheck",
-            "version": "v0.9.3",
+            "version": "v0.9.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-expirycheck.git",
-                "reference": "59c59cdf87e2679257b46c07bb4c27666a11cc20"
+                "reference": "02101497281031befba93c48c96ee9133f57241d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-expirycheck/zipball/59c59cdf87e2679257b46c07bb4c27666a11cc20",
-                "reference": "59c59cdf87e2679257b46c07bb4c27666a11cc20",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-expirycheck/zipball/02101497281031befba93c48c96ee9133f57241d",
+                "reference": "02101497281031befba93c48c96ee9133f57241d",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.6",
-                "simplesamlphp/composer-module-installer": "~1.1",
-                "webmozart/assert": "~1.4"
+                "simplesamlphp/composer-module-installer": "~1.1"
             },
             "require-dev": {
-                "simplesamlphp/simplesamlphp": "^1.17",
-                "simplesamlphp/simplesamlphp-test-framework": "^0.0.10"
+                "phpunit/phpunit": "~5.7",
+                "simplesamlphp/simplesamlphp": "^1.17"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -11613,7 +11699,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11627,23 +11713,23 @@
                 "simplesamlphp"
             ],
             "support": {
-                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-expirycheck/issues",
-                "source": "https://github.com/simplesamlphp/simplesamlphp-module-expirycheck"
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-expirycheck/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-expirycheck"
             },
-            "time": "2019-12-14T13:20:46+00:00"
+            "time": "2022-01-06T21:16:01+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-ldap",
-            "version": "v0.9.10",
+            "version": "v0.9.17",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-ldap.git",
-                "reference": "78f04cbe41bfb9dcbcdeff4b5f12e67c060e1a77"
+                "reference": "40f1bfe0c4ac2f91cf8e52d22fa6ec2fe1c03066"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-ldap/zipball/78f04cbe41bfb9dcbcdeff4b5f12e67c060e1a77",
-                "reference": "78f04cbe41bfb9dcbcdeff4b5f12e67c060e1a77",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-ldap/zipball/40f1bfe0c4ac2f91cf8e52d22fa6ec2fe1c03066",
+                "reference": "40f1bfe0c4ac2f91cf8e52d22fa6ec2fe1c03066",
                 "shasum": ""
             },
             "require": {
@@ -11686,20 +11772,20 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-ldap/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-ldap"
             },
-            "time": "2020-09-16T21:09:07+00:00"
+            "time": "2022-01-11T12:50:47+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-memcachemonitor",
-            "version": "v0.9.2",
+            "version": "v0.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-memcachemonitor.git",
-                "reference": "900b5c6b59913d9013b8dae090841a127ae55ae5"
+                "reference": "8d25463ac56b4e2294f59f622a6658e0c67086f4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-memcachemonitor/zipball/900b5c6b59913d9013b8dae090841a127ae55ae5",
-                "reference": "900b5c6b59913d9013b8dae090841a127ae55ae5",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-memcachemonitor/zipball/8d25463ac56b4e2294f59f622a6658e0c67086f4",
+                "reference": "8d25463ac56b4e2294f59f622a6658e0c67086f4",
                 "shasum": ""
             },
             "require": {
@@ -11737,7 +11823,7 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-memcachemonitor/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-memcachemonitor"
             },
-            "time": "2021-01-25T15:44:44+00:00"
+            "time": "2022-01-06T22:37:15+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-memcookie",
@@ -11793,16 +11879,16 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-metarefresh",
-            "version": "v0.9.6",
+            "version": "v0.10.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-metarefresh.git",
-                "reference": "e284306a7097297765b5b78a4e28f19f18d4e001"
+                "reference": "488d7809857c274befac89facfa03520a05bc1ba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-metarefresh/zipball/e284306a7097297765b5b78a4e28f19f18d4e001",
-                "reference": "e284306a7097297765b5b78a4e28f19f18d4e001",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-metarefresh/zipball/488d7809857c274befac89facfa03520a05bc1ba",
+                "reference": "488d7809857c274befac89facfa03520a05bc1ba",
                 "shasum": ""
             },
             "require": {
@@ -11838,20 +11924,20 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-metarefresh/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-metarefresh"
             },
-            "time": "2020-07-31T14:43:37+00:00"
+            "time": "2022-05-03T08:57:30+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-negotiate",
-            "version": "v0.9.10",
+            "version": "v0.9.12",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate.git",
-                "reference": "db05ff40399c66e3f14697a8162da6b2fbdab47d"
+                "reference": "48752cea80e81a60ebb522cc10789589ac16df50"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-negotiate/zipball/db05ff40399c66e3f14697a8162da6b2fbdab47d",
-                "reference": "db05ff40399c66e3f14697a8162da6b2fbdab47d",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-negotiate/zipball/48752cea80e81a60ebb522cc10789589ac16df50",
+                "reference": "48752cea80e81a60ebb522cc10789589ac16df50",
                 "shasum": ""
             },
             "require": {
@@ -11892,23 +11978,23 @@
                 "simplesamlphp"
             ],
             "support": {
-                "issues": "https://github.com/tvdijen/simplesamlphp-module-negotiate/issues",
-                "source": "https://github.com/tvdijen/simplesamlphp-module-negotiate"
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate"
             },
-            "time": "2021-01-22T13:36:09+00:00"
+            "time": "2022-01-03T23:18:27+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-oauth",
-            "version": "v0.9.2",
+            "version": "v0.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-oauth.git",
-                "reference": "d14d7aca6e699ec12b3f4dd0128373faa1a2cc61"
+                "reference": "2a2433144dca408315e4ee163f9ab73a6110b2b1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-oauth/zipball/d14d7aca6e699ec12b3f4dd0128373faa1a2cc61",
-                "reference": "d14d7aca6e699ec12b3f4dd0128373faa1a2cc61",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-oauth/zipball/2a2433144dca408315e4ee163f9ab73a6110b2b1",
+                "reference": "2a2433144dca408315e4ee163f9ab73a6110b2b1",
                 "shasum": ""
             },
             "require": {
@@ -11919,6 +12005,11 @@
                 "simplesamlphp/simplesamlphp": "^1.17"
             },
             "type": "simplesamlphp-module",
+            "autoload": {
+                "psr-4": {
+                    "SimpleSAML\\Module\\oauth\\": "lib/"
+                }
+            },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
                 "LGPL-2.1-or-later"
@@ -11944,29 +12035,29 @@
                 "source": "https://github.com/simplesamlphp/simplesamlphp-module-oauth/"
             },
             "abandoned": true,
-            "time": "2020-04-29T19:37:43+00:00"
+            "time": "2021-08-31T18:55:00+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-preprodwarning",
-            "version": "v0.9.2",
+            "version": "v0.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning.git",
-                "reference": "8e032de33a75eb44857dc06d886ad94ee3af4638"
+                "reference": "b3c6d9d41d009e340f4843ce5c24b4118a38e4c3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-preprodwarning/zipball/8e032de33a75eb44857dc06d886ad94ee3af4638",
-                "reference": "8e032de33a75eb44857dc06d886ad94ee3af4638",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-preprodwarning/zipball/b3c6d9d41d009e340f4843ce5c24b4118a38e4c3",
+                "reference": "b3c6d9d41d009e340f4843ce5c24b4118a38e4c3",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
+                "php": ">=7.0",
                 "simplesamlphp/composer-module-installer": "~1.1"
             },
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17",
+                "simplesamlphp/simplesamlphp": "dev-simplesamlphp-1.19",
                 "webmozart/assert": "^1.4"
             },
             "type": "simplesamlphp-module",
@@ -11994,20 +12085,20 @@
                 "issues": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning/issues",
                 "source": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning"
             },
-            "time": "2020-04-09T13:05:27+00:00"
+            "time": "2022-01-06T23:21:17+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-radius",
-            "version": "v0.9.3",
+            "version": "v0.9.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-radius.git",
-                "reference": "36bd0f39f9a13f7eb96ead97c97c3634aa1c3f2d"
+                "reference": "dbe2976ba27f5131faeca368a5665f8baeaae8b6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-radius/zipball/36bd0f39f9a13f7eb96ead97c97c3634aa1c3f2d",
-                "reference": "36bd0f39f9a13f7eb96ead97c97c3634aa1c3f2d",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-radius/zipball/dbe2976ba27f5131faeca368a5665f8baeaae8b6",
+                "reference": "dbe2976ba27f5131faeca368a5665f8baeaae8b6",
                 "shasum": ""
             },
             "require": {
@@ -12027,7 +12118,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -12044,7 +12135,7 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-radius/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-radius"
             },
-            "time": "2019-10-03T18:13:07+00:00"
+            "time": "2022-01-06T23:23:28+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-riak",
@@ -12149,16 +12240,16 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-smartattributes",
-            "version": "v0.9.1",
+            "version": "v0.9.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-smartattributes.git",
-                "reference": "b45d3ecd916e359a9cae05f9ae9df09b5c42f4e6"
+                "reference": "ba6a32fa287db0f8d767104471176f70fad7f0e1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-smartattributes/zipball/b45d3ecd916e359a9cae05f9ae9df09b5c42f4e6",
-                "reference": "b45d3ecd916e359a9cae05f9ae9df09b5c42f4e6",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-smartattributes/zipball/ba6a32fa287db0f8d767104471176f70fad7f0e1",
+                "reference": "ba6a32fa287db0f8d767104471176f70fad7f0e1",
                 "shasum": ""
             },
             "require": {
@@ -12177,7 +12268,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -12194,20 +12285,20 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-smartattributes/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-smartattributes"
             },
-            "time": "2019-12-03T09:24:09+00:00"
+            "time": "2022-01-06T23:42:07+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-sqlauth",
-            "version": "v0.9.1",
+            "version": "v0.9.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-sqlauth.git",
-                "reference": "31bce8763ad97f4b4473e4ad4a5a96ddc136ef6b"
+                "reference": "8a28f9a9726bab1dbc8fd3734daa08882dd0a25b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-sqlauth/zipball/31bce8763ad97f4b4473e4ad4a5a96ddc136ef6b",
-                "reference": "31bce8763ad97f4b4473e4ad4a5a96ddc136ef6b",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-sqlauth/zipball/8a28f9a9726bab1dbc8fd3734daa08882dd0a25b",
+                "reference": "8a28f9a9726bab1dbc8fd3734daa08882dd0a25b",
                 "shasum": ""
             },
             "require": {
@@ -12217,7 +12308,7 @@
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17",
-                "webmozart/assert": "^1.4"
+                "webmozart/assert": "^1.4 <1.7"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -12227,7 +12318,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -12244,7 +12335,7 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-sqlauth/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-sqlauth"
             },
-            "time": "2019-12-03T09:07:09+00:00"
+            "time": "2022-01-06T23:50:52+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-statistics",
@@ -12519,24 +12610,201 @@
             },
             "time": "2021-11-08T16:33:10+00:00"
         },
+        {
+            "name": "symfony/cache",
+            "version": "v5.4.11",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache.git",
+                "reference": "5a0fff46df349f0db3fe242263451fddf5277362"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache/zipball/5a0fff46df349f0db3fe242263451fddf5277362",
+                "reference": "5a0fff46df349f0db3fe242263451fddf5277362",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/cache": "^1.0|^2.0",
+                "psr/log": "^1.1|^2|^3",
+                "symfony/cache-contracts": "^1.1.7|^2",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-php73": "^1.9",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.1|^2|^3",
+                "symfony/var-exporter": "^4.4|^5.0|^6.0"
+            },
+            "conflict": {
+                "doctrine/dbal": "<2.13.1",
+                "symfony/dependency-injection": "<4.4",
+                "symfony/http-kernel": "<4.4",
+                "symfony/var-dumper": "<4.4"
+            },
+            "provide": {
+                "psr/cache-implementation": "1.0|2.0",
+                "psr/simple-cache-implementation": "1.0|2.0",
+                "symfony/cache-implementation": "1.0|2.0"
+            },
+            "require-dev": {
+                "cache/integration-tests": "dev-master",
+                "doctrine/cache": "^1.6|^2.0",
+                "doctrine/dbal": "^2.13.1|^3.0",
+                "predis/predis": "^1.1",
+                "psr/simple-cache": "^1.0|^2.0",
+                "symfony/config": "^4.4|^5.0|^6.0",
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+                "symfony/filesystem": "^4.4|^5.0|^6.0",
+                "symfony/http-kernel": "^4.4|^5.0|^6.0",
+                "symfony/messenger": "^4.4|^5.0|^6.0",
+                "symfony/var-dumper": "^4.4|^5.0|^6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Cache\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "caching",
+                "psr6"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache/tree/v5.4.11"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-07-28T15:25:17+00:00"
+        },
+        {
+            "name": "symfony/cache-contracts",
+            "version": "v2.5.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache-contracts.git",
+                "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
+                "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/cache": "^1.0|^2.0|^3.0"
+            },
+            "suggest": {
+                "symfony/cache-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.5-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Cache\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to caching",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-01-02T09:53:40+00:00"
+        },
         {
             "name": "symfony/config",
-            "version": "v4.4.25",
+            "version": "v4.4.44",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/config.git",
-                "reference": "2803882bb10353d277d4539635dd688a053d571c"
+                "reference": "ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/config/zipball/2803882bb10353d277d4539635dd688a053d571c",
-                "reference": "2803882bb10353d277d4539635dd688a053d571c",
+                "url": "https://api.github.com/repos/symfony/config/zipball/ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658",
+                "reference": "ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658",
                 "shasum": ""
             },
             "require": {
                 "php": ">=7.1.3",
                 "symfony/filesystem": "^3.4|^4.0|^5.0",
                 "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-php80": "^1.16",
                 "symfony/polyfill-php81": "^1.22"
             },
             "conflict": {
@@ -12578,7 +12846,7 @@
             "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/config/tree/v4.4.25"
+                "source": "https://github.com/symfony/config/tree/v4.4.44"
             },
             "funding": [
                 {
@@ -12594,7 +12862,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-05-26T11:20:16+00:00"
+            "time": "2022-07-20T09:59:04+00:00"
         },
         {
             "name": "symfony/console",
@@ -13281,21 +13549,22 @@
         },
         {
             "name": "symfony/filesystem",
-            "version": "v4.4.25",
+            "version": "v4.4.42",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
-                "reference": "2d926ebd76f52352deb3c9577d8c1d4b96eae429"
+                "reference": "815412ee8971209bd4c1eecd5f4f481eacd44bf5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/2d926ebd76f52352deb3c9577d8c1d4b96eae429",
-                "reference": "2d926ebd76f52352deb3c9577d8c1d4b96eae429",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/815412ee8971209bd4c1eecd5f4f481eacd44bf5",
+                "reference": "815412ee8971209bd4c1eecd5f4f481eacd44bf5",
                 "shasum": ""
             },
             "require": {
                 "php": ">=7.1.3",
-                "symfony/polyfill-ctype": "~1.8"
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-php80": "^1.16"
             },
             "type": "library",
             "autoload": {
@@ -13323,7 +13592,7 @@
             "description": "Provides basic utilities for the filesystem",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/filesystem/tree/v4.4.25"
+                "source": "https://github.com/symfony/filesystem/tree/v4.4.42"
             },
             "funding": [
                 {
@@ -13339,7 +13608,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-05-26T17:30:55+00:00"
+            "time": "2022-05-20T08:49:14+00:00"
         },
         {
             "name": "symfony/finder",
@@ -13403,6 +13672,152 @@
             ],
             "time": "2022-07-29T07:35:46+00:00"
         },
+        {
+            "name": "symfony/framework-bundle",
+            "version": "v4.4.45",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/framework-bundle.git",
+                "reference": "bd7d15b5412d6414036cc5fd6c562202ceac9daf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/bd7d15b5412d6414036cc5fd6c562202ceac9daf",
+                "reference": "bd7d15b5412d6414036cc5fd6c562202ceac9daf",
+                "shasum": ""
+            },
+            "require": {
+                "ext-xml": "*",
+                "php": ">=7.1.3",
+                "symfony/cache": "^4.4|^5.0",
+                "symfony/config": "^4.4.11|~5.0.11|^5.1.3",
+                "symfony/dependency-injection": "^4.4.38|^5.0.1",
+                "symfony/error-handler": "^4.4.1|^5.0.1",
+                "symfony/filesystem": "^3.4|^4.0|^5.0",
+                "symfony/finder": "^3.4|^4.0|^5.0",
+                "symfony/http-foundation": "^4.4|^5.0",
+                "symfony/http-kernel": "^4.4",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/routing": "^4.4.12|^5.1.4"
+            },
+            "conflict": {
+                "doctrine/persistence": "<1.3",
+                "phpdocumentor/reflection-docblock": "<3.0|>=3.2.0,<3.2.2",
+                "phpdocumentor/type-resolver": "<0.3.0|1.3.*",
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+                "symfony/asset": "<3.4",
+                "symfony/browser-kit": "<4.3",
+                "symfony/console": "<4.4.21",
+                "symfony/dom-crawler": "<4.3",
+                "symfony/dotenv": "<4.3.6",
+                "symfony/form": "<4.3.5",
+                "symfony/http-client": "<4.4",
+                "symfony/lock": "<4.4",
+                "symfony/mailer": "<4.4",
+                "symfony/messenger": "<4.4",
+                "symfony/mime": "<4.4",
+                "symfony/property-info": "<3.4",
+                "symfony/security-bundle": "<4.4",
+                "symfony/serializer": "<4.4",
+                "symfony/stopwatch": "<3.4",
+                "symfony/translation": "<4.4",
+                "symfony/twig-bridge": "<4.1.1",
+                "symfony/twig-bundle": "<4.4",
+                "symfony/validator": "<4.4",
+                "symfony/web-profiler-bundle": "<4.4",
+                "symfony/workflow": "<4.3.6"
+            },
+            "require-dev": {
+                "doctrine/annotations": "^1.10.4",
+                "doctrine/cache": "^1.0|^2.0",
+                "doctrine/persistence": "^1.3|^2|^3",
+                "paragonie/sodium_compat": "^1.8",
+                "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+                "symfony/asset": "^3.4|^4.0|^5.0",
+                "symfony/browser-kit": "^4.3|^5.0",
+                "symfony/console": "^4.4.42|^5.4.9",
+                "symfony/css-selector": "^3.4|^4.0|^5.0",
+                "symfony/dom-crawler": "^4.4.30|^5.3.7",
+                "symfony/dotenv": "^4.3.6|^5.0",
+                "symfony/expression-language": "^3.4|^4.0|^5.0",
+                "symfony/form": "^4.3.5|^5.0",
+                "symfony/http-client": "^4.4|^5.0",
+                "symfony/lock": "^4.4|^5.0",
+                "symfony/mailer": "^4.4|^5.0",
+                "symfony/messenger": "^4.4|^5.0",
+                "symfony/mime": "^4.4|^5.0",
+                "symfony/polyfill-intl-icu": "~1.0",
+                "symfony/process": "^3.4|^4.0|^5.0",
+                "symfony/property-info": "^3.4|^4.0|^5.0",
+                "symfony/security-core": "^3.4|^4.4|^5.2",
+                "symfony/security-csrf": "^3.4|^4.0|^5.0",
+                "symfony/security-http": "^3.4|^4.0|^5.0",
+                "symfony/serializer": "^4.4|^5.0",
+                "symfony/stopwatch": "^3.4|^4.0|^5.0",
+                "symfony/templating": "^3.4|^4.0|^5.0",
+                "symfony/translation": "^4.4|^5.0",
+                "symfony/twig-bundle": "^4.4|^5.0",
+                "symfony/validator": "^4.4|^5.0",
+                "symfony/web-link": "^4.4|^5.0",
+                "symfony/workflow": "^4.3.6|^5.0",
+                "symfony/yaml": "^3.4|^4.0|^5.0",
+                "twig/twig": "^1.43|^2.13|^3.0.4"
+            },
+            "suggest": {
+                "ext-apcu": "For best performance of the system caches",
+                "symfony/console": "For using the console commands",
+                "symfony/form": "For using forms",
+                "symfony/property-info": "For using the property_info service",
+                "symfony/serializer": "For using the serializer service",
+                "symfony/validator": "For using validation",
+                "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering",
+                "symfony/yaml": "For using the debug:config and lint:yaml commands"
+            },
+            "type": "symfony-bundle",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bundle\\FrameworkBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/framework-bundle/tree/v4.4.45"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-08-26T05:59:54+00:00"
+        },
         {
             "name": "symfony/http-client-contracts",
             "version": "v2.5.2",
@@ -15250,6 +15665,79 @@
             ],
             "time": "2022-07-20T13:00:38+00:00"
         },
+        {
+            "name": "symfony/var-exporter",
+            "version": "v5.4.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-exporter.git",
+                "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8fc03ee75eeece3d9be1ef47d26d79bea1afb340",
+                "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "require-dev": {
+                "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\VarExporter\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Allows exporting any serializable PHP data structure to plain PHP code",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "clone",
+                "construct",
+                "export",
+                "hydrate",
+                "instantiate",
+                "serialize"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/var-exporter/tree/v5.4.10"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-27T12:56:18+00:00"
+        },
         {
             "name": "symfony/yaml",
             "version": "v4.4.45",
@@ -15562,29 +16050,33 @@
         },
         {
             "name": "webmozart/assert",
-            "version": "1.5.0",
+            "version": "1.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/webmozarts/assert.git",
-                "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4"
+                "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/webmozarts/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4",
-                "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4",
+                "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+                "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.3.3 || ^7.0",
-                "symfony/polyfill-ctype": "^1.8"
+                "ext-ctype": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "conflict": {
+                "phpstan/phpstan": "<0.12.20",
+                "vimeo/psalm": "<4.6.1 || 4.6.2"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+                "phpunit/phpunit": "^8.5.13"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.3-dev"
+                    "dev-master": "1.10-dev"
                 }
             },
             "autoload": {
@@ -15610,9 +16102,9 @@
             ],
             "support": {
                 "issues": "https://github.com/webmozarts/assert/issues",
-                "source": "https://github.com/webmozarts/assert/tree/1.5.0"
+                "source": "https://github.com/webmozarts/assert/tree/1.11.0"
             },
-            "time": "2019-08-24T08:43:50+00:00"
+            "time": "2022-06-03T18:03:27+00:00"
         },
         {
             "name": "webmozart/path-util",
diff --git a/vendor/bin/export-plural-rules b/vendor/bin/export-plural-rules
index ac8f5c1da506ade9877597c11cef48e7765e42bb..c57177981966c167f3caa6dac3a3aac41416bbae 100755
--- a/vendor/bin/export-plural-rules
+++ b/vendor/bin/export-plural-rules
@@ -5,6 +5,7 @@
  * Proxy PHP file generated by Composer
  *
  * This file includes the referenced bin path (../gettext/languages/bin/export-plural-rules)
+ * using a stream wrapper to prevent the shebang from being output on PHP<8
  *
  * @generated
  */
@@ -14,5 +15,106 @@ namespace Composer;
 $GLOBALS['_composer_bin_dir'] = __DIR__;
 $GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
 
+if (PHP_VERSION_ID < 80000) {
+    if (!class_exists('Composer\BinProxyWrapper')) {
+        /**
+         * @internal
+         */
+        final class BinProxyWrapper
+        {
+            private $handle;
+            private $position;
+            private $realpath;
+
+            public function stream_open($path, $mode, $options, &$opened_path)
+            {
+                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
+                $opened_path = substr($path, 17);
+                $this->realpath = realpath($opened_path) ?: $opened_path;
+                $opened_path = $this->realpath;
+                $this->handle = fopen($this->realpath, $mode);
+                $this->position = 0;
+
+                return (bool) $this->handle;
+            }
+
+            public function stream_read($count)
+            {
+                $data = fread($this->handle, $count);
+
+                if ($this->position === 0) {
+                    $data = preg_replace('{^#!.*\r?\n}', '', $data);
+                }
+
+                $this->position += strlen($data);
+
+                return $data;
+            }
+
+            public function stream_cast($castAs)
+            {
+                return $this->handle;
+            }
+
+            public function stream_close()
+            {
+                fclose($this->handle);
+            }
+
+            public function stream_lock($operation)
+            {
+                return $operation ? flock($this->handle, $operation) : true;
+            }
+
+            public function stream_seek($offset, $whence)
+            {
+                if (0 === fseek($this->handle, $offset, $whence)) {
+                    $this->position = ftell($this->handle);
+                    return true;
+                }
+
+                return false;
+            }
+
+            public function stream_tell()
+            {
+                return $this->position;
+            }
+
+            public function stream_eof()
+            {
+                return feof($this->handle);
+            }
+
+            public function stream_stat()
+            {
+                return array();
+            }
+
+            public function stream_set_option($option, $arg1, $arg2)
+            {
+                return true;
+            }
+
+            public function url_stat($path, $flags)
+            {
+                $path = substr($path, 17);
+                if (file_exists($path)) {
+                    return stat($path);
+                }
+
+                return false;
+            }
+        }
+    }
+
+    if (
+        (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
+        || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
+    ) {
+        include("phpvfscomposer://" . __DIR__ . '/..'.'/gettext/languages/bin/export-plural-rules');
+        exit(0);
+    }
+}
 
 include __DIR__ . '/..'.'/gettext/languages/bin/export-plural-rules';
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 3fcd148c4cf86e8ce46733f01d39d75812e18127..d7a76e436e1ee4ff21fe33daa1695f41dd054bf2 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -601,6 +601,7 @@
     'Doctrine\\Common\\Collections\\Expr\\ExpressionVisitor' => $vendorDir . '/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php',
     'Doctrine\\Common\\Collections\\Expr\\Value' => $vendorDir . '/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Value.php',
     'Doctrine\\Common\\Collections\\ExpressionBuilder' => $vendorDir . '/doctrine/collections/lib/Doctrine/Common/Collections/ExpressionBuilder.php',
+    'Doctrine\\Common\\Collections\\ReadableCollection' => $vendorDir . '/doctrine/collections/lib/Doctrine/Common/Collections/ReadableCollection.php',
     'Doctrine\\Common\\Collections\\Selectable' => $vendorDir . '/doctrine/collections/lib/Doctrine/Common/Collections/Selectable.php',
     'Doctrine\\Common\\Lexer\\AbstractLexer' => $vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php',
     'Doctrine\\Common\\Reflection\\ClassFinderInterface' => $vendorDir . '/doctrine/reflection/lib/Doctrine/Common/Reflection/ClassFinderInterface.php',
@@ -3162,6 +3163,7 @@
     'Gettext\\Languages\\Exporter\\Php' => $vendorDir . '/gettext/languages/src/Exporter/Php.php',
     'Gettext\\Languages\\Exporter\\Po' => $vendorDir . '/gettext/languages/src/Exporter/Po.php',
     'Gettext\\Languages\\Exporter\\Prettyjson' => $vendorDir . '/gettext/languages/src/Exporter/Prettyjson.php',
+    'Gettext\\Languages\\Exporter\\Ruby' => $vendorDir . '/gettext/languages/src/Exporter/Ruby.php',
     'Gettext\\Languages\\Exporter\\Xml' => $vendorDir . '/gettext/languages/src/Exporter/Xml.php',
     'Gettext\\Languages\\FormulaConverter' => $vendorDir . '/gettext/languages/src/FormulaConverter.php',
     'Gettext\\Languages\\Language' => $vendorDir . '/gettext/languages/src/Language.php',
@@ -3556,6 +3558,7 @@
     'PEAR_Exception' => $vendorDir . '/pear/pear_exception/PEAR/Exception.php',
     'PHPMailer\\PHPMailer\\Exception' => $vendorDir . '/phpmailer/phpmailer/src/Exception.php',
     'PHPMailer\\PHPMailer\\OAuth' => $vendorDir . '/phpmailer/phpmailer/src/OAuth.php',
+    'PHPMailer\\PHPMailer\\OAuthTokenProvider' => $vendorDir . '/phpmailer/phpmailer/src/OAuthTokenProvider.php',
     'PHPMailer\\PHPMailer\\PHPMailer' => $vendorDir . '/phpmailer/phpmailer/src/PHPMailer.php',
     'PHPMailer\\PHPMailer\\POP3' => $vendorDir . '/phpmailer/phpmailer/src/POP3.php',
     'PHPMailer\\PHPMailer\\SMTP' => $vendorDir . '/phpmailer/phpmailer/src/SMTP.php',
@@ -4231,6 +4234,27 @@
     'SAML2\\DOMDocumentFactory' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/DOMDocumentFactory.php',
     'SAML2\\EncryptedAssertion' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/EncryptedAssertion.php',
     'SAML2\\Exception\\InvalidArgumentException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/InvalidArgumentException.php',
+    'SAML2\\Exception\\MetadataExpiredException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/MetadataExpiredException.php',
+    'SAML2\\Exception\\ProtocolViolationException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/ProtocolViolationException.php',
+    'SAML2\\Exception\\Protocol\\AuthnFailedException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/AuthnFailedException.php',
+    'SAML2\\Exception\\Protocol\\InvalidAttrNameOrValueException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/InvalidAttrNameOrValueException.php',
+    'SAML2\\Exception\\Protocol\\InvalidNameIDPolicyException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/InvalidNameIDPolicyException.php',
+    'SAML2\\Exception\\Protocol\\NoAuthnContextException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoAuthnContextException.php',
+    'SAML2\\Exception\\Protocol\\NoAvailableIDPException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoAvailableIDPException.php',
+    'SAML2\\Exception\\Protocol\\NoPassiveException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoPassiveException.php',
+    'SAML2\\Exception\\Protocol\\NoSupportedIDPException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoSupportedIDPException.php',
+    'SAML2\\Exception\\Protocol\\PartialLogoutException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/PartialLogoutException.php',
+    'SAML2\\Exception\\Protocol\\ProxyCountExceededException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/ProxyCountExceededException.php',
+    'SAML2\\Exception\\Protocol\\RequestDeniedException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestDeniedException.php',
+    'SAML2\\Exception\\Protocol\\RequestUnsupportedException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestUnsupportedException.php',
+    'SAML2\\Exception\\Protocol\\RequestVersionDeprecatedException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionDeprecatedException.php',
+    'SAML2\\Exception\\Protocol\\RequestVersionTooHighException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionTooHighException.php',
+    'SAML2\\Exception\\Protocol\\RequestVersionTooLowException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionTooLowException.php',
+    'SAML2\\Exception\\Protocol\\ResourceNotRecognizedException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/ResourceNotRecognizedException.php',
+    'SAML2\\Exception\\Protocol\\TooManyResponsesException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/TooManyResponsesException.php',
+    'SAML2\\Exception\\Protocol\\UnknownAttrProfileException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnknownAttrProfileException.php',
+    'SAML2\\Exception\\Protocol\\UnknownPrincipalException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnknownPrincipalException.php',
+    'SAML2\\Exception\\Protocol\\UnsupportedBindingException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnsupportedBindingException.php',
     'SAML2\\Exception\\RuntimeException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/RuntimeException.php',
     'SAML2\\Exception\\Throwable' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/Throwable.php',
     'SAML2\\Exception\\UnparseableXmlException' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/Exception/UnparseableXmlException.php',
@@ -4323,6 +4347,8 @@
     'SAML2\\XML\\samlp\\Extensions' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/XML/samlp/Extensions.php',
     'SAML2\\XML\\shibmd\\Scope' => $vendorDir . '/simplesamlphp/saml2/src/SAML2/XML/shibmd/Scope.php',
     'SelfUpdate\\SelfUpdateCommand' => $vendorDir . '/consolidation/self-update/src/SelfUpdateCommand.php',
+    'SimpleSAML\\Assert\\Assert' => $vendorDir . '/simplesamlphp/assert/src/Assert.php',
+    'SimpleSAML\\Assert\\AssertionFailedException' => $vendorDir . '/simplesamlphp/assert/src/AssertionFailedException.php',
     'SimpleSAML\\Auth\\AuthenticationFactory' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/AuthenticationFactory.php',
     'SimpleSAML\\Auth\\DefaultAuth' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/DefaultAuth.php',
     'SimpleSAML\\Auth\\ProcessingChain' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/ProcessingChain.php',
@@ -4334,7 +4360,9 @@
     'SimpleSAML\\Auth\\TimeLimitedToken' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/TimeLimitedToken.php',
     'SimpleSAML\\Bindings\\Shib13\\Artifact' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/Artifact.php',
     'SimpleSAML\\Bindings\\Shib13\\HTTPPost' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php',
+    'SimpleSAML\\Command\\RouterDebugCommand' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Command/RouterDebugCommand.php',
     'SimpleSAML\\Configuration' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Configuration.php',
+    'SimpleSAML\\Console\\Application' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Console/Application.php',
     'SimpleSAML\\Database' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Database.php',
     'SimpleSAML\\Error\\Assertion' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Assertion.php',
     'SimpleSAML\\Error\\AuthSource' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/AuthSource.php',
@@ -4356,12 +4384,12 @@
     'SimpleSAML\\Error\\User' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/User.php',
     'SimpleSAML\\Error\\UserAborted' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserAborted.php',
     'SimpleSAML\\Error\\UserNotFound' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserNotFound.php',
-    'SimpleSAML\\HTTP\\Router' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/Router.php',
     'SimpleSAML\\HTTP\\RunnableResponse' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/RunnableResponse.php',
     'SimpleSAML\\IdP' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP.php',
     'SimpleSAML\\IdP\\IFrameLogoutHandler' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/IFrameLogoutHandler.php',
     'SimpleSAML\\IdP\\LogoutHandlerInterface' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/LogoutHandlerInterface.php',
     'SimpleSAML\\IdP\\TraditionalLogoutHandler' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/TraditionalLogoutHandler.php',
+    'SimpleSAML\\Kernel' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Kernel.php',
     'SimpleSAML\\Locale\\Language' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Language.php',
     'SimpleSAML\\Locale\\Localization' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Localization.php',
     'SimpleSAML\\Locale\\Translate' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Translate.php',
@@ -4383,8 +4411,6 @@
     'SimpleSAML\\Metadata\\Signer' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Signer.php',
     'SimpleSAML\\Metadata\\Sources\\MDQ' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Sources/MDQ.php',
     'SimpleSAML\\Module' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module.php',
-    'SimpleSAML\\Module\\ControllerResolver' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module/ControllerResolver.php',
-    'SimpleSAML\\Module\\adfs\\AdfsController' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/adfs/lib/AdfsController.php',
     'SimpleSAML\\Module\\adfs\\IdP\\ADFS' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/adfs/lib/IdP/ADFS.php',
     'SimpleSAML\\Module\\adfs\\SAML2\\XML\\fed\\Constants' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Constants.php',
     'SimpleSAML\\Module\\adfs\\SAML2\\XML\\fed\\Endpoint' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Endpoint.php',
@@ -4395,12 +4421,8 @@
     'SimpleSAML\\Module\\authX509\\Controller\\ExpiryWarning' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/authX509/lib/Controller/ExpiryWarning.php',
     'SimpleSAML\\Module\\authcrypt\\Auth\\Source\\Hash' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/authcrypt/lib/Auth/Source/Hash.php',
     'SimpleSAML\\Module\\authcrypt\\Auth\\Source\\Htpasswd' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/authcrypt/lib/Auth/Source/Htpasswd.php',
-    'SimpleSAML\\Module\\authfacebook\\Auth\\Source\\Facebook' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/authfacebook/lib/Auth/Source/Facebook.php',
-    'SimpleSAML\\Module\\authfacebook\\Facebook' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/authfacebook/lib/Facebook.php',
     'SimpleSAML\\Module\\authorize\\Auth\\Process\\Authorize' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/authorize/lib/Auth/Process/Authorize.php',
     'SimpleSAML\\Module\\authtwitter\\Auth\\Source\\Twitter' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/authtwitter/lib/Auth/Source/Twitter.php',
-    'SimpleSAML\\Module\\authwindowslive\\Auth\\Source\\LiveID' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/authwindowslive/lib/Auth/Source/LiveID.php',
-    'SimpleSAML\\Module\\cas\\Auth\\Source\\CAS' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/cas/lib/Auth/Source/CAS.php',
     'SimpleSAML\\Module\\cdc\\Client' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/cdc/lib/Client.php',
     'SimpleSAML\\Module\\cdc\\Server' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/cdc/lib/Server.php',
     'SimpleSAML\\Module\\consent\\Auth\\Process\\Consent' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/consent/lib/Auth/Process/Consent.php',
@@ -4419,27 +4441,15 @@
     'SimpleSAML\\Module\\metarefresh\\ARP' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/metarefresh/lib/ARP.php',
     'SimpleSAML\\Module\\metarefresh\\MetaLoader' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/metarefresh/lib/MetaLoader.php',
     'SimpleSAML\\Module\\negotiate\\Auth\\Source\\Negotiate' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/negotiate/lib/Auth/Source/Negotiate.php',
+    'SimpleSAML\\Module\\oauth\\Consumer' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/oauth/lib/Consumer.php',
+    'SimpleSAML\\Module\\oauth\\OAuthServer' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/oauth/lib/OAuthServer.php',
+    'SimpleSAML\\Module\\oauth\\OAuthStore' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/oauth/lib/OAuthStore.php',
+    'SimpleSAML\\Module\\oauth\\Registry' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/oauth/lib/Registry.php',
     'SimpleSAML\\Module\\preprodwarning\\Auth\\Process\\Warning' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/preprodwarning/lib/Auth/Process/Warning.php',
+    'SimpleSAML\\Module\\preprodwarning\\Controller\\PreProdWarning' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/preprodwarning/lib/Controller/PreProdWarning.php',
     'SimpleSAML\\Module\\radius\\Auth\\Source\\Radius' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/radius/lib/Auth/Source/Radius.php',
-    'SimpleSAML\\Module\\riak\\Store\\Riak' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/riak/lib/Store/Riak.php',
     'SimpleSAML\\Module\\smartattributes\\Auth\\Process\\SmartID' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/smartattributes/lib/Auth/Process/SmartID.php',
     'SimpleSAML\\Module\\smartattributes\\Auth\\Process\\SmartName' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/smartattributes/lib/Auth/Process/SmartName.php',
-    'SimpleSAML\\Module\\sqlauth\\Auth\\Source\\SQL' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php',
-    'SimpleSAML\\Module\\statistics\\AccessCheck' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/AccessCheck.php',
-    'SimpleSAML\\Module\\statistics\\Aggregator' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Aggregator.php',
-    'SimpleSAML\\Module\\statistics\\DateHandler' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandler.php',
-    'SimpleSAML\\Module\\statistics\\DateHandlerMonth' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandlerMonth.php',
-    'SimpleSAML\\Module\\statistics\\Graph\\GoogleCharts' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Graph/GoogleCharts.php',
-    'SimpleSAML\\Module\\statistics\\LogCleaner' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/LogCleaner.php',
-    'SimpleSAML\\Module\\statistics\\LogParser' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/LogParser.php',
-    'SimpleSAML\\Module\\statistics\\RatioDataset' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/RatioDataset.php',
-    'SimpleSAML\\Module\\statistics\\Ruleset' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Ruleset.php',
-    'SimpleSAML\\Module\\statistics\\StatDataset' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/StatDataset.php',
-    'SimpleSAML\\Module\\statistics\\StatisticsController' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/StatisticsController.php',
-    'SimpleSAML\\Module\\statistics\\Statistics\\FieldPresentation\\Base' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/FieldPresentation/Base.php',
-    'SimpleSAML\\Module\\statistics\\Statistics\\FieldPresentation\\Entity' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/FieldPresentation/Entity.php',
-    'SimpleSAML\\Module\\statistics\\Statistics\\Rulesets\\BaseRule' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/Rulesets/BaseRule.php',
-    'SimpleSAML\\Module\\statistics\\Statistics\\Rulesets\\Ratio' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/Rulesets/Ratio.php',
     'SimpleSAML\\Session' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Session.php',
     'SimpleSAML\\SessionHandler' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandler.php',
     'SimpleSAML\\SessionHandlerCookie' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerCookie.php',
@@ -4502,6 +4512,125 @@
     'Symfony\\Bridge\\PsrHttpMessage\\Factory\\UploadedFile' => $vendorDir . '/symfony/psr-http-message-bridge/Factory/UploadedFile.php',
     'Symfony\\Bridge\\PsrHttpMessage\\HttpFoundationFactoryInterface' => $vendorDir . '/symfony/psr-http-message-bridge/HttpFoundationFactoryInterface.php',
     'Symfony\\Bridge\\PsrHttpMessage\\HttpMessageFactoryInterface' => $vendorDir . '/symfony/psr-http-message-bridge/HttpMessageFactoryInterface.php',
+    'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AbstractPhpFileCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php',
+    'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AnnotationsCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php',
+    'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\RouterCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php',
+    'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\SerializerCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php',
+    'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplateFinder' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/TemplateFinder.php',
+    'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplateFinderInterface' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/TemplateFinderInterface.php',
+    'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplatePathsCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/TemplatePathsCacheWarmer.php',
+    'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TranslationsCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.php',
+    'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ValidatorCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Client' => $vendorDir . '/symfony/framework-bundle/Client.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\AboutCommand' => $vendorDir . '/symfony/framework-bundle/Command/AboutCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\AbstractConfigCommand' => $vendorDir . '/symfony/framework-bundle/Command/AbstractConfigCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\AssetsInstallCommand' => $vendorDir . '/symfony/framework-bundle/Command/AssetsInstallCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\CacheClearCommand' => $vendorDir . '/symfony/framework-bundle/Command/CacheClearCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolClearCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolClearCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolDeleteCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolDeleteCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolListCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolListCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolPruneCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolPruneCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\CacheWarmupCommand' => $vendorDir . '/symfony/framework-bundle/Command/CacheWarmupCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/ConfigDebugCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDumpReferenceCommand' => $vendorDir . '/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerAwareCommand' => $vendorDir . '/symfony/framework-bundle/Command/ContainerAwareCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/ContainerDebugCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerLintCommand' => $vendorDir . '/symfony/framework-bundle/Command/ContainerLintCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\DebugAutowiringCommand' => $vendorDir . '/symfony/framework-bundle/Command/DebugAutowiringCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\EventDispatcherDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/EventDispatcherDebugCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\RouterDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/RouterDebugCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\RouterMatchCommand' => $vendorDir . '/symfony/framework-bundle/Command/RouterMatchCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsDecryptToLocalCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsEncryptFromLocalCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsGenerateKeysCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsListCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsListCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsRemoveCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsRemoveCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsSetCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsSetCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/TranslationDebugCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationUpdateCommand' => $vendorDir . '/symfony/framework-bundle/Command/TranslationUpdateCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\WorkflowDumpCommand' => $vendorDir . '/symfony/framework-bundle/Command/WorkflowDumpCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\XliffLintCommand' => $vendorDir . '/symfony/framework-bundle/Command/XliffLintCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Command\\YamlLintCommand' => $vendorDir . '/symfony/framework-bundle/Command/YamlLintCommand.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Console\\Application' => $vendorDir . '/symfony/framework-bundle/Console/Application.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/Descriptor.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/JsonDescriptor.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/MarkdownDescriptor.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/TextDescriptor.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/framework-bundle/Console/Helper/DescriptorHelper.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController' => $vendorDir . '/symfony/framework-bundle/Controller/AbstractController.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller' => $vendorDir . '/symfony/framework-bundle/Controller/Controller.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerNameParser' => $vendorDir . '/symfony/framework-bundle/Controller/ControllerNameParser.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver' => $vendorDir . '/symfony/framework-bundle/Controller/ControllerResolver.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerTrait' => $vendorDir . '/symfony/framework-bundle/Controller/ControllerTrait.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController' => $vendorDir . '/symfony/framework-bundle/Controller/RedirectController.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController' => $vendorDir . '/symfony/framework-bundle/Controller/TemplateController.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RequestDataCollector' => $vendorDir . '/symfony/framework-bundle/DataCollector/RequestDataCollector.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RouterDataCollector' => $vendorDir . '/symfony/framework-bundle/DataCollector/RouterDataCollector.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\CompatibilityServiceSubscriberInterface' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/CompatibilityServiceSubscriberInterface.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddAnnotationsCachedReaderPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddDebugLogProcessorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddExpressionLanguageProvidersPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CacheCollectorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/CacheCollectorPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolClearerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolClearerPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolPrunerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPrunerPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ContainerBuilderDebugDumpPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\DataCollectorTranslatorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\LoggingTranslatorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ProfilerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\SessionPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/SessionPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TemplatingPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TemplatingPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerRealRefPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerWeakRefPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\UnusedTagsPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\WorkflowGuardListenerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Configuration' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Configuration.php',
+    'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\FrameworkExtension' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php',
+    'Symfony\\Bundle\\FrameworkBundle\\EventListener\\ResolveControllerNameSubscriber' => $vendorDir . '/symfony/framework-bundle/EventListener/ResolveControllerNameSubscriber.php',
+    'Symfony\\Bundle\\FrameworkBundle\\EventListener\\SuggestMissingPackageSubscriber' => $vendorDir . '/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.php',
+    'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle' => $vendorDir . '/symfony/framework-bundle/FrameworkBundle.php',
+    'Symfony\\Bundle\\FrameworkBundle\\HttpCache\\HttpCache' => $vendorDir . '/symfony/framework-bundle/HttpCache/HttpCache.php',
+    'Symfony\\Bundle\\FrameworkBundle\\KernelBrowser' => $vendorDir . '/symfony/framework-bundle/KernelBrowser.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait' => $vendorDir . '/symfony/framework-bundle/Kernel/MicroKernelTrait.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Routing\\AnnotatedRouteControllerLoader' => $vendorDir . '/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Routing\\DelegatingLoader' => $vendorDir . '/symfony/framework-bundle/Routing/DelegatingLoader.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Routing\\LegacyRouteLoaderContainer' => $vendorDir . '/symfony/framework-bundle/Routing/LegacyRouteLoaderContainer.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableCompiledUrlMatcher' => $vendorDir . '/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableUrlMatcher' => $vendorDir . '/symfony/framework-bundle/Routing/RedirectableUrlMatcher.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Routing\\RouteLoaderInterface' => $vendorDir . '/symfony/framework-bundle/Routing/RouteLoaderInterface.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Routing\\Router' => $vendorDir . '/symfony/framework-bundle/Routing/Router.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Secrets\\AbstractVault' => $vendorDir . '/symfony/framework-bundle/Secrets/AbstractVault.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Secrets\\DotenvVault' => $vendorDir . '/symfony/framework-bundle/Secrets/DotenvVault.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Secrets\\SodiumVault' => $vendorDir . '/symfony/framework-bundle/Secrets/SodiumVault.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\DelegatingEngine' => $vendorDir . '/symfony/framework-bundle/Templating/DelegatingEngine.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\EngineInterface' => $vendorDir . '/symfony/framework-bundle/Templating/EngineInterface.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\GlobalVariables' => $vendorDir . '/symfony/framework-bundle/Templating/GlobalVariables.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\ActionsHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/ActionsHelper.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\AssetsHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/AssetsHelper.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\CodeHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/CodeHelper.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\FormHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/FormHelper.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\RequestHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/RequestHelper.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\RouterHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/RouterHelper.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\SessionHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/SessionHelper.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\StopwatchHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/StopwatchHelper.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\TranslatorHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/TranslatorHelper.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Loader\\FilesystemLoader' => $vendorDir . '/symfony/framework-bundle/Templating/Loader/FilesystemLoader.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\Loader\\TemplateLocator' => $vendorDir . '/symfony/framework-bundle/Templating/Loader/TemplateLocator.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\PhpEngine' => $vendorDir . '/symfony/framework-bundle/Templating/PhpEngine.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateFilenameParser' => $vendorDir . '/symfony/framework-bundle/Templating/TemplateFilenameParser.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateNameParser' => $vendorDir . '/symfony/framework-bundle/Templating/TemplateNameParser.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateReference' => $vendorDir . '/symfony/framework-bundle/Templating/TemplateReference.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Templating\\TimedPhpEngine' => $vendorDir . '/symfony/framework-bundle/Templating/TimedPhpEngine.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Test\\BrowserKitAssertionsTrait' => $vendorDir . '/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Test\\DomCrawlerAssertionsTrait' => $vendorDir . '/symfony/framework-bundle/Test/DomCrawlerAssertionsTrait.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Test\\ForwardCompatTestTrait' => $vendorDir . '/symfony/framework-bundle/Test/ForwardCompatTestTrait.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Test\\KernelTestCase' => $vendorDir . '/symfony/framework-bundle/Test/KernelTestCase.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Test\\MailerAssertionsTrait' => $vendorDir . '/symfony/framework-bundle/Test/MailerAssertionsTrait.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Test\\TestContainer' => $vendorDir . '/symfony/framework-bundle/Test/TestContainer.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestAssertionsTrait' => $vendorDir . '/symfony/framework-bundle/Test/WebTestAssertionsTrait.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestCase' => $vendorDir . '/symfony/framework-bundle/Test/WebTestCase.php',
+    'Symfony\\Bundle\\FrameworkBundle\\Translation\\Translator' => $vendorDir . '/symfony/framework-bundle/Translation/Translator.php',
     'Symfony\\Cmf\\Component\\Routing\\Candidates\\Candidates' => $vendorDir . '/symfony-cmf/routing/src/Candidates/Candidates.php',
     'Symfony\\Cmf\\Component\\Routing\\Candidates\\CandidatesInterface' => $vendorDir . '/symfony-cmf/routing/src/Candidates/CandidatesInterface.php',
     'Symfony\\Cmf\\Component\\Routing\\ChainRouteCollection' => $vendorDir . '/symfony-cmf/routing/src/ChainRouteCollection.php',
@@ -4537,6 +4666,63 @@
     'Symfony\\Cmf\\Component\\Routing\\RouteReferrersInterface' => $vendorDir . '/symfony-cmf/routing/src/RouteReferrersInterface.php',
     'Symfony\\Cmf\\Component\\Routing\\RouteReferrersReadInterface' => $vendorDir . '/symfony-cmf/routing/src/RouteReferrersReadInterface.php',
     'Symfony\\Cmf\\Component\\Routing\\VersatileGeneratorInterface' => $vendorDir . '/symfony-cmf/routing/src/VersatileGeneratorInterface.php',
+    'Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => $vendorDir . '/symfony/cache/Adapter/AdapterInterface.php',
+    'Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => $vendorDir . '/symfony/cache/Adapter/ApcuAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/ArrayAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => $vendorDir . '/symfony/cache/Adapter/ChainAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineDbalAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => $vendorDir . '/symfony/cache/Adapter/MemcachedAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\NullAdapter' => $vendorDir . '/symfony/cache/Adapter/NullAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer' => $vendorDir . '/symfony/cache/Adapter/ParameterNormalizer.php',
+    'Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => $vendorDir . '/symfony/cache/Adapter/PdoAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpArrayAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpFilesAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => $vendorDir . '/symfony/cache/Adapter/ProxyAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\Psr16Adapter' => $vendorDir . '/symfony/cache/Adapter/Psr16Adapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\RedisTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisTagAwareAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapterInterface.php',
+    'Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php',
+    'Symfony\\Component\\Cache\\CacheItem' => $vendorDir . '/symfony/cache/CacheItem.php',
+    'Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => $vendorDir . '/symfony/cache/DataCollector/CacheDataCollector.php',
+    'Symfony\\Component\\Cache\\DependencyInjection\\CacheCollectorPass' => $vendorDir . '/symfony/cache/DependencyInjection/CacheCollectorPass.php',
+    'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php',
+    'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPass.php',
+    'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php',
+    'Symfony\\Component\\Cache\\DoctrineProvider' => $vendorDir . '/symfony/cache/DoctrineProvider.php',
+    'Symfony\\Component\\Cache\\Exception\\CacheException' => $vendorDir . '/symfony/cache/Exception/CacheException.php',
+    'Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/cache/Exception/InvalidArgumentException.php',
+    'Symfony\\Component\\Cache\\Exception\\LogicException' => $vendorDir . '/symfony/cache/Exception/LogicException.php',
+    'Symfony\\Component\\Cache\\LockRegistry' => $vendorDir . '/symfony/cache/LockRegistry.php',
+    'Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller' => $vendorDir . '/symfony/cache/Marshaller/DefaultMarshaller.php',
+    'Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller' => $vendorDir . '/symfony/cache/Marshaller/DeflateMarshaller.php',
+    'Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface' => $vendorDir . '/symfony/cache/Marshaller/MarshallerInterface.php',
+    'Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller' => $vendorDir . '/symfony/cache/Marshaller/SodiumMarshaller.php',
+    'Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller' => $vendorDir . '/symfony/cache/Marshaller/TagAwareMarshaller.php',
+    'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationDispatcher.php',
+    'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationHandler' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationHandler.php',
+    'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationMessage.php',
+    'Symfony\\Component\\Cache\\PruneableInterface' => $vendorDir . '/symfony/cache/PruneableInterface.php',
+    'Symfony\\Component\\Cache\\Psr16Cache' => $vendorDir . '/symfony/cache/Psr16Cache.php',
+    'Symfony\\Component\\Cache\\ResettableInterface' => $vendorDir . '/symfony/cache/ResettableInterface.php',
+    'Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait' => $vendorDir . '/symfony/cache/Traits/AbstractAdapterTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\ContractsTrait' => $vendorDir . '/symfony/cache/Traits/ContractsTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemCommonTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\ProxyTrait' => $vendorDir . '/symfony/cache/Traits/ProxyTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\RedisClusterNodeProxy' => $vendorDir . '/symfony/cache/Traits/RedisClusterNodeProxy.php',
+    'Symfony\\Component\\Cache\\Traits\\RedisClusterProxy' => $vendorDir . '/symfony/cache/Traits/RedisClusterProxy.php',
+    'Symfony\\Component\\Cache\\Traits\\RedisProxy' => $vendorDir . '/symfony/cache/Traits/RedisProxy.php',
+    'Symfony\\Component\\Cache\\Traits\\RedisTrait' => $vendorDir . '/symfony/cache/Traits/RedisTrait.php',
     'Symfony\\Component\\Config\\ConfigCache' => $vendorDir . '/symfony/config/ConfigCache.php',
     'Symfony\\Component\\Config\\ConfigCacheFactory' => $vendorDir . '/symfony/config/ConfigCacheFactory.php',
     'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => $vendorDir . '/symfony/config/ConfigCacheFactoryInterface.php',
@@ -5778,6 +5964,16 @@
     'Symfony\\Component\\VarDumper\\Server\\DumpServer' => $vendorDir . '/symfony/var-dumper/Server/DumpServer.php',
     'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => $vendorDir . '/symfony/var-dumper/Test/VarDumperTestTrait.php',
     'Symfony\\Component\\VarDumper\\VarDumper' => $vendorDir . '/symfony/var-dumper/VarDumper.php',
+    'Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException' => $vendorDir . '/symfony/var-exporter/Exception/ClassNotFoundException.php',
+    'Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/var-exporter/Exception/ExceptionInterface.php',
+    'Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException' => $vendorDir . '/symfony/var-exporter/Exception/NotInstantiableTypeException.php',
+    'Symfony\\Component\\VarExporter\\Instantiator' => $vendorDir . '/symfony/var-exporter/Instantiator.php',
+    'Symfony\\Component\\VarExporter\\Internal\\Exporter' => $vendorDir . '/symfony/var-exporter/Internal/Exporter.php',
+    'Symfony\\Component\\VarExporter\\Internal\\Hydrator' => $vendorDir . '/symfony/var-exporter/Internal/Hydrator.php',
+    'Symfony\\Component\\VarExporter\\Internal\\Reference' => $vendorDir . '/symfony/var-exporter/Internal/Reference.php',
+    'Symfony\\Component\\VarExporter\\Internal\\Registry' => $vendorDir . '/symfony/var-exporter/Internal/Registry.php',
+    'Symfony\\Component\\VarExporter\\Internal\\Values' => $vendorDir . '/symfony/var-exporter/Internal/Values.php',
+    'Symfony\\Component\\VarExporter\\VarExporter' => $vendorDir . '/symfony/var-exporter/VarExporter.php',
     'Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php',
     'Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php',
     'Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php',
@@ -5790,6 +5986,11 @@
     'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php',
     'Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php',
     'Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php',
+    'Symfony\\Contracts\\Cache\\CacheInterface' => $vendorDir . '/symfony/cache-contracts/CacheInterface.php',
+    'Symfony\\Contracts\\Cache\\CacheTrait' => $vendorDir . '/symfony/cache-contracts/CacheTrait.php',
+    'Symfony\\Contracts\\Cache\\CallbackInterface' => $vendorDir . '/symfony/cache-contracts/CallbackInterface.php',
+    'Symfony\\Contracts\\Cache\\ItemInterface' => $vendorDir . '/symfony/cache-contracts/ItemInterface.php',
+    'Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => $vendorDir . '/symfony/cache-contracts/TagAwareCacheInterface.php',
     'Symfony\\Contracts\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher-contracts/Event.php',
     'Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php',
     'Symfony\\Contracts\\HttpClient\\ChunkInterface' => $vendorDir . '/symfony/http-client-contracts/ChunkInterface.php',
@@ -6242,6 +6443,8 @@
     'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
     'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
     'Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php',
+    'Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php',
+    'Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php',
     'Webmozart\\PathUtil\\Path' => $vendorDir . '/webmozart/path-util/src/Path.php',
     'Webmozart\\PathUtil\\Url' => $vendorDir . '/webmozart/path-util/src/Url.php',
     'WhiteHat101\\Crypt\\APR1_MD5' => $vendorDir . '/whitehat101/apr1-md5/src/APR1_MD5.php',
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 9b2e655423b19e444c029d70e06424357d3c8551..a1912402d357b6c0980f59acfe0b6c65e093b45e 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -8,17 +8,18 @@
 return array(
     'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
     '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
-    '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
     '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
+    '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
+    '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
     'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
     'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
-    '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
     '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
     '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
     '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
     'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
     'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
     '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
+    '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php',
     '07d7f1a47144818725fd8d91a907ac57' => $vendorDir . '/laminas/laminas-diactoros/src/functions/create_uploaded_file.php',
     'da94ac5d3ca7d2dbab84ce561ce72bfd' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_headers_from_sapi.php',
     '3d97c8dcdfba8cb85d3b34f116bb248b' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_method_from_sapi.php',
@@ -38,7 +39,6 @@
     'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php',
     '2f69d3914119f042cca9e44442d5ce95' => $baseDir . '/web/core/includes/bootstrap.inc',
     '6db5533840cb1ae1bc049452845aa88e' => $baseDir . '/web/core/includes/guzzle_php81_shim.php',
-    '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php',
     '5abda994d126976858eb25d2546ee3c9' => $vendorDir . '/simplesamlphp/simplesamlphp/lib/_autoload_modules.php',
     '801c31d8ed748cfa537fa45402288c95' => $vendorDir . '/psy/psysh/src/functions.php',
     '952683d815ff0a7bf322b93c0be7e4e4' => $vendorDir . '/chi-teck/drupal-code-generator/src/bootstrap.php',
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 86356439ec77b0157d3c04140f04ef0d23e09f4c..4ce28a3d550eb12513968d04583624eeab6a4086 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -27,7 +27,9 @@
     'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'),
     'Symfony\\Contracts\\HttpClient\\' => array($vendorDir . '/symfony/http-client-contracts'),
     'Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'),
+    'Symfony\\Contracts\\Cache\\' => array($vendorDir . '/symfony/cache-contracts'),
     'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
+    'Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'),
     'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
     'Symfony\\Component\\Validator\\' => array($vendorDir . '/symfony/validator'),
     'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
@@ -47,10 +49,12 @@
     'Symfony\\Component\\CssSelector\\' => array($vendorDir . '/symfony/css-selector'),
     'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
     'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'),
+    'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
     'Symfony\\Cmf\\Component\\Routing\\' => array($vendorDir . '/symfony-cmf/routing/src'),
+    'Symfony\\Bundle\\FrameworkBundle\\' => array($vendorDir . '/symfony/framework-bundle'),
     'Symfony\\Bridge\\PsrHttpMessage\\' => array($vendorDir . '/symfony/psr-http-message-bridge'),
     'Stecman\\Component\\Symfony\\Console\\BashCompletion\\' => array($vendorDir . '/stecman/symfony-console-completion/src'),
-    'SimpleSAML\\modules\\yubikey\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/authYubikey/lib'),
+    'SimpleSAML\\modules\\yubikey\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/authYubiKey/lib'),
     'SimpleSAML\\modules\\discopower\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/discopower/lib'),
     'SimpleSAML\\TwigConfigurableI18n\\' => array($vendorDir . '/simplesamlphp/twig-configurable-i18n/src'),
     'SimpleSAML\\Module\\statistics\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib'),
@@ -60,6 +64,7 @@
     'SimpleSAML\\Module\\riak\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/riak/lib'),
     'SimpleSAML\\Module\\radius\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/radius/lib'),
     'SimpleSAML\\Module\\preprodwarning\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/preprodwarning/lib'),
+    'SimpleSAML\\Module\\oauth\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/oauth/lib'),
     'SimpleSAML\\Module\\negotiate\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/negotiate/lib'),
     'SimpleSAML\\Module\\metarefresh\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/metarefresh/lib'),
     'SimpleSAML\\Module\\ldap\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/ldap/lib'),
@@ -75,6 +80,7 @@
     'SimpleSAML\\Module\\authcrypt\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/authcrypt/lib'),
     'SimpleSAML\\Module\\authX509\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/authX509/lib'),
     'SimpleSAML\\Module\\adfs\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/modules/adfs/lib'),
+    'SimpleSAML\\Assert\\' => array($vendorDir . '/simplesamlphp/assert/src'),
     'SimpleSAML\\' => array($vendorDir . '/simplesamlphp/simplesamlphp/lib/SimpleSAML'),
     'SelfUpdate\\' => array($vendorDir . '/consolidation/self-update/src'),
     'SAML2\\' => array($vendorDir . '/simplesamlphp/saml2/src/SAML2'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 5634349270164e583b7fd5edcd92b9bb638fa101..d7e9c376eadb0b0477966cca7ca3d243ab8ea600 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -9,17 +9,18 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
     public static $files = array (
         'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
         '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
-        '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
         '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
+        '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
+        '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
         'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
         'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
-        '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
         '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
         '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
         '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
         'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
         'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
         '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
+        '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php',
         '07d7f1a47144818725fd8d91a907ac57' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/create_uploaded_file.php',
         'da94ac5d3ca7d2dbab84ce561ce72bfd' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_headers_from_sapi.php',
         '3d97c8dcdfba8cb85d3b34f116bb248b' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_method_from_sapi.php',
@@ -39,7 +40,6 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php',
         '2f69d3914119f042cca9e44442d5ce95' => __DIR__ . '/../..' . '/web/core/includes/bootstrap.inc',
         '6db5533840cb1ae1bc049452845aa88e' => __DIR__ . '/../..' . '/web/core/includes/guzzle_php81_shim.php',
-        '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php',
         '5abda994d126976858eb25d2546ee3c9' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/_autoload_modules.php',
         '801c31d8ed748cfa537fa45402288c95' => __DIR__ . '/..' . '/psy/psysh/src/functions.php',
         '952683d815ff0a7bf322b93c0be7e4e4' => __DIR__ . '/..' . '/chi-teck/drupal-code-generator/src/bootstrap.php',
@@ -82,7 +82,9 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
             'Symfony\\Contracts\\Service\\' => 26,
             'Symfony\\Contracts\\HttpClient\\' => 29,
             'Symfony\\Contracts\\EventDispatcher\\' => 34,
+            'Symfony\\Contracts\\Cache\\' => 24,
             'Symfony\\Component\\Yaml\\' => 23,
+            'Symfony\\Component\\VarExporter\\' => 30,
             'Symfony\\Component\\VarDumper\\' => 28,
             'Symfony\\Component\\Validator\\' => 28,
             'Symfony\\Component\\Translation\\' => 30,
@@ -102,7 +104,9 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
             'Symfony\\Component\\CssSelector\\' => 30,
             'Symfony\\Component\\Console\\' => 26,
             'Symfony\\Component\\Config\\' => 25,
+            'Symfony\\Component\\Cache\\' => 24,
             'Symfony\\Cmf\\Component\\Routing\\' => 30,
+            'Symfony\\Bundle\\FrameworkBundle\\' => 31,
             'Symfony\\Bridge\\PsrHttpMessage\\' => 30,
             'Stecman\\Component\\Symfony\\Console\\BashCompletion\\' => 49,
             'SimpleSAML\\modules\\yubikey\\' => 27,
@@ -115,6 +119,7 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
             'SimpleSAML\\Module\\riak\\' => 23,
             'SimpleSAML\\Module\\radius\\' => 25,
             'SimpleSAML\\Module\\preprodwarning\\' => 33,
+            'SimpleSAML\\Module\\oauth\\' => 24,
             'SimpleSAML\\Module\\negotiate\\' => 28,
             'SimpleSAML\\Module\\metarefresh\\' => 30,
             'SimpleSAML\\Module\\ldap\\' => 23,
@@ -130,6 +135,7 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
             'SimpleSAML\\Module\\authcrypt\\' => 28,
             'SimpleSAML\\Module\\authX509\\' => 27,
             'SimpleSAML\\Module\\adfs\\' => 23,
+            'SimpleSAML\\Assert\\' => 18,
             'SimpleSAML\\' => 11,
             'SelfUpdate\\' => 11,
             'SAML2\\' => 6,
@@ -311,10 +317,18 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         array (
             0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts',
         ),
+        'Symfony\\Contracts\\Cache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/cache-contracts',
+        ),
         'Symfony\\Component\\Yaml\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/yaml',
         ),
+        'Symfony\\Component\\VarExporter\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/var-exporter',
+        ),
         'Symfony\\Component\\VarDumper\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/var-dumper',
@@ -391,10 +405,18 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         array (
             0 => __DIR__ . '/..' . '/symfony/config',
         ),
+        'Symfony\\Component\\Cache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/cache',
+        ),
         'Symfony\\Cmf\\Component\\Routing\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony-cmf/routing/src',
         ),
+        'Symfony\\Bundle\\FrameworkBundle\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/framework-bundle',
+        ),
         'Symfony\\Bridge\\PsrHttpMessage\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/psr-http-message-bridge',
@@ -405,7 +427,7 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         ),
         'SimpleSAML\\modules\\yubikey\\' => 
         array (
-            0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authYubikey/lib',
+            0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authYubiKey/lib',
         ),
         'SimpleSAML\\modules\\discopower\\' => 
         array (
@@ -443,6 +465,10 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         array (
             0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/preprodwarning/lib',
         ),
+        'SimpleSAML\\Module\\oauth\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/oauth/lib',
+        ),
         'SimpleSAML\\Module\\negotiate\\' => 
         array (
             0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/negotiate/lib',
@@ -503,6 +529,10 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         array (
             0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/adfs/lib',
         ),
+        'SimpleSAML\\Assert\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/simplesamlphp/assert/src',
+        ),
         'SimpleSAML\\' => 
         array (
             0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML',
@@ -1392,6 +1422,7 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'Doctrine\\Common\\Collections\\Expr\\ExpressionVisitor' => __DIR__ . '/..' . '/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php',
         'Doctrine\\Common\\Collections\\Expr\\Value' => __DIR__ . '/..' . '/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Value.php',
         'Doctrine\\Common\\Collections\\ExpressionBuilder' => __DIR__ . '/..' . '/doctrine/collections/lib/Doctrine/Common/Collections/ExpressionBuilder.php',
+        'Doctrine\\Common\\Collections\\ReadableCollection' => __DIR__ . '/..' . '/doctrine/collections/lib/Doctrine/Common/Collections/ReadableCollection.php',
         'Doctrine\\Common\\Collections\\Selectable' => __DIR__ . '/..' . '/doctrine/collections/lib/Doctrine/Common/Collections/Selectable.php',
         'Doctrine\\Common\\Lexer\\AbstractLexer' => __DIR__ . '/..' . '/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php',
         'Doctrine\\Common\\Reflection\\ClassFinderInterface' => __DIR__ . '/..' . '/doctrine/reflection/lib/Doctrine/Common/Reflection/ClassFinderInterface.php',
@@ -3953,6 +3984,7 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'Gettext\\Languages\\Exporter\\Php' => __DIR__ . '/..' . '/gettext/languages/src/Exporter/Php.php',
         'Gettext\\Languages\\Exporter\\Po' => __DIR__ . '/..' . '/gettext/languages/src/Exporter/Po.php',
         'Gettext\\Languages\\Exporter\\Prettyjson' => __DIR__ . '/..' . '/gettext/languages/src/Exporter/Prettyjson.php',
+        'Gettext\\Languages\\Exporter\\Ruby' => __DIR__ . '/..' . '/gettext/languages/src/Exporter/Ruby.php',
         'Gettext\\Languages\\Exporter\\Xml' => __DIR__ . '/..' . '/gettext/languages/src/Exporter/Xml.php',
         'Gettext\\Languages\\FormulaConverter' => __DIR__ . '/..' . '/gettext/languages/src/FormulaConverter.php',
         'Gettext\\Languages\\Language' => __DIR__ . '/..' . '/gettext/languages/src/Language.php',
@@ -4347,6 +4379,7 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'PEAR_Exception' => __DIR__ . '/..' . '/pear/pear_exception/PEAR/Exception.php',
         'PHPMailer\\PHPMailer\\Exception' => __DIR__ . '/..' . '/phpmailer/phpmailer/src/Exception.php',
         'PHPMailer\\PHPMailer\\OAuth' => __DIR__ . '/..' . '/phpmailer/phpmailer/src/OAuth.php',
+        'PHPMailer\\PHPMailer\\OAuthTokenProvider' => __DIR__ . '/..' . '/phpmailer/phpmailer/src/OAuthTokenProvider.php',
         'PHPMailer\\PHPMailer\\PHPMailer' => __DIR__ . '/..' . '/phpmailer/phpmailer/src/PHPMailer.php',
         'PHPMailer\\PHPMailer\\POP3' => __DIR__ . '/..' . '/phpmailer/phpmailer/src/POP3.php',
         'PHPMailer\\PHPMailer\\SMTP' => __DIR__ . '/..' . '/phpmailer/phpmailer/src/SMTP.php',
@@ -5022,6 +5055,27 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'SAML2\\DOMDocumentFactory' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/DOMDocumentFactory.php',
         'SAML2\\EncryptedAssertion' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/EncryptedAssertion.php',
         'SAML2\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/InvalidArgumentException.php',
+        'SAML2\\Exception\\MetadataExpiredException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/MetadataExpiredException.php',
+        'SAML2\\Exception\\ProtocolViolationException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/ProtocolViolationException.php',
+        'SAML2\\Exception\\Protocol\\AuthnFailedException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/AuthnFailedException.php',
+        'SAML2\\Exception\\Protocol\\InvalidAttrNameOrValueException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/InvalidAttrNameOrValueException.php',
+        'SAML2\\Exception\\Protocol\\InvalidNameIDPolicyException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/InvalidNameIDPolicyException.php',
+        'SAML2\\Exception\\Protocol\\NoAuthnContextException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoAuthnContextException.php',
+        'SAML2\\Exception\\Protocol\\NoAvailableIDPException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoAvailableIDPException.php',
+        'SAML2\\Exception\\Protocol\\NoPassiveException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoPassiveException.php',
+        'SAML2\\Exception\\Protocol\\NoSupportedIDPException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoSupportedIDPException.php',
+        'SAML2\\Exception\\Protocol\\PartialLogoutException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/PartialLogoutException.php',
+        'SAML2\\Exception\\Protocol\\ProxyCountExceededException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/ProxyCountExceededException.php',
+        'SAML2\\Exception\\Protocol\\RequestDeniedException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestDeniedException.php',
+        'SAML2\\Exception\\Protocol\\RequestUnsupportedException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestUnsupportedException.php',
+        'SAML2\\Exception\\Protocol\\RequestVersionDeprecatedException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionDeprecatedException.php',
+        'SAML2\\Exception\\Protocol\\RequestVersionTooHighException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionTooHighException.php',
+        'SAML2\\Exception\\Protocol\\RequestVersionTooLowException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionTooLowException.php',
+        'SAML2\\Exception\\Protocol\\ResourceNotRecognizedException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/ResourceNotRecognizedException.php',
+        'SAML2\\Exception\\Protocol\\TooManyResponsesException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/TooManyResponsesException.php',
+        'SAML2\\Exception\\Protocol\\UnknownAttrProfileException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnknownAttrProfileException.php',
+        'SAML2\\Exception\\Protocol\\UnknownPrincipalException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnknownPrincipalException.php',
+        'SAML2\\Exception\\Protocol\\UnsupportedBindingException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnsupportedBindingException.php',
         'SAML2\\Exception\\RuntimeException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/RuntimeException.php',
         'SAML2\\Exception\\Throwable' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/Throwable.php',
         'SAML2\\Exception\\UnparseableXmlException' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/Exception/UnparseableXmlException.php',
@@ -5114,6 +5168,8 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'SAML2\\XML\\samlp\\Extensions' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/XML/samlp/Extensions.php',
         'SAML2\\XML\\shibmd\\Scope' => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2/XML/shibmd/Scope.php',
         'SelfUpdate\\SelfUpdateCommand' => __DIR__ . '/..' . '/consolidation/self-update/src/SelfUpdateCommand.php',
+        'SimpleSAML\\Assert\\Assert' => __DIR__ . '/..' . '/simplesamlphp/assert/src/Assert.php',
+        'SimpleSAML\\Assert\\AssertionFailedException' => __DIR__ . '/..' . '/simplesamlphp/assert/src/AssertionFailedException.php',
         'SimpleSAML\\Auth\\AuthenticationFactory' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/AuthenticationFactory.php',
         'SimpleSAML\\Auth\\DefaultAuth' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/DefaultAuth.php',
         'SimpleSAML\\Auth\\ProcessingChain' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/ProcessingChain.php',
@@ -5125,7 +5181,9 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'SimpleSAML\\Auth\\TimeLimitedToken' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/TimeLimitedToken.php',
         'SimpleSAML\\Bindings\\Shib13\\Artifact' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/Artifact.php',
         'SimpleSAML\\Bindings\\Shib13\\HTTPPost' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php',
+        'SimpleSAML\\Command\\RouterDebugCommand' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Command/RouterDebugCommand.php',
         'SimpleSAML\\Configuration' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Configuration.php',
+        'SimpleSAML\\Console\\Application' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Console/Application.php',
         'SimpleSAML\\Database' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Database.php',
         'SimpleSAML\\Error\\Assertion' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Assertion.php',
         'SimpleSAML\\Error\\AuthSource' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/AuthSource.php',
@@ -5147,12 +5205,12 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'SimpleSAML\\Error\\User' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/User.php',
         'SimpleSAML\\Error\\UserAborted' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserAborted.php',
         'SimpleSAML\\Error\\UserNotFound' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserNotFound.php',
-        'SimpleSAML\\HTTP\\Router' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/Router.php',
         'SimpleSAML\\HTTP\\RunnableResponse' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/RunnableResponse.php',
         'SimpleSAML\\IdP' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP.php',
         'SimpleSAML\\IdP\\IFrameLogoutHandler' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/IFrameLogoutHandler.php',
         'SimpleSAML\\IdP\\LogoutHandlerInterface' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/LogoutHandlerInterface.php',
         'SimpleSAML\\IdP\\TraditionalLogoutHandler' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/TraditionalLogoutHandler.php',
+        'SimpleSAML\\Kernel' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Kernel.php',
         'SimpleSAML\\Locale\\Language' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Language.php',
         'SimpleSAML\\Locale\\Localization' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Localization.php',
         'SimpleSAML\\Locale\\Translate' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Translate.php',
@@ -5174,8 +5232,6 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'SimpleSAML\\Metadata\\Signer' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Signer.php',
         'SimpleSAML\\Metadata\\Sources\\MDQ' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Sources/MDQ.php',
         'SimpleSAML\\Module' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module.php',
-        'SimpleSAML\\Module\\ControllerResolver' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module/ControllerResolver.php',
-        'SimpleSAML\\Module\\adfs\\AdfsController' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/adfs/lib/AdfsController.php',
         'SimpleSAML\\Module\\adfs\\IdP\\ADFS' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/adfs/lib/IdP/ADFS.php',
         'SimpleSAML\\Module\\adfs\\SAML2\\XML\\fed\\Constants' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Constants.php',
         'SimpleSAML\\Module\\adfs\\SAML2\\XML\\fed\\Endpoint' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Endpoint.php',
@@ -5186,12 +5242,8 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'SimpleSAML\\Module\\authX509\\Controller\\ExpiryWarning' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authX509/lib/Controller/ExpiryWarning.php',
         'SimpleSAML\\Module\\authcrypt\\Auth\\Source\\Hash' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authcrypt/lib/Auth/Source/Hash.php',
         'SimpleSAML\\Module\\authcrypt\\Auth\\Source\\Htpasswd' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authcrypt/lib/Auth/Source/Htpasswd.php',
-        'SimpleSAML\\Module\\authfacebook\\Auth\\Source\\Facebook' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authfacebook/lib/Auth/Source/Facebook.php',
-        'SimpleSAML\\Module\\authfacebook\\Facebook' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authfacebook/lib/Facebook.php',
         'SimpleSAML\\Module\\authorize\\Auth\\Process\\Authorize' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authorize/lib/Auth/Process/Authorize.php',
         'SimpleSAML\\Module\\authtwitter\\Auth\\Source\\Twitter' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authtwitter/lib/Auth/Source/Twitter.php',
-        'SimpleSAML\\Module\\authwindowslive\\Auth\\Source\\LiveID' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authwindowslive/lib/Auth/Source/LiveID.php',
-        'SimpleSAML\\Module\\cas\\Auth\\Source\\CAS' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/cas/lib/Auth/Source/CAS.php',
         'SimpleSAML\\Module\\cdc\\Client' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/cdc/lib/Client.php',
         'SimpleSAML\\Module\\cdc\\Server' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/cdc/lib/Server.php',
         'SimpleSAML\\Module\\consent\\Auth\\Process\\Consent' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/consent/lib/Auth/Process/Consent.php',
@@ -5210,27 +5262,15 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'SimpleSAML\\Module\\metarefresh\\ARP' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/metarefresh/lib/ARP.php',
         'SimpleSAML\\Module\\metarefresh\\MetaLoader' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/metarefresh/lib/MetaLoader.php',
         'SimpleSAML\\Module\\negotiate\\Auth\\Source\\Negotiate' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/negotiate/lib/Auth/Source/Negotiate.php',
+        'SimpleSAML\\Module\\oauth\\Consumer' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/oauth/lib/Consumer.php',
+        'SimpleSAML\\Module\\oauth\\OAuthServer' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/oauth/lib/OAuthServer.php',
+        'SimpleSAML\\Module\\oauth\\OAuthStore' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/oauth/lib/OAuthStore.php',
+        'SimpleSAML\\Module\\oauth\\Registry' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/oauth/lib/Registry.php',
         'SimpleSAML\\Module\\preprodwarning\\Auth\\Process\\Warning' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/preprodwarning/lib/Auth/Process/Warning.php',
+        'SimpleSAML\\Module\\preprodwarning\\Controller\\PreProdWarning' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/preprodwarning/lib/Controller/PreProdWarning.php',
         'SimpleSAML\\Module\\radius\\Auth\\Source\\Radius' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/radius/lib/Auth/Source/Radius.php',
-        'SimpleSAML\\Module\\riak\\Store\\Riak' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/riak/lib/Store/Riak.php',
         'SimpleSAML\\Module\\smartattributes\\Auth\\Process\\SmartID' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/smartattributes/lib/Auth/Process/SmartID.php',
         'SimpleSAML\\Module\\smartattributes\\Auth\\Process\\SmartName' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/smartattributes/lib/Auth/Process/SmartName.php',
-        'SimpleSAML\\Module\\sqlauth\\Auth\\Source\\SQL' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php',
-        'SimpleSAML\\Module\\statistics\\AccessCheck' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/AccessCheck.php',
-        'SimpleSAML\\Module\\statistics\\Aggregator' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Aggregator.php',
-        'SimpleSAML\\Module\\statistics\\DateHandler' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandler.php',
-        'SimpleSAML\\Module\\statistics\\DateHandlerMonth' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandlerMonth.php',
-        'SimpleSAML\\Module\\statistics\\Graph\\GoogleCharts' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Graph/GoogleCharts.php',
-        'SimpleSAML\\Module\\statistics\\LogCleaner' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/LogCleaner.php',
-        'SimpleSAML\\Module\\statistics\\LogParser' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/LogParser.php',
-        'SimpleSAML\\Module\\statistics\\RatioDataset' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/RatioDataset.php',
-        'SimpleSAML\\Module\\statistics\\Ruleset' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Ruleset.php',
-        'SimpleSAML\\Module\\statistics\\StatDataset' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/StatDataset.php',
-        'SimpleSAML\\Module\\statistics\\StatisticsController' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/StatisticsController.php',
-        'SimpleSAML\\Module\\statistics\\Statistics\\FieldPresentation\\Base' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/FieldPresentation/Base.php',
-        'SimpleSAML\\Module\\statistics\\Statistics\\FieldPresentation\\Entity' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/FieldPresentation/Entity.php',
-        'SimpleSAML\\Module\\statistics\\Statistics\\Rulesets\\BaseRule' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/Rulesets/BaseRule.php',
-        'SimpleSAML\\Module\\statistics\\Statistics\\Rulesets\\Ratio' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/Rulesets/Ratio.php',
         'SimpleSAML\\Session' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/Session.php',
         'SimpleSAML\\SessionHandler' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandler.php',
         'SimpleSAML\\SessionHandlerCookie' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerCookie.php',
@@ -5293,6 +5333,125 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'Symfony\\Bridge\\PsrHttpMessage\\Factory\\UploadedFile' => __DIR__ . '/..' . '/symfony/psr-http-message-bridge/Factory/UploadedFile.php',
         'Symfony\\Bridge\\PsrHttpMessage\\HttpFoundationFactoryInterface' => __DIR__ . '/..' . '/symfony/psr-http-message-bridge/HttpFoundationFactoryInterface.php',
         'Symfony\\Bridge\\PsrHttpMessage\\HttpMessageFactoryInterface' => __DIR__ . '/..' . '/symfony/psr-http-message-bridge/HttpMessageFactoryInterface.php',
+        'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AbstractPhpFileCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php',
+        'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AnnotationsCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php',
+        'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\RouterCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php',
+        'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\SerializerCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php',
+        'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplateFinder' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/TemplateFinder.php',
+        'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplateFinderInterface' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/TemplateFinderInterface.php',
+        'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplatePathsCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/TemplatePathsCacheWarmer.php',
+        'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TranslationsCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.php',
+        'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ValidatorCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Client' => __DIR__ . '/..' . '/symfony/framework-bundle/Client.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\AboutCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/AboutCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\AbstractConfigCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/AbstractConfigCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\AssetsInstallCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/AssetsInstallCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\CacheClearCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CacheClearCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolClearCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolClearCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolDeleteCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolDeleteCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolListCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolListCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolPruneCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolPruneCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\CacheWarmupCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CacheWarmupCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ConfigDebugCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDumpReferenceCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerAwareCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ContainerAwareCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ContainerDebugCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerLintCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ContainerLintCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\DebugAutowiringCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/DebugAutowiringCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\EventDispatcherDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/EventDispatcherDebugCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\RouterDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/RouterDebugCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\RouterMatchCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/RouterMatchCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsDecryptToLocalCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsEncryptFromLocalCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsGenerateKeysCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsListCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsListCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsRemoveCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsRemoveCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsSetCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsSetCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/TranslationDebugCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationUpdateCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/TranslationUpdateCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\WorkflowDumpCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/WorkflowDumpCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\XliffLintCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/XliffLintCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Command\\YamlLintCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/YamlLintCommand.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Console\\Application' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Application.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/Descriptor.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/JsonDescriptor.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/MarkdownDescriptor.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/TextDescriptor.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Helper/DescriptorHelper.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/AbstractController.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/Controller.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerNameParser' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/ControllerNameParser.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/ControllerResolver.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/ControllerTrait.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/RedirectController.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/TemplateController.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RequestDataCollector' => __DIR__ . '/..' . '/symfony/framework-bundle/DataCollector/RequestDataCollector.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RouterDataCollector' => __DIR__ . '/..' . '/symfony/framework-bundle/DataCollector/RouterDataCollector.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\CompatibilityServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/CompatibilityServiceSubscriberInterface.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddAnnotationsCachedReaderPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddDebugLogProcessorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddExpressionLanguageProvidersPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CacheCollectorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/CacheCollectorPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolClearerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolClearerPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolPrunerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPrunerPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ContainerBuilderDebugDumpPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\DataCollectorTranslatorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\LoggingTranslatorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ProfilerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\SessionPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/SessionPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TemplatingPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TemplatingPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerRealRefPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerWeakRefPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\UnusedTagsPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\WorkflowGuardListenerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Configuration' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Configuration.php',
+        'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\FrameworkExtension' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php',
+        'Symfony\\Bundle\\FrameworkBundle\\EventListener\\ResolveControllerNameSubscriber' => __DIR__ . '/..' . '/symfony/framework-bundle/EventListener/ResolveControllerNameSubscriber.php',
+        'Symfony\\Bundle\\FrameworkBundle\\EventListener\\SuggestMissingPackageSubscriber' => __DIR__ . '/..' . '/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.php',
+        'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle' => __DIR__ . '/..' . '/symfony/framework-bundle/FrameworkBundle.php',
+        'Symfony\\Bundle\\FrameworkBundle\\HttpCache\\HttpCache' => __DIR__ . '/..' . '/symfony/framework-bundle/HttpCache/HttpCache.php',
+        'Symfony\\Bundle\\FrameworkBundle\\KernelBrowser' => __DIR__ . '/..' . '/symfony/framework-bundle/KernelBrowser.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Kernel/MicroKernelTrait.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Routing\\AnnotatedRouteControllerLoader' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Routing\\DelegatingLoader' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/DelegatingLoader.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Routing\\LegacyRouteLoaderContainer' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/LegacyRouteLoaderContainer.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableCompiledUrlMatcher' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableUrlMatcher' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/RedirectableUrlMatcher.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Routing\\RouteLoaderInterface' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/RouteLoaderInterface.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Routing\\Router' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/Router.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Secrets\\AbstractVault' => __DIR__ . '/..' . '/symfony/framework-bundle/Secrets/AbstractVault.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Secrets\\DotenvVault' => __DIR__ . '/..' . '/symfony/framework-bundle/Secrets/DotenvVault.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Secrets\\SodiumVault' => __DIR__ . '/..' . '/symfony/framework-bundle/Secrets/SodiumVault.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\DelegatingEngine' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/DelegatingEngine.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\EngineInterface' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/EngineInterface.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\GlobalVariables' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/GlobalVariables.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\ActionsHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/ActionsHelper.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\AssetsHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/AssetsHelper.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\CodeHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/CodeHelper.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\FormHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/FormHelper.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\RequestHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/RequestHelper.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\RouterHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/RouterHelper.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\SessionHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/SessionHelper.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\StopwatchHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/StopwatchHelper.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\TranslatorHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/TranslatorHelper.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Loader\\FilesystemLoader' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Loader/FilesystemLoader.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\Loader\\TemplateLocator' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Loader/TemplateLocator.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\PhpEngine' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/PhpEngine.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateFilenameParser' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/TemplateFilenameParser.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateNameParser' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/TemplateNameParser.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateReference' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/TemplateReference.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Templating\\TimedPhpEngine' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/TimedPhpEngine.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Test\\BrowserKitAssertionsTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Test\\DomCrawlerAssertionsTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/DomCrawlerAssertionsTrait.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Test\\ForwardCompatTestTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/ForwardCompatTestTrait.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Test\\KernelTestCase' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/KernelTestCase.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Test\\MailerAssertionsTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/MailerAssertionsTrait.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Test\\TestContainer' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/TestContainer.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestAssertionsTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/WebTestAssertionsTrait.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestCase' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/WebTestCase.php',
+        'Symfony\\Bundle\\FrameworkBundle\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/framework-bundle/Translation/Translator.php',
         'Symfony\\Cmf\\Component\\Routing\\Candidates\\Candidates' => __DIR__ . '/..' . '/symfony-cmf/routing/src/Candidates/Candidates.php',
         'Symfony\\Cmf\\Component\\Routing\\Candidates\\CandidatesInterface' => __DIR__ . '/..' . '/symfony-cmf/routing/src/Candidates/CandidatesInterface.php',
         'Symfony\\Cmf\\Component\\Routing\\ChainRouteCollection' => __DIR__ . '/..' . '/symfony-cmf/routing/src/ChainRouteCollection.php',
@@ -5328,6 +5487,63 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'Symfony\\Cmf\\Component\\Routing\\RouteReferrersInterface' => __DIR__ . '/..' . '/symfony-cmf/routing/src/RouteReferrersInterface.php',
         'Symfony\\Cmf\\Component\\Routing\\RouteReferrersReadInterface' => __DIR__ . '/..' . '/symfony-cmf/routing/src/RouteReferrersReadInterface.php',
         'Symfony\\Cmf\\Component\\Routing\\VersatileGeneratorInterface' => __DIR__ . '/..' . '/symfony-cmf/routing/src/VersatileGeneratorInterface.php',
+        'Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/AdapterInterface.php',
+        'Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ApcuAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ArrayAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ChainAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineDbalAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/MemcachedAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/NullAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer' => __DIR__ . '/..' . '/symfony/cache/Adapter/ParameterNormalizer.php',
+        'Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PdoAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpArrayAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpFilesAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ProxyAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\Psr16Adapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/Psr16Adapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\RedisTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisTagAwareAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapterInterface.php',
+        'Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php',
+        'Symfony\\Component\\Cache\\CacheItem' => __DIR__ . '/..' . '/symfony/cache/CacheItem.php',
+        'Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => __DIR__ . '/..' . '/symfony/cache/DataCollector/CacheDataCollector.php',
+        'Symfony\\Component\\Cache\\DependencyInjection\\CacheCollectorPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CacheCollectorPass.php',
+        'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php',
+        'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPass.php',
+        'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php',
+        'Symfony\\Component\\Cache\\DoctrineProvider' => __DIR__ . '/..' . '/symfony/cache/DoctrineProvider.php',
+        'Symfony\\Component\\Cache\\Exception\\CacheException' => __DIR__ . '/..' . '/symfony/cache/Exception/CacheException.php',
+        'Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/cache/Exception/InvalidArgumentException.php',
+        'Symfony\\Component\\Cache\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/cache/Exception/LogicException.php',
+        'Symfony\\Component\\Cache\\LockRegistry' => __DIR__ . '/..' . '/symfony/cache/LockRegistry.php',
+        'Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/DefaultMarshaller.php',
+        'Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/DeflateMarshaller.php',
+        'Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface' => __DIR__ . '/..' . '/symfony/cache/Marshaller/MarshallerInterface.php',
+        'Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/SodiumMarshaller.php',
+        'Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/TagAwareMarshaller.php',
+        'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationDispatcher.php',
+        'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationHandler' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationHandler.php',
+        'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationMessage.php',
+        'Symfony\\Component\\Cache\\PruneableInterface' => __DIR__ . '/..' . '/symfony/cache/PruneableInterface.php',
+        'Symfony\\Component\\Cache\\Psr16Cache' => __DIR__ . '/..' . '/symfony/cache/Psr16Cache.php',
+        'Symfony\\Component\\Cache\\ResettableInterface' => __DIR__ . '/..' . '/symfony/cache/ResettableInterface.php',
+        'Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/AbstractAdapterTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\ContractsTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ContractsTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemCommonTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\ProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ProxyTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\RedisClusterNodeProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisClusterNodeProxy.php',
+        'Symfony\\Component\\Cache\\Traits\\RedisClusterProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisClusterProxy.php',
+        'Symfony\\Component\\Cache\\Traits\\RedisProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisProxy.php',
+        'Symfony\\Component\\Cache\\Traits\\RedisTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisTrait.php',
         'Symfony\\Component\\Config\\ConfigCache' => __DIR__ . '/..' . '/symfony/config/ConfigCache.php',
         'Symfony\\Component\\Config\\ConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactory.php',
         'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactoryInterface.php',
@@ -6569,6 +6785,16 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'Symfony\\Component\\VarDumper\\Server\\DumpServer' => __DIR__ . '/..' . '/symfony/var-dumper/Server/DumpServer.php',
         'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => __DIR__ . '/..' . '/symfony/var-dumper/Test/VarDumperTestTrait.php',
         'Symfony\\Component\\VarDumper\\VarDumper' => __DIR__ . '/..' . '/symfony/var-dumper/VarDumper.php',
+        'Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/ClassNotFoundException.php',
+        'Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/ExceptionInterface.php',
+        'Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/NotInstantiableTypeException.php',
+        'Symfony\\Component\\VarExporter\\Instantiator' => __DIR__ . '/..' . '/symfony/var-exporter/Instantiator.php',
+        'Symfony\\Component\\VarExporter\\Internal\\Exporter' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Exporter.php',
+        'Symfony\\Component\\VarExporter\\Internal\\Hydrator' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Hydrator.php',
+        'Symfony\\Component\\VarExporter\\Internal\\Reference' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Reference.php',
+        'Symfony\\Component\\VarExporter\\Internal\\Registry' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Registry.php',
+        'Symfony\\Component\\VarExporter\\Internal\\Values' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Values.php',
+        'Symfony\\Component\\VarExporter\\VarExporter' => __DIR__ . '/..' . '/symfony/var-exporter/VarExporter.php',
         'Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php',
         'Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php',
         'Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php',
@@ -6581,6 +6807,11 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php',
         'Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php',
         'Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php',
+        'Symfony\\Contracts\\Cache\\CacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheInterface.php',
+        'Symfony\\Contracts\\Cache\\CacheTrait' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheTrait.php',
+        'Symfony\\Contracts\\Cache\\CallbackInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CallbackInterface.php',
+        'Symfony\\Contracts\\Cache\\ItemInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/ItemInterface.php',
+        'Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/TagAwareCacheInterface.php',
         'Symfony\\Contracts\\EventDispatcher\\Event' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/Event.php',
         'Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php',
         'Symfony\\Contracts\\HttpClient\\ChunkInterface' => __DIR__ . '/..' . '/symfony/http-client-contracts/ChunkInterface.php',
@@ -7033,6 +7264,8 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530
         'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
         'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
         'Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php',
+        'Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php',
+        'Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php',
         'Webmozart\\PathUtil\\Path' => __DIR__ . '/..' . '/webmozart/path-util/src/Path.php',
         'Webmozart\\PathUtil\\Url' => __DIR__ . '/..' . '/webmozart/path-util/src/Url.php',
         'WhiteHat101\\Crypt\\APR1_MD5' => __DIR__ . '/..' . '/whitehat101/apr1-md5/src/APR1_MD5.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 7a491952370b7a56436ddbe894622bb4943b537e..0d47f322d940f5a8092b31809adfd73eb44aed0b 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1441,17 +1441,17 @@
         },
         {
             "name": "doctrine/collections",
-            "version": "1.7.3",
-            "version_normalized": "1.7.3.0",
+            "version": "1.8.0",
+            "version_normalized": "1.8.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/collections.git",
-                "reference": "09dde3eb237756190f2de738d3c97cff10a8407b"
+                "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/collections/zipball/09dde3eb237756190f2de738d3c97cff10a8407b",
-                "reference": "09dde3eb237756190f2de738d3c97cff10a8407b",
+                "url": "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e",
+                "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e",
                 "shasum": ""
             },
             "require": {
@@ -1464,7 +1464,7 @@
                 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5",
                 "vimeo/psalm": "^4.22"
             },
-            "time": "2022-09-01T19:34:23+00:00",
+            "time": "2022-09-01T20:12:10+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -1508,7 +1508,7 @@
             ],
             "support": {
                 "issues": "https://github.com/doctrine/collections/issues",
-                "source": "https://github.com/doctrine/collections/tree/1.7.3"
+                "source": "https://github.com/doctrine/collections/tree/1.8.0"
             },
             "install-path": "../doctrine/collections"
         },
@@ -7165,29 +7165,29 @@
         },
         {
             "name": "drupal/simplesamlphp_auth",
-            "version": "3.2.0",
-            "version_normalized": "3.2.0.0",
+            "version": "3.3.0",
+            "version_normalized": "3.3.0.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/simplesamlphp_auth.git",
-                "reference": "8.x-3.2"
+                "reference": "8.x-3.3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/simplesamlphp_auth-8.x-3.2.zip",
-                "reference": "8.x-3.2",
-                "shasum": "a5a2b10fc873eb8669929ad1a6d9599e47a2ca99"
+                "url": "https://ftp.drupal.org/files/projects/simplesamlphp_auth-8.x-3.3.zip",
+                "reference": "8.x-3.3",
+                "shasum": "14b33fc4e7c9a6a72de5a4ec32722200e7203d43"
             },
             "require": {
-                "drupal/core": "^8.7|^9.0",
-                "drupal/externalauth": "^1.1",
-                "simplesamlphp/simplesamlphp": "^1.18.2"
+                "drupal/core": "^8.7||^9.0",
+                "drupal/externalauth": "^1.1||^2.0",
+                "simplesamlphp/simplesamlphp": "^1.18.2||^1.19"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-3.2",
-                    "datestamp": "1580423953",
+                    "version": "8.x-3.3",
+                    "datestamp": "1660687554",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -7216,6 +7216,10 @@
                     "name": "geekwisdom",
                     "homepage": "https://www.drupal.org/user/1662"
                 },
+                {
+                    "name": "japerry",
+                    "homepage": "https://www.drupal.org/user/45640"
+                },
                 {
                     "name": "snufkin",
                     "homepage": "https://www.drupal.org/user/58645"
@@ -8815,17 +8819,17 @@
         },
         {
             "name": "gettext/gettext",
-            "version": "v4.8.3",
-            "version_normalized": "4.8.3.0",
+            "version": "4.x-dev",
+            "version_normalized": "4.9999999.9999999.9999999-dev",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-gettext/Gettext.git",
-                "reference": "57ff4fb16647e78e80a5909fe3c190f1c3110321"
+                "reference": "3f7bc5ef23302a9059e64934f3d59e454516bec0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/57ff4fb16647e78e80a5909fe3c190f1c3110321",
-                "reference": "57ff4fb16647e78e80a5909fe3c190f1c3110321",
+                "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/3f7bc5ef23302a9059e64934f3d59e454516bec0",
+                "reference": "3f7bc5ef23302a9059e64934f3d59e454516bec0",
                 "shasum": ""
             },
             "require": {
@@ -8833,7 +8837,7 @@
                 "php": ">=5.4.0"
             },
             "require-dev": {
-                "illuminate/view": "*",
+                "illuminate/view": "^5.0.x-dev",
                 "phpunit/phpunit": "^4.8|^5.7|^6.5",
                 "squizlabs/php_codesniffer": "^3.0",
                 "symfony/yaml": "~2",
@@ -8846,7 +8850,7 @@
                 "twig/extensions": "Is necessary if you want to use the Twig extractor",
                 "twig/twig": "Is necessary if you want to use the Twig extractor"
             },
-            "time": "2020-11-18T22:35:49+00:00",
+            "time": "2022-08-02T09:42:10+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -8876,31 +8880,49 @@
                 "po",
                 "translation"
             ],
+            "support": {
+                "email": "oom@oscarotero.com",
+                "issues": "https://github.com/oscarotero/Gettext/issues",
+                "source": "https://github.com/php-gettext/Gettext/tree/4.x"
+            },
+            "funding": [
+                {
+                    "url": "https://paypal.me/oscarotero",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/oscarotero",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/misteroom",
+                    "type": "patreon"
+                }
+            ],
             "install-path": "../gettext/gettext"
         },
         {
             "name": "gettext/languages",
-            "version": "2.6.0",
-            "version_normalized": "2.6.0.0",
+            "version": "2.9.0",
+            "version_normalized": "2.9.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-gettext/Languages.git",
-                "reference": "38ea0482f649e0802e475f0ed19fa993bcb7a618"
+                "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-gettext/Languages/zipball/38ea0482f649e0802e475f0ed19fa993bcb7a618",
-                "reference": "38ea0482f649e0802e475f0ed19fa993bcb7a618",
+                "url": "https://api.github.com/repos/php-gettext/Languages/zipball/ed56dd2c7f4024cc953ed180d25f02f2640e3ffa",
+                "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3"
             },
             "require-dev": {
-                "friendsofphp/php-cs-fixer": "^2.16.0",
                 "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4"
             },
-            "time": "2019-11-13T10:30:21+00:00",
+            "time": "2021-11-11T17:30:39+00:00",
             "bin": [
                 "bin/export-plural-rules"
             ],
@@ -8940,6 +8962,20 @@
                 "translations",
                 "unicode"
             ],
+            "support": {
+                "issues": "https://github.com/php-gettext/Languages/issues",
+                "source": "https://github.com/php-gettext/Languages/tree/2.9.0"
+            },
+            "funding": [
+                {
+                    "url": "https://paypal.me/mlocati",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/mlocati",
+                    "type": "github"
+                }
+            ],
             "install-path": "../gettext/languages"
         },
         {
@@ -10481,17 +10517,17 @@
         },
         {
             "name": "phpmailer/phpmailer",
-            "version": "v6.2.0",
-            "version_normalized": "6.2.0.0",
+            "version": "v6.6.4",
+            "version_normalized": "6.6.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHPMailer/PHPMailer.git",
-                "reference": "e38888a75c070304ca5514197d4847a59a5c853f"
+                "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e38888a75c070304ca5514197d4847a59a5c853f",
-                "reference": "e38888a75c070304ca5514197d4847a59a5c853f",
+                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a94fdebaea6bd17f51be0c2373ab80d3d681269b",
+                "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b",
                 "shasum": ""
             },
             "require": {
@@ -10503,20 +10539,22 @@
             "require-dev": {
                 "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
                 "doctrine/annotations": "^1.2",
+                "php-parallel-lint/php-console-highlighter": "^1.0.0",
+                "php-parallel-lint/php-parallel-lint": "^1.3.2",
                 "phpcompatibility/php-compatibility": "^9.3.5",
                 "roave/security-advisories": "dev-latest",
-                "squizlabs/php_codesniffer": "^3.5.6",
-                "yoast/phpunit-polyfills": "^0.2.0"
+                "squizlabs/php_codesniffer": "^3.6.2",
+                "yoast/phpunit-polyfills": "^1.0.0"
             },
             "suggest": {
-                "ext-mbstring": "Needed to send email in multibyte encoding charset",
+                "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
                 "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
                 "league/oauth2-google": "Needed for Google XOAUTH2 authentication",
                 "psr/log": "For optional PSR-3 debug logging",
                 "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication",
                 "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)"
             },
-            "time": "2020-11-25T15:24:57+00:00",
+            "time": "2022-08-22T09:22:00+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -10546,6 +10584,10 @@
                 }
             ],
             "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
+            "support": {
+                "issues": "https://github.com/PHPMailer/PHPMailer/issues",
+                "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.4"
+            },
             "funding": [
                 {
                     "url": "https://github.com/Synchro",
@@ -10983,6 +11025,67 @@
             ],
             "install-path": "../robrichards/xmlseclibs"
         },
+        {
+            "name": "simplesamlphp/assert",
+            "version": "v0.0.13",
+            "version_normalized": "0.0.13.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/simplesamlphp/assert.git",
+                "reference": "5429921b320ca4f9d1844225884ac52f649ea1e3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/5429921b320ca4f9d1844225884ac52f649ea1e3",
+                "reference": "5429921b320ca4f9d1844225884ac52f649ea1e3",
+                "shasum": ""
+            },
+            "require": {
+                "ext-spl": "*",
+                "php": "^7.1 || ^8.0",
+                "webmozart/assert": "^1.9"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5",
+                "sensiolabs/security-checker": "~6.0",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.2.7",
+                "squizlabs/php_codesniffer": "~3.5",
+                "vimeo/psalm": "~3.13"
+            },
+            "time": "2020-08-17T20:40:49+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "v0.0.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "SimpleSAML\\Assert\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-2.1-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "Tim van Dijen",
+                    "email": "tvdijen@gmail.com"
+                },
+                {
+                    "name": "Jaime Perez Crespo",
+                    "email": "jaimepc@gmail.com"
+                }
+            ],
+            "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments",
+            "support": {
+                "issues": "https://github.com/simplesamlphp/assert/issues",
+                "source": "https://github.com/simplesamlphp/assert/tree/master"
+            },
+            "install-path": "../simplesamlphp/assert"
+        },
         {
             "name": "simplesamlphp/composer-module-installer",
             "version": "v1.1.8",
@@ -11022,41 +11125,40 @@
         },
         {
             "name": "simplesamlphp/saml2",
-            "version": "v4.2.0",
-            "version_normalized": "4.2.0.0",
+            "version": "v4.6.3",
+            "version_normalized": "4.6.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/saml2.git",
-                "reference": "d4038b83be50ccd64ecdc0b7c68e66d63c899d2c"
+                "reference": "bfc9c79dd6b728a41d1de988f545f6e64728a51d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/d4038b83be50ccd64ecdc0b7c68e66d63c899d2c",
-                "reference": "d4038b83be50ccd64ecdc0b7c68e66d63c899d2c",
+                "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/bfc9c79dd6b728a41d1de988f545f6e64728a51d",
+                "reference": "bfc9c79dd6b728a41d1de988f545f6e64728a51d",
                 "shasum": ""
             },
             "require": {
                 "ext-dom": "*",
                 "ext-openssl": "*",
                 "ext-zlib": "*",
-                "php": ">=7.1",
-                "psr/log": "~1.1",
-                "robrichards/xmlseclibs": "^3.1.0",
-                "webmozart/assert": "^1.5"
+                "php": ">=7.1 || ^8.0",
+                "psr/log": "~1.1 || ^2.0 || ^3.0",
+                "robrichards/xmlseclibs": "^3.1.1",
+                "webmozart/assert": "^1.9"
             },
             "require-dev": {
-                "mockery/mockery": "~1.2",
-                "phpunit/phpunit": "^7.5",
-                "sebastian/phpcpd": "~4.1",
-                "sensiolabs/security-checker": "~6.0",
+                "mockery/mockery": "^1.3",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "sebastian/phpcpd": "~4.1 || ^5.0 || ^6.0",
                 "simplesamlphp/simplesamlphp-test-framework": "~0.1.0",
                 "squizlabs/php_codesniffer": "~3.5"
             },
-            "time": "2021-01-28T21:35:22+00:00",
+            "time": "2022-06-13T14:04:10+00:00",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "v4.0.x-dev"
+                    "dev-master": "v4.2.x-dev"
                 }
             },
             "installation-source": "dist",
@@ -11076,21 +11178,25 @@
                 }
             ],
             "description": "SAML2 PHP library from SimpleSAMLphp",
+            "support": {
+                "issues": "https://github.com/simplesamlphp/saml2/issues",
+                "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.3"
+            },
             "install-path": "../simplesamlphp/saml2"
         },
         {
             "name": "simplesamlphp/simplesamlphp",
-            "version": "v1.18.8",
-            "version_normalized": "1.18.8.0",
+            "version": "v1.19.6",
+            "version_normalized": "1.19.6.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp.git",
-                "reference": "ebb6d15bb8e8b45504adc26fd3872073d1e5cd9b"
+                "reference": "76a18dd3d0f64bfd1d249f713fb6eefc0b62a0f0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp/zipball/ebb6d15bb8e8b45504adc26fd3872073d1e5cd9b",
-                "reference": "ebb6d15bb8e8b45504adc26fd3872073d1e5cd9b",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp/zipball/76a18dd3d0f64bfd1d249f713fb6eefc0b62a0f0",
+                "reference": "76a18dd3d0f64bfd1d249f713fb6eefc0b62a0f0",
                 "shasum": ""
             },
             "require": {
@@ -11103,12 +11209,13 @@
                 "ext-pcre": "*",
                 "ext-spl": "*",
                 "ext-zlib": "*",
-                "gettext/gettext": "^4.6",
-                "php": ">=5.6",
-                "phpmailer/phpmailer": "^6.0",
-                "robrichards/xmlseclibs": "^3.0.4",
-                "simplesamlphp/saml2": "^3.4 || ^4.0",
-                "simplesamlphp/simplesamlphp-module-adfs": "^0.9",
+                "gettext/gettext": "v4.x-dev#3e7460f8d9c90174824e3f39240bd578bb3d376a",
+                "php": ">=7.1|^8",
+                "phpmailer/phpmailer": "^6.1",
+                "robrichards/xmlseclibs": "^3.1",
+                "simplesamlphp/assert": "^0.0.13",
+                "simplesamlphp/saml2": "^4.5",
+                "simplesamlphp/simplesamlphp-module-adfs": "^1.0",
                 "simplesamlphp/simplesamlphp-module-authcrypt": "^0.9",
                 "simplesamlphp/simplesamlphp-module-authfacebook": "^0.9",
                 "simplesamlphp/simplesamlphp-module-authorize": "^0.9",
@@ -11120,15 +11227,15 @@
                 "simplesamlphp/simplesamlphp-module-cdc": "^0.9",
                 "simplesamlphp/simplesamlphp-module-consent": "^0.9",
                 "simplesamlphp/simplesamlphp-module-consentadmin": "^0.9",
-                "simplesamlphp/simplesamlphp-module-discopower": "^0.9",
+                "simplesamlphp/simplesamlphp-module-discopower": "^0.10",
                 "simplesamlphp/simplesamlphp-module-exampleattributeserver": "^1.0",
                 "simplesamlphp/simplesamlphp-module-expirycheck": "^0.9",
-                "simplesamlphp/simplesamlphp-module-ldap": "^0.9",
+                "simplesamlphp/simplesamlphp-module-ldap": "^0.9 | ^1.0",
                 "simplesamlphp/simplesamlphp-module-memcachemonitor": "^0.9",
                 "simplesamlphp/simplesamlphp-module-memcookie": "^1.2",
-                "simplesamlphp/simplesamlphp-module-metarefresh": "^0.9",
+                "simplesamlphp/simplesamlphp-module-metarefresh": "^0.10",
                 "simplesamlphp/simplesamlphp-module-negotiate": "^0.9",
-                "simplesamlphp/simplesamlphp-module-oauth": "^0.9",
+                "simplesamlphp/simplesamlphp-module-oauth": "^0.9.3",
                 "simplesamlphp/simplesamlphp-module-preprodwarning": "^0.9",
                 "simplesamlphp/simplesamlphp-module-radius": "^0.9",
                 "simplesamlphp/simplesamlphp-module-riak": "^0.9",
@@ -11136,23 +11243,26 @@
                 "simplesamlphp/simplesamlphp-module-smartattributes": "^0.9",
                 "simplesamlphp/simplesamlphp-module-sqlauth": "^0.9",
                 "simplesamlphp/simplesamlphp-module-statistics": "^0.9",
-                "simplesamlphp/twig-configurable-i18n": "^2.2",
-                "symfony/config": "^3.4 || ^4.0",
-                "symfony/dependency-injection": "^3.4 || ^4.0",
-                "symfony/http-foundation": "^3.4 || ^4.0",
-                "symfony/http-kernel": "^3.4 || ^4.0",
-                "symfony/routing": "^3.4 || ^4.0",
-                "symfony/yaml": "^3.4 || ^4.0",
-                "twig/twig": "~1.0 || ~2.0"
+                "simplesamlphp/twig-configurable-i18n": "~2.3.3",
+                "symfony/cache": "^4.4 || ^5.0",
+                "symfony/config": "^4.4 || ^5.0",
+                "symfony/console": "^4.4 || ^5.0",
+                "symfony/dependency-injection": "^4.4 || ^5.0",
+                "symfony/finder": "^4.4 || ^5.0",
+                "symfony/framework-bundle": "^4.4 || ^5.0",
+                "symfony/http-foundation": "^4.4 || ^5.0",
+                "symfony/http-kernel": "^4.4 || ^5.0",
+                "symfony/routing": "^4.4 || ^5.0",
+                "symfony/var-exporter": "^4.4 || ^5.0",
+                "symfony/yaml": "^4.4 || ^5.0",
+                "twig/twig": "^2.14.11"
             },
             "require-dev": {
                 "ext-curl": "*",
                 "mikey179/vfsstream": "~1.6",
-                "phpunit/phpunit": "~5.7",
-                "sensiolabs/security-checker": "^5.0.3",
-                "simplesamlphp/simplesamlphp-test-framework": "^0.0.14",
-                "squizlabs/php_codesniffer": "^3.5",
-                "vimeo/psalm": "~1.1.9"
+                "phpunit/phpunit": "^7.5",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.1.2",
+                "vimeo/psalm": "~3.14"
             },
             "suggest": {
                 "ext-curl": "Needed in order to check for updates automatically",
@@ -11164,16 +11274,16 @@
                 "ext-radius": "Needed if a Radius backend is used",
                 "predis/predis": "Needed if a Redis server is used to store session information"
             },
-            "time": "2020-09-02T12:07:28+00:00",
+            "time": "2022-07-01T19:19:48+00:00",
             "type": "project",
             "installation-source": "dist",
             "autoload": {
-                "psr-4": {
-                    "SimpleSAML\\": "lib/SimpleSAML"
-                },
                 "files": [
                     "lib/_autoload_modules.php"
-                ]
+                ],
+                "psr-4": {
+                    "SimpleSAML\\": "lib/SimpleSAML"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -11203,33 +11313,37 @@
                 "sp",
                 "ws-federation"
             ],
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp"
+            },
             "install-path": "../simplesamlphp/simplesamlphp"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-adfs",
-            "version": "v0.9.6",
-            "version_normalized": "0.9.6.0",
+            "version": "v1.0.9",
+            "version_normalized": "1.0.9.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-adfs.git",
-                "reference": "425e5ebbdd097c92fe5265a6b48d32a3095c7237"
+                "reference": "c47daabc262b7e14a76879015fd9db85319752ec"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/425e5ebbdd097c92fe5265a6b48d32a3095c7237",
-                "reference": "425e5ebbdd097c92fe5265a6b48d32a3095c7237",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/c47daabc262b7e14a76879015fd9db85319752ec",
+                "reference": "c47daabc262b7e14a76879015fd9db85319752ec",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
-                "simplesamlphp/composer-module-installer": "~1.1"
+                "php": ">=7.1",
+                "simplesamlphp/assert": "^0.0.13",
+                "simplesamlphp/composer-module-installer": "^1.1.7"
             },
             "require-dev": {
-                "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17",
-                "webmozart/assert": "<1.7"
+                "simplesamlphp/simplesamlphp": "^1.18",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.1.2"
             },
-            "time": "2020-03-31T14:29:24+00:00",
+            "time": "2022-04-11T10:24:25+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -11252,21 +11366,25 @@
                 "adfs",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-adfs/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-adfs"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/adfs"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authcrypt",
-            "version": "v0.9.3",
-            "version_normalized": "0.9.3.0",
+            "version": "v0.9.4",
+            "version_normalized": "0.9.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authcrypt.git",
-                "reference": "9a2c1a761e2d94394a4f2d3499fd6f0853899530"
+                "reference": "62555123e61b11463be3cd7adb708562023cff28"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authcrypt/zipball/9a2c1a761e2d94394a4f2d3499fd6f0853899530",
-                "reference": "9a2c1a761e2d94394a4f2d3499fd6f0853899530",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authcrypt/zipball/62555123e61b11463be3cd7adb708562023cff28",
+                "reference": "62555123e61b11463be3cd7adb708562023cff28",
                 "shasum": ""
             },
             "require": {
@@ -11279,7 +11397,7 @@
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17"
             },
-            "time": "2021-01-08T09:09:33+00:00",
+            "time": "2022-01-03T20:50:47+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -11302,6 +11420,10 @@
                 "authcrypt",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-authcrypt/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-authcrypt"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/authcrypt"
         },
         {
@@ -11358,17 +11480,17 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authorize",
-            "version": "v0.9.2",
-            "version_normalized": "0.9.2.0",
+            "version": "v0.9.4",
+            "version_normalized": "0.9.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authorize.git",
-                "reference": "c2607a5252ee1256b50ce7795e35513b116998d4"
+                "reference": "4c7ce4eaa54fc301f131c62e803fc843e4d88056"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authorize/zipball/c2607a5252ee1256b50ce7795e35513b116998d4",
-                "reference": "c2607a5252ee1256b50ce7795e35513b116998d4",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authorize/zipball/4c7ce4eaa54fc301f131c62e803fc843e4d88056",
+                "reference": "4c7ce4eaa54fc301f131c62e803fc843e4d88056",
                 "shasum": ""
             },
             "require": {
@@ -11379,7 +11501,7 @@
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17"
             },
-            "time": "2020-02-25T15:16:57+00:00",
+            "time": "2022-01-03T20:56:53+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -11389,7 +11511,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11402,21 +11524,25 @@
                 "authorize",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-authorize/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-authorize"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/authorize"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authtwitter",
-            "version": "v0.9.1",
-            "version_normalized": "0.9.1.0",
+            "version": "v0.9.3",
+            "version_normalized": "0.9.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authtwitter.git",
-                "reference": "29a15e58061222632fea9eb2c807aef5e2c0d54a"
+                "reference": "6e178e7aae7827a64dc462b5bb2f28d6eddc4381"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authtwitter/zipball/29a15e58061222632fea9eb2c807aef5e2c0d54a",
-                "reference": "29a15e58061222632fea9eb2c807aef5e2c0d54a",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authtwitter/zipball/6e178e7aae7827a64dc462b5bb2f28d6eddc4381",
+                "reference": "6e178e7aae7827a64dc462b5bb2f28d6eddc4381",
                 "shasum": ""
             },
             "require": {
@@ -11426,9 +11552,10 @@
             },
             "require-dev": {
                 "phpunit/phpunit": "~4.8.35",
-                "simplesamlphp/simplesamlphp": "^1.17"
+                "simplesamlphp/simplesamlphp": "^1.17",
+                "webmozart/assert": "<1.7"
             },
-            "time": "2019-12-03T09:00:09+00:00",
+            "time": "2022-01-03T23:01:48+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -11438,7 +11565,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11455,6 +11582,10 @@
                 "simplesamlphp",
                 "twitter"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-authtwitter/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-authtwitter"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/authtwitter"
         },
         {
@@ -11513,17 +11644,17 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authx509",
-            "version": "v0.9.8",
-            "version_normalized": "0.9.8.0",
+            "version": "v0.9.9",
+            "version_normalized": "0.9.9.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authX509.git",
-                "reference": "66525b1ec4145ec8d0d0e9db4534624b6be4c1fb"
+                "reference": "b138f41b2bc725371f42abb63b5a39ac11b5432a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authX509/zipball/66525b1ec4145ec8d0d0e9db4534624b6be4c1fb",
-                "reference": "66525b1ec4145ec8d0d0e9db4534624b6be4c1fb",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authX509/zipball/b138f41b2bc725371f42abb63b5a39ac11b5432a",
+                "reference": "b138f41b2bc725371f42abb63b5a39ac11b5432a",
                 "shasum": ""
             },
             "require": {
@@ -11535,7 +11666,7 @@
                 "simplesamlphp/simplesamlphp": "^1.17",
                 "simplesamlphp/simplesamlphp-test-framework": "^0.0.15"
             },
-            "time": "2020-12-15T23:06:47+00:00",
+            "time": "2022-01-06T19:02:38+00:00",
             "type": "simplesamlphp-module",
             "extra": {
                 "ssp-mixedcase-module-name": "authX509"
@@ -11565,21 +11696,25 @@
                 "simplesamlphp",
                 "x509"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-authx509/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-authx509"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/authX509"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authyubikey",
-            "version": "v0.9.1",
-            "version_normalized": "0.9.1.0",
+            "version": "v0.9.3",
+            "version_normalized": "0.9.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authyubikey.git",
-                "reference": "8c27bfeb4981d2e6fa40a831e945f40c5a4ad3d2"
+                "reference": "414e2a73da4adfee6d97ba66e852ec7c85369913"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authyubikey/zipball/8c27bfeb4981d2e6fa40a831e945f40c5a4ad3d2",
-                "reference": "8c27bfeb4981d2e6fa40a831e945f40c5a4ad3d2",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authyubikey/zipball/414e2a73da4adfee6d97ba66e852ec7c85369913",
+                "reference": "414e2a73da4adfee6d97ba66e852ec7c85369913",
                 "shasum": ""
             },
             "require": {
@@ -11591,10 +11726,10 @@
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17"
             },
-            "time": "2019-12-03T08:52:49+00:00",
+            "time": "2022-01-06T19:07:32+00:00",
             "type": "simplesamlphp-module",
             "extra": {
-                "ssp-mixedcase-module-name": "authYubikey"
+                "ssp-mixedcase-module-name": "authYubiKey"
             },
             "installation-source": "dist",
             "autoload": {
@@ -11604,7 +11739,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11621,7 +11756,7 @@
                 "issues": "https://github.com/tvdijen/simplesamlphp-module-authyubikey/issues",
                 "source": "https://github.com/tvdijen/simplesamlphp-module-authyubikey"
             },
-            "install-path": "../simplesamlphp/simplesamlphp/modules/authYubikey"
+            "install-path": "../simplesamlphp/simplesamlphp/modules/authYubiKey"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-cas",
@@ -11675,17 +11810,17 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-cdc",
-            "version": "v0.9.1",
-            "version_normalized": "0.9.1.0",
+            "version": "v0.9.2",
+            "version_normalized": "0.9.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-cdc.git",
-                "reference": "16a5bfac7299e04e5feb472af328e07598708166"
+                "reference": "92498fc3004c02849d96da29ca472d99ed23af73"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-cdc/zipball/16a5bfac7299e04e5feb472af328e07598708166",
-                "reference": "16a5bfac7299e04e5feb472af328e07598708166",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-cdc/zipball/92498fc3004c02849d96da29ca472d99ed23af73",
+                "reference": "92498fc3004c02849d96da29ca472d99ed23af73",
                 "shasum": ""
             },
             "require": {
@@ -11693,9 +11828,10 @@
             },
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17"
+                "simplesamlphp/simplesamlphp": "^1.17",
+                "webmozart/assert": "<1.7"
             },
-            "time": "2019-12-03T09:04:11+00:00",
+            "time": "2022-01-06T19:27:16+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -11705,7 +11841,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11723,21 +11859,25 @@
                 "cdc",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-cdc/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-cdc/"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/cdc"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-consent",
-            "version": "v0.9.6",
-            "version_normalized": "0.9.6.0",
+            "version": "v0.9.8",
+            "version_normalized": "0.9.8.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-consent.git",
-                "reference": "2f84d15e96afb5a32b6d1cff93370f501ca7867d"
+                "reference": "8466b0b7c6207b15ca5e265f436299ff2dec85da"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consent/zipball/2f84d15e96afb5a32b6d1cff93370f501ca7867d",
-                "reference": "2f84d15e96afb5a32b6d1cff93370f501ca7867d",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consent/zipball/8466b0b7c6207b15ca5e265f436299ff2dec85da",
+                "reference": "8466b0b7c6207b15ca5e265f436299ff2dec85da",
                 "shasum": ""
             },
             "require": {
@@ -11747,9 +11887,9 @@
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17",
-                "webmozart/assert": "<1.7"
+                "webmozart/assert": "<1.6"
             },
-            "time": "2020-06-15T14:26:23+00:00",
+            "time": "2022-01-06T19:17:22+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -11772,21 +11912,25 @@
                 "consent",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-consent/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-consent"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/consent"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-consentadmin",
-            "version": "v0.9.1",
-            "version_normalized": "0.9.1.0",
+            "version": "v0.9.2",
+            "version_normalized": "0.9.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin.git",
-                "reference": "466e8d0d751f0080162d78e63ab2e125b24d17a1"
+                "reference": "62dc5e9d5b1a12a73549c80140b7224d7f7d1c2e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consentadmin/zipball/466e8d0d751f0080162d78e63ab2e125b24d17a1",
-                "reference": "466e8d0d751f0080162d78e63ab2e125b24d17a1",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consentadmin/zipball/62dc5e9d5b1a12a73549c80140b7224d7f7d1c2e",
+                "reference": "62dc5e9d5b1a12a73549c80140b7224d7f7d1c2e",
                 "shasum": ""
             },
             "require": {
@@ -11799,7 +11943,7 @@
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17"
             },
-            "time": "2019-12-03T09:06:40+00:00",
+            "time": "2022-01-06T19:19:38+00:00",
             "type": "simplesamlphp-module",
             "extra": {
                 "ssp-mixedcase-module-name": "consentAdmin"
@@ -11807,7 +11951,7 @@
             "installation-source": "dist",
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11824,33 +11968,36 @@
                 "consentadmin",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/consentAdmin"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-discopower",
-            "version": "v0.9.3",
-            "version_normalized": "0.9.3.0",
+            "version": "v0.10.1",
+            "version_normalized": "0.10.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-discopower.git",
-                "reference": "c892926e8186d0a2c638f7032dfc30540c1f92fb"
+                "reference": "4cb6b7c648b455586903b8932a171397375b50b0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-discopower/zipball/c892926e8186d0a2c638f7032dfc30540c1f92fb",
-                "reference": "c892926e8186d0a2c638f7032dfc30540c1f92fb",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-discopower/zipball/4cb6b7c648b455586903b8932a171397375b50b0",
+                "reference": "4cb6b7c648b455586903b8932a171397375b50b0",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
-                "simplesamlphp/composer-module-installer": "~1.1",
-                "webmozart/assert": "~1.4 <1.6"
+                "php": ">=7.1",
+                "simplesamlphp/composer-module-installer": "~1.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17"
+                "simplesamlphp/simplesamlphp": "^1.19",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.1.2"
             },
-            "time": "2019-12-13T07:51:43+00:00",
+            "time": "2021-08-17T14:29:22+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -11860,7 +12007,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11874,6 +12021,10 @@
                 "discovery",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-discopower/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-discopower"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/discopower"
         },
         {
@@ -11926,29 +12077,28 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-expirycheck",
-            "version": "v0.9.3",
-            "version_normalized": "0.9.3.0",
+            "version": "v0.9.4",
+            "version_normalized": "0.9.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-expirycheck.git",
-                "reference": "59c59cdf87e2679257b46c07bb4c27666a11cc20"
+                "reference": "02101497281031befba93c48c96ee9133f57241d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-expirycheck/zipball/59c59cdf87e2679257b46c07bb4c27666a11cc20",
-                "reference": "59c59cdf87e2679257b46c07bb4c27666a11cc20",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-expirycheck/zipball/02101497281031befba93c48c96ee9133f57241d",
+                "reference": "02101497281031befba93c48c96ee9133f57241d",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.6",
-                "simplesamlphp/composer-module-installer": "~1.1",
-                "webmozart/assert": "~1.4"
+                "simplesamlphp/composer-module-installer": "~1.1"
             },
             "require-dev": {
-                "simplesamlphp/simplesamlphp": "^1.17",
-                "simplesamlphp/simplesamlphp-test-framework": "^0.0.10"
+                "phpunit/phpunit": "~5.7",
+                "simplesamlphp/simplesamlphp": "^1.17"
             },
-            "time": "2019-12-14T13:20:46+00:00",
+            "time": "2022-01-06T21:16:01+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -11958,7 +12108,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -11971,21 +12121,25 @@
                 "expirycheck",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-expirycheck/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-expirycheck"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/expirycheck"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-ldap",
-            "version": "v0.9.10",
-            "version_normalized": "0.9.10.0",
+            "version": "v0.9.17",
+            "version_normalized": "0.9.17.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-ldap.git",
-                "reference": "78f04cbe41bfb9dcbcdeff4b5f12e67c060e1a77"
+                "reference": "40f1bfe0c4ac2f91cf8e52d22fa6ec2fe1c03066"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-ldap/zipball/78f04cbe41bfb9dcbcdeff4b5f12e67c060e1a77",
-                "reference": "78f04cbe41bfb9dcbcdeff4b5f12e67c060e1a77",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-ldap/zipball/40f1bfe0c4ac2f91cf8e52d22fa6ec2fe1c03066",
+                "reference": "40f1bfe0c4ac2f91cf8e52d22fa6ec2fe1c03066",
                 "shasum": ""
             },
             "require": {
@@ -11999,7 +12153,7 @@
             "suggest": {
                 "ext-ldap": "Needed when using LDAP authentication in SimpleSAMLphp"
             },
-            "time": "2020-09-16T21:09:07+00:00",
+            "time": "2022-01-11T12:50:47+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -12026,21 +12180,25 @@
                 "ldap",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-ldap/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-ldap"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/ldap"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-memcachemonitor",
-            "version": "v0.9.2",
-            "version_normalized": "0.9.2.0",
+            "version": "v0.9.3",
+            "version_normalized": "0.9.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-memcachemonitor.git",
-                "reference": "900b5c6b59913d9013b8dae090841a127ae55ae5"
+                "reference": "8d25463ac56b4e2294f59f622a6658e0c67086f4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-memcachemonitor/zipball/900b5c6b59913d9013b8dae090841a127ae55ae5",
-                "reference": "900b5c6b59913d9013b8dae090841a127ae55ae5",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-memcachemonitor/zipball/8d25463ac56b4e2294f59f622a6658e0c67086f4",
+                "reference": "8d25463ac56b4e2294f59f622a6658e0c67086f4",
                 "shasum": ""
             },
             "require": {
@@ -12051,7 +12209,7 @@
                 "simplesamlphp/simplesamlphp": "^1.17",
                 "simplesamlphp/simplesamlphp-test-framework": "~0.0.6"
             },
-            "time": "2021-01-25T15:44:44+00:00",
+            "time": "2022-01-06T22:37:15+00:00",
             "type": "simplesamlphp-module",
             "extra": {
                 "ssp-mixedcase-module-name": "memcacheMonitor"
@@ -12076,6 +12234,10 @@
                 "memcachemonitor",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-memcachemonitor/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-memcachemonitor"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/memcacheMonitor"
         },
         {
@@ -12131,17 +12293,17 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-metarefresh",
-            "version": "v0.9.6",
-            "version_normalized": "0.9.6.0",
+            "version": "v0.10.0",
+            "version_normalized": "0.10.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-metarefresh.git",
-                "reference": "e284306a7097297765b5b78a4e28f19f18d4e001"
+                "reference": "488d7809857c274befac89facfa03520a05bc1ba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-metarefresh/zipball/e284306a7097297765b5b78a4e28f19f18d4e001",
-                "reference": "e284306a7097297765b5b78a4e28f19f18d4e001",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-metarefresh/zipball/488d7809857c274befac89facfa03520a05bc1ba",
+                "reference": "488d7809857c274befac89facfa03520a05bc1ba",
                 "shasum": ""
             },
             "require": {
@@ -12152,7 +12314,7 @@
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.18"
             },
-            "time": "2020-07-31T14:43:37+00:00",
+            "time": "2022-05-03T08:57:30+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -12175,21 +12337,25 @@
                 "metarefresh",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-metarefresh/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-metarefresh"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/metarefresh"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-negotiate",
-            "version": "v0.9.10",
-            "version_normalized": "0.9.10.0",
+            "version": "v0.9.12",
+            "version_normalized": "0.9.12.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate.git",
-                "reference": "db05ff40399c66e3f14697a8162da6b2fbdab47d"
+                "reference": "48752cea80e81a60ebb522cc10789589ac16df50"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-negotiate/zipball/db05ff40399c66e3f14697a8162da6b2fbdab47d",
-                "reference": "db05ff40399c66e3f14697a8162da6b2fbdab47d",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-negotiate/zipball/48752cea80e81a60ebb522cc10789589ac16df50",
+                "reference": "48752cea80e81a60ebb522cc10789589ac16df50",
                 "shasum": ""
             },
             "require": {
@@ -12208,7 +12374,7 @@
             "suggest": {
                 "ext-krb5": "Needed in case the SimpleSAMLphp negotiate module is used"
             },
-            "time": "2021-01-22T13:36:09+00:00",
+            "time": "2022-01-03T23:18:27+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -12231,21 +12397,25 @@
                 "negotiate",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/negotiate"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-oauth",
-            "version": "v0.9.2",
-            "version_normalized": "0.9.2.0",
+            "version": "v0.9.3",
+            "version_normalized": "0.9.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-oauth.git",
-                "reference": "d14d7aca6e699ec12b3f4dd0128373faa1a2cc61"
+                "reference": "2a2433144dca408315e4ee163f9ab73a6110b2b1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-oauth/zipball/d14d7aca6e699ec12b3f4dd0128373faa1a2cc61",
-                "reference": "d14d7aca6e699ec12b3f4dd0128373faa1a2cc61",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-oauth/zipball/2a2433144dca408315e4ee163f9ab73a6110b2b1",
+                "reference": "2a2433144dca408315e4ee163f9ab73a6110b2b1",
                 "shasum": ""
             },
             "require": {
@@ -12255,9 +12425,14 @@
                 "phpunit/phpunit": "~4.8.36",
                 "simplesamlphp/simplesamlphp": "^1.17"
             },
-            "time": "2020-04-29T19:37:43+00:00",
+            "time": "2021-08-31T18:55:00+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "SimpleSAML\\Module\\oauth\\": "lib/"
+                }
+            },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
                 "LGPL-2.1-or-later"
@@ -12278,33 +12453,38 @@
                 "oauth1",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-oauth/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-oauth/"
+            },
+            "abandoned": true,
             "install-path": "../simplesamlphp/simplesamlphp/modules/oauth"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-preprodwarning",
-            "version": "v0.9.2",
-            "version_normalized": "0.9.2.0",
+            "version": "v0.9.3",
+            "version_normalized": "0.9.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning.git",
-                "reference": "8e032de33a75eb44857dc06d886ad94ee3af4638"
+                "reference": "b3c6d9d41d009e340f4843ce5c24b4118a38e4c3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-preprodwarning/zipball/8e032de33a75eb44857dc06d886ad94ee3af4638",
-                "reference": "8e032de33a75eb44857dc06d886ad94ee3af4638",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-preprodwarning/zipball/b3c6d9d41d009e340f4843ce5c24b4118a38e4c3",
+                "reference": "b3c6d9d41d009e340f4843ce5c24b4118a38e4c3",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
+                "php": ">=7.0",
                 "simplesamlphp/composer-module-installer": "~1.1"
             },
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17",
+                "simplesamlphp/simplesamlphp": "dev-simplesamlphp-1.19",
                 "webmozart/assert": "^1.4"
             },
-            "time": "2020-04-09T13:05:27+00:00",
+            "time": "2022-01-06T23:21:17+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -12327,21 +12507,25 @@
                 "preprodwarning",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/preprodwarning"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-radius",
-            "version": "v0.9.3",
-            "version_normalized": "0.9.3.0",
+            "version": "v0.9.4",
+            "version_normalized": "0.9.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-radius.git",
-                "reference": "36bd0f39f9a13f7eb96ead97c97c3634aa1c3f2d"
+                "reference": "dbe2976ba27f5131faeca368a5665f8baeaae8b6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-radius/zipball/36bd0f39f9a13f7eb96ead97c97c3634aa1c3f2d",
-                "reference": "36bd0f39f9a13f7eb96ead97c97c3634aa1c3f2d",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-radius/zipball/dbe2976ba27f5131faeca368a5665f8baeaae8b6",
+                "reference": "dbe2976ba27f5131faeca368a5665f8baeaae8b6",
                 "shasum": ""
             },
             "require": {
@@ -12353,7 +12537,7 @@
                 "simplesamlphp/simplesamlphp": "^1.17",
                 "simplesamlphp/simplesamlphp-test-framework": "^0.0.7"
             },
-            "time": "2019-10-03T18:13:07+00:00",
+            "time": "2022-01-06T23:23:28+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -12363,7 +12547,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -12376,6 +12560,10 @@
                 "radius",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-radius/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-radius"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/radius"
         },
         {
@@ -12478,17 +12666,17 @@
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-smartattributes",
-            "version": "v0.9.1",
-            "version_normalized": "0.9.1.0",
+            "version": "v0.9.2",
+            "version_normalized": "0.9.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-smartattributes.git",
-                "reference": "b45d3ecd916e359a9cae05f9ae9df09b5c42f4e6"
+                "reference": "ba6a32fa287db0f8d767104471176f70fad7f0e1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-smartattributes/zipball/b45d3ecd916e359a9cae05f9ae9df09b5c42f4e6",
-                "reference": "b45d3ecd916e359a9cae05f9ae9df09b5c42f4e6",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-smartattributes/zipball/ba6a32fa287db0f8d767104471176f70fad7f0e1",
+                "reference": "ba6a32fa287db0f8d767104471176f70fad7f0e1",
                 "shasum": ""
             },
             "require": {
@@ -12499,7 +12687,7 @@
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17"
             },
-            "time": "2019-12-03T09:24:09+00:00",
+            "time": "2022-01-06T23:42:07+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -12509,7 +12697,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -12522,21 +12710,25 @@
                 "simplesamlphp",
                 "smartattributes"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-smartattributes/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-smartattributes"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/smartattributes"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-sqlauth",
-            "version": "v0.9.1",
-            "version_normalized": "0.9.1.0",
+            "version": "v0.9.4",
+            "version_normalized": "0.9.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-sqlauth.git",
-                "reference": "31bce8763ad97f4b4473e4ad4a5a96ddc136ef6b"
+                "reference": "8a28f9a9726bab1dbc8fd3734daa08882dd0a25b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-sqlauth/zipball/31bce8763ad97f4b4473e4ad4a5a96ddc136ef6b",
-                "reference": "31bce8763ad97f4b4473e4ad4a5a96ddc136ef6b",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-sqlauth/zipball/8a28f9a9726bab1dbc8fd3734daa08882dd0a25b",
+                "reference": "8a28f9a9726bab1dbc8fd3734daa08882dd0a25b",
                 "shasum": ""
             },
             "require": {
@@ -12546,9 +12738,9 @@
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17",
-                "webmozart/assert": "^1.4"
+                "webmozart/assert": "^1.4 <1.7"
             },
-            "time": "2019-12-03T09:07:09+00:00",
+            "time": "2022-01-06T23:50:52+00:00",
             "type": "simplesamlphp-module",
             "installation-source": "dist",
             "autoload": {
@@ -12558,7 +12750,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -12571,6 +12763,10 @@
                 "simplesamlphp",
                 "sqlauth"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-sqlauth/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-sqlauth"
+            },
             "install-path": "../simplesamlphp/simplesamlphp/modules/sqlauth"
         },
         {
@@ -12849,25 +13045,208 @@
             },
             "install-path": "../symfony-cmf/routing"
         },
+        {
+            "name": "symfony/cache",
+            "version": "v5.4.11",
+            "version_normalized": "5.4.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache.git",
+                "reference": "5a0fff46df349f0db3fe242263451fddf5277362"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache/zipball/5a0fff46df349f0db3fe242263451fddf5277362",
+                "reference": "5a0fff46df349f0db3fe242263451fddf5277362",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/cache": "^1.0|^2.0",
+                "psr/log": "^1.1|^2|^3",
+                "symfony/cache-contracts": "^1.1.7|^2",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-php73": "^1.9",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.1|^2|^3",
+                "symfony/var-exporter": "^4.4|^5.0|^6.0"
+            },
+            "conflict": {
+                "doctrine/dbal": "<2.13.1",
+                "symfony/dependency-injection": "<4.4",
+                "symfony/http-kernel": "<4.4",
+                "symfony/var-dumper": "<4.4"
+            },
+            "provide": {
+                "psr/cache-implementation": "1.0|2.0",
+                "psr/simple-cache-implementation": "1.0|2.0",
+                "symfony/cache-implementation": "1.0|2.0"
+            },
+            "require-dev": {
+                "cache/integration-tests": "dev-master",
+                "doctrine/cache": "^1.6|^2.0",
+                "doctrine/dbal": "^2.13.1|^3.0",
+                "predis/predis": "^1.1",
+                "psr/simple-cache": "^1.0|^2.0",
+                "symfony/config": "^4.4|^5.0|^6.0",
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+                "symfony/filesystem": "^4.4|^5.0|^6.0",
+                "symfony/http-kernel": "^4.4|^5.0|^6.0",
+                "symfony/messenger": "^4.4|^5.0|^6.0",
+                "symfony/var-dumper": "^4.4|^5.0|^6.0"
+            },
+            "time": "2022-07-28T15:25:17+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Cache\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "caching",
+                "psr6"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache/tree/v5.4.11"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "install-path": "../symfony/cache"
+        },
+        {
+            "name": "symfony/cache-contracts",
+            "version": "v2.5.2",
+            "version_normalized": "2.5.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache-contracts.git",
+                "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
+                "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/cache": "^1.0|^2.0|^3.0"
+            },
+            "suggest": {
+                "symfony/cache-implementation": ""
+            },
+            "time": "2022-01-02T09:53:40+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.5-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Cache\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to caching",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "install-path": "../symfony/cache-contracts"
+        },
         {
             "name": "symfony/config",
-            "version": "v4.4.25",
-            "version_normalized": "4.4.25.0",
+            "version": "v4.4.44",
+            "version_normalized": "4.4.44.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/config.git",
-                "reference": "2803882bb10353d277d4539635dd688a053d571c"
+                "reference": "ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/config/zipball/2803882bb10353d277d4539635dd688a053d571c",
-                "reference": "2803882bb10353d277d4539635dd688a053d571c",
+                "url": "https://api.github.com/repos/symfony/config/zipball/ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658",
+                "reference": "ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658",
                 "shasum": ""
             },
             "require": {
                 "php": ">=7.1.3",
                 "symfony/filesystem": "^3.4|^4.0|^5.0",
                 "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-php80": "^1.16",
                 "symfony/polyfill-php81": "^1.22"
             },
             "conflict": {
@@ -12883,7 +13262,7 @@
             "suggest": {
                 "symfony/yaml": "To use the yaml reference dumper"
             },
-            "time": "2021-05-26T11:20:16+00:00",
+            "time": "2022-07-20T09:59:04+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -12911,7 +13290,7 @@
             "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/config/tree/v4.4.25"
+                "source": "https://github.com/symfony/config/tree/v4.4.44"
             },
             "funding": [
                 {
@@ -13641,24 +14020,25 @@
         },
         {
             "name": "symfony/filesystem",
-            "version": "v4.4.25",
-            "version_normalized": "4.4.25.0",
+            "version": "v4.4.42",
+            "version_normalized": "4.4.42.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
-                "reference": "2d926ebd76f52352deb3c9577d8c1d4b96eae429"
+                "reference": "815412ee8971209bd4c1eecd5f4f481eacd44bf5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/2d926ebd76f52352deb3c9577d8c1d4b96eae429",
-                "reference": "2d926ebd76f52352deb3c9577d8c1d4b96eae429",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/815412ee8971209bd4c1eecd5f4f481eacd44bf5",
+                "reference": "815412ee8971209bd4c1eecd5f4f481eacd44bf5",
                 "shasum": ""
             },
             "require": {
                 "php": ">=7.1.3",
-                "symfony/polyfill-ctype": "~1.8"
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-php80": "^1.16"
             },
-            "time": "2021-05-26T17:30:55+00:00",
+            "time": "2022-05-20T08:49:14+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -13686,7 +14066,7 @@
             "description": "Provides basic utilities for the filesystem",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/filesystem/tree/v4.4.25"
+                "source": "https://github.com/symfony/filesystem/tree/v4.4.42"
             },
             "funding": [
                 {
@@ -13769,6 +14149,155 @@
             ],
             "install-path": "../symfony/finder"
         },
+        {
+            "name": "symfony/framework-bundle",
+            "version": "v4.4.45",
+            "version_normalized": "4.4.45.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/framework-bundle.git",
+                "reference": "bd7d15b5412d6414036cc5fd6c562202ceac9daf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/bd7d15b5412d6414036cc5fd6c562202ceac9daf",
+                "reference": "bd7d15b5412d6414036cc5fd6c562202ceac9daf",
+                "shasum": ""
+            },
+            "require": {
+                "ext-xml": "*",
+                "php": ">=7.1.3",
+                "symfony/cache": "^4.4|^5.0",
+                "symfony/config": "^4.4.11|~5.0.11|^5.1.3",
+                "symfony/dependency-injection": "^4.4.38|^5.0.1",
+                "symfony/error-handler": "^4.4.1|^5.0.1",
+                "symfony/filesystem": "^3.4|^4.0|^5.0",
+                "symfony/finder": "^3.4|^4.0|^5.0",
+                "symfony/http-foundation": "^4.4|^5.0",
+                "symfony/http-kernel": "^4.4",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/routing": "^4.4.12|^5.1.4"
+            },
+            "conflict": {
+                "doctrine/persistence": "<1.3",
+                "phpdocumentor/reflection-docblock": "<3.0|>=3.2.0,<3.2.2",
+                "phpdocumentor/type-resolver": "<0.3.0|1.3.*",
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+                "symfony/asset": "<3.4",
+                "symfony/browser-kit": "<4.3",
+                "symfony/console": "<4.4.21",
+                "symfony/dom-crawler": "<4.3",
+                "symfony/dotenv": "<4.3.6",
+                "symfony/form": "<4.3.5",
+                "symfony/http-client": "<4.4",
+                "symfony/lock": "<4.4",
+                "symfony/mailer": "<4.4",
+                "symfony/messenger": "<4.4",
+                "symfony/mime": "<4.4",
+                "symfony/property-info": "<3.4",
+                "symfony/security-bundle": "<4.4",
+                "symfony/serializer": "<4.4",
+                "symfony/stopwatch": "<3.4",
+                "symfony/translation": "<4.4",
+                "symfony/twig-bridge": "<4.1.1",
+                "symfony/twig-bundle": "<4.4",
+                "symfony/validator": "<4.4",
+                "symfony/web-profiler-bundle": "<4.4",
+                "symfony/workflow": "<4.3.6"
+            },
+            "require-dev": {
+                "doctrine/annotations": "^1.10.4",
+                "doctrine/cache": "^1.0|^2.0",
+                "doctrine/persistence": "^1.3|^2|^3",
+                "paragonie/sodium_compat": "^1.8",
+                "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+                "symfony/asset": "^3.4|^4.0|^5.0",
+                "symfony/browser-kit": "^4.3|^5.0",
+                "symfony/console": "^4.4.42|^5.4.9",
+                "symfony/css-selector": "^3.4|^4.0|^5.0",
+                "symfony/dom-crawler": "^4.4.30|^5.3.7",
+                "symfony/dotenv": "^4.3.6|^5.0",
+                "symfony/expression-language": "^3.4|^4.0|^5.0",
+                "symfony/form": "^4.3.5|^5.0",
+                "symfony/http-client": "^4.4|^5.0",
+                "symfony/lock": "^4.4|^5.0",
+                "symfony/mailer": "^4.4|^5.0",
+                "symfony/messenger": "^4.4|^5.0",
+                "symfony/mime": "^4.4|^5.0",
+                "symfony/polyfill-intl-icu": "~1.0",
+                "symfony/process": "^3.4|^4.0|^5.0",
+                "symfony/property-info": "^3.4|^4.0|^5.0",
+                "symfony/security-core": "^3.4|^4.4|^5.2",
+                "symfony/security-csrf": "^3.4|^4.0|^5.0",
+                "symfony/security-http": "^3.4|^4.0|^5.0",
+                "symfony/serializer": "^4.4|^5.0",
+                "symfony/stopwatch": "^3.4|^4.0|^5.0",
+                "symfony/templating": "^3.4|^4.0|^5.0",
+                "symfony/translation": "^4.4|^5.0",
+                "symfony/twig-bundle": "^4.4|^5.0",
+                "symfony/validator": "^4.4|^5.0",
+                "symfony/web-link": "^4.4|^5.0",
+                "symfony/workflow": "^4.3.6|^5.0",
+                "symfony/yaml": "^3.4|^4.0|^5.0",
+                "twig/twig": "^1.43|^2.13|^3.0.4"
+            },
+            "suggest": {
+                "ext-apcu": "For best performance of the system caches",
+                "symfony/console": "For using the console commands",
+                "symfony/form": "For using forms",
+                "symfony/property-info": "For using the property_info service",
+                "symfony/serializer": "For using the serializer service",
+                "symfony/validator": "For using validation",
+                "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering",
+                "symfony/yaml": "For using the debug:config and lint:yaml commands"
+            },
+            "time": "2022-08-26T05:59:54+00:00",
+            "type": "symfony-bundle",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bundle\\FrameworkBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/framework-bundle/tree/v4.4.45"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "install-path": "../symfony/framework-bundle"
+        },
         {
             "name": "symfony/http-client-contracts",
             "version": "v2.5.2",
@@ -15682,6 +16211,82 @@
             ],
             "install-path": "../symfony/var-dumper"
         },
+        {
+            "name": "symfony/var-exporter",
+            "version": "v5.4.10",
+            "version_normalized": "5.4.10.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-exporter.git",
+                "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8fc03ee75eeece3d9be1ef47d26d79bea1afb340",
+                "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "require-dev": {
+                "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0"
+            },
+            "time": "2022-05-27T12:56:18+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\VarExporter\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Allows exporting any serializable PHP data structure to plain PHP code",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "clone",
+                "construct",
+                "export",
+                "hydrate",
+                "instantiate",
+                "serialize"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/var-exporter/tree/v5.4.10"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "install-path": "../symfony/var-exporter"
+        },
         {
             "name": "symfony/yaml",
             "version": "v4.4.45",
@@ -16001,31 +16606,35 @@
         },
         {
             "name": "webmozart/assert",
-            "version": "1.5.0",
-            "version_normalized": "1.5.0.0",
+            "version": "1.11.0",
+            "version_normalized": "1.11.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/webmozarts/assert.git",
-                "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4"
+                "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/webmozarts/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4",
-                "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4",
+                "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+                "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.3.3 || ^7.0",
-                "symfony/polyfill-ctype": "^1.8"
+                "ext-ctype": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "conflict": {
+                "phpstan/phpstan": "<0.12.20",
+                "vimeo/psalm": "<4.6.1 || 4.6.2"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+                "phpunit/phpunit": "^8.5.13"
             },
-            "time": "2019-08-24T08:43:50+00:00",
+            "time": "2022-06-03T18:03:27+00:00",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.3-dev"
+                    "dev-master": "1.10-dev"
                 }
             },
             "installation-source": "dist",
@@ -16050,6 +16659,10 @@
                 "check",
                 "validate"
             ],
+            "support": {
+                "issues": "https://github.com/webmozarts/assert/issues",
+                "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+            },
             "install-path": "../webmozart/assert"
         },
         {
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index 7f12177093a69127f91e1a7137372de150ce3752..e249c708842324e838e1acf38581fbd0a808b608 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -3,7 +3,7 @@
         'name' => 'osu-asc-webservices/d8-upstream',
         'pretty_version' => 'dev-master',
         'version' => 'dev-master',
-        'reference' => '7f9bb121024eb250b3d84f6f2c746159cd992dbe',
+        'reference' => '2d7a5f4dab146b60ec7cc817a51373f9d98e5936',
         'type' => 'project',
         'install_path' => __DIR__ . '/../../',
         'aliases' => array(),
@@ -242,9 +242,9 @@
             'dev_requirement' => false,
         ),
         'doctrine/collections' => array(
-            'pretty_version' => '1.7.3',
-            'version' => '1.7.3.0',
-            'reference' => '09dde3eb237756190f2de738d3c97cff10a8407b',
+            'pretty_version' => '1.8.0',
+            'version' => '1.8.0.0',
+            'reference' => '2b44dd4cbca8b5744327de78bafef5945c7e7b5e',
             'type' => 'library',
             'install_path' => __DIR__ . '/../doctrine/collections',
             'aliases' => array(),
@@ -1181,9 +1181,9 @@
             'dev_requirement' => false,
         ),
         'drupal/simplesamlphp_auth' => array(
-            'pretty_version' => '3.2.0',
-            'version' => '3.2.0.0',
-            'reference' => '8.x-3.2',
+            'pretty_version' => '3.3.0',
+            'version' => '3.3.0.0',
+            'reference' => '8.x-3.3',
             'type' => 'drupal-module',
             'install_path' => __DIR__ . '/../../web/modules/simplesamlphp_auth',
             'aliases' => array(),
@@ -1415,18 +1415,18 @@
             'dev_requirement' => false,
         ),
         'gettext/gettext' => array(
-            'pretty_version' => 'v4.8.3',
-            'version' => '4.8.3.0',
-            'reference' => '57ff4fb16647e78e80a5909fe3c190f1c3110321',
+            'pretty_version' => '4.x-dev',
+            'version' => '4.9999999.9999999.9999999-dev',
+            'reference' => '3f7bc5ef23302a9059e64934f3d59e454516bec0',
             'type' => 'library',
             'install_path' => __DIR__ . '/../gettext/gettext',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'gettext/languages' => array(
-            'pretty_version' => '2.6.0',
-            'version' => '2.6.0.0',
-            'reference' => '38ea0482f649e0802e475f0ed19fa993bcb7a618',
+            'pretty_version' => '2.9.0',
+            'version' => '2.9.0.0',
+            'reference' => 'ed56dd2c7f4024cc953ed180d25f02f2640e3ffa',
             'type' => 'library',
             'install_path' => __DIR__ . '/../gettext/languages',
             'aliases' => array(),
@@ -1594,7 +1594,7 @@
         'osu-asc-webservices/d8-upstream' => array(
             'pretty_version' => 'dev-master',
             'version' => 'dev-master',
-            'reference' => '7f9bb121024eb250b3d84f6f2c746159cd992dbe',
+            'reference' => '2d7a5f4dab146b60ec7cc817a51373f9d98e5936',
             'type' => 'project',
             'install_path' => __DIR__ . '/../../',
             'aliases' => array(),
@@ -1655,9 +1655,9 @@
             'dev_requirement' => false,
         ),
         'phpmailer/phpmailer' => array(
-            'pretty_version' => 'v6.2.0',
-            'version' => '6.2.0.0',
-            'reference' => 'e38888a75c070304ca5514197d4847a59a5c853f',
+            'pretty_version' => 'v6.6.4',
+            'version' => '6.6.4.0',
+            'reference' => 'a94fdebaea6bd17f51be0c2373ab80d3d681269b',
             'type' => 'library',
             'install_path' => __DIR__ . '/../phpmailer/phpmailer',
             'aliases' => array(),
@@ -1672,6 +1672,12 @@
             'aliases' => array(),
             'dev_requirement' => false,
         ),
+        'psr/cache-implementation' => array(
+            'dev_requirement' => false,
+            'provided' => array(
+                0 => '1.0|2.0',
+            ),
+        ),
         'psr/container' => array(
             'pretty_version' => '1.1.1',
             'version' => '1.1.1.0',
@@ -1739,6 +1745,12 @@
                 0 => '1.0|2.0',
             ),
         ),
+        'psr/simple-cache-implementation' => array(
+            'dev_requirement' => false,
+            'provided' => array(
+                0 => '1.0|2.0',
+            ),
+        ),
         'psy/psysh' => array(
             'pretty_version' => 'v0.10.8',
             'version' => '0.10.8.0',
@@ -1784,6 +1796,15 @@
                 0 => '*',
             ),
         ),
+        'simplesamlphp/assert' => array(
+            'pretty_version' => 'v0.0.13',
+            'version' => '0.0.13.0',
+            'reference' => '5429921b320ca4f9d1844225884ac52f649ea1e3',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../simplesamlphp/assert',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
         'simplesamlphp/composer-module-installer' => array(
             'pretty_version' => 'v1.1.8',
             'version' => '1.1.8.0',
@@ -1794,36 +1815,36 @@
             'dev_requirement' => false,
         ),
         'simplesamlphp/saml2' => array(
-            'pretty_version' => 'v4.2.0',
-            'version' => '4.2.0.0',
-            'reference' => 'd4038b83be50ccd64ecdc0b7c68e66d63c899d2c',
+            'pretty_version' => 'v4.6.3',
+            'version' => '4.6.3.0',
+            'reference' => 'bfc9c79dd6b728a41d1de988f545f6e64728a51d',
             'type' => 'library',
             'install_path' => __DIR__ . '/../simplesamlphp/saml2',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp' => array(
-            'pretty_version' => 'v1.18.8',
-            'version' => '1.18.8.0',
-            'reference' => 'ebb6d15bb8e8b45504adc26fd3872073d1e5cd9b',
+            'pretty_version' => 'v1.19.6',
+            'version' => '1.19.6.0',
+            'reference' => '76a18dd3d0f64bfd1d249f713fb6eefc0b62a0f0',
             'type' => 'project',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-adfs' => array(
-            'pretty_version' => 'v0.9.6',
-            'version' => '0.9.6.0',
-            'reference' => '425e5ebbdd097c92fe5265a6b48d32a3095c7237',
+            'pretty_version' => 'v1.0.9',
+            'version' => '1.0.9.0',
+            'reference' => 'c47daabc262b7e14a76879015fd9db85319752ec',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/adfs',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-authcrypt' => array(
-            'pretty_version' => 'v0.9.3',
-            'version' => '0.9.3.0',
-            'reference' => '9a2c1a761e2d94394a4f2d3499fd6f0853899530',
+            'pretty_version' => 'v0.9.4',
+            'version' => '0.9.4.0',
+            'reference' => '62555123e61b11463be3cd7adb708562023cff28',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/authcrypt',
             'aliases' => array(),
@@ -1839,18 +1860,18 @@
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-authorize' => array(
-            'pretty_version' => 'v0.9.2',
-            'version' => '0.9.2.0',
-            'reference' => 'c2607a5252ee1256b50ce7795e35513b116998d4',
+            'pretty_version' => 'v0.9.4',
+            'version' => '0.9.4.0',
+            'reference' => '4c7ce4eaa54fc301f131c62e803fc843e4d88056',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/authorize',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-authtwitter' => array(
-            'pretty_version' => 'v0.9.1',
-            'version' => '0.9.1.0',
-            'reference' => '29a15e58061222632fea9eb2c807aef5e2c0d54a',
+            'pretty_version' => 'v0.9.3',
+            'version' => '0.9.3.0',
+            'reference' => '6e178e7aae7827a64dc462b5bb2f28d6eddc4381',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/authtwitter',
             'aliases' => array(),
@@ -1866,20 +1887,20 @@
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-authx509' => array(
-            'pretty_version' => 'v0.9.8',
-            'version' => '0.9.8.0',
-            'reference' => '66525b1ec4145ec8d0d0e9db4534624b6be4c1fb',
+            'pretty_version' => 'v0.9.9',
+            'version' => '0.9.9.0',
+            'reference' => 'b138f41b2bc725371f42abb63b5a39ac11b5432a',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/authX509',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-authyubikey' => array(
-            'pretty_version' => 'v0.9.1',
-            'version' => '0.9.1.0',
-            'reference' => '8c27bfeb4981d2e6fa40a831e945f40c5a4ad3d2',
+            'pretty_version' => 'v0.9.3',
+            'version' => '0.9.3.0',
+            'reference' => '414e2a73da4adfee6d97ba66e852ec7c85369913',
             'type' => 'simplesamlphp-module',
-            'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/authYubikey',
+            'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/authYubiKey',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
@@ -1893,36 +1914,36 @@
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-cdc' => array(
-            'pretty_version' => 'v0.9.1',
-            'version' => '0.9.1.0',
-            'reference' => '16a5bfac7299e04e5feb472af328e07598708166',
+            'pretty_version' => 'v0.9.2',
+            'version' => '0.9.2.0',
+            'reference' => '92498fc3004c02849d96da29ca472d99ed23af73',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/cdc',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-consent' => array(
-            'pretty_version' => 'v0.9.6',
-            'version' => '0.9.6.0',
-            'reference' => '2f84d15e96afb5a32b6d1cff93370f501ca7867d',
+            'pretty_version' => 'v0.9.8',
+            'version' => '0.9.8.0',
+            'reference' => '8466b0b7c6207b15ca5e265f436299ff2dec85da',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/consent',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-consentadmin' => array(
-            'pretty_version' => 'v0.9.1',
-            'version' => '0.9.1.0',
-            'reference' => '466e8d0d751f0080162d78e63ab2e125b24d17a1',
+            'pretty_version' => 'v0.9.2',
+            'version' => '0.9.2.0',
+            'reference' => '62dc5e9d5b1a12a73549c80140b7224d7f7d1c2e',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/consentAdmin',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-discopower' => array(
-            'pretty_version' => 'v0.9.3',
-            'version' => '0.9.3.0',
-            'reference' => 'c892926e8186d0a2c638f7032dfc30540c1f92fb',
+            'pretty_version' => 'v0.10.1',
+            'version' => '0.10.1.0',
+            'reference' => '4cb6b7c648b455586903b8932a171397375b50b0',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/discopower',
             'aliases' => array(),
@@ -1938,27 +1959,27 @@
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-expirycheck' => array(
-            'pretty_version' => 'v0.9.3',
-            'version' => '0.9.3.0',
-            'reference' => '59c59cdf87e2679257b46c07bb4c27666a11cc20',
+            'pretty_version' => 'v0.9.4',
+            'version' => '0.9.4.0',
+            'reference' => '02101497281031befba93c48c96ee9133f57241d',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/expirycheck',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-ldap' => array(
-            'pretty_version' => 'v0.9.10',
-            'version' => '0.9.10.0',
-            'reference' => '78f04cbe41bfb9dcbcdeff4b5f12e67c060e1a77',
+            'pretty_version' => 'v0.9.17',
+            'version' => '0.9.17.0',
+            'reference' => '40f1bfe0c4ac2f91cf8e52d22fa6ec2fe1c03066',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/ldap',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-memcachemonitor' => array(
-            'pretty_version' => 'v0.9.2',
-            'version' => '0.9.2.0',
-            'reference' => '900b5c6b59913d9013b8dae090841a127ae55ae5',
+            'pretty_version' => 'v0.9.3',
+            'version' => '0.9.3.0',
+            'reference' => '8d25463ac56b4e2294f59f622a6658e0c67086f4',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/memcacheMonitor',
             'aliases' => array(),
@@ -1974,45 +1995,45 @@
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-metarefresh' => array(
-            'pretty_version' => 'v0.9.6',
-            'version' => '0.9.6.0',
-            'reference' => 'e284306a7097297765b5b78a4e28f19f18d4e001',
+            'pretty_version' => 'v0.10.0',
+            'version' => '0.10.0.0',
+            'reference' => '488d7809857c274befac89facfa03520a05bc1ba',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/metarefresh',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-negotiate' => array(
-            'pretty_version' => 'v0.9.10',
-            'version' => '0.9.10.0',
-            'reference' => 'db05ff40399c66e3f14697a8162da6b2fbdab47d',
+            'pretty_version' => 'v0.9.12',
+            'version' => '0.9.12.0',
+            'reference' => '48752cea80e81a60ebb522cc10789589ac16df50',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/negotiate',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-oauth' => array(
-            'pretty_version' => 'v0.9.2',
-            'version' => '0.9.2.0',
-            'reference' => 'd14d7aca6e699ec12b3f4dd0128373faa1a2cc61',
+            'pretty_version' => 'v0.9.3',
+            'version' => '0.9.3.0',
+            'reference' => '2a2433144dca408315e4ee163f9ab73a6110b2b1',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/oauth',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-preprodwarning' => array(
-            'pretty_version' => 'v0.9.2',
-            'version' => '0.9.2.0',
-            'reference' => '8e032de33a75eb44857dc06d886ad94ee3af4638',
+            'pretty_version' => 'v0.9.3',
+            'version' => '0.9.3.0',
+            'reference' => 'b3c6d9d41d009e340f4843ce5c24b4118a38e4c3',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/preprodwarning',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-radius' => array(
-            'pretty_version' => 'v0.9.3',
-            'version' => '0.9.3.0',
-            'reference' => '36bd0f39f9a13f7eb96ead97c97c3634aa1c3f2d',
+            'pretty_version' => 'v0.9.4',
+            'version' => '0.9.4.0',
+            'reference' => 'dbe2976ba27f5131faeca368a5665f8baeaae8b6',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/radius',
             'aliases' => array(),
@@ -2037,18 +2058,18 @@
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-smartattributes' => array(
-            'pretty_version' => 'v0.9.1',
-            'version' => '0.9.1.0',
-            'reference' => 'b45d3ecd916e359a9cae05f9ae9df09b5c42f4e6',
+            'pretty_version' => 'v0.9.2',
+            'version' => '0.9.2.0',
+            'reference' => 'ba6a32fa287db0f8d767104471176f70fad7f0e1',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/smartattributes',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'simplesamlphp/simplesamlphp-module-sqlauth' => array(
-            'pretty_version' => 'v0.9.1',
-            'version' => '0.9.1.0',
-            'reference' => '31bce8763ad97f4b4473e4ad4a5a96ddc136ef6b',
+            'pretty_version' => 'v0.9.4',
+            'version' => '0.9.4.0',
+            'reference' => '8a28f9a9726bab1dbc8fd3734daa08882dd0a25b',
             'type' => 'simplesamlphp-module',
             'install_path' => __DIR__ . '/../simplesamlphp/simplesamlphp/modules/sqlauth',
             'aliases' => array(),
@@ -2099,10 +2120,34 @@
             'aliases' => array(),
             'dev_requirement' => false,
         ),
+        'symfony/cache' => array(
+            'pretty_version' => 'v5.4.11',
+            'version' => '5.4.11.0',
+            'reference' => '5a0fff46df349f0db3fe242263451fddf5277362',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/cache',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'symfony/cache-contracts' => array(
+            'pretty_version' => 'v2.5.2',
+            'version' => '2.5.2.0',
+            'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/cache-contracts',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'symfony/cache-implementation' => array(
+            'dev_requirement' => false,
+            'provided' => array(
+                0 => '1.0|2.0',
+            ),
+        ),
         'symfony/config' => array(
-            'pretty_version' => 'v4.4.25',
-            'version' => '4.4.25.0',
-            'reference' => '2803882bb10353d277d4539635dd688a053d571c',
+            'pretty_version' => 'v4.4.44',
+            'version' => '4.4.44.0',
+            'reference' => 'ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/config',
             'aliases' => array(),
@@ -2196,9 +2241,9 @@
             ),
         ),
         'symfony/filesystem' => array(
-            'pretty_version' => 'v4.4.25',
-            'version' => '4.4.25.0',
-            'reference' => '2d926ebd76f52352deb3c9577d8c1d4b96eae429',
+            'pretty_version' => 'v4.4.42',
+            'version' => '4.4.42.0',
+            'reference' => '815412ee8971209bd4c1eecd5f4f481eacd44bf5',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/filesystem',
             'aliases' => array(),
@@ -2213,6 +2258,15 @@
             'aliases' => array(),
             'dev_requirement' => false,
         ),
+        'symfony/framework-bundle' => array(
+            'pretty_version' => 'v4.4.45',
+            'version' => '4.4.45.0',
+            'reference' => 'bd7d15b5412d6414036cc5fd6c562202ceac9daf',
+            'type' => 'symfony-bundle',
+            'install_path' => __DIR__ . '/../symfony/framework-bundle',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
         'symfony/http-client-contracts' => array(
             'pretty_version' => 'v2.5.2',
             'version' => '2.5.2.0',
@@ -2423,6 +2477,15 @@
             'aliases' => array(),
             'dev_requirement' => false,
         ),
+        'symfony/var-exporter' => array(
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => '8fc03ee75eeece3d9be1ef47d26d79bea1afb340',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/var-exporter',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
         'symfony/yaml' => array(
             'pretty_version' => 'v4.4.45',
             'version' => '4.4.45.0',
@@ -2469,9 +2532,9 @@
             'dev_requirement' => false,
         ),
         'webmozart/assert' => array(
-            'pretty_version' => '1.5.0',
-            'version' => '1.5.0.0',
-            'reference' => '88e6d84706d09a236046d686bbea96f07b3a34f4',
+            'pretty_version' => '1.11.0',
+            'version' => '1.11.0.0',
+            'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991',
             'type' => 'library',
             'install_path' => __DIR__ . '/../webmozart/assert',
             'aliases' => array(),
diff --git a/vendor/doctrine/collections/docs/en/index.rst b/vendor/doctrine/collections/docs/en/index.rst
index 936f9efa3702573314f0610d2448ef3dec265de7..8ca97229b4a8fe9d44df4a87e9960a76425f2394 100644
--- a/vendor/doctrine/collections/docs/en/index.rst
+++ b/vendor/doctrine/collections/docs/en/index.rst
@@ -32,6 +32,11 @@ explicitly retrieve an iterator though ``getIterator()`` which can then be
 used to iterate over the collection. You can not rely on the internal iterator
 of the collection being at a certain position unless you explicitly positioned it before.
 
+Methods that do not alter the collection or have template types
+appearing in invariant or contravariant positions are not directly
+defined in ``Doctrine\Common\Collections\Collection``, but are inherited
+from the ``Doctrine\Common\Collections\ReadableCollection`` interface.
+
 The methods available on the interface are:
 
 add
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php
index 6b0743e03211bc566b07f5d9acb3eaf7df81fe94..baab4d599c569d40a87f53f5a60dd6a852d277d3 100644
--- a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php
@@ -61,6 +61,8 @@ public function clear()
 
     /**
      * {@inheritDoc}
+     *
+     * @template TMaybeContained
      */
     public function contains($element)
     {
@@ -260,6 +262,8 @@ public function partition(Closure $p)
 
     /**
      * {@inheritDoc}
+     *
+     * @template TMaybeContained
      */
     public function indexOf($element)
     {
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php
index 8637c9286b27f95664fcf9964945cd564c97febd..186f6ec4cc7780c9cdb6ccc6745f510f7c53b558 100644
--- a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php
@@ -231,6 +231,8 @@ public function containsKey($key)
 
     /**
      * {@inheritDoc}
+     *
+     * @template TMaybeContained
      */
     public function contains($element)
     {
@@ -253,6 +255,12 @@ public function exists(Closure $p)
 
     /**
      * {@inheritDoc}
+     *
+     * @psalm-param TMaybeContained $element
+     *
+     * @psalm-return (TMaybeContained is T ? TKey|false : false)
+     *
+     * @template TMaybeContained
      */
     public function indexOf($element)
     {
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php
index d3f2061ad5a6db2c50ac5d36931c5f4e0905a11b..fb091923c7fae3c1ab4081847e85f486e494e8e2 100644
--- a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php
@@ -4,8 +4,6 @@
 
 use ArrayAccess;
 use Closure;
-use Countable;
-use IteratorAggregate;
 
 /**
  * The missing (SPL) Collection/Array/OrderedMap interface.
@@ -26,10 +24,10 @@
  *
  * @psalm-template TKey of array-key
  * @psalm-template T
- * @template-extends IteratorAggregate<TKey, T>
+ * @template-extends ReadableCollection<TKey, T>
  * @template-extends ArrayAccess<TKey, T>
  */
-interface Collection extends Countable, IteratorAggregate, ArrayAccess
+interface Collection extends ReadableCollection, ArrayAccess
 {
     /**
      * Adds an element at the end of the collection.
@@ -48,24 +46,6 @@ public function add($element);
      */
     public function clear();
 
-    /**
-     * Checks whether an element is contained in the collection.
-     * This is an O(n) operation, where n is the size of the collection.
-     *
-     * @param mixed $element The element to search for.
-     * @psalm-param T $element
-     *
-     * @return bool TRUE if the collection contains the element, FALSE otherwise.
-     */
-    public function contains($element);
-
-    /**
-     * Checks whether the collection is empty (contains no elements).
-     *
-     * @return bool TRUE if the collection is empty, FALSE otherwise.
-     */
-    public function isEmpty();
-
     /**
      * Removes the element at the specified index from the collection.
      *
@@ -87,46 +67,6 @@ public function remove($key);
      */
     public function removeElement($element);
 
-    /**
-     * Checks whether the collection contains an element with the specified key/index.
-     *
-     * @param string|int $key The key/index to check for.
-     * @psalm-param TKey $key
-     *
-     * @return bool TRUE if the collection contains an element with the specified key/index,
-     *              FALSE otherwise.
-     */
-    public function containsKey($key);
-
-    /**
-     * Gets the element at the specified key/index.
-     *
-     * @param string|int $key The key/index of the element to retrieve.
-     * @psalm-param TKey $key
-     *
-     * @return mixed
-     * @psalm-return T|null
-     */
-    public function get($key);
-
-    /**
-     * Gets all keys/indices of the collection.
-     *
-     * @return int[]|string[] The keys/indices of the collection, in the order of the corresponding
-     *               elements in the collection.
-     * @psalm-return TKey[]
-     */
-    public function getKeys();
-
-    /**
-     * Gets all values of the collection.
-     *
-     * @return mixed[] The values of all elements in the collection, in the
-     *                 order they appear in the collection.
-     * @psalm-return list<T>
-     */
-    public function getValues();
-
     /**
      * Sets an element in the collection at the specified key/index.
      *
@@ -140,69 +80,7 @@ public function getValues();
     public function set($key, $value);
 
     /**
-     * Gets a native PHP array representation of the collection.
-     *
-     * @return mixed[]
-     * @psalm-return array<TKey,T>
-     */
-    public function toArray();
-
-    /**
-     * Sets the internal iterator to the first element in the collection and returns this element.
-     *
-     * @return mixed
-     * @psalm-return T|false
-     */
-    public function first();
-
-    /**
-     * Sets the internal iterator to the last element in the collection and returns this element.
-     *
-     * @return mixed
-     * @psalm-return T|false
-     */
-    public function last();
-
-    /**
-     * Gets the key/index of the element at the current iterator position.
-     *
-     * @return int|string|null
-     * @psalm-return TKey|null
-     */
-    public function key();
-
-    /**
-     * Gets the element of the collection at the current iterator position.
-     *
-     * @return mixed
-     * @psalm-return T|false
-     */
-    public function current();
-
-    /**
-     * Moves the internal iterator position to the next element and returns this element.
-     *
-     * @return mixed
-     * @psalm-return T|false
-     */
-    public function next();
-
-    /**
-     * Tests for the existence of an element that satisfies the given predicate.
-     *
-     * @param Closure $p The predicate.
-     * @psalm-param Closure(TKey, T):bool $p
-     *
-     * @return bool TRUE if the predicate is TRUE for at least one element, FALSE otherwise.
-     */
-    public function exists(Closure $p);
-
-    /**
-     * Returns all the elements of this collection that satisfy the predicate p.
-     * The order of the elements is preserved.
-     *
-     * @param Closure $p The predicate used for filtering.
-     * @psalm-param Closure(T):bool $p
+     * {@inheritdoc}
      *
      * @return Collection<mixed> A collection with the results of the filter operation.
      * @psalm-return Collection<TKey, T>
@@ -210,34 +88,7 @@ public function exists(Closure $p);
     public function filter(Closure $p);
 
     /**
-     * Tests whether the given predicate p holds for all elements of this collection.
-     *
-     * @param Closure $p The predicate.
-     * @psalm-param Closure(TKey, T):bool $p
-     *
-     * @return bool TRUE, if the predicate yields TRUE for all elements, FALSE otherwise.
-     */
-    public function forAll(Closure $p);
-
-    /**
-     * Applies the given function to each element in the collection and returns
-     * a new collection with the elements returned by the function.
-     *
-     * @psalm-param Closure(T):U $func
-     *
-     * @return Collection<mixed>
-     * @psalm-return Collection<TKey, U>
-     *
-     * @psalm-template U
-     */
-    public function map(Closure $func);
-
-    /**
-     * Partitions this collection in two collections according to a predicate.
-     * Keys are preserved in the resulting collections.
-     *
-     * @param Closure $p The predicate on which to partition.
-     * @psalm-param Closure(TKey, T):bool $p
+     * {@inheritdoc}
      *
      * @return Collection<mixed>[] An array with two elements. The first element contains the collection
      *                      of elements where the predicate returned TRUE, the second element
@@ -245,32 +96,4 @@ public function map(Closure $func);
      * @psalm-return array{0: Collection<TKey, T>, 1: Collection<TKey, T>}
      */
     public function partition(Closure $p);
-
-    /**
-     * Gets the index/key of a given element. The comparison of two elements is strict,
-     * that means not only the value but also the type must match.
-     * For objects this means reference equality.
-     *
-     * @param mixed $element The element to search for.
-     * @psalm-param T $element
-     *
-     * @return int|string|bool The key/index of the element or FALSE if the element was not found.
-     * @psalm-return TKey|false
-     */
-    public function indexOf($element);
-
-    /**
-     * Extracts a slice of $length elements starting at position $offset from the Collection.
-     *
-     * If $length is null it returns all elements from $offset to the end of the Collection.
-     * Keys have to be preserved by this method. Calling this method will only return the
-     * selected slice and NOT change the elements contained in the collection slice is called on.
-     *
-     * @param int      $offset The offset to start from.
-     * @param int|null $length The maximum number of elements to return, or null for no limit.
-     *
-     * @return mixed[]
-     * @psalm-return array<TKey,T>
-     */
-    public function slice($offset, $length = null);
 }
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ReadableCollection.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ReadableCollection.php
new file mode 100644
index 0000000000000000000000000000000000000000..44b374969c65a721a06ad528b0f3d00cdb159ac2
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ReadableCollection.php
@@ -0,0 +1,213 @@
+<?php
+
+namespace Doctrine\Common\Collections;
+
+use Closure;
+use Countable;
+use IteratorAggregate;
+
+/**
+ * @psalm-template TKey of array-key
+ * @template-covariant T
+ * @template-extends IteratorAggregate<TKey, T>
+ */
+interface ReadableCollection extends Countable, IteratorAggregate
+{
+    /**
+     * Checks whether an element is contained in the collection.
+     * This is an O(n) operation, where n is the size of the collection.
+     *
+     * @param mixed $element The element to search for.
+     * @psalm-param TMaybeContained $element
+     *
+     * @return bool TRUE if the collection contains the element, FALSE otherwise.
+     * @psalm-return (TMaybeContained is T ? bool : false)
+     *
+     * @template TMaybeContained
+     */
+    public function contains($element);
+
+    /**
+     * Checks whether the collection is empty (contains no elements).
+     *
+     * @return bool TRUE if the collection is empty, FALSE otherwise.
+     */
+    public function isEmpty();
+
+    /**
+     * Checks whether the collection contains an element with the specified key/index.
+     *
+     * @param string|int $key The key/index to check for.
+     * @psalm-param TKey $key
+     *
+     * @return bool TRUE if the collection contains an element with the specified key/index,
+     *              FALSE otherwise.
+     */
+    public function containsKey($key);
+
+    /**
+     * Gets the element at the specified key/index.
+     *
+     * @param string|int $key The key/index of the element to retrieve.
+     * @psalm-param TKey $key
+     *
+     * @return mixed
+     * @psalm-return T|null
+     */
+    public function get($key);
+
+    /**
+     * Gets all keys/indices of the collection.
+     *
+     * @return int[]|string[] The keys/indices of the collection, in the order of the corresponding
+     *               elements in the collection.
+     * @psalm-return list<TKey>
+     */
+    public function getKeys();
+
+    /**
+     * Gets all values of the collection.
+     *
+     * @return mixed[] The values of all elements in the collection, in the
+     *                 order they appear in the collection.
+     * @psalm-return list<T>
+     */
+    public function getValues();
+
+    /**
+     * Gets a native PHP array representation of the collection.
+     *
+     * @return mixed[]
+     * @psalm-return array<TKey,T>
+     */
+    public function toArray();
+
+    /**
+     * Sets the internal iterator to the first element in the collection and returns this element.
+     *
+     * @return mixed
+     * @psalm-return T|false
+     */
+    public function first();
+
+    /**
+     * Sets the internal iterator to the last element in the collection and returns this element.
+     *
+     * @return mixed
+     * @psalm-return T|false
+     */
+    public function last();
+
+    /**
+     * Gets the key/index of the element at the current iterator position.
+     *
+     * @return int|string|null
+     * @psalm-return TKey|null
+     */
+    public function key();
+
+    /**
+     * Gets the element of the collection at the current iterator position.
+     *
+     * @return mixed
+     * @psalm-return T|false
+     */
+    public function current();
+
+    /**
+     * Moves the internal iterator position to the next element and returns this element.
+     *
+     * @return mixed
+     * @psalm-return T|false
+     */
+    public function next();
+
+    /**
+     * Extracts a slice of $length elements starting at position $offset from the Collection.
+     *
+     * If $length is null it returns all elements from $offset to the end of the Collection.
+     * Keys have to be preserved by this method. Calling this method will only return the
+     * selected slice and NOT change the elements contained in the collection slice is called on.
+     *
+     * @param int      $offset The offset to start from.
+     * @param int|null $length The maximum number of elements to return, or null for no limit.
+     *
+     * @return mixed[]
+     * @psalm-return array<TKey,T>
+     */
+    public function slice($offset, $length = null);
+
+    /**
+     * Tests for the existence of an element that satisfies the given predicate.
+     *
+     * @param Closure $p The predicate.
+     * @psalm-param Closure(TKey, T):bool $p
+     *
+     * @return bool TRUE if the predicate is TRUE for at least one element, FALSE otherwise.
+     */
+    public function exists(Closure $p);
+
+    /**
+     * Returns all the elements of this collection that satisfy the predicate p.
+     * The order of the elements is preserved.
+     *
+     * @param Closure $p The predicate used for filtering.
+     * @psalm-param Closure(T):bool $p
+     *
+     * @return ReadableCollection<mixed> A collection with the results of the filter operation.
+     * @psalm-return ReadableCollection<TKey, T>
+     */
+    public function filter(Closure $p);
+
+    /**
+     * Applies the given function to each element in the collection and returns
+     * a new collection with the elements returned by the function.
+     *
+     * @psalm-param Closure(T):U $func
+     *
+     * @return Collection<mixed>
+     * @psalm-return Collection<TKey, U>
+     *
+     * @psalm-template U
+     */
+    public function map(Closure $func);
+
+    /**
+     * Partitions this collection in two collections according to a predicate.
+     * Keys are preserved in the resulting collections.
+     *
+     * @param Closure $p The predicate on which to partition.
+     * @psalm-param Closure(TKey, T):bool $p
+     *
+     * @return ReadableCollection<mixed>[] An array with two elements. The first element contains the collection
+     *                      of elements where the predicate returned TRUE, the second element
+     *                      contains the collection of elements where the predicate returned FALSE.
+     * @psalm-return array{0: ReadableCollection<TKey, T>, 1: ReadableCollection<TKey, T>}
+     */
+    public function partition(Closure $p);
+
+    /**
+     * Tests whether the given predicate p holds for all elements of this collection.
+     *
+     * @param Closure $p The predicate.
+     * @psalm-param Closure(TKey, T):bool $p
+     *
+     * @return bool TRUE, if the predicate yields TRUE for all elements, FALSE otherwise.
+     */
+    public function forAll(Closure $p);
+
+    /**
+     * Gets the index/key of a given element. The comparison of two elements is strict,
+     * that means not only the value but also the type must match.
+     * For objects this means reference equality.
+     *
+     * @param mixed $element The element to search for.
+     * @psalm-param TMaybeContained $element
+     *
+     * @return int|string|bool The key/index of the element or FALSE if the element was not found.
+     * @psalm-return (TMaybeContained is T ? TKey|false : false)
+     *
+     * @template TMaybeContained
+     */
+    public function indexOf($element);
+}
diff --git a/vendor/gettext/gettext/CHANGELOG.md b/vendor/gettext/gettext/CHANGELOG.md
index 054e8d8235a6b85f387754b94e30ceafef4272d8..4e3a5f5cae7f5866e4e5337884f3690f98950353 100644
--- a/vendor/gettext/gettext/CHANGELOG.md
+++ b/vendor/gettext/gettext/CHANGELOG.md
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 
 Previous releases are documented in [github releases](https://github.com/oscarotero/Gettext/releases)
 
+## [4.8.7] - 2022-08-02
+### Fixed
+- Suppress deprecation error on PHP 8.1 [#280]
+
+## [4.8.6] - 2021-10-19
+### Fixed
+- Parse PO files with multiline disabled entries [#274]
+
+## [4.8.5] - 2021-07-13
+### Fixed
+- Prevent adding the same translator comment to multiple functions [#271]
+
+## [4.8.4] - 2021-03-10
+### Fixed
+- PHP 8 compatibilty [#266]
+
 ## [4.8.3] - 2020-11-18
 ### Fixed
 - Blade extractor for Laravel8/Jetstream [#261]
@@ -109,7 +125,7 @@ Previous releases are documented in [github releases](https://github.com/oscarot
 ### Fixed
 - Improved the code style including php_codesniffer in development
 
-## 4.3.0 - 2017-03-04
+## [4.3.0] - 2017-03-04
 ### Added
 - Added support for named placeholders (using `strtr`). For example:
   ```php
@@ -160,7 +176,15 @@ Previous releases are documented in [github releases](https://github.com/oscarot
 [#238]: https://github.com/oscarotero/Gettext/issues/238
 [#242]: https://github.com/oscarotero/Gettext/issues/242
 [#261]: https://github.com/oscarotero/Gettext/issues/261
-
+[#266]: https://github.com/oscarotero/Gettext/issues/266
+[#271]: https://github.com/oscarotero/Gettext/issues/271
+[#274]: https://github.com/oscarotero/Gettext/issues/274
+[#280]: https://github.com/oscarotero/Gettext/issues/280
+
+[4.8.7]: https://github.com/oscarotero/Gettext/compare/v4.8.6...v4.8.7
+[4.8.6]: https://github.com/oscarotero/Gettext/compare/v4.8.5...v4.8.6
+[4.8.5]: https://github.com/oscarotero/Gettext/compare/v4.8.4...v4.8.5
+[4.8.4]: https://github.com/oscarotero/Gettext/compare/v4.8.3...v4.8.4
 [4.8.3]: https://github.com/oscarotero/Gettext/compare/v4.8.2...v4.8.3
 [4.8.2]: https://github.com/oscarotero/Gettext/compare/v4.8.1...v4.8.2
 [4.8.1]: https://github.com/oscarotero/Gettext/compare/v4.8.0...v4.8.1
@@ -176,3 +200,4 @@ Previous releases are documented in [github releases](https://github.com/oscarot
 [4.4.2]: https://github.com/oscarotero/Gettext/compare/v4.4.1...v4.4.2
 [4.4.1]: https://github.com/oscarotero/Gettext/compare/v4.4.0...v4.4.1
 [4.4.0]: https://github.com/oscarotero/Gettext/compare/v4.3.0...v4.4.0
+[4.3.0]: https://github.com/oscarotero/Gettext/releases/tag/v4.3.0
diff --git a/vendor/gettext/gettext/composer.json b/vendor/gettext/gettext/composer.json
index 24b5083d6a78258abd4754212713820cb38ec52d..5c5c2b5c44a810958296539a0385a3b0ce9ed496 100644
--- a/vendor/gettext/gettext/composer.json
+++ b/vendor/gettext/gettext/composer.json
@@ -22,7 +22,7 @@
         "gettext/languages": "^2.3"
     },
     "require-dev": {
-        "illuminate/view": "*",
+        "illuminate/view": "^5.0.x-dev",
         "twig/twig": "^1.31|^2.0",
         "twig/extensions": "*",
         "symfony/yaml": "~2",
diff --git a/vendor/gettext/gettext/src/Extractors/Po.php b/vendor/gettext/gettext/src/Extractors/Po.php
index a5ee56b88ea3762ae3323190fa53627a5be610bf..4343a792a72e84b14fc069bf62d6dcdcf912f7ab 100644
--- a/vendor/gettext/gettext/src/Extractors/Po.php
+++ b/vendor/gettext/gettext/src/Extractors/Po.php
@@ -162,15 +162,19 @@ public static function fromString($string, Translations $translations, array $op
     protected static function fixMultiLines($line, array $lines, &$i)
     {
         for ($j = $i, $t = count($lines); $j < $t; ++$j) {
-            if (substr($line, -1, 1) == '"'
-                && isset($lines[$j + 1])
-                && substr(trim($lines[$j + 1]), 0, 1) == '"'
-            ) {
-                $line = substr($line, 0, -1).substr(trim($lines[$j + 1]), 1);
-            } else {
-                $i = $j;
-                break;
+            if (substr($line, -1, 1) == '"' && isset($lines[$j + 1])) {
+                $nextLine = trim($lines[$j + 1]);
+                if (substr($nextLine, 0, 1) == '"') {
+                    $line = substr($line, 0, -1).substr($nextLine, 1);
+                    continue;
+                }
+                if (substr($nextLine, 0, 4) == '#~ "') {
+                    $line = substr($line, 0, -1).substr($nextLine, 4);
+                    continue;
+                }
             }
+            $i = $j;
+            break;
         }
 
         return $line;
diff --git a/vendor/gettext/gettext/src/Translations.php b/vendor/gettext/gettext/src/Translations.php
index ccf842818dee36bf78d00cad280782be25544d8d..c852fca5bb10a4a9d6120563c898f5fd953f4beb 100644
--- a/vendor/gettext/gettext/src/Translations.php
+++ b/vendor/gettext/gettext/src/Translations.php
@@ -215,6 +215,7 @@ public function __clone()
      *
      * @return Translation
      */
+    #[\ReturnTypeWillChange]
     public function offsetSet($index, $value)
     {
         if (!($value instanceof Translation)) {
diff --git a/vendor/gettext/gettext/src/Utils/FunctionsScanner.php b/vendor/gettext/gettext/src/Utils/FunctionsScanner.php
index 503c090f3ae9811f1be27bd0ec417ec5cfa7f2f5..8d2c3fdf6042e08e7c759841e8fc07eb21f8ab30 100644
--- a/vendor/gettext/gettext/src/Utils/FunctionsScanner.php
+++ b/vendor/gettext/gettext/src/Utils/FunctionsScanner.php
@@ -30,7 +30,7 @@ public function saveGettextFunctions($translations, array $options)
         $translations = is_array($translations) ? $translations : [$translations];
 
         /** @var Translations[] $translationByDomain [domain => translations, ..] */
-        $translationByDomain = array_reduce($translations, function (&$carry, Translations $translations) {
+        $translationByDomain = array_reduce($translations, function ($carry, Translations $translations) {
             $carry[$translations->getDomain()] = $translations;
             return $carry;
         }, []);
@@ -38,6 +38,15 @@ public function saveGettextFunctions($translations, array $options)
         $functions = $options['functions'];
         $file = $options['file'];
 
+        /**
+         * List of source code comments already associated with a function.
+         *
+         * Prevents associating the same comment to multiple functions.
+         *
+         * @var ParsedComment[] $commentsCache
+         */
+        $commentsCache = [];
+
         foreach ($this->getFunctions($options['constants']) as $function) {
             list($name, $line, $args) = $function;
 
@@ -78,8 +87,13 @@ public function saveGettextFunctions($translations, array $options)
             $translation->addReference($file, $line);
 
             if (isset($function[3])) {
+                /* @var ParsedComment $extractedComment */
                 foreach ($function[3] as $extractedComment) {
-                    $translation->addExtractedComment($extractedComment);
+                    if (in_array($extractedComment, $commentsCache, true)) {
+                        continue;
+                    }
+                    $translation->addExtractedComment($extractedComment->getComment());
+                    $commentsCache[] = $extractedComment;
                 }
             }
         }
diff --git a/vendor/gettext/gettext/src/Utils/ParsedFunction.php b/vendor/gettext/gettext/src/Utils/ParsedFunction.php
index 5c5aa8ea3a302b8a62c6e9960b717f1c6a14b481..2b1b21ddf936fca01b94399033075908e60dd3b6 100644
--- a/vendor/gettext/gettext/src/Utils/ParsedFunction.php
+++ b/vendor/gettext/gettext/src/Utils/ParsedFunction.php
@@ -45,7 +45,7 @@ class ParsedFunction
     /**
      * Extracted comments.
      *
-     * @var string[]|null
+     * @var ParsedComment[]|null
      */
     protected $comments;
 
@@ -112,7 +112,7 @@ public function addArgumentChunk($chunk)
     /**
      * Add a comment associated to this function.
      *
-     * @param string $comment
+     * @param ParsedComment $comment
      */
     public function addComment($comment)
     {
diff --git a/vendor/gettext/gettext/src/Utils/PhpFunctionsScanner.php b/vendor/gettext/gettext/src/Utils/PhpFunctionsScanner.php
index 01dc1f80176e6d7eeb1eef36b2cfabc1155297ca..af1b92b90f87ca2d67ad9fbac3738ab57bacbe2d 100644
--- a/vendor/gettext/gettext/src/Utils/PhpFunctionsScanner.php
+++ b/vendor/gettext/gettext/src/Utils/PhpFunctionsScanner.php
@@ -129,7 +129,7 @@ public function getFunctions(array $constants = [])
                                 $comment = $bufferComments[0];
 
                                 if ($comment->isRelatedWith($newFunction)) {
-                                    $newFunction->addComment($comment->getComment());
+                                    $newFunction->addComment($comment);
                                 }
                             }
 
@@ -148,7 +148,7 @@ public function getFunctions(array $constants = [])
 
                         // The comment is inside the function call.
                         if (isset($bufferFunctions[0])) {
-                            $bufferFunctions[0]->addComment($comment->getComment());
+                            $bufferFunctions[0]->addComment($comment);
                         }
                     }
                     break;
diff --git a/vendor/gettext/languages/bin/export-plural-rules b/vendor/gettext/languages/bin/export-plural-rules
index 0931ee5aca3a327a764c4b12a3bdb063964200ac..0389e2e68fc40330676c2672f66b5be4534932da 100755
--- a/vendor/gettext/languages/bin/export-plural-rules
+++ b/vendor/gettext/languages/bin/export-plural-rules
@@ -1,3 +1,4 @@
+#!/usr/bin/env php
 <?php
 
 use Gettext\Languages\Exporter\Exporter;
@@ -7,55 +8,12 @@ use Gettext\Languages\Language;
 // This is a really life-saving approach.
 error_reporting(E_ALL);
 set_error_handler(function ($errno, $errstr, $errfile, $errline) {
-    fprintf(STDERR, "${errstr}\nFile: ${errfile}\nLine: ${errline}\nCode: ${errno}\n");
-    die(5);
+    fwrite(STDERR, "{$errstr}\nFile: {$errfile}\nLine: {$errline}\nCode: {$errno}\n");
+    exit(5);
 });
 
 require_once dirname(__DIR__) . '/src/autoloader.php';
 
-// Parse the command line options
-Enviro::initialize();
-
-try {
-    if (isset(Enviro::$languages)) {
-        $languages = array();
-        foreach (Enviro::$languages as $languageId) {
-            $language = Language::getById($languageId);
-            if (!isset($language)) {
-                throw new Exception("Unable to find the language with id '${languageId}'");
-            }
-            $languages[] = $language;
-        }
-    } else {
-        $languages = Language::getAll();
-    }
-    if (Enviro::$reduce) {
-        $languages = Enviro::reduce($languages);
-    }
-    if (Enviro::$noExtraParenthesis) {
-        $languages = array_map(
-            function (Language $language) {
-                $language->formula = $language->buildFormula(true);
-
-                return $language;
-            },
-            $languages
-        );
-    }
-    if (isset(Enviro::$outputFilename)) {
-        echo call_user_func(array(Exporter::getExporterClassName(Enviro::$outputFormat), 'toFile'), $languages, Enviro::$outputFilename, array('us-ascii' => Enviro::$outputUSAscii));
-    } else {
-        echo call_user_func(array(Exporter::getExporterClassName(Enviro::$outputFormat), 'toString'), $languages, array('us-ascii' => Enviro::$outputUSAscii));
-    }
-} catch (Exception $x) {
-    fprintf(STDERR, $x->getMessage() . "\n");
-    fprintf(STDERR, "Trace:\n");
-    fprintf(STDERR, $x->getTraceAsString() . "\n");
-    die(4);
-}
-
-die(0);
-
 /**
  * Helper class to handle command line options.
  */
@@ -127,7 +85,7 @@ class Enviro
                         case '-h':
                         case '--help':
                             self::showSyntax();
-                            die(0);
+                            exit(0);
                         case '--us-ascii':
                             self::$outputUSAscii = true;
                             break;
@@ -146,9 +104,9 @@ class Enviro
                         default:
                             if (preg_match('/^--output=.+$/', $argLC)) {
                                 if (isset(self::$outputFilename)) {
-                                    fprintf(STDERR, "The output file name has been specified more than once!\n");
+                                    fwrite(STDERR, "The output file name has been specified more than once!\n");
                                     self::showSyntax();
-                                    die(3);
+                                    exit(3);
                                 }
                                 list(, self::$outputFilename) = explode('=', $arg, 2);
                                 self::$outputFilename = trim(self::$outputFilename);
@@ -162,15 +120,15 @@ class Enviro
                                 }
                             } elseif (isset($exporters[$argLC])) {
                                 if (isset(self::$outputFormat)) {
-                                    fprintf(STDERR, "The output format has been specified more than once!\n");
+                                    fwrite(STDERR, "The output format has been specified more than once!\n");
                                     self::showSyntax();
-                                    die(3);
+                                    exit(3);
                                 }
                                 self::$outputFormat = $argLC;
                             } else {
-                                fprintf(STDERR, "Unknown option: ${arg}\n");
+                                fwrite(STDERR, "Unknown option: {$arg}\n");
                                 self::showSyntax();
-                                die(2);
+                                exit(2);
                             }
                             break;
                     }
@@ -179,7 +137,7 @@ class Enviro
         }
         if (!isset(self::$outputFormat)) {
             self::showSyntax();
-            die(1);
+            exit(1);
         }
         if (isset(self::$languages)) {
             self::$languages = array_values(array_unique(self::$languages));
@@ -197,9 +155,11 @@ class Enviro
         $basename = basename(__FILE__);
         $exporters = array_keys(Exporter::getExporters(true));
         $exporterList = implode('|', $exporters);
-        fprintf(STDERR, <<<EOT
+        fwrite(
+            STDERR,
+            <<<EOT
 Syntax:
-    ${basename} [-h|--help] [--us-ascii] [--languages=<LanguageId>[,<LanguageId>,...]] [--reduce=yes|no] [--parenthesis=yes|no] [--output=<file name>] <${exporterList}>
+    {$basename} [-h|--help] [--us-ascii] [--languages=<LanguageId>[,<LanguageId>,...]] [--reduce=yes|no] [--parenthesis=yes|no] [--output=<file name>] <{$exporterList}>
 
 Where:
     --help
@@ -236,9 +196,9 @@ EOT
         );
         $len = max(array_map('strlen', $exporters));
         foreach ($exporters as $exporter) {
-            fprintf(STDERR, '    ' . str_pad($exporter, $len) . ': ' . Exporter::getExporterDescription($exporter) . "\n");
+            fwrite(STDERR, '    ' . str_pad($exporter, $len) . ': ' . Exporter::getExporterDescription($exporter) . "\n");
         }
-        fprintf(STDERR, "\n");
+        fwrite(STDERR, "\n");
     }
 
     /**
@@ -255,7 +215,7 @@ EOT
             foreach ($languages as $language) {
                 $chunks = explode('_', $language->id);
                 $compatibleFound = false;
-                if (count($chunks) === $numChunks) {
+                if ($numChunks === count($chunks)) {
                     $categoriesHash = serialize($language->categories);
                     $otherIds = array();
                     $otherIds[] = $chunks[0];
@@ -265,7 +225,7 @@ EOT
 
                     foreach ($languages as $check) {
                         foreach ($otherIds as $otherId) {
-                            if (($check->id === $otherId) && ($check->formula === $language->formula) && (serialize($check->categories) === $categoriesHash)) {
+                            if ($check->id === $otherId && $check->formula === $language->formula && $categoriesHash === serialize($check->categories)) {
                                 $compatibleFound = true;
                                 break;
                             }
@@ -285,3 +245,46 @@ EOT
         return $languages;
     }
 }
+
+// Parse the command line options
+Enviro::initialize();
+
+try {
+    if (isset(Enviro::$languages)) {
+        $languages = array();
+        foreach (Enviro::$languages as $languageId) {
+            $language = Language::getById($languageId);
+            if (!isset($language)) {
+                throw new Exception("Unable to find the language with id '{$languageId}'");
+            }
+            $languages[] = $language;
+        }
+    } else {
+        $languages = Language::getAll();
+    }
+    if (Enviro::$reduce) {
+        $languages = Enviro::reduce($languages);
+    }
+    if (Enviro::$noExtraParenthesis) {
+        $languages = array_map(
+            function (Language $language) {
+                $language->formula = $language->buildFormula(true);
+
+                return $language;
+            },
+            $languages
+        );
+    }
+    if (isset(Enviro::$outputFilename)) {
+        echo call_user_func(array(Exporter::getExporterClassName(Enviro::$outputFormat), 'toFile'), $languages, Enviro::$outputFilename, array('us-ascii' => Enviro::$outputUSAscii));
+    } else {
+        echo call_user_func(array(Exporter::getExporterClassName(Enviro::$outputFormat), 'toString'), $languages, array('us-ascii' => Enviro::$outputUSAscii));
+    }
+} catch (Exception $x) {
+    fwrite(STDERR, $x->getMessage() . "\n");
+    fwrite(STDERR, "Trace:\n");
+    fwrite(STDERR, $x->getTraceAsString() . "\n");
+    exit(4);
+}
+
+exit(0);
diff --git a/vendor/gettext/languages/composer.json b/vendor/gettext/languages/composer.json
index ae56958c395e8500f2e9b2b8c992e6688ff3c62a..2f914a4d569a500ec32d7aa4d1f642067c302411 100644
--- a/vendor/gettext/languages/composer.json
+++ b/vendor/gettext/languages/composer.json
@@ -40,13 +40,10 @@
         "php": ">=5.3"
     },
     "require-dev": {
-        "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4",
-        "friendsofphp/php-cs-fixer": "^2.16.0"
+        "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4"
     },
     "scripts": {
-        "test": "phpunit",
-        "cs-test": "php-cs-fixer fix --config=.php_cs.dist --path-mode=intersection --verbose --dry-run --diff",
-        "cs-fix": "php-cs-fixer fix --config=.php_cs.dist --path-mode=intersection"
+        "test": "phpunit"
     },
     "bin": [
         "bin/export-plural-rules"
diff --git a/vendor/gettext/languages/src/Category.php b/vendor/gettext/languages/src/Category.php
index 5f491a0d9df4790ed5976a3fb10dc85206ea3e2c..a3e5d3b85ed287e03c58ec6f39330bb462f5b776 100644
--- a/vendor/gettext/languages/src/Category.php
+++ b/vendor/gettext/languages/src/Category.php
@@ -42,15 +42,15 @@ public function __construct($cldrCategoryId, $cldrFormulaAndExamples)
     {
         $matches = array();
         if (!preg_match('/^pluralRule-count-(.+)$/', $cldrCategoryId, $matches)) {
-            throw new Exception("Invalid CLDR category: '${cldrCategoryId}'");
+            throw new Exception("Invalid CLDR category: '{$cldrCategoryId}'");
         }
         if (!in_array($matches[1], CldrData::$categories)) {
-            throw new Exception("Invalid CLDR category: '${cldrCategoryId}'");
+            throw new Exception("Invalid CLDR category: '{$cldrCategoryId}'");
         }
         $this->id = $matches[1];
         $cldrFormulaAndExamplesNormalized = trim(preg_replace('/\s+/', ' ', $cldrFormulaAndExamples));
         if (!preg_match('/^([^@]*)(?:@integer([^@]+))?(?:@decimal(?:[^@]+))?$/', $cldrFormulaAndExamplesNormalized, $matches)) {
-            throw new Exception("Invalid CLDR category rule: ${cldrFormulaAndExamples}");
+            throw new Exception("Invalid CLDR category rule: {$cldrFormulaAndExamples}");
         }
         $cldrFormula = trim($matches[1]);
         $s = isset($matches[2]) ? trim($matches[2]) : '';
@@ -58,7 +58,7 @@ public function __construct($cldrCategoryId, $cldrFormulaAndExamples)
         switch ($this->id) {
             case CldrData::OTHER_CATEGORY:
                 if ($cldrFormula !== '') {
-                    throw new Exception("The '" . CldrData::OTHER_CATEGORY . "' category should not have any formula, but it has '${cldrFormula}'");
+                    throw new Exception("The '" . CldrData::OTHER_CATEGORY . "' category should not have any formula, but it has '{$cldrFormula}'");
                 }
                 $this->formula = null;
                 break;
@@ -100,8 +100,8 @@ public static function expandExamples($examples)
             $examples = substr($examples, 0, strlen($examples) - strlen(', …'));
         }
         foreach (explode(',', str_replace(' ', '', $examples)) as $range) {
-            if (preg_match('/^\d+$/', $range)) {
-                $result[] = (int) $range;
+            if (preg_match('/^(?<num>\d+)((c|e)(?<exp>\d+))?$/', $range, $m)) {
+                $result[] = (int) (isset($m['exp']) ? ($m['num'] . str_repeat('0', (int) $m['exp'])) : $range);
             } elseif (preg_match('/^(\d+)~(\d+)$/', $range, $m)) {
                 $from = (int) $m[1];
                 $to = (int) $m[2];
@@ -112,11 +112,11 @@ public static function expandExamples($examples)
                 }
                 $result[] = $to;
             } else {
-                throw new Exception("Unhandled test range '${range}' in '${examples}'");
+                throw new Exception("Unhandled test range '{$range}' in '{$examples}'");
             }
         }
         if (empty($result)) {
-            throw new Exception("No test numbers from '${examples}'");
+            throw new Exception("No test numbers from '{$examples}'");
         }
 
         return $result;
diff --git a/vendor/gettext/languages/src/CldrData.php b/vendor/gettext/languages/src/CldrData.php
index 9218eca9748ab21f527ceacad911f18b2edcd478..9169a1daaa573a2f0407fe6c248a473a179753ae 100644
--- a/vendor/gettext/languages/src/CldrData.php
+++ b/vendor/gettext/languages/src/CldrData.php
@@ -309,6 +309,7 @@ private static function getData($key)
             );
             $knownMissingLanguages = array(
                 'guw' => 'Gun',
+                'hnj' => 'Mong Njua',
                 'nah' => 'Nahuatl',
                 'smi' => 'Sami',
             );
@@ -320,7 +321,7 @@ private static function getData($key)
                     if (isset($knownMissingLanguages[$missingLanguage])) {
                         $data['languages'][$missingLanguage] = $knownMissingLanguages[$missingLanguage];
                     } else {
-                        throw new Exception("We have the plural rule for the language '${missingLanguage}' but we don't have its language name");
+                        throw new Exception("We have the plural rule for the language '{$missingLanguage}' but we don't have its language name");
                     }
                 }
             }
@@ -333,7 +334,7 @@ private static function getData($key)
             self::$data = $data;
         }
         if (!isset(self::$data[$key])) {
-            throw new Exception("Invalid CLDR data key: '${key}'");
+            throw new Exception("Invalid CLDR data key: '{$key}'");
         }
 
         return self::$data[$key];
diff --git a/vendor/gettext/languages/src/Exporter/Docs.php b/vendor/gettext/languages/src/Exporter/Docs.php
index 3471294783cc4cfca91ca286c76d208970dcb635..c4c5d4c0ad556cafb91a2df40bb94beedb431f64 100644
--- a/vendor/gettext/languages/src/Exporter/Docs.php
+++ b/vendor/gettext/languages/src/Exporter/Docs.php
@@ -31,7 +31,7 @@ public static function getDescription()
      */
     protected static function toStringDo($languages)
     {
-        $result = <<<EOT
+        $result = <<<'EOT'
 <!doctype html>
 <html lang="en">
     <head>
@@ -50,7 +50,7 @@ protected static function toStringDo($languages)
 
 EOT;
         $result .= static::buildTable($languages, true);
-        $result .= <<<EOT
+        $result .= <<<'EOT'
 
         </div>
         <script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
diff --git a/vendor/gettext/languages/src/Exporter/Exporter.php b/vendor/gettext/languages/src/Exporter/Exporter.php
index 834bf38026448d40e558d8a39f626db60398bc93..95a7112ce11beece13bc18e1a4d63bf90a94f7ca 100644
--- a/vendor/gettext/languages/src/Exporter/Exporter.php
+++ b/vendor/gettext/languages/src/Exporter/Exporter.php
@@ -62,7 +62,7 @@ final public static function getExporterDescription($exporterHandle)
     {
         $exporters = self::getExporters();
         if (!isset($exporters[$exporterHandle])) {
-            throw new Exception("Invalid exporter handle: '${exporterHandle}'");
+            throw new Exception("Invalid exporter handle: '{$exporterHandle}'");
         }
 
         return call_user_func(self::getExporterClassName($exporterHandle) . '::getDescription');
@@ -84,6 +84,7 @@ final public static function getExporterClassName($exporterHandle)
      * Convert a list of Language instances to string.
      *
      * @param \Gettext\Languages\Language[] $languages the Language instances to convert
+     * @param array|null $options
      *
      * @return string
      */
@@ -106,6 +107,7 @@ final public static function toString($languages, $options = null)
      * Save the Language instances to a file.
      *
      * @param \Gettext\Languages\Language[] $languages the Language instances to convert
+     * @param array|null $options
      *
      * @throws \Exception
      */
@@ -113,7 +115,7 @@ final public static function toFile($languages, $filename, $options = null)
     {
         $data = self::toString($languages, $options);
         if (@file_put_contents($filename, $data) === false) {
-            throw new Exception("Error writing data to '${filename}'");
+            throw new Exception("Error writing data to '{$filename}'");
         }
     }
 
diff --git a/vendor/gettext/languages/src/Exporter/Ruby.php b/vendor/gettext/languages/src/Exporter/Ruby.php
new file mode 100644
index 0000000000000000000000000000000000000000..ff08a3e50b796c71edbd827a08e42f9b15427080
--- /dev/null
+++ b/vendor/gettext/languages/src/Exporter/Ruby.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Gettext\Languages\Exporter;
+
+class Ruby extends Exporter
+{
+    /**
+     * {@inheritdoc}
+     *
+     * @see \Gettext\Languages\Exporter\Exporter::getDescription()
+     */
+    public static function getDescription()
+    {
+        return 'Build a Ruby hash';
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @see \Gettext\Languages\Exporter\Exporter::toStringDo()
+     */
+    protected static function toStringDo($languages)
+    {
+        $lines = array();
+        $lines[] = 'PLURAL_RULES = {';
+        foreach ($languages as $lc) {
+            $lines[] = '  \'' . $lc->id . '\' => {';
+            $lines[] = '    \'name\' => \'' . addslashes($lc->name) . '\',';
+            if (isset($lc->supersededBy)) {
+                $lines[] = '    \'supersededBy\' => \'' . $lc->supersededBy . '\',';
+            }
+            if (isset($lc->script)) {
+                $lines[] = '    \'script\' => \'' . addslashes($lc->script) . '\',';
+            }
+            if (isset($lc->territory)) {
+                $lines[] = '    \'territory\' => \'' . addslashes($lc->territory) . '\',';
+            }
+            if (isset($lc->baseLanguage)) {
+                $lines[] = '    \'baseLanguage\' => \'' . addslashes($lc->baseLanguage) . '\',';
+            }
+            $lines[] = '    \'formula\' => \'' . $lc->formula . '\',';
+            $lines[] = '    \'plurals\' => ' . count($lc->categories) . ',';
+            $catNames = array();
+            foreach ($lc->categories as $c) {
+                $catNames[] = "'{$c->id}'";
+            }
+            $lines[] = '    \'cases\' => [' . implode(', ', $catNames) . '],';
+            $lines[] = '    \'examples\' => {';
+            foreach ($lc->categories as $c) {
+                $lines[] = '      \'' . $c->id . '\' => \'' . $c->examples . '\',';
+            }
+            $lines[] = '    },';
+            $lines[] = '  },';
+        }
+        $lines[] = '}';
+        $lines[] = '';
+
+        return implode("\n", $lines);
+    }
+}
diff --git a/vendor/gettext/languages/src/FormulaConverter.php b/vendor/gettext/languages/src/FormulaConverter.php
index 6eb14b5f7e0c572d4b9df760be87f59ef7f1e2bd..72061ba585a4599604536f8b15da118fc880143a 100644
--- a/vendor/gettext/languages/src/FormulaConverter.php
+++ b/vendor/gettext/languages/src/FormulaConverter.php
@@ -21,7 +21,7 @@ class FormulaConverter
     public static function convertFormula($cldrFormula)
     {
         if (strpbrk($cldrFormula, '()') !== false) {
-            throw new Exception("Unable to convert the formula '${cldrFormula}': parenthesis handling not implemented");
+            throw new Exception("Unable to convert the formula '{$cldrFormula}': parenthesis handling not implemented");
         }
         $orSeparatedChunks = array();
         foreach (explode(' or ', $cldrFormula) as $cldrFormulaChunk) {
@@ -95,13 +95,13 @@ private static function convertAtom($cldrAtom)
         if (preg_match('/^(?:v|w)(?: % 10+)? != (\d+)(?:\.\.\d+)?$/', $gettextAtom, $m)) { // For gettext: v == 0, w == 0
             return (int) $m[1] === 0 ? false : true;
         }
-        if (preg_match('/^(?:f|t)(?: % 10+)? == (\d+)(?:\.\.\d+)?$/', $gettextAtom, $m)) { // f == empty, t == empty
+        if (preg_match('/^(?:f|t|c|e)(?: % 10+)? == (\d+)(?:\.\.\d+)?$/', $gettextAtom, $m)) { // f == empty, t == empty, c == empty, e == empty
             return (int) $m[1] === 0 ? true : false;
         }
-        if (preg_match('/^(?:f|t)(?: % 10+)? != (\d+)(?:\.\.\d+)?$/', $gettextAtom, $m)) { // f == empty, t == empty
+        if (preg_match('/^(?:f|t|c|e)(?: % 10+)? != (\d+)(?:\.\.\d+)?$/', $gettextAtom, $m)) { // f == empty, t == empty, c == empty, e == empty
             return (int) $m[1] === 0 ? false : true;
         }
-        throw new Exception("Unable to convert the formula chunk '${cldrAtom}' from CLDR to gettext");
+        throw new Exception("Unable to convert the formula chunk '{$cldrAtom}' from CLDR to gettext");
     }
 
     /**
@@ -123,7 +123,7 @@ private static function expandAtom($atom)
             foreach (explode(',', $m[3]) as $range) {
                 $chunk = null;
                 if ((!isset($chunk)) && preg_match('/^\d+$/', $range)) {
-                    $chunk = "${what} ${op} ${range}";
+                    $chunk = "{$what} {$op} {$range}";
                 }
                 if ((!isset($chunk)) && preg_match('/^(\d+)\.\.(\d+)$/', $range, $m)) {
                     $from = (int) $m[1];
@@ -131,29 +131,29 @@ private static function expandAtom($atom)
                     if (($to - $from) === 1) {
                         switch ($op) {
                             case '==':
-                                $chunk = "(${what} == ${from} || ${what} == ${to})";
+                                $chunk = "({$what} == {$from} || {$what} == {$to})";
                                 break;
                             case '!=':
-                                $chunk = "${what} != ${from} && ${what} == ${to}";
+                                $chunk = "{$what} != {$from} && {$what} == {$to}";
                                 break;
                         }
                     } else {
                         switch ($op) {
                             case '==':
-                                $chunk = "${what} >= ${from} && ${what} <= ${to}";
+                                $chunk = "{$what} >= {$from} && {$what} <= {$to}";
                                 break;
                             case '!=':
                                 if ($what === 'n' && $from <= 0) {
-                                    $chunk = "${what} > ${to}";
+                                    $chunk = "{$what} > {$to}";
                                 } else {
-                                    $chunk = "(${what} < ${from} || ${what} > ${to})";
+                                    $chunk = "({$what} < {$from} || {$what} > {$to})";
                                 }
                                 break;
                         }
                     }
                 }
                 if (!isset($chunk)) {
-                    throw new Exception("Unhandled range '${range}' in '${atom}'");
+                    throw new Exception("Unhandled range '{$range}' in '{$atom}'");
                 }
                 $chunks[] = $chunk;
             }
@@ -167,6 +167,6 @@ private static function expandAtom($atom)
                     return implode(' && ', $chunks);
             }
         }
-        throw new Exception("Unable to expand '${atom}'");
+        throw new Exception("Unable to expand '{$atom}'");
     }
 }
diff --git a/vendor/gettext/languages/src/Language.php b/vendor/gettext/languages/src/Language.php
index eb17189b82d87a797be1d8c644fefb269f67f756..4f28c3bd3107f826f7e01c0e6f146b05bd8f5a38 100644
--- a/vendor/gettext/languages/src/Language.php
+++ b/vendor/gettext/languages/src/Language.php
@@ -184,11 +184,11 @@ public function buildFormula($withoutParenthesis = false)
                 for ($i = $numCategories - 2; $i >= 0; $i--) {
                     $f = self::reduceFormula($this->categories[$i]->formula);
                     if (!$withoutParenthesis && !preg_match('/^\([^()]+\)$/', $f)) {
-                        $f = "(${f})";
+                        $f = "({$f})";
                     }
-                    $formula = "${f} ? ${i} : ${formula}";
+                    $formula = "{$f} ? {$i} : {$formula}";
                     if (!$withoutParenthesis && $i > 0) {
-                        $formula = "(${formula})";
+                        $formula = "({$formula})";
                     }
                 }
 
@@ -358,7 +358,7 @@ private static function reverseFormula($formula)
             case '(n == 0 || n == 1) || n >= 11 && n <= 99':
                 return 'n >= 2 && (n < 11 || n > 99)';
         }
-        throw new Exception("Unable to reverse the formula '${formula}'");
+        throw new Exception("Unable to reverse the formula '{$formula}'");
     }
 
     /**
@@ -389,26 +389,23 @@ private static function asciifier(&$value)
     {
         if (is_string($value) && $value !== '') {
             // Avoid converting from 'Ÿ' to '"Y', let's prefer 'Y'
-            $transliterated = strtr($value, array(
-                'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A',
+            $value = strtr($value, array(
+                'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A',
                 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E',
                 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I',
                 'Ñ' => 'N',
                 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O',
                 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U',
                 'Ÿ' => 'Y', 'Ý' => 'Y',
-                'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a',
+                'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a',
                 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e',
                 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i',
                 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o',
                 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u',
                 'ý' => 'y', 'ÿ' => 'y',
+                '…' => '...',
+                'ʼ' => "'", '’' => "'",
             ));
-            $transliterated = @iconv('UTF-8', 'US-ASCII//IGNORE//TRANSLIT', $transliterated);
-            if ($transliterated === false || $transliterated === '') {
-                throw new Exception("Unable to transliterate '${value}'");
-            }
-            $value = $transliterated;
         }
     }
 }
diff --git a/vendor/gettext/languages/src/cldr-data/main/en-US/languages.json b/vendor/gettext/languages/src/cldr-data/main/en-US/languages.json
index aef743dbd8e6138b653ba20d9509b449bde8468a..605213d4427f56b96a98c833d18b3a719149d415 100644
--- a/vendor/gettext/languages/src/cldr-data/main/en-US/languages.json
+++ b/vendor/gettext/languages/src/cldr-data/main/en-US/languages.json
@@ -3,8 +3,7 @@
     "en-US": {
       "identity": {
         "version": {
-          "_number": "$Revision$",
-          "_cldrVersion": "36"
+          "_cldrVersion": "40"
         },
         "language": "en",
         "territory": "US"
@@ -41,6 +40,7 @@
           "arp": "Arapaho",
           "arq": "Algerian Arabic",
           "ars": "Najdi Arabic",
+          "ars-alt-menu": "Arabic, Najdi",
           "arw": "Arawak",
           "ary": "Moroccan Arabic",
           "arz": "Egyptian Arabic",
@@ -115,6 +115,8 @@
           "chy": "Cheyenne",
           "cic": "Chickasaw",
           "ckb": "Central Kurdish",
+          "ckb-alt-menu": "Kurdish, Central",
+          "ckb-alt-variant": "Kurdish, Sorani",
           "co": "Corsican",
           "cop": "Coptic",
           "cps": "Capiznon",
@@ -369,7 +371,7 @@
           "mgh": "Makhuwa-Meetto",
           "mgo": "Metaʼ",
           "mh": "Marshallese",
-          "mi": "Maori",
+          "mi": "Māori",
           "mic": "Mi'kmaq",
           "min": "Minangkabau",
           "mk": "Macedonian",
@@ -467,6 +469,7 @@
           "rap": "Rapanui",
           "rar": "Rarotongan",
           "rgn": "Romagnol",
+          "rhg": "Rohingya",
           "rif": "Riffian",
           "rm": "Romansh",
           "rn": "Rundi",
@@ -474,7 +477,6 @@
           "ro-MD": "Moldavian",
           "rof": "Rombo",
           "rom": "Romany",
-          "root": "Root",
           "rtm": "Rotuman",
           "ru": "Russian",
           "rue": "Rusyn",
@@ -499,6 +501,7 @@
           "sdc": "Sassarese Sardinian",
           "sdh": "Southern Kurdish",
           "se": "Northern Sami",
+          "se-alt-menu": "Sami, Northern",
           "see": "Seneca",
           "seh": "Sena",
           "sei": "Seri",
@@ -519,9 +522,13 @@
           "sly": "Selayar",
           "sm": "Samoan",
           "sma": "Southern Sami",
+          "sma-alt-menu": "Sami, Southern",
           "smj": "Lule Sami",
+          "smj-alt-menu": "Sami, Lule",
           "smn": "Inari Sami",
+          "smn-alt-menu": "Sami, Inari",
           "sms": "Skolt Sami",
+          "sms-alt-menu": "Sami, Skolt",
           "sn": "Shona",
           "snk": "Soninke",
           "so": "Somali",
diff --git a/vendor/gettext/languages/src/cldr-data/main/en-US/scripts.json b/vendor/gettext/languages/src/cldr-data/main/en-US/scripts.json
index f0ff7d4ae950cb6db900c058d440f36a3c14726a..f7e9cd11c7000bf5b42a861b81ac91790426471d 100644
--- a/vendor/gettext/languages/src/cldr-data/main/en-US/scripts.json
+++ b/vendor/gettext/languages/src/cldr-data/main/en-US/scripts.json
@@ -3,8 +3,7 @@
     "en-US": {
       "identity": {
         "version": {
-          "_number": "$Revision$",
-          "_cldrVersion": "36"
+          "_cldrVersion": "40"
         },
         "language": "en",
         "territory": "US"
@@ -17,6 +16,7 @@
           "Ahom": "Ahom",
           "Arab": "Arabic",
           "Arab-alt-variant": "Perso-Arabic",
+          "Aran": "Nastaliq",
           "Armi": "Imperial Aramaic",
           "Armn": "Armenian",
           "Avst": "Avestan",
@@ -38,12 +38,15 @@
           "Cari": "Carian",
           "Cham": "Cham",
           "Cher": "Cherokee",
+          "Chrs": "Chorasmian",
           "Cirt": "Cirth",
           "Copt": "Coptic",
+          "Cpmn": "Cypro-Minoan",
           "Cprt": "Cypriot",
           "Cyrl": "Cyrillic",
           "Cyrs": "Old Church Slavonic Cyrillic",
           "Deva": "Devanagari",
+          "Diak": "Dives Akuru",
           "Dogr": "Dogra",
           "Dsrt": "Deseret",
           "Dupl": "Duployan shorthand",
@@ -90,6 +93,7 @@
           "Khar": "Kharoshthi",
           "Khmr": "Khmer",
           "Khoj": "Khojki",
+          "Kits": "Khitan small script",
           "Knda": "Kannada",
           "Kore": "Korean",
           "Kpel": "Kpelle",
@@ -138,6 +142,7 @@
           "Orya": "Odia",
           "Osge": "Osage",
           "Osma": "Osmanya",
+          "Ougr": "Old Uyghur",
           "Palm": "Palmyrene",
           "Pauc": "Pau Cin Hau",
           "Perm": "Old Permic",
@@ -150,7 +155,8 @@
           "Prti": "Inscriptional Parthian",
           "Qaag": "Zawgyi",
           "Rjng": "Rejang",
-          "Rohg": "Hanifi Rohingya",
+          "Rohg": "Hanifi",
+          "Rohg-alt-stand-alone": "Hanifi Rohingya",
           "Roro": "Rongorongo",
           "Runr": "Runic",
           "Samr": "Samaritan",
@@ -188,15 +194,19 @@
           "Thai": "Thai",
           "Tibt": "Tibetan",
           "Tirh": "Tirhuta",
+          "Tnsa": "Tangsa",
+          "Toto": "Toto",
           "Ugar": "Ugaritic",
           "Vaii": "Vai",
           "Visp": "Visible Speech",
+          "Vith": "Vithkuqi",
           "Wara": "Varang Kshiti",
           "Wcho": "Wancho",
           "Wole": "Woleai",
           "Xpeo": "Old Persian",
           "Xsux": "Sumero-Akkadian Cuneiform",
           "Xsux-alt-short": "S-A Cuneiform",
+          "Yezi": "Yezidi",
           "Yiii": "Yi",
           "Zanb": "Zanabazar Square",
           "Zinh": "Inherited",
diff --git a/vendor/gettext/languages/src/cldr-data/main/en-US/territories.json b/vendor/gettext/languages/src/cldr-data/main/en-US/territories.json
index 190522b5ce6f2d2938eca5595ffdfd55a0b12b73..23715f1352eabf35b9e757c9aad050e7076e90ef 100644
--- a/vendor/gettext/languages/src/cldr-data/main/en-US/territories.json
+++ b/vendor/gettext/languages/src/cldr-data/main/en-US/territories.json
@@ -3,15 +3,14 @@
     "en-US": {
       "identity": {
         "version": {
-          "_number": "$Revision$",
-          "_cldrVersion": "36"
+          "_cldrVersion": "40"
         },
         "language": "en",
         "territory": "US"
       },
       "localeDisplayNames": {
         "territories": {
-          "001": "World",
+          "001": "world",
           "002": "Africa",
           "003": "North America",
           "005": "South America",
@@ -100,6 +99,7 @@
           "CR": "Costa Rica",
           "CU": "Cuba",
           "CV": "Cape Verde",
+          "CV-alt-variant": "Cabo Verde",
           "CW": "Curaçao",
           "CX": "Christmas Island",
           "CY": "Cyprus",
@@ -201,7 +201,6 @@
           "MG": "Madagascar",
           "MH": "Marshall Islands",
           "MK": "North Macedonia",
-          "MK-alt-variant": "MK",
           "ML": "Mali",
           "MM": "Myanmar (Burma)",
           "MM-alt-short": "Myanmar",
diff --git a/vendor/gettext/languages/src/cldr-data/supplemental/plurals.json b/vendor/gettext/languages/src/cldr-data/supplemental/plurals.json
index b83bbc0d788af84366f26608276fd1d61cadb20f..b60c667836cac2c5447971404703a69ac4b39efa 100644
--- a/vendor/gettext/languages/src/cldr-data/supplemental/plurals.json
+++ b/vendor/gettext/languages/src/cldr-data/supplemental/plurals.json
@@ -1,9 +1,8 @@
 {
   "supplemental": {
     "version": {
-      "_number": "$Revision$",
-      "_unicodeVersion": "12.1.0",
-      "_cldrVersion": "36"
+      "_unicodeVersion": "14.0.0",
+      "_cldrVersion": "40"
     },
     "plurals-type-cardinal": {
       "af": {
@@ -54,6 +53,10 @@
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
+      "bal": {
+        "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
+        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+      },
       "be": {
         "pluralRule-count-one": "n % 10 = 1 and n % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 101.0, 1001.0, …",
         "pluralRule-count-few": "n % 10 = 2..4 and n % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 2.0, 3.0, 4.0, 22.0, 23.0, 24.0, 32.0, 33.0, 102.0, 1002.0, …",
@@ -90,7 +93,7 @@
         "pluralRule-count-one": "n % 10 = 1 and n % 100 != 11,71,91 @integer 1, 21, 31, 41, 51, 61, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 81.0, 101.0, 1001.0, …",
         "pluralRule-count-two": "n % 10 = 2 and n % 100 != 12,72,92 @integer 2, 22, 32, 42, 52, 62, 82, 102, 1002, … @decimal 2.0, 22.0, 32.0, 42.0, 52.0, 62.0, 82.0, 102.0, 1002.0, …",
         "pluralRule-count-few": "n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99 @integer 3, 4, 9, 23, 24, 29, 33, 34, 39, 43, 44, 49, 103, 1003, … @decimal 3.0, 4.0, 9.0, 23.0, 24.0, 29.0, 33.0, 34.0, 103.0, 1003.0, …",
-        "pluralRule-count-many": "n != 0 and n % 1000000 = 0 @integer 1000000, … @decimal 1000000.0, 1000000.00, 1000000.000, …",
+        "pluralRule-count-many": "n != 0 and n % 1000000 = 0 @integer 1000000, … @decimal 1000000.0, 1000000.00, 1000000.000, 1000000.0000, …",
         "pluralRule-count-other": " @integer 0, 5~8, 10~20, 100, 1000, 10000, 100000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, …"
       },
       "brx": {
@@ -148,6 +151,10 @@
         "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
+      "doi": {
+        "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04",
+        "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+      },
       "dsb": {
         "pluralRule-count-one": "v = 0 and i % 100 = 1 or f % 100 = 1 @integer 1, 101, 201, 301, 401, 501, 601, 701, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …",
         "pluralRule-count-two": "v = 0 and i % 100 = 2 or f % 100 = 2 @integer 2, 102, 202, 302, 402, 502, 602, 702, 1002, … @decimal 0.2, 1.2, 2.2, 3.2, 4.2, 5.2, 6.2, 7.2, 10.2, 100.2, 1000.2, …",
@@ -179,7 +186,8 @@
       },
       "es": {
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
-        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+        "pluralRule-count-many": "e = 0 and i != 0 and i % 1000000 = 0 and v = 0 or e != 0..5 @integer 1000000, 1c6, 2c6, 3c6, 4c6, 5c6, 6c6, … @decimal 1.0000001c6, 1.1c6, 2.0000001c6, 2.1c6, 3.0000001c6, 3.1c6, …",
+        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1c3, 2c3, 3c3, 4c3, 5c3, 6c3, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 1.0001c3, 1.1c3, 2.0001c3, 2.1c3, 3.0001c3, 3.1c3, …"
       },
       "et": {
         "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
@@ -211,7 +219,8 @@
       },
       "fr": {
         "pluralRule-count-one": "i = 0,1 @integer 0, 1 @decimal 0.0~1.5",
-        "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+        "pluralRule-count-many": "e = 0 and i != 0 and i % 1000000 = 0 and v = 0 or e != 0..5 @integer 1000000, 1c6, 2c6, 3c6, 4c6, 5c6, 6c6, … @decimal 1.0000001c6, 1.1c6, 2.0000001c6, 2.1c6, 3.0000001c6, 3.1c6, …",
+        "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1c3, 2c3, 3c3, 4c3, 5c3, 6c3, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 1.0001c3, 1.1c3, 2.0001c3, 2.1c3, 3.0001c3, 3.1c3, …"
       },
       "fur": {
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
@@ -275,6 +284,9 @@
         "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04",
         "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
+      "hnj": {
+        "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+      },
       "hr": {
         "pluralRule-count-one": "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …",
         "pluralRule-count-few": "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 0.2~0.4, 1.2~1.4, 2.2~2.4, 3.2~3.4, 4.2~4.4, 5.2, 10.2, 100.2, 1000.2, …",
@@ -307,9 +319,6 @@
       "ii": {
         "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
-      "in": {
-        "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
-      },
       "io": {
         "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
@@ -320,19 +329,14 @@
       },
       "it": {
         "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
-        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+        "pluralRule-count-many": "e = 0 and i != 0 and i % 1000000 = 0 and v = 0 or e != 0..5 @integer 1000000, 1c6, 2c6, 3c6, 4c6, 5c6, 6c6, … @decimal 1.0000001c6, 1.1c6, 2.0000001c6, 2.1c6, 3.0000001c6, 3.1c6, …",
+        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1c3, 2c3, 3c3, 4c3, 5c3, 6c3, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 1.0001c3, 1.1c3, 2.0001c3, 2.1c3, 3.0001c3, 3.1c3, …"
       },
       "iu": {
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
         "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000",
         "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
-      "iw": {
-        "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
-        "pluralRule-count-two": "i = 2 and v = 0 @integer 2",
-        "pluralRule-count-many": "v = 0 and n != 0..10 and n % 10 = 0 @integer 20, 30, 40, 50, 60, 70, 80, 90, 100, 1000, 10000, 100000, 1000000, …",
-        "pluralRule-count-other": " @integer 0, 3~17, 101, 1001, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
-      },
       "ja": {
         "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
@@ -343,10 +347,6 @@
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
-      "ji": {
-        "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
-        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
-      },
       "jmc": {
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
@@ -443,6 +443,10 @@
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
+      "lij": {
+        "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
+        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+      },
       "lkt": {
         "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
@@ -588,6 +592,10 @@
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
+      "pcm": {
+        "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04",
+        "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+      },
       "pl": {
         "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
         "pluralRule-count-few": "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, …",
@@ -605,11 +613,13 @@
       },
       "pt": {
         "pluralRule-count-one": "i = 0..1 @integer 0, 1 @decimal 0.0~1.5",
-        "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+        "pluralRule-count-many": "e = 0 and i != 0 and i % 1000000 = 0 and v = 0 or e != 0..5 @integer 1000000, 1c6, 2c6, 3c6, 4c6, 5c6, 6c6, … @decimal 1.0000001c6, 1.1c6, 2.0000001c6, 2.1c6, 3.0000001c6, 3.1c6, …",
+        "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1c3, 2c3, 3c3, 4c3, 5c3, 6c3, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 1.0001c3, 1.1c3, 2.0001c3, 2.1c3, 3.0001c3, 3.1c3, …"
       },
       "pt-PT": {
         "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
-        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+        "pluralRule-count-many": "e = 0 and i != 0 and i % 1000000 = 0 and v = 0 or e != 0..5 @integer 1000000, 1c6, 2c6, 3c6, 4c6, 5c6, 6c6, … @decimal 1.0000001c6, 1.1c6, 2.0000001c6, 2.1c6, 3.0000001c6, 3.1c6, …",
+        "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1c3, 2c3, 3c3, 4c3, 5c3, 6c3, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 1.0001c3, 1.1c3, 2.0001c3, 2.1c3, 3.0001c3, 3.1c3, …"
       },
       "rm": {
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
@@ -624,9 +634,6 @@
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
-      "root": {
-        "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
-      },
       "ru": {
         "pluralRule-count-one": "v = 0 and i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …",
         "pluralRule-count-few": "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, …",
@@ -644,6 +651,11 @@
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
+      "sat": {
+        "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
+        "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000",
+        "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+      },
       "sc": {
         "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
@@ -808,6 +820,9 @@
       "to": {
         "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
+      "tpi": {
+        "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+      },
       "tr": {
         "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
@@ -830,6 +845,9 @@
         "pluralRule-count-many": "v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …",
         "pluralRule-count-other": "   @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
       },
+      "und": {
+        "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
+      },
       "ur": {
         "pluralRule-count-one": "i = 1 and v = 0 @integer 1",
         "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
diff --git a/vendor/phpmailer/phpmailer/README.md b/vendor/phpmailer/phpmailer/README.md
index d9cbbaaf971deae3080742e3c5a4b3d32f85d604..56f971a499845b1458dbed758063af22484caa32 100644
--- a/vendor/phpmailer/phpmailer/README.md
+++ b/vendor/phpmailer/phpmailer/README.md
@@ -1,46 +1,53 @@
-![PHPMailer](https://raw.github.com/PHPMailer/PHPMailer/master/examples/images/phpmailer.png)
+[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://supportukrainenow.org/)
 
-# PHPMailer - A full-featured email creation and transfer class for PHP
+![PHPMailer](https://raw.github.com/PHPMailer/PHPMailer/master/examples/images/phpmailer.png)
 
-Build status: [![Build Status](https://travis-ci.org/PHPMailer/PHPMailer.svg)](https://travis-ci.org/PHPMailer/PHPMailer)
-[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/PHPMailer/PHPMailer/badges/quality-score.png?s=3758e21d279becdf847a557a56a3ed16dfec9d5d)](https://scrutinizer-ci.com/g/PHPMailer/PHPMailer/)
-[![Code Coverage](https://scrutinizer-ci.com/g/PHPMailer/PHPMailer/badges/coverage.png?s=3fe6ca5fe8cd2cdf96285756e42932f7ca256962)](https://scrutinizer-ci.com/g/PHPMailer/PHPMailer/)
+# PHPMailer – A full-featured email creation and transfer class for PHP
 
-[![Latest Stable Version](https://poser.pugx.org/phpmailer/phpmailer/v/stable.svg)](https://packagist.org/packages/phpmailer/phpmailer) [![Total Downloads](https://poser.pugx.org/phpmailer/phpmailer/downloads)](https://packagist.org/packages/phpmailer/phpmailer) [![Latest Unstable Version](https://poser.pugx.org/phpmailer/phpmailer/v/unstable.svg)](https://packagist.org/packages/phpmailer/phpmailer) [![License](https://poser.pugx.org/phpmailer/phpmailer/license.svg)](https://packagist.org/packages/phpmailer/phpmailer) [![API Docs](https://github.com/phpmailer/phpmailer/workflows/Docs/badge.svg)](http://phpmailer.github.io/PHPMailer/)
+[![Test status](https://github.com/PHPMailer/PHPMailer/workflows/Tests/badge.svg)](https://github.com/PHPMailer/PHPMailer/actions)
+[![codecov.io](https://codecov.io/gh/PHPMailer/PHPMailer/branch/master/graph/badge.svg?token=iORZpwmYmM)](https://codecov.io/gh/PHPMailer/PHPMailer)
+[![Latest Stable Version](https://poser.pugx.org/phpmailer/phpmailer/v/stable.svg)](https://packagist.org/packages/phpmailer/phpmailer)
+[![Total Downloads](https://poser.pugx.org/phpmailer/phpmailer/downloads)](https://packagist.org/packages/phpmailer/phpmailer)
+[![License](https://poser.pugx.org/phpmailer/phpmailer/license.svg)](https://packagist.org/packages/phpmailer/phpmailer)
+[![API Docs](https://github.com/phpmailer/phpmailer/workflows/Docs/badge.svg)](https://phpmailer.github.io/PHPMailer/)
+[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/PHPMailer/PHPMailer/badge)](https://api.securityscorecards.dev/projects/github.com/PHPMailer/PHPMailer)
 
-## Class Features
+## Features
 - Probably the world's most popular code for sending email from PHP!
 - Used by many open-source projects: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more
-- Integrated SMTP support - send without a local mail server
+- Integrated SMTP support – send without a local mail server
 - Send emails with multiple To, CC, BCC and Reply-to addresses
 - Multipart/alternative emails for mail clients that do not read HTML email
 - Add attachments, including inline
 - Support for UTF-8 content and 8bit, base64, binary, and quoted-printable encodings
-- SMTP authentication with LOGIN, PLAIN, CRAM-MD5, and XOAUTH2 mechanisms over SSL and SMTP+STARTTLS transports
+- SMTP authentication with LOGIN, PLAIN, CRAM-MD5, and XOAUTH2 mechanisms over SMTPS and SMTP+STARTTLS transports
 - Validates email addresses automatically
-- Protect against header injection attacks
+- Protects against header injection attacks
 - Error messages in over 50 languages!
 - DKIM and S/MIME signing support
-- Compatible with PHP 5.5 and later
+- Compatible with PHP 5.5 and later, including PHP 8.1
 - Namespaced to prevent name clashes
 - Much more!
 
 ## Why you might need it
-Many PHP developers need to send email from their code. The only PHP function that supports this is [`mail()`](https://www.php.net/manual/en/function.mail.php). However, it does not provide any assistance for making use of popular features such as encryption, authentication, HTML messages, and attachments.
+Many PHP developers need to send email from their code. The only PHP function that supports this directly is [`mail()`](https://www.php.net/manual/en/function.mail.php). However, it does not provide any assistance for making use of popular features such as encryption, authentication, HTML messages, and attachments.
 
-Formatting email correctly is surprisingly difficult. There are myriad overlapping RFCs, requiring tight adherence to horribly complicated formatting and encoding rules – the vast majority of code that you'll find online that uses the `mail()` function directly is just plain wrong!
-*Please* don't be tempted to do it yourself – if you don't use PHPMailer, there are many other excellent libraries that you should look at before rolling your own. Try [SwiftMailer](https://swiftmailer.symfony.com/), [Zend/Mail](https://zendframework.github.io/zend-mail/), [ZetaComponents](https://github.com/zetacomponents/Mail) etc.
+Formatting email correctly is surprisingly difficult. There are myriad overlapping (and conflicting) standards, requiring tight adherence to horribly complicated formatting and encoding rules – the vast majority of code that you'll find online that uses the `mail()` function directly is just plain wrong, if not unsafe!
 
-The PHP `mail()` function usually sends via a local mail server, typically fronted by a `sendmail` binary on Linux, BSD, and macOS platforms, however, Windows usually doesn't include a local mail server; PHPMailer's integrated SMTP implementation allows email sending on Windows platforms without a local mail server.
+The PHP `mail()` function usually sends via a local mail server, typically fronted by a `sendmail` binary on Linux, BSD, and macOS platforms, however, Windows usually doesn't include a local mail server; PHPMailer's integrated SMTP client allows email sending on all platforms without needing a local mail server. Be aware though, that the `mail()` function should be avoided when possible; it's both faster and [safer](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html) to use SMTP to localhost.
+
+*Please* don't be tempted to do it yourself – if you don't use PHPMailer, there are many other excellent libraries that
+you should look at before rolling your own. Try [SwiftMailer](https://swiftmailer.symfony.com/)
+, [Laminas/Mail](https://docs.laminas.dev/laminas-mail/), [ZetaComponents](https://github.com/zetacomponents/Mail) etc.
 
 ## License
-This software is distributed under the [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html) license, along with the [GPL Cooperation Commitment](https://gplcc.github.io/gplcc/). Please read LICENSE for information on the software availability and distribution.
+This software is distributed under the [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html) license, along with the [GPL Cooperation Commitment](https://gplcc.github.io/gplcc/). Please read [LICENSE](https://github.com/PHPMailer/PHPMailer/blob/master/LICENSE) for information on the software availability and distribution.
 
 ## Installation & loading
 PHPMailer is available on [Packagist](https://packagist.org/packages/phpmailer/phpmailer) (using semantic versioning), and installation via [Composer](https://getcomposer.org) is the recommended way to install PHPMailer. Just add this line to your `composer.json` file:
 
 ```json
-"phpmailer/phpmailer": "~6.1"
+"phpmailer/phpmailer": "^6.5"
 ```
 
 or run
@@ -53,7 +60,8 @@ Note that the `vendor` folder and the `vendor/autoload.php` script are generated
 
 If you want to use the Gmail XOAUTH2 authentication class, you will also need to add a dependency on the `league/oauth2-client` package in your `composer.json`.
 
-Alternatively, if you're not using Composer, copy the contents of the PHPMailer folder into one of the `include_path` directories specified in your PHP configuration and load each class file manually:
+Alternatively, if you're not using Composer, you
+can [download PHPMailer as a zip file](https://github.com/PHPMailer/PHPMailer/archive/master.zip), (note that docs and examples are not included in the zip file), then copy the contents of the PHPMailer folder into one of the `include_path` directories specified in your PHP configuration and load each class file manually:
 
 ```php
 <?php
@@ -65,60 +73,58 @@ require 'path/to/PHPMailer/src/PHPMailer.php';
 require 'path/to/PHPMailer/src/SMTP.php';
 ```
 
-If you're not using the `SMTP` class explicitly (you're probably not), you don't need a `use` line for the SMTP class.
-
-If you don't speak git or just want a tarball, click the 'zip' button on the right of the project page in GitHub, though note that docs and examples are not included in the tarball.
+If you're not using the `SMTP` class explicitly (you're probably not), you don't need a `use` line for the SMTP class. Even if you're not using exceptions, you do still need to load the `Exception` class as it is used internally.
 
 ## Legacy versions
-PHPMailer 5.2 (which is compatible with PHP 5.0 - 7.0) is no longer being supported, even for security updates. You will find the latest version of 5.2 in the [5.2-stable branch](https://github.com/PHPMailer/PHPMailer/tree/5.2-stable). If you're using PHP 5.5 or later (which you should be), switch to the 6.x releases.
+PHPMailer 5.2 (which is compatible with PHP 5.0 — 7.0) is no longer supported, even for security updates. You will find the latest version of 5.2 in the [5.2-stable branch](https://github.com/PHPMailer/PHPMailer/tree/5.2-stable). If you're using PHP 5.5 or later (which you should be), switch to the 6.x releases.
 
 ### Upgrading from 5.2
 The biggest changes are that source files are now in the `src/` folder, and PHPMailer now declares the namespace `PHPMailer\PHPMailer`. This has several important effects – [read the upgrade guide](https://github.com/PHPMailer/PHPMailer/tree/master/UPGRADING.md) for more details.
 
 ### Minimal installation
-While installing the entire package manually or with Composer is simple, convenient, and reliable, you may want to include only vital files in your project. At the very least you will need [src/PHPMailer.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/PHPMailer.php). If you're using SMTP, you'll need [src/SMTP.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/SMTP.php), and if you're using POP-before SMTP, you'll need [src/POP3.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/POP3.php). You can skip the [language](https://github.com/PHPMailer/PHPMailer/tree/master/language/) folder if you're not showing errors to users and can make do with English-only errors. If you're using XOAUTH2 you will need [src/OAuth.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/OAuth.php) as well as the Composer dependencies for the services you wish to authenticate with. Really, it's much easier to use Composer!
+While installing the entire package manually or with Composer is simple, convenient, and reliable, you may want to include only vital files in your project. At the very least you will need [src/PHPMailer.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/PHPMailer.php). If you're using SMTP, you'll need [src/SMTP.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/SMTP.php), and if you're using POP-before SMTP (*very* unlikely!), you'll need [src/POP3.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/POP3.php). You can skip the [language](https://github.com/PHPMailer/PHPMailer/tree/master/language/) folder if you're not showing errors to users and can make do with English-only errors. If you're using XOAUTH2 you will need [src/OAuth.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/OAuth.php) as well as the Composer dependencies for the services you wish to authenticate with. Really, it's much easier to use Composer!
 
 ## A Simple Example
 
 ```php
 <?php
-// Import PHPMailer classes into the global namespace
-// These must be at the top of your script, not inside a function
+//Import PHPMailer classes into the global namespace
+//These must be at the top of your script, not inside a function
 use PHPMailer\PHPMailer\PHPMailer;
 use PHPMailer\PHPMailer\SMTP;
 use PHPMailer\PHPMailer\Exception;
 
-// Load Composer's autoloader
+//Load Composer's autoloader
 require 'vendor/autoload.php';
 
-// Instantiation and passing `true` enables exceptions
+//Create an instance; passing `true` enables exceptions
 $mail = new PHPMailer(true);
 
 try {
     //Server settings
-    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      // Enable verbose debug output
-    $mail->isSMTP();                                            // Send using SMTP
-    $mail->Host       = 'smtp1.example.com';                    // Set the SMTP server to send through
-    $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
-    $mail->Username   = 'user@example.com';                     // SMTP username
-    $mail->Password   = 'secret';                               // SMTP password
-    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged
-    $mail->Port       = 587;                                    // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above
+    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      //Enable verbose debug output
+    $mail->isSMTP();                                            //Send using SMTP
+    $mail->Host       = 'smtp.example.com';                     //Set the SMTP server to send through
+    $mail->SMTPAuth   = true;                                   //Enable SMTP authentication
+    $mail->Username   = 'user@example.com';                     //SMTP username
+    $mail->Password   = 'secret';                               //SMTP password
+    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;            //Enable implicit TLS encryption
+    $mail->Port       = 465;                                    //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
 
     //Recipients
     $mail->setFrom('from@example.com', 'Mailer');
-    $mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
-    $mail->addAddress('ellen@example.com');               // Name is optional
+    $mail->addAddress('joe@example.net', 'Joe User');     //Add a recipient
+    $mail->addAddress('ellen@example.com');               //Name is optional
     $mail->addReplyTo('info@example.com', 'Information');
     $mail->addCC('cc@example.com');
     $mail->addBCC('bcc@example.com');
 
-    // Attachments
-    $mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
-    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
+    //Attachments
+    $mail->addAttachment('/var/tmp/file.tar.gz');         //Add attachments
+    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    //Optional name
 
-    // Content
-    $mail->isHTML(true);                                  // Set email format to HTML
+    //Content
+    $mail->isHTML(true);                                  //Set email format to HTML
     $mail->Subject = 'Here is the subject';
     $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
     $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
@@ -130,7 +136,7 @@ try {
 }
 ```
 
-You'll find plenty more to play with in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder.
+You'll find plenty to play with in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder, which covers many common scenarios including sending through gmail, building contact forms, sending to mailing lists, and more.
 
 If you are re-using the instance (e.g. when sending to a mailing list), you may need to clear the recipient list to avoid sending duplicate messages. See [the mailing list example](https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps) for further guidance.
 
@@ -140,43 +146,43 @@ That's it. You should now be ready to use PHPMailer!
 PHPMailer defaults to English, but in the [language](https://github.com/PHPMailer/PHPMailer/tree/master/language/) folder you'll find many translations for PHPMailer error messages that you may encounter. Their filenames contain [ISO 639-1](http://en.wikipedia.org/wiki/ISO_639-1) language code for the translations, for example `fr` for French. To specify a language, you need to tell PHPMailer which one to use, like this:
 
 ```php
-// To load the French version
+//To load the French version
 $mail->setLanguage('fr', '/optional/path/to/language/directory/');
 ```
 
-We welcome corrections and new languages - if you're looking for corrections to do, run the [PHPMailerLangTest.php](https://github.com/PHPMailer/PHPMailer/tree/master/test/PHPMailerLangTest.php) script in the tests folder and it will show any missing translations.
+We welcome corrections and new languages – if you're looking for corrections, run the [PHPMailerLangTest.php](https://github.com/PHPMailer/PHPMailer/tree/master/test/PHPMailerLangTest.php) script in the tests folder and it will show any missing translations.
 
 ## Documentation
-Start reading at the [GitHub wiki](https://github.com/PHPMailer/PHPMailer/wiki). If you're having trouble, this should be the first place you look as it's the most frequently updated.
+Start reading at the [GitHub wiki](https://github.com/PHPMailer/PHPMailer/wiki). If you're having trouble, head for [the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting) as it's frequently updated.
 
 Examples of how to use PHPMailer for common scenarios can be found in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder. If you're looking for a good starting point, we recommend you start with [the Gmail example](https://github.com/PHPMailer/PHPMailer/tree/master/examples/gmail.phps).
 
-Note that in order to reduce PHPMailer's deployed code footprint, the examples are no longer included if you load PHPMailer via Composer or via [GitHub's zip file download](https://github.com/PHPMailer/PHPMailer/archive/master.zip), so you'll need to either clone the git repository or use the above links to get to the examples directly.
+To reduce PHPMailer's deployed code footprint, examples are not included if you load PHPMailer via Composer or via [GitHub's zip file download](https://github.com/PHPMailer/PHPMailer/archive/master.zip), so you'll need to either clone the git repository or use the above links to get to the examples directly.
 
-Complete generated API documentation is [available online](http://phpmailer.github.io/PHPMailer/).
+Complete generated API documentation is [available online](https://phpmailer.github.io/PHPMailer/).
 
-You can generate complete API-level documentation by running `phpdoc` in the top-level folder, and documentation will appear in the `docs` folder, though you'll need to have [PHPDocumentor](http://www.phpdoc.org) installed. You may find [the unit tests](https://github.com/PHPMailer/PHPMailer/blob/master/test/PHPMailerTest.php) a good source of how to do various operations such as encryption.
+You can generate complete API-level documentation by running `phpdoc` in the top-level folder, and documentation will appear in the `docs` folder, though you'll need to have [PHPDocumentor](http://www.phpdoc.org) installed. You may find [the unit tests](https://github.com/PHPMailer/PHPMailer/blob/master/test/PHPMailerTest.php) a good reference for how to do various operations such as encryption.
 
 If the documentation doesn't cover what you need, search the [many questions on Stack Overflow](http://stackoverflow.com/questions/tagged/phpmailer), and before you ask a question about "SMTP Error: Could not connect to SMTP host.", [read the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting).
 
 ## Tests
-There is a PHPUnit test script in the [test](https://github.com/PHPMailer/PHPMailer/tree/master/test/) folder. PHPMailer uses PHPUnit 4.8 - we would use 5.x but we need to run on PHP 5.5.
+[PHPMailer tests](https://github.com/PHPMailer/PHPMailer/tree/master/test/) use PHPUnit 9, with [a polyfill](https://github.com/Yoast/PHPUnit-Polyfills) to let 9-style tests run on older PHPUnit and PHP versions.
 
-Build status: [![Build Status](https://travis-ci.org/PHPMailer/PHPMailer.svg)](https://travis-ci.org/PHPMailer/PHPMailer)
+[![Test status](https://github.com/PHPMailer/PHPMailer/workflows/Tests/badge.svg)](https://github.com/PHPMailer/PHPMailer/actions)
 
 If this isn't passing, is there something you can do to help?
 
 ## Security
 Please disclose any vulnerabilities found responsibly – report security issues to the maintainers privately.
 
-See [SECURITY](https://github.com/PHPMailer/PHPMailer/tree/master/SECURITY.md) for details on security issues.
+See [SECURITY](https://github.com/PHPMailer/PHPMailer/tree/master/SECURITY.md) and [PHPMailer's security advisories on GitHub](https://github.com/PHPMailer/PHPMailer/security). 
 
 ## Contributing
 Please submit bug reports, suggestions and pull requests to the [GitHub issue tracker](https://github.com/PHPMailer/PHPMailer/issues).
 
 We're particularly interested in fixing edge-cases, expanding test coverage and updating translations.
 
-If you found a mistake in the docs, or want to add something, go ahead and amend the wiki - anyone can edit it.
+If you found a mistake in the docs, or want to add something, go ahead and amend the wiki – anyone can edit it.
 
 If you have git clones from prior to the move to the PHPMailer GitHub organisation, you'll need to update any remote URLs referencing the old GitHub location with a command like this from within your clone:
 
@@ -187,27 +193,36 @@ git remote set-url upstream https://github.com/PHPMailer/PHPMailer.git
 Please *don't* use the SourceForge or Google Code projects any more; they are obsolete and no longer maintained.
 
 ## Sponsorship
-Development time and resources for PHPMailer are provided by [Smartmessages.net](https://info.smartmessages.net/), a powerful email marketing system.
+Development time and resources for PHPMailer are provided by [Smartmessages.net](https://info.smartmessages.net/), the world's only privacy-first email marketing system.
+
+<a href="https://info.smartmessages.net/"><img src="https://www.smartmessages.net/img/smartmessages-logo.svg" width="550" alt="Smartmessages.net privacy-first email marketing logo"></a>
+
+Donations are very welcome, whether in beer 🍺, T-shirts 👕, or cold, hard cash 💰. Sponsorship through GitHub is a simple and convenient way to say "thank you" to PHPMailer's maintainers and contributors – just click the "Sponsor" button [on the project page](https://github.com/PHPMailer/PHPMailer). If your company uses PHPMailer, consider taking part in Tidelift's enterprise support programme.
+
+## PHPMailer For Enterprise
 
-<a href="https://info.smartmessages.net/"><img src="https://www.smartmessages.net/img/smartmessages-logo.svg" width="250" height="28" alt="Smartmessages email marketing"></a>
+Available as part of the Tidelift Subscription.
 
-Other contributions are gladly received, whether in beer 🍺, T-shirts 👕, Amazon wishlist raids, or cold, hard cash 💰. If you'd like to donate to say "thank you" to maintainers or contributors, please contact them through individual profile pages via [the contributors page](https://github.com/PHPMailer/PHPMailer/graphs/contributors).
+The maintainers of PHPMailer and thousands of other packages are working with Tidelift to deliver commercial
+support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and
+improve code health, while paying the maintainers of the exact packages you
+use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-phpmailer-phpmailer?utm_source=packagist-phpmailer-phpmailer&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
 
 ## Changelog
 See [changelog](changelog.md).
 
 ## History
 - PHPMailer was originally written in 2001 by Brent R. Matzelle as a [SourceForge project](http://sourceforge.net/projects/phpmailer/).
-- Marcus Bointon (coolbru on SF) and Andy Prevost (codeworxtech) took over the project in 2004.
+- [Marcus Bointon](https://github.com/Synchro) (`coolbru` on SF) and Andy Prevost (`codeworxtech`) took over the project in 2004.
 - Became an Apache incubator project on Google Code in 2010, managed by Jim Jagielski.
-- Marcus created his fork on [GitHub](https://github.com/Synchro/PHPMailer) in 2008.
+- Marcus created [his fork on GitHub](https://github.com/Synchro/PHPMailer) in 2008.
 - Jim and Marcus decide to join forces and use GitHub as the canonical and official repo for PHPMailer in 2013.
-- PHPMailer moves to the [PHPMailer organisation](https://github.com/PHPMailer) on GitHub in 2013.
+- PHPMailer moves to [the PHPMailer organisation](https://github.com/PHPMailer) on GitHub in 2013.
 
 ### What's changed since moving from SourceForge?
 - Official successor to the SourceForge and Google Code projects.
 - Test suite.
-- Continuous integration with Travis-CI.
+- Continuous integration with Github Actions.
 - Composer support.
 - Public development.
 - Additional languages and language strings.
diff --git a/vendor/phpmailer/phpmailer/SECURITY.md b/vendor/phpmailer/phpmailer/SECURITY.md
index fc3e61c2012b08c8802c26a8c64bb5adddfcd3c8..035a87f7b0c3ccc7651cace865f53163588e726f 100644
--- a/vendor/phpmailer/phpmailer/SECURITY.md
+++ b/vendor/phpmailer/phpmailer/SECURITY.md
@@ -1,6 +1,13 @@
 # Security notices relating to PHPMailer
 
-Please disclose any vulnerabilities found responsibly - report any security problems found to the maintainers privately.
+Please disclose any security issues or vulnerabilities found through [Tidelift's coordinated disclosure system](https://tidelift.com/security) or to the maintainers privately.
+
+PHPMailer 6.4.1 and earlier contain a vulnerability that can result in untrusted code being called (if such code is injected into the host project's scope by other means). If the `$patternselect` parameter to `validateAddress()` is set to `'php'` (the default, defined by `PHPMailer::$validator`), and the global namespace contains a function called `php`, it will be called in preference to the built-in validator of the same name. Mitigated in PHPMailer 6.5.0 by denying the use of simple strings as validator function names. Recorded as [CVE-2021-3603](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-3603). Reported by [Vikrant Singh Chauhan](mailto:vi@hackberry.xyz) via [huntr.dev](https://www.huntr.dev/).
+
+PHPMailer versions 6.4.1 and earlier contain a possible remote code execution vulnerability through the `$lang_path` parameter of the `setLanguage()` method. If the `$lang_path` parameter is passed unfiltered from user input, it can be set to [a UNC path](https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats#unc-paths), and if an attacker is also able to persuade the server to load a file from that UNC path, a script file under their control may be executed. This vulnerability only applies to systems that resolve UNC paths, typically only Microsoft Windows.
+PHPMailer 6.5.0 mitigates this by no longer treating translation files as PHP code, but by parsing their text content directly. This approach avoids the possibility of executing unknown code while retaining backward compatibility. This isn't ideal, so the current translation format is deprecated and will be replaced in the next major release. Recorded as [CVE-2021-34551](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-34551). Reported by [Jilin Diting Information Technology Co., Ltd](https://listensec.com) via Tidelift.
+
+PHPMailer versions between 6.1.8 and 6.4.0 contain a regression of the earlier CVE-2018-19296 object injection vulnerability as a result of [a fix for Windows UNC paths in 6.1.8](https://github.com/PHPMailer/PHPMailer/commit/e2e07a355ee8ff36aba21d0242c5950c56e4c6f9). Recorded as [CVE-2020-36326](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-36326). Reported by Fariskhi Vidyan via Tidelift. 6.4.1 fixes this issue, and also enforces stricter checks for URL schemes in local path contexts.
 
 PHPMailer versions 6.1.5 and earlier contain an output escaping bug that occurs in `Content-Type` and `Content-Disposition` when filenames passed into `addAttachment` and other methods that accept attachment names contain double quote characters, in contravention of RFC822 3.4.1. No specific vulnerability has been found relating to this, but it could allow file attachments to bypass attachment filters that are based on matching filename extensions. Recorded as [CVE-2020-13625](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-13625). Reported by Elar Lang of Clarified Security.
 
diff --git a/vendor/phpmailer/phpmailer/VERSION b/vendor/phpmailer/phpmailer/VERSION
index 4ac4fded49f189433028e133612a444d89a5a089..a08b5f1e88fb86a8382110ed5ee830b96688b22f 100644
--- a/vendor/phpmailer/phpmailer/VERSION
+++ b/vendor/phpmailer/phpmailer/VERSION
@@ -1 +1 @@
-6.2.0
\ No newline at end of file
+6.6.4
\ No newline at end of file
diff --git a/vendor/phpmailer/phpmailer/composer.json b/vendor/phpmailer/phpmailer/composer.json
index 7388bd98b92432a831760c917d5ec6805121eef3..1db6f03d8d251603f6581c9252f886e0e3ac38f8 100644
--- a/vendor/phpmailer/phpmailer/composer.json
+++ b/vendor/phpmailer/phpmailer/composer.json
@@ -25,6 +25,11 @@
             "type": "github"
         }
     ],
+    "config": {
+        "allow-plugins": {
+            "dealerdirect/phpcodesniffer-composer-installer": true
+        }
+    },
     "require": {
         "php": ">=5.5.0",
         "ext-ctype": "*",
@@ -34,13 +39,15 @@
     "require-dev": {
         "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
         "doctrine/annotations": "^1.2",
+        "php-parallel-lint/php-console-highlighter": "^1.0.0",
+        "php-parallel-lint/php-parallel-lint": "^1.3.2",
         "phpcompatibility/php-compatibility": "^9.3.5",
         "roave/security-advisories": "dev-latest",
-        "squizlabs/php_codesniffer": "^3.5.6",
-        "yoast/phpunit-polyfills": "^0.2.0"
+        "squizlabs/php_codesniffer": "^3.6.2",
+        "yoast/phpunit-polyfills": "^1.0.0"
     },
     "suggest": {
-        "ext-mbstring": "Needed to send email in multibyte encoding charset",
+        "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
         "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
         "league/oauth2-google": "Needed for Google XOAUTH2 authentication",
         "psr/log": "For optional PSR-3 debug logging",
@@ -57,5 +64,13 @@
             "PHPMailer\\Test\\": "test/"
         }
     },
-    "license": "LGPL-2.1-only"
+    "license": "LGPL-2.1-only",
+    "scripts": {
+        "check": "./vendor/bin/phpcs",
+        "test": "./vendor/bin/phpunit --no-coverage",
+        "coverage": "./vendor/bin/phpunit",
+        "lint": [
+            "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . --show-deprecated -e php,phps --exclude vendor --exclude .git --exclude build"
+        ]
+    }
 }
diff --git a/vendor/phpmailer/phpmailer/get_oauth_token.php b/vendor/phpmailer/phpmailer/get_oauth_token.php
index 560d364584e09df1b5795b8e1183d774b399e884..ba66f6cae946cf7e96462d9e4debdc40fe7722a5 100644
--- a/vendor/phpmailer/phpmailer/get_oauth_token.php
+++ b/vendor/phpmailer/phpmailer/get_oauth_token.php
@@ -38,20 +38,32 @@
  * Plenty to choose from here:
  * @see http://oauth2-client.thephpleague.com/providers/thirdparty/
  */
-// @see https://github.com/thephpleague/oauth2-google
+//@see https://github.com/thephpleague/oauth2-google
 use League\OAuth2\Client\Provider\Google;
-// @see https://packagist.org/packages/hayageek/oauth2-yahoo
+//@see https://packagist.org/packages/hayageek/oauth2-yahoo
 use Hayageek\OAuth2\Client\Provider\Yahoo;
-// @see https://github.com/stevenmaguire/oauth2-microsoft
+//@see https://github.com/stevenmaguire/oauth2-microsoft
 use Stevenmaguire\OAuth2\Client\Provider\Microsoft;
 
-if (!isset($_GET['code']) && !isset($_GET['provider'])) {
+if (!isset($_GET['code']) && !isset($_POST['provider'])) {
     ?>
 <html>
-<body>Select Provider:<br/>
-<a href='?provider=Google'>Google</a><br/>
-<a href='?provider=Yahoo'>Yahoo</a><br/>
-<a href='?provider=Microsoft'>Microsoft/Outlook/Hotmail/Live/Office365</a><br/>
+<body>
+<form method="post">
+    <h1>Select Provider</h1>
+    <input type="radio" name="provider" value="Google" id="providerGoogle">
+    <label for="providerGoogle">Google</label><br>
+    <input type="radio" name="provider" value="Yahoo" id="providerYahoo">
+    <label for="providerYahoo">Yahoo</label><br>
+    <input type="radio" name="provider" value="Microsoft" id="providerMicrosoft">
+    <label for="providerMicrosoft">Microsoft</label><br>
+    <h1>Enter id and secret</h1>
+    <p>These details are obtained by setting up an app in your provider's developer console.
+    </p>
+    <p>ClientId: <input type="text" name="clientId"><p>
+    <p>ClientSecret: <input type="text" name="clientSecret"></p>
+    <input type="submit" value="Continue">
+</form>
 </body>
 </html>
     <?php
@@ -63,21 +75,25 @@
 session_start();
 
 $providerName = '';
+$clientId = '';
+$clientSecret = '';
 
-if (array_key_exists('provider', $_GET)) {
-    $providerName = $_GET['provider'];
+if (array_key_exists('provider', $_POST)) {
+    $providerName = $_POST['provider'];
+    $clientId = $_POST['clientId'];
+    $clientSecret = $_POST['clientSecret'];
     $_SESSION['provider'] = $providerName;
+    $_SESSION['clientId'] = $clientId;
+    $_SESSION['clientSecret'] = $clientSecret;
 } elseif (array_key_exists('provider', $_SESSION)) {
     $providerName = $_SESSION['provider'];
-}
-if (!in_array($providerName, ['Google', 'Microsoft', 'Yahoo'])) {
-    exit('Only Google, Microsoft and Yahoo OAuth2 providers are currently supported in this script.');
+    $clientId = $_SESSION['clientId'];
+    $clientSecret = $_SESSION['clientSecret'];
 }
 
-//These details are obtained by setting up an app in the Google developer console,
-//or whichever provider you're using.
-$clientId = 'RANDOMCHARS-----duv1n2.apps.googleusercontent.com';
-$clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';
+//If you don't want to use the built-in form, set your client id and secret here
+//$clientId = 'RANDOMCHARS-----duv1n2.apps.googleusercontent.com';
+//$clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';
 
 //If this automatic URL doesn't work, set it yourself manually to the URL of this script
 $redirectUri = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
@@ -121,26 +137,26 @@
 }
 
 if (!isset($_GET['code'])) {
-    // If we don't have an authorization code then get one
+    //If we don't have an authorization code then get one
     $authUrl = $provider->getAuthorizationUrl($options);
     $_SESSION['oauth2state'] = $provider->getState();
     header('Location: ' . $authUrl);
     exit;
-// Check given state against previously stored one to mitigate CSRF attack
+    //Check given state against previously stored one to mitigate CSRF attack
 } elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
     unset($_SESSION['oauth2state']);
     unset($_SESSION['provider']);
     exit('Invalid state');
 } else {
     unset($_SESSION['provider']);
-    // Try to get an access token (using the authorization code grant)
+    //Try to get an access token (using the authorization code grant)
     $token = $provider->getAccessToken(
         'authorization_code',
         [
             'code' => $_GET['code']
         ]
     );
-    // Use this to interact with an API on the users behalf
-    // Use this to get a new access token if the old one expires
+    //Use this to interact with an API on the users behalf
+    //Use this to get a new access token if the old one expires
     echo 'Refresh Token: ', $token->getRefreshToken();
 }
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-ar.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-ar.php
index 8ab485c449b0de68748c78c304e37eca6db6a690..f795580a143e0d3dc66db51bf24cd9f783c0766b 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-ar.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-ar.php
@@ -19,8 +19,7 @@
 $PHPMAILER_LANG['invalid_address']      = 'الإرسال غير ممكن لأن عنوان البريد الإلكتروني غير صالح: ';
 $PHPMAILER_LANG['mailer_not_supported'] = ' برنامج الإرسال غير مدعوم.';
 $PHPMAILER_LANG['provide_address']      = 'يجب توفير عنوان البريد الإلكتروني لمستلم واحد على الأقل.';
-$PHPMAILER_LANG['recipients_failed']    = 'خطأ SMTP: الأخطاء التالية ' .
-                                          'فشل في الارسال لكل من : ';
+$PHPMAILER_LANG['recipients_failed']    = 'خطأ SMTP: الأخطاء التالية فشل في الارسال لكل من : ';
 $PHPMAILER_LANG['signing']              = 'خطأ في التوقيع: ';
 $PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() غير ممكن.';
 $PHPMAILER_LANG['smtp_error']           = 'خطأ على مستوى الخادم SMTP: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-ch.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-ch.php
deleted file mode 100644
index 500c952676db2e7396d74321e2fb841e170dea3a..0000000000000000000000000000000000000000
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-ch.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-/**
- * Chinese PHPMailer language file: refer to English translation for definitive list
- * @package PHPMailer
- * @author LiuXin <http://www.80x86.cn/blog/>
- */
-
-$PHPMAILER_LANG['authenticate']         = 'SMTP 错误:身份验证失败。';
-$PHPMAILER_LANG['connect_host']         = 'SMTP 错误: 不能连接SMTP主机。';
-$PHPMAILER_LANG['data_not_accepted']    = 'SMTP 错误: 数据不可接受。';
-//$PHPMAILER_LANG['empty_message']        = 'Message body empty';
-$PHPMAILER_LANG['encoding']             = '未知编码:';
-$PHPMAILER_LANG['execute']              = '不能执行: ';
-$PHPMAILER_LANG['file_access']          = '不能访问文件:';
-$PHPMAILER_LANG['file_open']            = '文件错误:不能打开文件:';
-$PHPMAILER_LANG['from_failed']          = '下面的发送地址邮件发送失败了: ';
-$PHPMAILER_LANG['instantiate']          = '不能实现mail方法。';
-//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';
-$PHPMAILER_LANG['mailer_not_supported'] = ' 您所选择的发送邮件的方法并不支持。';
-$PHPMAILER_LANG['provide_address']      = '您必须提供至少一个 收信人的email地址。';
-$PHPMAILER_LANG['recipients_failed']    = 'SMTP 错误: 下面的 收件人失败了: ';
-//$PHPMAILER_LANG['signing']              = 'Signing Error: ';
-//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';
-//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';
-//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';
-//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php
index 55bdd9c89e4205dd089d0c80e4acc9334947083d..e770a1a265f8e6f1c775e68e07ba3f1c1f9b3271 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php
@@ -16,6 +16,8 @@
 $PHPMAILER_LANG['from_failed']          = 'Následující adresa odesílatele je nesprávná: ';
 $PHPMAILER_LANG['instantiate']          = 'Nelze vytvořit instanci emailové funkce.';
 $PHPMAILER_LANG['invalid_address']      = 'Neplatná adresa: ';
+$PHPMAILER_LANG['invalid_hostentry']    = 'Záznam hostitele je nesprávný: ';
+$PHPMAILER_LANG['invalid_host']         = 'Hostitel je nesprávný: ';
 $PHPMAILER_LANG['mailer_not_supported'] = ' mailer není podporován.';
 $PHPMAILER_LANG['provide_address']      = 'Musíte zadat alespoň jednu emailovou adresu příjemce.';
 $PHPMAILER_LANG['recipients_failed']    = 'Chyba SMTP: Následující adresy příjemců nejsou správně: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-el.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-el.php
index b3d5ca94bd7c6c1bfcbb197775c4d682b57b0a80..339ee5753b7fc4080508e8acd300a7e6b797b784 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-el.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-el.php
@@ -5,22 +5,29 @@
  * @package PHPMailer
  */
 
-$PHPMAILER_LANG['authenticate']         = 'SMTP Σφάλμα: Αδυναμία πιστοποίησης (authentication).';
-$PHPMAILER_LANG['connect_host']         = 'SMTP Σφάλμα: Αδυναμία σύνδεσης στον SMTP-Host.';
-$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Σφάλμα: Τα δεδομένα δεν έγιναν αποδεκτά.';
-$PHPMAILER_LANG['empty_message']        = 'Το E-Mail δεν έχει περιεχόμενο .';
-$PHPMAILER_LANG['encoding']             = 'Αγνωστο Encoding-Format: ';
-$PHPMAILER_LANG['execute']              = 'Αδυναμία εκτέλεσης ακόλουθης εντολής: ';
-$PHPMAILER_LANG['file_access']          = 'Αδυναμία προσπέλασης του αρχείου: ';
-$PHPMAILER_LANG['file_open']            = 'Σφάλμα Αρχείου: Δεν είναι δυνατό το άνοιγμα του ακόλουθου αρχείου: ';
-$PHPMAILER_LANG['from_failed']          = 'Η παρακάτω διεύθυνση αποστολέα δεν είναι σωστή: ';
-$PHPMAILER_LANG['instantiate']          = 'Αδυναμία εκκίνησης Mail function.';
-$PHPMAILER_LANG['invalid_address']      = 'Το μήνυμα δεν εστάλη, η διεύθυνση δεν είναι έγκυρη: ';
+$PHPMAILER_LANG['authenticate']         = 'Σφάλμα SMTP: Αδυναμία πιστοποίησης.';
+$PHPMAILER_LANG['buggy_php']            = 'Η έκδοση PHP που χρησιμοποιείτε παρουσιάζει σφάλμα που μπορεί να έχει ως αποτέλεσμα κατεστραμένα μηνύματα. Για να το διορθώσετε, αλλάξτε τον τρόπο αποστολής σε SMTP, απενεργοποιήστε την επιλογή mail.add_x_header στο αρχείο php.ini, αλλάξτε λειτουργικό σε MacOS ή Linux ή αναβαθμίστε την PHP σε έκδοση 7.0.17+ ή 7.1.3+.';
+$PHPMAILER_LANG['connect_host']         = 'Σφάλμα SMTP: Αδυναμία σύνδεσης με τον φιλοξενητή SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Σφάλμα SMTP: Μη αποδεκτά δεδομένα.';
+$PHPMAILER_LANG['empty_message']        = 'Η ηλεκτρονική επιστολή δεν έχει περιεχόμενο.';
+$PHPMAILER_LANG['encoding']             = 'Άγνωστη μορφή κωδικοποίησης: ';
+$PHPMAILER_LANG['execute']              = 'Αδυναμία εκτέλεσης: ';
+$PHPMAILER_LANG['extension_missing']    = 'Απουσία επέκτασης: ';
+$PHPMAILER_LANG['file_access']          = 'Αδυναμία πρόσβασης στο αρχείο: ';
+$PHPMAILER_LANG['file_open']            = 'Σφάλμα Αρχείου: Αδυναμία ανοίγματος αρχείου: ';
+$PHPMAILER_LANG['from_failed']          = 'Η ακόλουθη διεύθυνση αποστολέα δεν είναι σωστή: ';
+$PHPMAILER_LANG['instantiate']          = 'Αδυναμία εκκίνησης συνάρτησης Mail.';
+$PHPMAILER_LANG['invalid_address']      = 'Μη έγκυρη διεύθυνση: ';
+$PHPMAILER_LANG['invalid_header']       = 'Μη έγκυρο όνομα κεφαλίδας ή τιμή';
+$PHPMAILER_LANG['invalid_hostentry']    = 'Μη έγκυρη εισαγωγή φιλοξενητή: ';
+$PHPMAILER_LANG['invalid_host']         = 'Μη έγκυρος φιλοξενητής: ';
 $PHPMAILER_LANG['mailer_not_supported'] = ' mailer δεν υποστηρίζεται.';
-$PHPMAILER_LANG['provide_address']      = 'Παρακαλούμε δώστε τουλάχιστον μια e-mail διεύθυνση παραλήπτη.';
-$PHPMAILER_LANG['recipients_failed']    = 'SMTP Σφάλμα: Οι παρακάτω διευθύνσεις παραλήπτη δεν είναι έγκυρες: ';
+$PHPMAILER_LANG['provide_address']      = 'Δώστε τουλάχιστον μια ηλεκτρονική διεύθυνση παραλήπτη.';
+$PHPMAILER_LANG['recipients_failed']    = 'Σφάλμα SMTP: Οι παρακάτω διευθύνσεις παραλήπτη δεν είναι έγκυρες: ';
 $PHPMAILER_LANG['signing']              = 'Σφάλμα υπογραφής: ';
-$PHPMAILER_LANG['smtp_connect_failed']  = 'Αποτυχία σύνδεσης στον SMTP Server.';
-$PHPMAILER_LANG['smtp_error']           = 'Σφάλμα από τον SMTP Server: ';
-$PHPMAILER_LANG['variable_set']         = 'Αδυναμία ορισμού ή αρχικοποίησης μεταβλητής: ';
-//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+$PHPMAILER_LANG['smtp_code']            = 'Κώδικάς SMTP: ';
+$PHPMAILER_LANG['smtp_code_ex']         = 'Πρόσθετες πληροφορίες SMTP: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Αποτυχία σύνδεσης SMTP.';
+$PHPMAILER_LANG['smtp_detail']          = 'Λεπτομέρεια: ';
+$PHPMAILER_LANG['smtp_error']           = 'Σφάλμα με τον διακομιστή SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'Αδυναμία ορισμού ή επαναφοράς μεταβλητής: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php
index b57f0ec660c73a1c3975e62f36f34e4c435ee53b..38a7a8e7e5b632543cbedb0c69115c1c654c7053 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php
@@ -9,24 +9,30 @@
  * @see http://unicode.org/udhr/n/notes_fra.html
  */
 
-$PHPMAILER_LANG['authenticate']         = 'Erreur SMTP : échec de l\'authentification.';
+$PHPMAILER_LANG['authenticate']         = 'Erreur SMTP : échec de l’authentification.';
+$PHPMAILER_LANG['buggy_php']            = 'Votre version de PHP est affectée par un bug qui peut entraîner des messages corrompus. Pour résoudre ce problème, passez à l’envoi par SMTP, désactivez l’option mail.add_x_header dans le fichier php.ini, passez à MacOS ou Linux, ou passez PHP à la version 7.0.17+ ou 7.1.3+.';
 $PHPMAILER_LANG['connect_host']         = 'Erreur SMTP : impossible de se connecter au serveur SMTP.';
 $PHPMAILER_LANG['data_not_accepted']    = 'Erreur SMTP : données incorrectes.';
 $PHPMAILER_LANG['empty_message']        = 'Corps du message vide.';
 $PHPMAILER_LANG['encoding']             = 'Encodage inconnu : ';
-$PHPMAILER_LANG['execute']              = 'Impossible de lancer l\'exécution : ';
-$PHPMAILER_LANG['file_access']          = 'Impossible d\'accéder au fichier : ';
+$PHPMAILER_LANG['execute']              = 'Impossible de lancer l’exécution : ';
+$PHPMAILER_LANG['extension_missing']    = 'Extension manquante : ';
+$PHPMAILER_LANG['file_access']          = 'Impossible d’accéder au fichier : ';
 $PHPMAILER_LANG['file_open']            = 'Ouverture du fichier impossible : ';
-$PHPMAILER_LANG['from_failed']          = 'L\'adresse d\'expéditeur suivante a échoué : ';
-$PHPMAILER_LANG['instantiate']          = 'Impossible d\'instancier la fonction mail.';
-$PHPMAILER_LANG['invalid_address']      = 'L\'adresse courriel n\'est pas valide : ';
-$PHPMAILER_LANG['invalid_hostentry']    = 'L\'entrée hôte n\'est pas valide : ';
-$PHPMAILER_LANG['invalid_host']         = 'L\'hôte n\'est pas valide : ';
+$PHPMAILER_LANG['from_failed']          = 'L’adresse d’expéditeur suivante a échoué : ';
+$PHPMAILER_LANG['instantiate']          = 'Impossible d’instancier la fonction mail.';
+$PHPMAILER_LANG['invalid_address']      = 'Adresse courriel non valide : ';
+$PHPMAILER_LANG['invalid_header']       = 'Nom ou valeur de l’en-tête non valide';
+$PHPMAILER_LANG['invalid_hostentry']    = 'Entrée d’hôte non valide : ';
+$PHPMAILER_LANG['invalid_host']         = 'Hôte non valide : ';
 $PHPMAILER_LANG['mailer_not_supported'] = ' client de messagerie non supporté.';
 $PHPMAILER_LANG['provide_address']      = 'Vous devez fournir au moins une adresse de destinataire.';
-$PHPMAILER_LANG['recipients_failed']    = 'Erreur SMTP : les destinataires suivants sont en erreur : ';
+$PHPMAILER_LANG['recipients_failed']    = 'Erreur SMTP : les destinataires suivants ont échoué : ';
 $PHPMAILER_LANG['signing']              = 'Erreur de signature : ';
-$PHPMAILER_LANG['smtp_connect_failed']  = 'Échec de la connexion SMTP.';
+$PHPMAILER_LANG['smtp_code']            = 'Code SMTP : ';
+$PHPMAILER_LANG['smtp_code_ex']         = 'Informations supplémentaires SMTP : ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'La fonction SMTP connect() a échouée.';
+$PHPMAILER_LANG['smtp_detail']          = 'Détails : ';
 $PHPMAILER_LANG['smtp_error']           = 'Erreur du serveur SMTP : ';
-$PHPMAILER_LANG['variable_set']         = 'Impossible d\'initialiser ou de réinitialiser une variable : ';
+$PHPMAILER_LANG['variable_set']         = 'Impossible d’initialiser ou de réinitialiser une variable : ';
 $PHPMAILER_LANG['extension_missing']    = 'Extension manquante : ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php
index eee7989881297422b3af194d38a866e52dd64d41..c76f5264c9e75300ace758eca0adfd50c3aeee5f 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php
@@ -5,24 +5,25 @@
  * @package PHPMailer
  * @author Mitsuhiro Yoshida <http://mitstek.com/>
  * @author Yoshi Sakai <http://bluemooninc.jp/>
+ * @author Arisophy <https://github.com/arisophy/>
  */
 
 $PHPMAILER_LANG['authenticate']         = 'SMTPエラー: 認証できませんでした。';
 $PHPMAILER_LANG['connect_host']         = 'SMTPエラー: SMTPホストに接続できませんでした。';
 $PHPMAILER_LANG['data_not_accepted']    = 'SMTPエラー: データが受け付けられませんでした。';
-//$PHPMAILER_LANG['empty_message']        = 'Message body empty';
+$PHPMAILER_LANG['empty_message']        = 'メール本文が空です。';
 $PHPMAILER_LANG['encoding']             = '不明なエンコーディング: ';
 $PHPMAILER_LANG['execute']              = '実行できませんでした: ';
 $PHPMAILER_LANG['file_access']          = 'ファイルにアクセスできません: ';
 $PHPMAILER_LANG['file_open']            = 'ファイルエラー: ファイルを開けません: ';
 $PHPMAILER_LANG['from_failed']          = 'Fromアドレスを登録する際にエラーが発生しました: ';
 $PHPMAILER_LANG['instantiate']          = 'メール関数が正常に動作しませんでした。';
-//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';
+$PHPMAILER_LANG['invalid_address']      = '不正なメールアドレス: ';
 $PHPMAILER_LANG['provide_address']      = '少なくとも1つメールアドレスを 指定する必要があります。';
 $PHPMAILER_LANG['mailer_not_supported'] = ' メーラーがサポートされていません。';
 $PHPMAILER_LANG['recipients_failed']    = 'SMTPエラー: 次の受信者アドレスに 間違いがあります: ';
-//$PHPMAILER_LANG['signing']              = 'Signing Error: ';
-//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';
-//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';
-//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';
-//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+$PHPMAILER_LANG['signing']              = '署名エラー: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP接続に失敗しました。';
+$PHPMAILER_LANG['smtp_error']           = 'SMTPサーバーエラー: ';
+$PHPMAILER_LANG['variable_set']         = '変数が存在しません: ';
+$PHPMAILER_LANG['extension_missing']    = '拡張機能が見つかりません: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-mn.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-mn.php
new file mode 100644
index 0000000000000000000000000000000000000000..04d262c7243aad8c53eb4823207fbab1eb1362fa
--- /dev/null
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-mn.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Mongolian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author @wispas
+ */
+
+$PHPMAILER_LANG['authenticate']         = 'Алдаа SMTP: Холбогдож чадсангүй.';
+$PHPMAILER_LANG['connect_host']         = 'Алдаа SMTP: SMTP- сервертэй холбогдож болохгүй байна.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Алдаа SMTP: зөвшөөрөгдсөнгүй.';
+$PHPMAILER_LANG['encoding']             = 'Тодорхойгүй кодчилол: ';
+$PHPMAILER_LANG['execute']              = 'Коммандыг гүйцэтгэх боломжгүй байна: ';
+$PHPMAILER_LANG['file_access']          = 'Файлд хандах боломжгүй байна: ';
+$PHPMAILER_LANG['file_open']            = 'Файлын алдаа: файлыг нээх боломжгүй байна: ';
+$PHPMAILER_LANG['from_failed']          = 'Илгээгчийн хаяг буруу байна: ';
+$PHPMAILER_LANG['instantiate']          = 'Mail () функцийг ажиллуулах боломжгүй байна.';
+$PHPMAILER_LANG['provide_address']      = 'Хүлээн авагчийн имэйл хаягийг оруулна уу.';
+$PHPMAILER_LANG['mailer_not_supported'] = ' — мэйл серверийг дэмжсэнгүй.';
+$PHPMAILER_LANG['recipients_failed']    = 'Алдаа SMTP: ийм хаягийг илгээж чадсангүй: ';
+$PHPMAILER_LANG['empty_message']        = 'Хоосон мессэж';
+$PHPMAILER_LANG['invalid_address']      = 'И-Мэйл буруу форматтай тул илгээх боломжгүй: ';
+$PHPMAILER_LANG['signing']              = 'Гарын үсгийн алдаа: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP сервертэй холбогдоход алдаа гарлаа';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP серверийн алдаа: ';
+$PHPMAILER_LANG['variable_set']         = 'Хувьсагчийг тохируулах эсвэл дахин тохируулах боломжгүй байна: ';
+$PHPMAILER_LANG['extension_missing']    = 'Өргөтгөл байхгүй: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-nl.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-nl.php
index bf41ade8faef1ad885aa9be883ba0681f9a5b445..8229d5e257e4b1a2a948e8e9d67bbffcb66d62d8 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-nl.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-nl.php
@@ -7,23 +7,28 @@
  */
 
 $PHPMAILER_LANG['authenticate']         = 'SMTP-fout: authenticatie mislukt.';
+$PHPMAILER_LANG['buggy_php']            = 'PHP versie gededecteerd die onderhavig is aan een bug die kan resulteren in gecorrumpeerde berichten. Om dit te voorkomen, gebruik SMTP voor het verzenden van berichten, zet de mail.add_x_header optie in uw php.ini file uit, gebruik MacOS of Linux, of pas de gebruikte PHP versie aan naar versie 7.0.17+ or 7.1.3+.';
 $PHPMAILER_LANG['connect_host']         = 'SMTP-fout: kon niet verbinden met SMTP-host.';
 $PHPMAILER_LANG['data_not_accepted']    = 'SMTP-fout: data niet geaccepteerd.';
 $PHPMAILER_LANG['empty_message']        = 'Berichttekst is leeg';
 $PHPMAILER_LANG['encoding']             = 'Onbekende codering: ';
 $PHPMAILER_LANG['execute']              = 'Kon niet uitvoeren: ';
+$PHPMAILER_LANG['extension_missing']    = 'Extensie afwezig: ';
 $PHPMAILER_LANG['file_access']          = 'Kreeg geen toegang tot bestand: ';
 $PHPMAILER_LANG['file_open']            = 'Bestandsfout: kon bestand niet openen: ';
 $PHPMAILER_LANG['from_failed']          = 'Het volgende afzendersadres is mislukt: ';
 $PHPMAILER_LANG['instantiate']          = 'Kon mailfunctie niet initialiseren.';
 $PHPMAILER_LANG['invalid_address']      = 'Ongeldig adres: ';
+$PHPMAILER_LANG['invalid_header']       = 'Ongeldige header naam of waarde';
 $PHPMAILER_LANG['invalid_hostentry']    = 'Ongeldige hostentry: ';
 $PHPMAILER_LANG['invalid_host']         = 'Ongeldige host: ';
 $PHPMAILER_LANG['mailer_not_supported'] = ' mailer wordt niet ondersteund.';
 $PHPMAILER_LANG['provide_address']      = 'Er moet minstens één ontvanger worden opgegeven.';
 $PHPMAILER_LANG['recipients_failed']    = 'SMTP-fout: de volgende ontvangers zijn mislukt: ';
 $PHPMAILER_LANG['signing']              = 'Signeerfout: ';
+$PHPMAILER_LANG['smtp_code']            = 'SMTP code: ';
+$PHPMAILER_LANG['smtp_code_ex']         = 'Aanvullende SMTP informatie: ';
 $PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Verbinding mislukt.';
+$PHPMAILER_LANG['smtp_detail']          = 'Detail: ';
 $PHPMAILER_LANG['smtp_error']           = 'SMTP-serverfout: ';
 $PHPMAILER_LANG['variable_set']         = 'Kan de volgende variabele niet instellen of resetten: ';
-$PHPMAILER_LANG['extension_missing']    = 'Extensie afwezig: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php
index d8638098ce7053450e34b2738b86e95bff28b806..5239865a6f8b4c95e968432b1f30aff55878e165 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php
@@ -7,24 +7,32 @@
  * @author Lucas Guimarães <lucas@lucasguimaraes.com>
  * @author Phelipe Alves <phelipealvesdesouza@gmail.com>
  * @author Fabio Beneditto <fabiobeneditto@gmail.com>
+ * @author Geidson Benício Coelho <geidsonc@gmail.com>
  */
 
 $PHPMAILER_LANG['authenticate']         = 'Erro de SMTP: Não foi possível autenticar.';
+$PHPMAILER_LANG['buggy_php']            = 'Sua versão do PHP é afetada por um bug que por resultar em messagens corrompidas. Para corrigir, mude para enviar usando SMTP, desative a opção mail.add_x_header em seu php.ini, mude para MacOS ou Linux, ou atualize seu PHP para versão 7.0.17+ ou 7.1.3+ ';
 $PHPMAILER_LANG['connect_host']         = 'Erro de SMTP: Não foi possível conectar ao servidor SMTP.';
 $PHPMAILER_LANG['data_not_accepted']    = 'Erro de SMTP: Dados rejeitados.';
 $PHPMAILER_LANG['empty_message']        = 'Mensagem vazia';
 $PHPMAILER_LANG['encoding']             = 'Codificação desconhecida: ';
 $PHPMAILER_LANG['execute']              = 'Não foi possível executar: ';
+$PHPMAILER_LANG['extension_missing']    = 'Extensão não existe: ';
 $PHPMAILER_LANG['file_access']          = 'Não foi possível acessar o arquivo: ';
 $PHPMAILER_LANG['file_open']            = 'Erro de Arquivo: Não foi possível abrir o arquivo: ';
 $PHPMAILER_LANG['from_failed']          = 'Os seguintes remetentes falharam: ';
 $PHPMAILER_LANG['instantiate']          = 'Não foi possível instanciar a função mail.';
 $PHPMAILER_LANG['invalid_address']      = 'Endereço de e-mail inválido: ';
+$PHPMAILER_LANG['invalid_header']       = 'Nome ou valor de cabeçalho inválido';
+$PHPMAILER_LANG['invalid_hostentry']    = 'hostentry inválido: ';
+$PHPMAILER_LANG['invalid_host']         = 'host inválido: ';
 $PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.';
 $PHPMAILER_LANG['provide_address']      = 'Você deve informar pelo menos um destinatário.';
 $PHPMAILER_LANG['recipients_failed']    = 'Erro de SMTP: Os seguintes destinatários falharam: ';
 $PHPMAILER_LANG['signing']              = 'Erro de Assinatura: ';
 $PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() falhou.';
+$PHPMAILER_LANG['smtp_code']            = 'Código do servidor SMTP: ';
 $PHPMAILER_LANG['smtp_error']           = 'Erro de servidor SMTP: ';
+$PHPMAILER_LANG['smtp_code_ex']         = 'Informações adicionais do servidor SMTP: ';
+$PHPMAILER_LANG['smtp_detail']          = 'Detalhes do servidor SMTP: ';
 $PHPMAILER_LANG['variable_set']         = 'Não foi possível definir ou redefinir a variável: ';
-$PHPMAILER_LANG['extension_missing']    = 'Extensão não existe: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php
index 292ec1e48f0b6b620bea22b44a95bc1dd96586bb..45bef9155386fa0009f5f2f1f9dbe2d67a7bb7bb 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php
@@ -3,25 +3,31 @@
 /**
  * Romanian PHPMailer language file: refer to English translation for definitive list
  * @package PHPMailer
- * @author Alex Florea <alecz.fia@gmail.com>
  */
 
 $PHPMAILER_LANG['authenticate']         = 'Eroare SMTP: Autentificarea a eșuat.';
+$PHPMAILER_LANG['buggy_php']            = 'Versiunea instalată de PHP este afectată de o problemă care poate duce la coruperea mesajelor Pentru a preveni această problemă, folosiți SMTP, dezactivați opțiunea mail.add_x_header din php.ini, folosiți MacOS/Linux sau actualizați versiunea de PHP la 7.0.17+ sau 7.1.3+.';
 $PHPMAILER_LANG['connect_host']         = 'Eroare SMTP: Conectarea la serverul SMTP a eșuat.';
 $PHPMAILER_LANG['data_not_accepted']    = 'Eroare SMTP: Datele nu au fost acceptate.';
 $PHPMAILER_LANG['empty_message']        = 'Mesajul este gol.';
 $PHPMAILER_LANG['encoding']             = 'Encodare necunoscută: ';
 $PHPMAILER_LANG['execute']              = 'Nu se poate executa următoarea comandă:  ';
+$PHPMAILER_LANG['extension_missing']    = 'Lipsește extensia: ';
 $PHPMAILER_LANG['file_access']          = 'Nu se poate accesa următorul fișier: ';
 $PHPMAILER_LANG['file_open']            = 'Eroare fișier: Nu se poate deschide următorul fișier: ';
 $PHPMAILER_LANG['from_failed']          = 'Următoarele adrese From au dat eroare: ';
 $PHPMAILER_LANG['instantiate']          = 'Funcția mail nu a putut fi inițializată.';
 $PHPMAILER_LANG['invalid_address']      = 'Adresa de email nu este validă: ';
+$PHPMAILER_LANG['invalid_header']       = 'Numele sau valoarea header-ului nu este validă: ';
+$PHPMAILER_LANG['invalid_hostentry']    = 'Hostentry invalid: ';
+$PHPMAILER_LANG['invalid_host']         = 'Host invalid: ';
 $PHPMAILER_LANG['mailer_not_supported'] = ' mailer nu este suportat.';
 $PHPMAILER_LANG['provide_address']      = 'Trebuie să adăugați cel puțin o adresă de email.';
 $PHPMAILER_LANG['recipients_failed']    = 'Eroare SMTP: Următoarele adrese de email au eșuat: ';
 $PHPMAILER_LANG['signing']              = 'A aparut o problemă la semnarea emailului. ';
+$PHPMAILER_LANG['smtp_code']            = 'Cod SMTP: ';
+$PHPMAILER_LANG['smtp_code_ex']         = 'Informații SMTP adiționale: ';
 $PHPMAILER_LANG['smtp_connect_failed']  = 'Conectarea la serverul SMTP a eșuat.';
+$PHPMAILER_LANG['smtp_detail']          = 'Detalii SMTP: ';
 $PHPMAILER_LANG['smtp_error']           = 'Eroare server SMTP: ';
 $PHPMAILER_LANG['variable_set']         = 'Nu se poate seta/reseta variabila. ';
-$PHPMAILER_LANG['extension_missing']    = 'Lipsește extensia: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php
index a1cfb2889a8af98d41ed3abdd736fd7a837c59a4..028f5bc49693b7339371b1350a3db9aa001452ad 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php
@@ -18,6 +18,8 @@
 $PHPMAILER_LANG['from_failed']          = 'Následujúca adresa From je nesprávna: ';
 $PHPMAILER_LANG['instantiate']          = 'Nedá sa vytvoriť inštancia emailovej funkcie.';
 $PHPMAILER_LANG['invalid_address']      = 'Neodoslané, emailová adresa je nesprávna: ';
+$PHPMAILER_LANG['invalid_hostentry']    = 'Záznam hostiteľa je nesprávny: ';
+$PHPMAILER_LANG['invalid_host']         = 'Hostiteľ je nesprávny: ';
 $PHPMAILER_LANG['mailer_not_supported'] = ' emailový klient nieje podporovaný.';
 $PHPMAILER_LANG['provide_address']      = 'Musíte zadať aspoň jednu emailovú adresu príjemcu.';
 $PHPMAILER_LANG['recipients_failed']    = 'SMTP Error: Adresy príjemcov niesu správne ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php
index c437a886226f8659a119d99305b48dcd02447ac8..3e00c25963274b4a67c2d22ba60e7f6df900443b 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php
@@ -9,23 +9,28 @@
  */
 
 $PHPMAILER_LANG['authenticate']         = 'SMTP napaka: Avtentikacija ni uspela.';
+$PHPMAILER_LANG['buggy_php']            = 'Na vašo PHP različico vpliva napaka, ki lahko povzroči poškodovana sporočila. Če želite težavo odpraviti, preklopite na pošiljanje prek SMTP, onemogočite možnost mail.add_x_header v vaši php.ini datoteki, preklopite na MacOS ali Linux, ali nadgradite vašo PHP zaličico na 7.0.17+ ali 7.1.3+.';
 $PHPMAILER_LANG['connect_host']         = 'SMTP napaka: Vzpostavljanje povezave s SMTP gostiteljem ni uspelo.';
 $PHPMAILER_LANG['data_not_accepted']    = 'SMTP napaka: Strežnik zavrača podatke.';
 $PHPMAILER_LANG['empty_message']        = 'E-poštno sporočilo nima vsebine.';
 $PHPMAILER_LANG['encoding']             = 'Nepoznan tip kodiranja: ';
 $PHPMAILER_LANG['execute']              = 'Operacija ni uspela: ';
+$PHPMAILER_LANG['extension_missing']    = 'Manjkajoča razširitev: ';
 $PHPMAILER_LANG['file_access']          = 'Nimam dostopa do datoteke: ';
 $PHPMAILER_LANG['file_open']            = 'Ne morem odpreti datoteke: ';
 $PHPMAILER_LANG['from_failed']          = 'Neveljaven e-naslov pošiljatelja: ';
 $PHPMAILER_LANG['instantiate']          = 'Ne morem inicializirati mail funkcije.';
 $PHPMAILER_LANG['invalid_address']      = 'E-poštno sporočilo ni bilo poslano. E-naslov je neveljaven: ';
+$PHPMAILER_LANG['invalid_header']       = 'Neveljavno ime ali vrednost glave';
 $PHPMAILER_LANG['invalid_hostentry']    = 'Neveljaven vnos gostitelja: ';
 $PHPMAILER_LANG['invalid_host']         = 'Neveljaven gostitelj: ';
 $PHPMAILER_LANG['mailer_not_supported'] = ' mailer ni podprt.';
 $PHPMAILER_LANG['provide_address']      = 'Prosimo, vnesite vsaj enega naslovnika.';
 $PHPMAILER_LANG['recipients_failed']    = 'SMTP napaka: Sledeči naslovniki so neveljavni: ';
 $PHPMAILER_LANG['signing']              = 'Napaka pri podpisovanju: ';
+$PHPMAILER_LANG['smtp_code']            = 'SMTP koda: ';
+$PHPMAILER_LANG['smtp_code_ex']         = 'Dodatne informacije o SMTP: ';
 $PHPMAILER_LANG['smtp_connect_failed']  = 'Ne morem vzpostaviti povezave s SMTP strežnikom.';
+$PHPMAILER_LANG['smtp_detail']          = 'Podrobnosti: ';
 $PHPMAILER_LANG['smtp_error']           = 'Napaka SMTP strežnika: ';
 $PHPMAILER_LANG['variable_set']         = 'Ne morem nastaviti oz. ponastaviti spremenljivke: ';
-$PHPMAILER_LANG['extension_missing']    = 'Manjkajoča razširitev: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr_latn.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr_latn.php
new file mode 100644
index 0000000000000000000000000000000000000000..62138329acba6e8e11974987a82c80fa9f1057b4
--- /dev/null
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr_latn.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Serbian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Александар Јевремовић <ajevremovic@gmail.com>
+ * @author Miloš Milanović <mmilanovic016@gmail.com>
+ */
+
+$PHPMAILER_LANG['authenticate']         = 'SMTP greška: autentifikacija nije uspela.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP greška: povezivanje sa SMTP serverom nije uspelo.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP greška: podaci nisu prihvaćeni.';
+$PHPMAILER_LANG['empty_message']        = 'Sadržaj poruke je prazan.';
+$PHPMAILER_LANG['encoding']             = 'Nepoznato kodiranje: ';
+$PHPMAILER_LANG['execute']              = 'Nije moguće izvršiti naredbu: ';
+$PHPMAILER_LANG['file_access']          = 'Nije moguće pristupiti datoteci: ';
+$PHPMAILER_LANG['file_open']            = 'Nije moguće otvoriti datoteku: ';
+$PHPMAILER_LANG['from_failed']          = 'SMTP greška: slanje sa sledećih adresa nije uspelo: ';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP greška: slanje na sledeće adrese nije uspelo: ';
+$PHPMAILER_LANG['instantiate']          = 'Nije moguće pokrenuti mail funkciju.';
+$PHPMAILER_LANG['invalid_address']      = 'Poruka nije poslata. Neispravna adresa: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' majler nije podržan.';
+$PHPMAILER_LANG['provide_address']      = 'Definišite bar jednu adresu primaoca.';
+$PHPMAILER_LANG['signing']              = 'Greška prilikom prijave: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Povezivanje sa SMTP serverom nije uspelo.';
+$PHPMAILER_LANG['smtp_error']           = 'Greška SMTP servera: ';
+$PHPMAILER_LANG['variable_set']         = 'Nije moguće zadati niti resetovati promenljivu: ';
+$PHPMAILER_LANG['extension_missing']    = 'Nedostaje proširenje: ';
diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-uk.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-uk.php
index 9fa60cf190632863777f3a163659c92ba1c10682..3dea055bbc28be71b11112f208c3de8a7df3128e 100644
--- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-uk.php
+++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-uk.php
@@ -16,11 +16,11 @@
 $PHPMAILER_LANG['file_open']            = 'Помилка файлової системи: не вдається відкрити файл: ';
 $PHPMAILER_LANG['from_failed']          = 'Невірна адреса відправника: ';
 $PHPMAILER_LANG['instantiate']          = 'Неможливо запустити функцію mail().';
-$PHPMAILER_LANG['provide_address']      = 'Будь-ласка, введіть хоча б одну email-адресу отримувача.';
+$PHPMAILER_LANG['provide_address']      = 'Будь ласка, введіть хоча б одну email-адресу отримувача.';
 $PHPMAILER_LANG['mailer_not_supported'] = ' - поштовий сервер не підтримується.';
 $PHPMAILER_LANG['recipients_failed']    = 'Помилка SMTP: не вдалося відправлення для таких отримувачів: ';
 $PHPMAILER_LANG['empty_message']        = 'Пусте повідомлення';
-$PHPMAILER_LANG['invalid_address']      = 'Не відправлено через невірний формат email-адреси: ';
+$PHPMAILER_LANG['invalid_address']      = 'Не відправлено через неправильний формат email-адреси: ';
 $PHPMAILER_LANG['signing']              = 'Помилка підпису: ';
 $PHPMAILER_LANG['smtp_connect_failed']  = 'Помилка з\'єднання з SMTP-сервером';
 $PHPMAILER_LANG['smtp_error']           = 'Помилка SMTP-сервера: ';
diff --git a/vendor/phpmailer/phpmailer/src/Exception.php b/vendor/phpmailer/phpmailer/src/Exception.php
index a50a8991f7a1d13551dfe3fa98085aa604715833..52eaf95158a37321a8a08d520ab0eea6ef78bbf5 100644
--- a/vendor/phpmailer/phpmailer/src/Exception.php
+++ b/vendor/phpmailer/phpmailer/src/Exception.php
@@ -35,6 +35,6 @@ class Exception extends \Exception
      */
     public function errorMessage()
     {
-        return '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
+        return '<strong>' . htmlspecialchars($this->getMessage(), ENT_COMPAT | ENT_HTML401) . "</strong><br />\n";
     }
 }
diff --git a/vendor/phpmailer/phpmailer/src/OAuth.php b/vendor/phpmailer/phpmailer/src/OAuth.php
index 07fde4c8158420c4b293f8388c71e64ff6b49b10..c1d5b77623cb9ffeefedb01e26d6aeb3b7f2e105 100644
--- a/vendor/phpmailer/phpmailer/src/OAuth.php
+++ b/vendor/phpmailer/phpmailer/src/OAuth.php
@@ -33,7 +33,7 @@
  *
  * @author  Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
  */
-class OAuth
+class OAuth implements OAuthTokenProvider
 {
     /**
      * An instance of the League OAuth Client Provider.
@@ -123,7 +123,7 @@ protected function getToken()
      */
     public function getOauth64()
     {
-        // Get a new token if it's not available or has expired
+        //Get a new token if it's not available or has expired
         if (null === $this->oauthToken || $this->oauthToken->hasExpired()) {
             $this->oauthToken = $this->getToken();
         }
diff --git a/vendor/phpmailer/phpmailer/src/OAuthTokenProvider.php b/vendor/phpmailer/phpmailer/src/OAuthTokenProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..1155507435bcd789e0624869896ba471290e8f79
--- /dev/null
+++ b/vendor/phpmailer/phpmailer/src/OAuthTokenProvider.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * PHPMailer - PHP email creation and transport class.
+ * PHP Version 5.5.
+ *
+ * @see https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
+ *
+ * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
+ * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>
+ * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
+ * @author    Brent R. Matzelle (original founder)
+ * @copyright 2012 - 2020 Marcus Bointon
+ * @copyright 2010 - 2012 Jim Jagielski
+ * @copyright 2004 - 2009 Andy Prevost
+ * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ * @note      This program is distributed in the hope that it will be useful - WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+namespace PHPMailer\PHPMailer;
+
+/**
+ * OAuthTokenProvider - OAuth2 token provider interface.
+ * Provides base64 encoded OAuth2 auth strings for SMTP authentication.
+ *
+ * @see     OAuth
+ * @see     SMTP::authenticate()
+ *
+ * @author  Peter Scopes (pdscopes)
+ * @author  Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
+ */
+interface OAuthTokenProvider
+{
+    /**
+     * Generate a base64-encoded OAuth token ensuring that the access token has not expired.
+     * The string to be base 64 encoded should be in the form:
+     * "user=<user_email_address>\001auth=Bearer <access_token>\001\001"
+     *
+     * @return string
+     */
+    public function getOauth64();
+}
diff --git a/vendor/phpmailer/phpmailer/src/PHPMailer.php b/vendor/phpmailer/phpmailer/src/PHPMailer.php
index c8fc1a8243185affff6177b4ae8ad966231d3a95..62424545a2d42bf772be8fee53c4c07d98676909 100644
--- a/vendor/phpmailer/phpmailer/src/PHPMailer.php
+++ b/vendor/phpmailer/phpmailer/src/PHPMailer.php
@@ -103,14 +103,14 @@ class PHPMailer
      *
      * @var string
      */
-    public $From = 'root@localhost';
+    public $From = '';
 
     /**
      * The From name of the message.
      *
      * @var string
      */
-    public $FromName = 'Root User';
+    public $FromName = '';
 
     /**
      * The envelope sender of the message.
@@ -350,17 +350,17 @@ class PHPMailer
     public $Password = '';
 
     /**
-     * SMTP auth type.
-     * Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2, attempted in that order if not specified.
+     * SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2.
+     * If not specified, the first one from that list that the server supports will be selected.
      *
      * @var string
      */
     public $AuthType = '';
 
     /**
-     * An instance of the PHPMailer OAuth class.
+     * An implementation of the PHPMailer OAuthTokenProvider interface.
      *
-     * @var OAuth
+     * @var OAuthTokenProvider
      */
     protected $oauth;
 
@@ -428,9 +428,11 @@ class PHPMailer
     public $Debugoutput = 'echo';
 
     /**
-     * Whether to keep SMTP connection open after each message.
-     * If this is set to true then to close the connection
-     * requires an explicit call to smtpClose().
+     * Whether to keep the SMTP connection open after each message.
+     * If this is set to true then the connection will remain open after a send,
+     * and closing the connection will require an explicit call to smtpClose().
+     * It's a good idea to use this if you are sending multiple messages as it reduces overhead.
+     * See the mailing list example for how to use it.
      *
      * @var bool
      */
@@ -687,7 +689,7 @@ class PHPMailer
     protected $boundary = [];
 
     /**
-     * The array of available languages.
+     * The array of available text strings for the current language.
      *
      * @var array
      */
@@ -748,7 +750,7 @@ class PHPMailer
      *
      * @var string
      */
-    const VERSION = '6.2.0';
+    const VERSION = '6.6.4';
 
     /**
      * Error severity: message only, continue processing.
@@ -862,18 +864,25 @@ private function mailPassthru($to, $subject, $body, $header, $params)
             $subject = $this->encodeHeader($this->secureHeader($subject));
         }
         //Calling mail() with null params breaks
+        $this->edebug('Sending with mail()');
+        $this->edebug('Sendmail path: ' . ini_get('sendmail_path'));
+        $this->edebug("Envelope sender: {$this->Sender}");
+        $this->edebug("To: {$to}");
+        $this->edebug("Subject: {$subject}");
+        $this->edebug("Headers: {$header}");
         if (!$this->UseSendmailOptions || null === $params) {
             $result = @mail($to, $subject, $body, $header);
         } else {
+            $this->edebug("Additional params: {$params}");
             $result = @mail($to, $subject, $body, $header, $params);
         }
-
+        $this->edebug('Result: ' . ($result ? 'true' : 'false'));
         return $result;
     }
 
     /**
-     * Output debugging info via user-defined method.
-     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
+     * Output debugging info via a user-defined method.
+     * Only generates output if debug output is enabled.
      *
      * @see PHPMailer::$Debugoutput
      * @see PHPMailer::$SMTPDebug
@@ -1057,8 +1066,8 @@ public function addReplyTo($address, $name = '')
      * Addresses that have been added already return false, but do not throw exceptions.
      *
      * @param string $kind    One of 'to', 'cc', 'bcc', or 'ReplyTo'
-     * @param string $address The email address to send, resp. to reply to
-     * @param string $name
+     * @param string $address The email address
+     * @param string $name    An optional username associated with the address
      *
      * @throws Exception
      *
@@ -1066,11 +1075,13 @@ public function addReplyTo($address, $name = '')
      */
     protected function addOrEnqueueAnAddress($kind, $address, $name)
     {
-        $address = trim($address);
-        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
-        $pos = strrpos($address, '@');
+        $pos = false;
+        if ($address !== null) {
+            $address = trim($address);
+            $pos = strrpos($address, '@');
+        }
         if (false === $pos) {
-            // At-sign is missing.
+            //At-sign is missing.
             $error_message = sprintf(
                 '%s (%s): %s',
                 $this->lang('invalid_address'),
@@ -1085,8 +1096,14 @@ protected function addOrEnqueueAnAddress($kind, $address, $name)
 
             return false;
         }
+        if ($name !== null && is_string($name)) {
+            $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
+        } else {
+            $name = '';
+        }
         $params = [$kind, $address, $name];
-        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
+        //Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
+        //Domain is assumed to be whatever is after the last @ symbol in the address
         if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) {
             if ('Reply-To' !== $kind) {
                 if (!array_key_exists($address, $this->RecipientsQueue)) {
@@ -1103,7 +1120,7 @@ protected function addOrEnqueueAnAddress($kind, $address, $name)
             return false;
         }
 
-        // Immediately add standard addresses without IDN.
+        //Immediately add standard addresses without IDN.
         return call_user_func_array([$this, 'addAnAddress'], $params);
     }
 
@@ -1176,21 +1193,39 @@ protected function addAnAddress($kind, $address, $name = '')
      *
      * @param string $addrstr The address list string
      * @param bool   $useimap Whether to use the IMAP extension to parse the list
+     * @param string $charset The charset to use when decoding the address list string.
      *
      * @return array
      */
-    public static function parseAddresses($addrstr, $useimap = true)
+    public static function parseAddresses($addrstr, $useimap = true, $charset = self::CHARSET_ISO88591)
     {
         $addresses = [];
         if ($useimap && function_exists('imap_rfc822_parse_adrlist')) {
             //Use this built-in parser if it's available
             $list = imap_rfc822_parse_adrlist($addrstr, '');
+            // Clear any potential IMAP errors to get rid of notices being thrown at end of script.
+            imap_errors();
             foreach ($list as $address) {
                 if (
-                    ('.SYNTAX-ERROR.' !== $address->host) && static::validateAddress(
-                        $address->mailbox . '@' . $address->host
-                    )
+                    '.SYNTAX-ERROR.' !== $address->host &&
+                    static::validateAddress($address->mailbox . '@' . $address->host)
                 ) {
+                    //Decode the name part if it's present and encoded
+                    if (
+                        property_exists($address, 'personal') &&
+                        //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled
+                        defined('MB_CASE_UPPER') &&
+                        preg_match('/^=\?.*\?=$/s', $address->personal)
+                    ) {
+                        $origCharset = mb_internal_encoding();
+                        mb_internal_encoding($charset);
+                        //Undo any RFC2047-encoded spaces-as-underscores
+                        $address->personal = str_replace('_', '=20', $address->personal);
+                        //Decode the name
+                        $address->personal = mb_decode_mimeheader($address->personal);
+                        mb_internal_encoding($origCharset);
+                    }
+
                     $addresses[] = [
                         'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                         'address' => $address->mailbox . '@' . $address->host,
@@ -1214,9 +1249,22 @@ public static function parseAddresses($addrstr, $useimap = true)
                 } else {
                     list($name, $email) = explode('<', $address);
                     $email = trim(str_replace('>', '', $email));
+                    $name = trim($name);
                     if (static::validateAddress($email)) {
+                        //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled
+                        //If this name is encoded, decode it
+                        if (defined('MB_CASE_UPPER') && preg_match('/^=\?.*\?=$/s', $name)) {
+                            $origCharset = mb_internal_encoding();
+                            mb_internal_encoding($charset);
+                            //Undo any RFC2047-encoded spaces-as-underscores
+                            $name = str_replace('_', '=20', $name);
+                            //Decode the name
+                            $name = mb_decode_mimeheader($name);
+                            mb_internal_encoding($origCharset);
+                        }
                         $addresses[] = [
-                            'name' => trim(str_replace(['"', "'"], '', $name)),
+                            //Remove any surrounding quotes and spaces from the name
+                            'name' => trim($name, '\'" '),
                             'address' => $email,
                         ];
                     }
@@ -1240,9 +1288,9 @@ public static function parseAddresses($addrstr, $useimap = true)
      */
     public function setFrom($address, $name = '', $auto = true)
     {
-        $address = trim($address);
+        $address = trim((string)$address);
         $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
-        // Don't validate now addresses with IDN. Will be done in send().
+        //Don't validate now addresses with IDN. Will be done in send().
         $pos = strrpos($address, '@');
         if (
             (false === $pos)
@@ -1313,7 +1361,8 @@ public static function validateAddress($address, $patternselect = null)
         if (null === $patternselect) {
             $patternselect = static::$validator;
         }
-        if (is_callable($patternselect)) {
+        //Don't allow strings as callables, see SECURITY.md and CVE-2021-3603
+        if (is_callable($patternselect) && !is_string($patternselect)) {
             return call_user_func($patternselect, $address);
         }
         //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
@@ -1395,7 +1444,7 @@ public static function idnSupported()
      */
     public function punyencodeAddress($address)
     {
-        // Verify we have required functions, CharSet, and at-sign.
+        //Verify we have required functions, CharSet, and at-sign.
         $pos = strrpos($address, '@');
         if (
             !empty($this->CharSet) &&
@@ -1403,16 +1452,25 @@ public function punyencodeAddress($address)
             static::idnSupported()
         ) {
             $domain = substr($address, ++$pos);
-            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
+            //Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
             if ($this->has8bitChars($domain) && @mb_check_encoding($domain, $this->CharSet)) {
-                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
+                //Convert the domain from whatever charset it's in to UTF-8
+                $domain = mb_convert_encoding($domain, self::CHARSET_UTF8, $this->CharSet);
                 //Ignore IDE complaints about this line - method signature changed in PHP 5.4
                 $errorcode = 0;
                 if (defined('INTL_IDNA_VARIANT_UTS46')) {
-                    $punycode = idn_to_ascii($domain, $errorcode, INTL_IDNA_VARIANT_UTS46);
+                    //Use the current punycode standard (appeared in PHP 7.2)
+                    $punycode = idn_to_ascii(
+                        $domain,
+                        \IDNA_DEFAULT | \IDNA_USE_STD3_RULES | \IDNA_CHECK_BIDI |
+                            \IDNA_CHECK_CONTEXTJ | \IDNA_NONTRANSITIONAL_TO_ASCII,
+                        \INTL_IDNA_VARIANT_UTS46
+                    );
                 } elseif (defined('INTL_IDNA_VARIANT_2003')) {
-                    $punycode = idn_to_ascii($domain, $errorcode, INTL_IDNA_VARIANT_2003);
+                    //Fall back to this old, deprecated/removed encoding
+                    $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_2003);
                 } else {
+                    //Fall back to a default we don't know about
                     $punycode = idn_to_ascii($domain, $errorcode);
                 }
                 if (false !== $punycode) {
@@ -1462,7 +1520,7 @@ public function preSend()
     {
         if (
             'smtp' === $this->Mailer
-            || ('mail' === $this->Mailer && (PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0))
+            || ('mail' === $this->Mailer && (\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0))
         ) {
             //SMTP mandates RFC-compliant line endings
             //and it's also used with mail() on Windows
@@ -1474,24 +1532,19 @@ public function preSend()
         //Check for buggy PHP versions that add a header with an incorrect line break
         if (
             'mail' === $this->Mailer
-            && ((PHP_VERSION_ID >= 70000 && PHP_VERSION_ID < 70017)
-                || (PHP_VERSION_ID >= 70100 && PHP_VERSION_ID < 70103))
+            && ((\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70017)
+                || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70103))
             && ini_get('mail.add_x_header') === '1'
             && stripos(PHP_OS, 'WIN') === 0
         ) {
-            trigger_error(
-                'Your version of PHP is affected by a bug that may result in corrupted messages.' .
-                ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' .
-                ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.',
-                E_USER_WARNING
-            );
+            trigger_error($this->lang('buggy_php'), E_USER_WARNING);
         }
 
         try {
-            $this->error_count = 0; // Reset errors
+            $this->error_count = 0; //Reset errors
             $this->mailHeader = '';
 
-            // Dequeue recipient and Reply-To addresses with IDN
+            //Dequeue recipient and Reply-To addresses with IDN
             foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                 $params[1] = $this->punyencodeAddress($params[1]);
                 call_user_func_array([$this, 'addAnAddress'], $params);
@@ -1500,19 +1553,19 @@ public function preSend()
                 throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL);
             }
 
-            // Validate From, Sender, and ConfirmReadingTo addresses
+            //Validate From, Sender, and ConfirmReadingTo addresses
             foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) {
-                $this->$address_kind = trim($this->$address_kind);
-                if (empty($this->$address_kind)) {
+                $this->{$address_kind} = trim($this->{$address_kind});
+                if (empty($this->{$address_kind})) {
                     continue;
                 }
-                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
-                if (!static::validateAddress($this->$address_kind)) {
+                $this->{$address_kind} = $this->punyencodeAddress($this->{$address_kind});
+                if (!static::validateAddress($this->{$address_kind})) {
                     $error_message = sprintf(
                         '%s (%s): %s',
                         $this->lang('invalid_address'),
                         $address_kind,
-                        $this->$address_kind
+                        $this->{$address_kind}
                     );
                     $this->setError($error_message);
                     $this->edebug($error_message);
@@ -1524,29 +1577,29 @@ public function preSend()
                 }
             }
 
-            // Set whether the message is multipart/alternative
+            //Set whether the message is multipart/alternative
             if ($this->alternativeExists()) {
                 $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE;
             }
 
             $this->setMessageType();
-            // Refuse to send an empty message unless we are specifically allowing it
+            //Refuse to send an empty message unless we are specifically allowing it
             if (!$this->AllowEmpty && empty($this->Body)) {
                 throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL);
             }
 
             //Trim subject consistently
             $this->Subject = trim($this->Subject);
-            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
+            //Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
             $this->MIMEHeader = '';
             $this->MIMEBody = $this->createBody();
-            // createBody may have added some headers, so retain them
+            //createBody may have added some headers, so retain them
             $tempheaders = $this->MIMEHeader;
             $this->MIMEHeader = $this->createHeader();
             $this->MIMEHeader .= $tempheaders;
 
-            // To capture the complete message when using mail(), create
-            // an extra header list which createHeader() doesn't fold in
+            //To capture the complete message when using mail(), create
+            //an extra header list which createHeader() doesn't fold in
             if ('mail' === $this->Mailer) {
                 if (count($this->to) > 0) {
                     $this->mailHeader .= $this->addrAppend('To', $this->to);
@@ -1559,7 +1612,7 @@ public function preSend()
                 );
             }
 
-            // Sign with DKIM if enabled
+            //Sign with DKIM if enabled
             if (
                 !empty($this->DKIM_domain)
                 && !empty($this->DKIM_selector)
@@ -1600,7 +1653,7 @@ public function preSend()
     public function postSend()
     {
         try {
-            // Choose the mailer and send through it
+            //Choose the mailer and send through it
             switch ($this->Mailer) {
                 case 'sendmail':
                 case 'qmail':
@@ -1612,7 +1665,7 @@ public function postSend()
                 default:
                     $sendMethod = $this->Mailer . 'Send';
                     if (method_exists($this, $sendMethod)) {
-                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
+                        return $this->{$sendMethod}($this->MIMEHeader, $this->MIMEBody);
                     }
 
                     return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
@@ -1645,22 +1698,47 @@ public function postSend()
      */
     protected function sendmailSend($header, $body)
     {
+        if ($this->Mailer === 'qmail') {
+            $this->edebug('Sending with qmail');
+        } else {
+            $this->edebug('Sending with sendmail');
+        }
         $header = static::stripTrailingWSP($header) . static::$LE . static::$LE;
+        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
+        //A space after `-f` is optional, but there is a long history of its presence
+        //causing problems, so we don't use one
+        //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html
+        //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html
+        //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html
+        //Example problem: https://www.drupal.org/node/1057954
 
-        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
-        if (!empty($this->Sender) && self::isShellSafe($this->Sender)) {
-            if ('qmail' === $this->Mailer) {
+        //PHP 5.6 workaround
+        $sendmail_from_value = ini_get('sendmail_from');
+        if (empty($this->Sender) && !empty($sendmail_from_value)) {
+            //PHP config has a sender address we can use
+            $this->Sender = ini_get('sendmail_from');
+        }
+        //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
+        if (!empty($this->Sender) && static::validateAddress($this->Sender) && self::isShellSafe($this->Sender)) {
+            if ($this->Mailer === 'qmail') {
                 $sendmailFmt = '%s -f%s';
             } else {
                 $sendmailFmt = '%s -oi -f%s -t';
             }
-        } elseif ('qmail' === $this->Mailer) {
-            $sendmailFmt = '%s';
         } else {
+            //allow sendmail to choose a default envelope sender. It may
+            //seem preferable to force it to use the From header as with
+            //SMTP, but that introduces new problems (see
+            //<https://github.com/PHPMailer/PHPMailer/issues/2298>), and
+            //it has historically worked this way.
             $sendmailFmt = '%s -oi -t';
         }
 
         $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);
+        $this->edebug('Sendmail path: ' . $this->Sendmail);
+        $this->edebug('Sendmail command: ' . $sendmail);
+        $this->edebug('Envelope sender: ' . $this->Sender);
+        $this->edebug("Headers: {$header}");
 
         if ($this->SingleTo) {
             foreach ($this->SingleToArray as $toAddr) {
@@ -1668,13 +1746,15 @@ protected function sendmailSend($header, $body)
                 if (!$mail) {
                     throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                 }
+                $this->edebug("To: {$toAddr}");
                 fwrite($mail, 'To: ' . $toAddr . "\n");
                 fwrite($mail, $header);
                 fwrite($mail, $body);
                 $result = pclose($mail);
+                $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet);
                 $this->doCallback(
                     ($result === 0),
-                    [$toAddr],
+                    [[$addrinfo['address'], $addrinfo['name']]],
                     $this->cc,
                     $this->bcc,
                     $this->Subject,
@@ -1682,6 +1762,7 @@ protected function sendmailSend($header, $body)
                     $this->From,
                     []
                 );
+                $this->edebug("Result: " . ($result === 0 ? 'true' : 'false'));
                 if (0 !== $result) {
                     throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                 }
@@ -1704,6 +1785,7 @@ protected function sendmailSend($header, $body)
                 $this->From,
                 []
             );
+            $this->edebug("Result: " . ($result === 0 ? 'true' : 'false'));
             if (0 !== $result) {
                 throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
             }
@@ -1724,7 +1806,13 @@ protected function sendmailSend($header, $body)
      */
     protected static function isShellSafe($string)
     {
-        // Future-proof
+        //It's not possible to use shell commands safely (which includes the mail() function) without escapeshellarg,
+        //but some hosting providers disable it, creating a security problem that we don't want to have to deal with,
+        //so we don't.
+        if (!function_exists('escapeshellarg') || !function_exists('escapeshellcmd')) {
+            return false;
+        }
+
         if (
             escapeshellcmd($string) !== $string
             || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""])
@@ -1737,9 +1825,9 @@ protected static function isShellSafe($string)
         for ($i = 0; $i < $length; ++$i) {
             $c = $string[$i];
 
-            // All other characters have a special meaning in at least one common shell, including = and +.
-            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
-            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
+            //All other characters have a special meaning in at least one common shell, including = and +.
+            //Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
+            //Note that this does permit non-Latin alphanumeric characters based on the current locale.
             if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                 return false;
             }
@@ -1759,7 +1847,8 @@ protected static function isShellSafe($string)
      */
     protected static function isPermittedPath($path)
     {
-        return !preg_match('#^[a-z]+://#i', $path);
+        //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1
+        return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path);
     }
 
     /**
@@ -1771,12 +1860,15 @@ protected static function isPermittedPath($path)
      */
     protected static function fileIsAccessible($path)
     {
+        if (!static::isPermittedPath($path)) {
+            return false;
+        }
         $readable = file_exists($path);
         //If not a UNC path (expected to start with \\), check read permission, see #2069
         if (strpos($path, '\\\\') !== 0) {
             $readable = $readable && is_readable($path);
         }
-        return static::isPermittedPath($path) && $readable;
+        return  $readable;
     }
 
     /**
@@ -1799,7 +1891,14 @@ protected function mailSend($header, $body)
         foreach ($this->to as $toaddr) {
             $toArr[] = $this->addrFormat($toaddr);
         }
-        $to = implode(', ', $toArr);
+        $to = trim(implode(', ', $toArr));
+
+        //If there are no To-addresses (e.g. when sending only to BCC-addresses)
+        //the following should be added to get a correct DKIM-signature.
+        //Compare with $this->preSend()
+        if ($to === '') {
+            $to = 'undisclosed-recipients:;';
+        }
 
         $params = null;
         //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
@@ -1809,11 +1908,18 @@ protected function mailSend($header, $body)
         //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html
         //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html
         //Example problem: https://www.drupal.org/node/1057954
-        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
-        if (!empty($this->Sender) && static::validateAddress($this->Sender) && self::isShellSafe($this->Sender)) {
-            $params = sprintf('-f%s', $this->Sender);
+        //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
+
+        //PHP 5.6 workaround
+        $sendmail_from_value = ini_get('sendmail_from');
+        if (empty($this->Sender) && !empty($sendmail_from_value)) {
+            //PHP config has a sender address we can use
+            $this->Sender = ini_get('sendmail_from');
         }
         if (!empty($this->Sender) && static::validateAddress($this->Sender)) {
+            if (self::isShellSafe($this->Sender)) {
+                $params = sprintf('-f%s', $this->Sender);
+            }
             $old_from = ini_get('sendmail_from');
             ini_set('sendmail_from', $this->Sender);
         }
@@ -1821,7 +1927,17 @@ protected function mailSend($header, $body)
         if ($this->SingleTo && count($toArr) > 1) {
             foreach ($toArr as $toAddr) {
                 $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
-                $this->doCallback($result, [$toAddr], $this->cc, $this->bcc, $this->Subject, $body, $this->From, []);
+                $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet);
+                $this->doCallback(
+                    $result,
+                    [[$addrinfo['address'], $addrinfo['name']]],
+                    $this->cc,
+                    $this->bcc,
+                    $this->Subject,
+                    $body,
+                    $this->From,
+                    []
+                );
             }
         } else {
             $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
@@ -1899,7 +2015,7 @@ protected function smtpSend($header, $body)
         }
 
         $callbacks = [];
-        // Attempt to send to all recipients
+        //Attempt to send to all recipients
         foreach ([$this->to, $this->cc, $this->bcc] as $togroup) {
             foreach ($togroup as $to) {
                 if (!$this->smtp->recipient($to[0], $this->dsn)) {
@@ -1910,11 +2026,11 @@ protected function smtpSend($header, $body)
                     $isSent = true;
                 }
 
-                $callbacks[] = ['issent' => $isSent, 'to' => $to[0]];
+                $callbacks[] = ['issent' => $isSent, 'to' => $to[0], 'name' => $to[1]];
             }
         }
 
-        // Only send the DATA command if we have viable recipients
+        //Only send the DATA command if we have viable recipients
         if ((count($this->all_recipients) > count($bad_rcpt)) && !$this->smtp->data($header . $body)) {
             throw new Exception($this->lang('data_not_accepted'), self::STOP_CRITICAL);
         }
@@ -1931,7 +2047,7 @@ protected function smtpSend($header, $body)
         foreach ($callbacks as $cb) {
             $this->doCallback(
                 $cb['issent'],
-                [$cb['to']],
+                [[$cb['to'], $cb['name']]],
                 [],
                 [],
                 $this->Subject,
@@ -1976,7 +2092,7 @@ public function smtpConnect($options = null)
             $options = $this->SMTPOptions;
         }
 
-        // Already connected?
+        //Already connected?
         if ($this->smtp->connected()) {
             return true;
         }
@@ -1998,14 +2114,14 @@ public function smtpConnect($options = null)
                 )
             ) {
                 $this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry));
-                // Not a valid host entry
+                //Not a valid host entry
                 continue;
             }
-            // $hostinfo[1]: optional ssl or tls prefix
-            // $hostinfo[2]: the hostname
-            // $hostinfo[3]: optional port number
-            // The host string prefix can temporarily override the current setting for SMTPSecure
-            // If it's not specified, the default value is used
+            //$hostinfo[1]: optional ssl or tls prefix
+            //$hostinfo[2]: the hostname
+            //$hostinfo[3]: optional port number
+            //The host string prefix can temporarily override the current setting for SMTPSecure
+            //If it's not specified, the default value is used
 
             //Check the host name is a valid name or IP address before trying to use it
             if (!static::isValidHost($hostinfo[2])) {
@@ -2017,11 +2133,11 @@ public function smtpConnect($options = null)
             $tls = (static::ENCRYPTION_STARTTLS === $this->SMTPSecure);
             if ('ssl' === $hostinfo[1] || ('' === $hostinfo[1] && static::ENCRYPTION_SMTPS === $this->SMTPSecure)) {
                 $prefix = 'ssl://';
-                $tls = false; // Can't have SSL and TLS at the same time
+                $tls = false; //Can't have SSL and TLS at the same time
                 $secure = static::ENCRYPTION_SMTPS;
             } elseif ('tls' === $hostinfo[1]) {
                 $tls = true;
-                // tls doesn't use a prefix
+                //TLS doesn't use a prefix
                 $secure = static::ENCRYPTION_STARTTLS;
             }
             //Do we need the OpenSSL extension?
@@ -2051,18 +2167,19 @@ public function smtpConnect($options = null)
                     }
                     $this->smtp->hello($hello);
                     //Automatically enable TLS encryption if:
-                    // * it's not disabled
-                    // * we have openssl extension
-                    // * we are not already using SSL
-                    // * the server offers STARTTLS
+                    //* it's not disabled
+                    //* we have openssl extension
+                    //* we are not already using SSL
+                    //* the server offers STARTTLS
                     if ($this->SMTPAutoTLS && $sslext && 'ssl' !== $secure && $this->smtp->getServerExt('STARTTLS')) {
                         $tls = true;
                     }
                     if ($tls) {
                         if (!$this->smtp->startTLS()) {
-                            throw new Exception($this->lang('connect_host'));
+                            $message = $this->getSmtpErrorMessage('connect_host');
+                            throw new Exception($message);
                         }
-                        // We must resend EHLO after TLS negotiation
+                        //We must resend EHLO after TLS negotiation
                         $this->smtp->hello($hello);
                     }
                     if (
@@ -2080,17 +2197,22 @@ public function smtpConnect($options = null)
                 } catch (Exception $exc) {
                     $lastexception = $exc;
                     $this->edebug($exc->getMessage());
-                    // We must have connected, but then failed TLS or Auth, so close connection nicely
+                    //We must have connected, but then failed TLS or Auth, so close connection nicely
                     $this->smtp->quit();
                 }
             }
         }
-        // If we get here, all connection attempts have failed, so close connection hard
+        //If we get here, all connection attempts have failed, so close connection hard
         $this->smtp->close();
-        // As we've caught all exceptions, just report whatever the last one was
+        //As we've caught all exceptions, just report whatever the last one was
         if ($this->exceptions && null !== $lastexception) {
             throw $lastexception;
         }
+        if ($this->exceptions) {
+            // no exception was thrown, likely $this->smtp->connect() failed
+            $message = $this->getSmtpErrorMessage('connect_host');
+            throw new Exception($message);
+        }
 
         return false;
     }
@@ -2108,17 +2230,19 @@ public function smtpClose()
 
     /**
      * Set the language for error messages.
-     * Returns false if it cannot load the language file.
      * The default language is English.
      *
      * @param string $langcode  ISO 639-1 2-character language code (e.g. French is "fr")
+     *                          Optionally, the language code can be enhanced with a 4-character
+     *                          script annotation and/or a 2-character country annotation.
      * @param string $lang_path Path to the language file directory, with trailing separator (slash)
+     *                          Do not set this from user input!
      *
-     * @return bool
+     * @return bool Returns true if the requested language was loaded, false otherwise.
      */
     public function setLanguage($langcode = 'en', $lang_path = '')
     {
-        // Backwards compatibility for renamed language codes
+        //Backwards compatibility for renamed language codes
         $renamed_langcodes = [
             'br' => 'pt_br',
             'cz' => 'cs',
@@ -2134,54 +2258,105 @@ public function setLanguage($langcode = 'en', $lang_path = '')
             $langcode = $renamed_langcodes[$langcode];
         }
 
-        // Define full set of translatable strings in English
+        //Define full set of translatable strings in English
         $PHPMAILER_LANG = [
             'authenticate' => 'SMTP Error: Could not authenticate.',
+            'buggy_php' => 'Your version of PHP is affected by a bug that may result in corrupted messages.' .
+                ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' .
+                ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.',
             'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
             'data_not_accepted' => 'SMTP Error: data not accepted.',
             'empty_message' => 'Message body empty',
             'encoding' => 'Unknown encoding: ',
             'execute' => 'Could not execute: ',
+            'extension_missing' => 'Extension missing: ',
             'file_access' => 'Could not access file: ',
             'file_open' => 'File Error: Could not open file: ',
             'from_failed' => 'The following From address failed: ',
             'instantiate' => 'Could not instantiate mail function.',
             'invalid_address' => 'Invalid address: ',
+            'invalid_header' => 'Invalid header name or value',
             'invalid_hostentry' => 'Invalid hostentry: ',
             'invalid_host' => 'Invalid host: ',
             'mailer_not_supported' => ' mailer is not supported.',
             'provide_address' => 'You must provide at least one recipient email address.',
             'recipients_failed' => 'SMTP Error: The following recipients failed: ',
             'signing' => 'Signing Error: ',
+            'smtp_code' => 'SMTP code: ',
+            'smtp_code_ex' => 'Additional SMTP info: ',
             'smtp_connect_failed' => 'SMTP connect() failed.',
+            'smtp_detail' => 'Detail: ',
             'smtp_error' => 'SMTP server error: ',
             'variable_set' => 'Cannot set or reset variable: ',
-            'extension_missing' => 'Extension missing: ',
         ];
         if (empty($lang_path)) {
-            // Calculate an absolute path so it can work if CWD is not here
+            //Calculate an absolute path so it can work if CWD is not here
             $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR;
         }
+
         //Validate $langcode
-        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
+        $foundlang = true;
+        $langcode  = strtolower($langcode);
+        if (
+            !preg_match('/^(?P<lang>[a-z]{2})(?P<script>_[a-z]{4})?(?P<country>_[a-z]{2})?$/', $langcode, $matches)
+            && $langcode !== 'en'
+        ) {
+            $foundlang = false;
             $langcode = 'en';
         }
-        $foundlang = true;
-        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
-        // There is no English translation file
+
+        //There is no English translation file
         if ('en' !== $langcode) {
-            // Make sure language file path is readable
-            if (!static::fileIsAccessible($lang_file)) {
+            $langcodes = [];
+            if (!empty($matches['script']) && !empty($matches['country'])) {
+                $langcodes[] = $matches['lang'] . $matches['script'] . $matches['country'];
+            }
+            if (!empty($matches['country'])) {
+                $langcodes[] = $matches['lang'] . $matches['country'];
+            }
+            if (!empty($matches['script'])) {
+                $langcodes[] = $matches['lang'] . $matches['script'];
+            }
+            $langcodes[] = $matches['lang'];
+
+            //Try and find a readable language file for the requested language.
+            $foundFile = false;
+            foreach ($langcodes as $code) {
+                $lang_file = $lang_path . 'phpmailer.lang-' . $code . '.php';
+                if (static::fileIsAccessible($lang_file)) {
+                    $foundFile = true;
+                    break;
+                }
+            }
+
+            if ($foundFile === false) {
                 $foundlang = false;
             } else {
-                // Overwrite language-specific strings.
-                // This way we'll never have missing translation keys.
-                $foundlang = include $lang_file;
+                $lines = file($lang_file);
+                foreach ($lines as $line) {
+                    //Translation file lines look like this:
+                    //$PHPMAILER_LANG['authenticate'] = 'SMTP-Fehler: Authentifizierung fehlgeschlagen.';
+                    //These files are parsed as text and not PHP so as to avoid the possibility of code injection
+                    //See https://blog.stevenlevithan.com/archives/match-quoted-string
+                    $matches = [];
+                    if (
+                        preg_match(
+                            '/^\$PHPMAILER_LANG\[\'([a-z\d_]+)\'\]\s*=\s*(["\'])(.+)*?\2;/',
+                            $line,
+                            $matches
+                        ) &&
+                        //Ignore unknown translation keys
+                        array_key_exists($matches[1], $PHPMAILER_LANG)
+                    ) {
+                        //Overwrite language-specific strings so we'll never have missing translation keys.
+                        $PHPMAILER_LANG[$matches[1]] = (string)$matches[3];
+                    }
+                }
             }
         }
         $this->language = $PHPMAILER_LANG;
 
-        return (bool) $foundlang; // Returns false if language not found
+        return $foundlang; //Returns false if language not found
     }
 
     /**
@@ -2191,6 +2366,10 @@ public function setLanguage($langcode = 'en', $lang_path = '')
      */
     public function getTranslations()
     {
+        if (empty($this->language)) {
+            $this->setLanguage(); // Set the default language.
+        }
+
         return $this->language;
     }
 
@@ -2225,7 +2404,7 @@ public function addrAppend($type, $addr)
      */
     public function addrFormat($addr)
     {
-        if (empty($addr[1])) { // No name provided
+        if (empty($addr[1])) { //No name provided
             return $this->secureHeader($addr[0]);
         }
 
@@ -2252,8 +2431,8 @@ public function wrapText($message, $length, $qp_mode = false)
         } else {
             $soft_break = static::$LE;
         }
-        // If utf-8 encoding is used, we will need to make sure we don't
-        // split multibyte characters when we wrap
+        //If utf-8 encoding is used, we will need to make sure we don't
+        //split multibyte characters when we wrap
         $is_utf8 = static::CHARSET_UTF8 === strtolower($this->CharSet);
         $lelen = strlen(static::$LE);
         $crlflen = strlen(static::$LE);
@@ -2353,29 +2532,29 @@ public function utf8CharBoundary($encodedText, $maxLength)
             $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
             $encodedCharPos = strpos($lastChunk, '=');
             if (false !== $encodedCharPos) {
-                // Found start of encoded character byte within $lookBack block.
-                // Check the encoded byte value (the 2 chars after the '=')
+                //Found start of encoded character byte within $lookBack block.
+                //Check the encoded byte value (the 2 chars after the '=')
                 $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                 $dec = hexdec($hex);
                 if ($dec < 128) {
-                    // Single byte character.
-                    // If the encoded char was found at pos 0, it will fit
-                    // otherwise reduce maxLength to start of the encoded char
+                    //Single byte character.
+                    //If the encoded char was found at pos 0, it will fit
+                    //otherwise reduce maxLength to start of the encoded char
                     if ($encodedCharPos > 0) {
                         $maxLength -= $lookBack - $encodedCharPos;
                     }
                     $foundSplitPos = true;
                 } elseif ($dec >= 192) {
-                    // First byte of a multi byte character
-                    // Reduce maxLength to split at start of character
+                    //First byte of a multi byte character
+                    //Reduce maxLength to split at start of character
                     $maxLength -= $lookBack - $encodedCharPos;
                     $foundSplitPos = true;
                 } elseif ($dec < 192) {
-                    // Middle byte of a multi byte character, look further back
+                    //Middle byte of a multi byte character, look further back
                     $lookBack += 3;
                 }
             } else {
-                // No encoded character found
+                //No encoded character found
                 $foundSplitPos = true;
             }
         }
@@ -2419,7 +2598,7 @@ public function createHeader()
 
         $result .= $this->headerLine('Date', '' === $this->MessageDate ? self::rfcDate() : $this->MessageDate);
 
-        // The To header is created automatically by mail(), so needs to be omitted here
+        //The To header is created automatically by mail(), so needs to be omitted here
         if ('mail' !== $this->Mailer) {
             if ($this->SingleTo) {
                 foreach ($this->to as $toaddr) {
@@ -2433,12 +2612,12 @@ public function createHeader()
         }
         $result .= $this->addrAppend('From', [[trim($this->From), $this->FromName]]);
 
-        // sendmail and mail() extract Cc from the header before sending
+        //sendmail and mail() extract Cc from the header before sending
         if (count($this->cc) > 0) {
             $result .= $this->addrAppend('Cc', $this->cc);
         }
 
-        // sendmail and mail() extract Bcc from the header before sending
+        //sendmail and mail() extract Bcc from the header before sending
         if (
             (
                 'sendmail' === $this->Mailer || 'qmail' === $this->Mailer || 'mail' === $this->Mailer
@@ -2452,14 +2631,24 @@ public function createHeader()
             $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
         }
 
-        // mail() sets the subject itself
+        //mail() sets the subject itself
         if ('mail' !== $this->Mailer) {
             $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
         }
 
-        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
-        // https://tools.ietf.org/html/rfc5322#section-3.6.4
-        if ('' !== $this->MessageID && preg_match('/^<.*@.*>$/', $this->MessageID)) {
+        //Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
+        //https://tools.ietf.org/html/rfc5322#section-3.6.4
+        if (
+            '' !== $this->MessageID &&
+            preg_match(
+                '/^<((([a-z\d!#$%&\'*+\/=?^_`{|}~-]+(\.[a-z\d!#$%&\'*+\/=?^_`{|}~-]+)*)' .
+                '|("(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]|[\x21\x23-\x5B\x5D-\x7E])' .
+                '|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*"))@(([a-z\d!#$%&\'*+\/=?^_`{|}~-]+' .
+                '(\.[a-z\d!#$%&\'*+\/=?^_`{|}~-]+)*)|(\[(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]' .
+                '|[\x21-\x5A\x5E-\x7E])|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*\])))>$/Di',
+                $this->MessageID
+            )
+        ) {
             $this->lastMessageID = $this->MessageID;
         } else {
             $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
@@ -2469,22 +2658,21 @@ public function createHeader()
             $result .= $this->headerLine('X-Priority', $this->Priority);
         }
         if ('' === $this->XMailer) {
+            //Empty string for default X-Mailer header
             $result .= $this->headerLine(
                 'X-Mailer',
                 'PHPMailer ' . self::VERSION . ' (https://github.com/PHPMailer/PHPMailer)'
             );
-        } else {
-            $myXmailer = trim($this->XMailer);
-            if ($myXmailer) {
-                $result .= $this->headerLine('X-Mailer', $myXmailer);
-            }
-        }
+        } elseif (is_string($this->XMailer) && trim($this->XMailer) !== '') {
+            //Some string
+            $result .= $this->headerLine('X-Mailer', trim($this->XMailer));
+        } //Other values result in no X-Mailer header
 
         if ('' !== $this->ConfirmReadingTo) {
             $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
         }
 
-        // Add custom headers
+        //Add custom headers
         foreach ($this->CustomHeader as $header) {
             $result .= $this->headerLine(
                 trim($header[0]),
@@ -2526,28 +2714,24 @@ public function getMailMIME()
                 $result .= $this->textLine(' boundary="' . $this->boundary[1] . '"');
                 break;
             default:
-                // Catches case 'plain': and case '':
+                //Catches case 'plain': and case '':
                 $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                 $ismultipart = false;
                 break;
         }
-        // RFC1341 part 5 says 7bit is assumed if not specified
+        //RFC1341 part 5 says 7bit is assumed if not specified
         if (static::ENCODING_7BIT !== $this->Encoding) {
-            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
+            //RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
             if ($ismultipart) {
                 if (static::ENCODING_8BIT === $this->Encoding) {
                     $result .= $this->headerLine('Content-Transfer-Encoding', static::ENCODING_8BIT);
                 }
-                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
+                //The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
             } else {
                 $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
             }
         }
 
-        if ('mail' !== $this->Mailer) {
-//            $result .= static::$LE;
-        }
-
         return $result;
     }
 
@@ -2816,7 +3000,7 @@ public function createBody()
                 $body .= $this->attachAll('attachment', $this->boundary[1]);
                 break;
             default:
-                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
+                //Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                 //Reset the `Encoding` property in case we changed it for line length reasons
                 $this->Encoding = $bodyEncoding;
                 $body .= $this->encodeString($this->Body, $this->Encoding);
@@ -2907,7 +3091,7 @@ protected function getBoundary($boundary, $charSet, $contentType, $encoding)
         $result .= $this->textLine('--' . $boundary);
         $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
         $result .= static::$LE;
-        // RFC1341 part 5 says 7bit is assumed if not specified
+        //RFC1341 part 5 says 7bit is assumed if not specified
         if (static::ENCODING_7BIT !== $encoding) {
             $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
         }
@@ -3005,7 +3189,7 @@ public function addAttachment(
                 throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);
             }
 
-            // If a MIME type is not specified, try to work it out from the file name
+            //If a MIME type is not specified, try to work it out from the file name
             if ('' === $type) {
                 $type = static::filenameToType($path);
             }
@@ -3024,7 +3208,7 @@ public function addAttachment(
                 2 => $name,
                 3 => $encoding,
                 4 => $type,
-                5 => false, // isStringAttachment
+                5 => false, //isStringAttachment
                 6 => $disposition,
                 7 => $name,
             ];
@@ -3064,16 +3248,16 @@ public function getAttachments()
      */
     protected function attachAll($disposition_type, $boundary)
     {
-        // Return text of body
+        //Return text of body
         $mime = [];
         $cidUniq = [];
         $incl = [];
 
-        // Add all attachments
+        //Add all attachments
         foreach ($this->attachment as $attachment) {
-            // Check if it is a valid disposition_filter
+            //Check if it is a valid disposition_filter
             if ($attachment[6] === $disposition_type) {
-                // Check for string attachment
+                //Check for string attachment
                 $string = '';
                 $path = '';
                 $bString = $attachment[5];
@@ -3114,7 +3298,7 @@ protected function attachAll($disposition_type, $boundary)
                         static::$LE
                     );
                 }
-                // RFC1341 part 5 says 7bit is assumed if not specified
+                //RFC1341 part 5 says 7bit is assumed if not specified
                 if (static::ENCODING_7BIT !== $encoding) {
                     $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, static::$LE);
                 }
@@ -3124,7 +3308,7 @@ protected function attachAll($disposition_type, $boundary)
                     $mime[] = 'Content-ID: <' . $this->encodeHeader($this->secureHeader($cid)) . '>' . static::$LE;
                 }
 
-                // Allow for bypassing the Content-Disposition header
+                //Allow for bypassing the Content-Disposition header
                 if (!empty($disposition)) {
                     $encoded_name = $this->encodeHeader($this->secureHeader($name));
                     if (!empty($encoded_name)) {
@@ -3145,7 +3329,7 @@ protected function attachAll($disposition_type, $boundary)
                     $mime[] = static::$LE;
                 }
 
-                // Encode as string attachment
+                //Encode as string attachment
                 if ($bString) {
                     $mime[] = $this->encodeString($string, $encoding);
                 } else {
@@ -3221,7 +3405,7 @@ public function encodeString($str, $encoding = self::ENCODING_BASE64)
             case static::ENCODING_7BIT:
             case static::ENCODING_8BIT:
                 $encoded = static::normalizeBreaks($str);
-                // Make sure it ends with a line break
+                //Make sure it ends with a line break
                 if (substr($encoded, -(strlen(static::$LE))) !== static::$LE) {
                     $encoded .= static::$LE;
                 }
@@ -3259,7 +3443,7 @@ public function encodeHeader($str, $position = 'text')
         switch (strtolower($position)) {
             case 'phrase':
                 if (!preg_match('/[\200-\377]/', $str)) {
-                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
+                    //Can't use addslashes as we don't know the value of magic_quotes_sybase
                     $encoded = addcslashes($str, "\0..\37\177\\\"");
                     if (($str === $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                         return $encoded;
@@ -3285,7 +3469,7 @@ public function encodeHeader($str, $position = 'text')
             $charset = static::CHARSET_ASCII;
         }
 
-        // Q/B encoding adds 8 chars and the charset ("` =?<charset>?[QB]?<content>?=`").
+        //Q/B encoding adds 8 chars and the charset ("` =?<charset>?[QB]?<content>?=`").
         $overhead = 8 + strlen($charset);
 
         if ('mail' === $this->Mailer) {
@@ -3294,26 +3478,26 @@ public function encodeHeader($str, $position = 'text')
             $maxlen = static::MAX_LINE_LENGTH - $overhead;
         }
 
-        // Select the encoding that produces the shortest output and/or prevents corruption.
+        //Select the encoding that produces the shortest output and/or prevents corruption.
         if ($matchcount > strlen($str) / 3) {
-            // More than 1/3 of the content needs encoding, use B-encode.
+            //More than 1/3 of the content needs encoding, use B-encode.
             $encoding = 'B';
         } elseif ($matchcount > 0) {
-            // Less than 1/3 of the content needs encoding, use Q-encode.
+            //Less than 1/3 of the content needs encoding, use Q-encode.
             $encoding = 'Q';
         } elseif (strlen($str) > $maxlen) {
-            // No encoding needed, but value exceeds max line length, use Q-encode to prevent corruption.
+            //No encoding needed, but value exceeds max line length, use Q-encode to prevent corruption.
             $encoding = 'Q';
         } else {
-            // No reformatting needed
+            //No reformatting needed
             $encoding = false;
         }
 
         switch ($encoding) {
             case 'B':
                 if ($this->hasMultiBytes($str)) {
-                    // Use a custom function which correctly encodes and wraps long
-                    // multibyte strings without breaking lines within a character
+                    //Use a custom function which correctly encodes and wraps long
+                    //multibyte strings without breaking lines within a character
                     $encoded = $this->base64EncodeWrapMB($str, "\n");
                 } else {
                     $encoded = base64_encode($str);
@@ -3348,7 +3532,7 @@ public function hasMultiBytes($str)
             return strlen($str) > mb_strlen($str, $this->CharSet);
         }
 
-        // Assume no multibytes (we can't handle without mbstring functions anyway)
+        //Assume no multibytes (we can't handle without mbstring functions anyway)
         return false;
     }
 
@@ -3386,11 +3570,11 @@ public function base64EncodeWrapMB($str, $linebreak = null)
         }
 
         $mb_length = mb_strlen($str, $this->CharSet);
-        // Each line must have length <= 75, including $start and $end
+        //Each line must have length <= 75, including $start and $end
         $length = 75 - strlen($start) - strlen($end);
-        // Average multi-byte ratio
+        //Average multi-byte ratio
         $ratio = $mb_length / strlen($str);
-        // Base64 has a 4:3 ratio
+        //Base64 has a 4:3 ratio
         $avgLength = floor($length * $ratio * .75);
 
         $offset = 0;
@@ -3405,7 +3589,7 @@ public function base64EncodeWrapMB($str, $linebreak = null)
             $encoded .= $chunk . $linebreak;
         }
 
-        // Chomp the last linefeed
+        //Chomp the last linefeed
         return substr($encoded, 0, -strlen($linebreak));
     }
 
@@ -3434,12 +3618,12 @@ public function encodeQP($string)
      */
     public function encodeQ($str, $position = 'text')
     {
-        // There should not be any EOL in the string
+        //There should not be any EOL in the string
         $pattern = '';
         $encoded = str_replace(["\r", "\n"], '', $str);
         switch (strtolower($position)) {
             case 'phrase':
-                // RFC 2047 section 5.3
+                //RFC 2047 section 5.3
                 $pattern = '^A-Za-z0-9!*+\/ -';
                 break;
             /*
@@ -3452,15 +3636,15 @@ public function encodeQ($str, $position = 'text')
             /* Intentional fall through */
             case 'text':
             default:
-                // RFC 2047 section 5.1
-                // Replace every high ascii, control, =, ? and _ characters
+                //RFC 2047 section 5.1
+                //Replace every high ascii, control, =, ? and _ characters
                 $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                 break;
         }
         $matches = [];
         if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
-            // If the string contains an '=', make sure it's the first thing we replace
-            // so as to avoid double-encoding
+            //If the string contains an '=', make sure it's the first thing we replace
+            //so as to avoid double-encoding
             $eqkey = array_search('=', $matches[0], true);
             if (false !== $eqkey) {
                 unset($matches[0][$eqkey]);
@@ -3470,8 +3654,8 @@ public function encodeQ($str, $position = 'text')
                 $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
             }
         }
-        // Replace spaces with _ (more readable than =20)
-        // RFC 2047 section 4.2(2)
+        //Replace spaces with _ (more readable than =20)
+        //RFC 2047 section 4.2(2)
         return str_replace(' ', '_', $encoded);
     }
 
@@ -3498,7 +3682,7 @@ public function addStringAttachment(
         $disposition = 'attachment'
     ) {
         try {
-            // If a MIME type is not specified, try to work it out from the file name
+            //If a MIME type is not specified, try to work it out from the file name
             if ('' === $type) {
                 $type = static::filenameToType($filename);
             }
@@ -3507,14 +3691,14 @@ public function addStringAttachment(
                 throw new Exception($this->lang('encoding') . $encoding);
             }
 
-            // Append to $attachment array
+            //Append to $attachment array
             $this->attachment[] = [
                 0 => $string,
                 1 => $filename,
                 2 => static::mb_pathinfo($filename, PATHINFO_BASENAME),
                 3 => $encoding,
                 4 => $type,
-                5 => true, // isStringAttachment
+                5 => true, //isStringAttachment
                 6 => $disposition,
                 7 => 0,
             ];
@@ -3537,20 +3721,21 @@ public function addStringAttachment(
      * These differ from 'regular' attachments in that they are intended to be
      * displayed inline with the message, not just attached for download.
      * This is used in HTML messages that embed the images
-     * the HTML refers to using the $cid value.
+     * the HTML refers to using the `$cid` value in `img` tags, for example `<img src="cid:mylogo">`.
      * Never use a user-supplied path to a file!
      *
      * @param string $path        Path to the attachment
      * @param string $cid         Content ID of the attachment; Use this to reference
      *                            the content when using an embedded image in HTML
-     * @param string $name        Overrides the attachment name
-     * @param string $encoding    File encoding (see $Encoding)
-     * @param string $type        File MIME type
-     * @param string $disposition Disposition to use
+     * @param string $name        Overrides the attachment filename
+     * @param string $encoding    File encoding (see $Encoding) defaults to `base64`
+     * @param string $type        File MIME type (by default mapped from the `$path` filename's extension)
+     * @param string $disposition Disposition to use: `inline` (default) or `attachment`
+     *                            (unlikely you want this – {@see `addAttachment()`} instead)
      *
+     * @return bool True on successfully adding an attachment
      * @throws Exception
      *
-     * @return bool True on successfully adding an attachment
      */
     public function addEmbeddedImage(
         $path,
@@ -3565,7 +3750,7 @@ public function addEmbeddedImage(
                 throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);
             }
 
-            // If a MIME type is not specified, try to work it out from the file name
+            //If a MIME type is not specified, try to work it out from the file name
             if ('' === $type) {
                 $type = static::filenameToType($path);
             }
@@ -3579,14 +3764,14 @@ public function addEmbeddedImage(
                 $name = $filename;
             }
 
-            // Append to $attachment array
+            //Append to $attachment array
             $this->attachment[] = [
                 0 => $path,
                 1 => $filename,
                 2 => $name,
                 3 => $encoding,
                 4 => $type,
-                5 => false, // isStringAttachment
+                5 => false, //isStringAttachment
                 6 => $disposition,
                 7 => $cid,
             ];
@@ -3631,7 +3816,7 @@ public function addStringEmbeddedImage(
         $disposition = 'inline'
     ) {
         try {
-            // If a MIME type is not specified, try to work it out from the name
+            //If a MIME type is not specified, try to work it out from the name
             if ('' === $type && !empty($name)) {
                 $type = static::filenameToType($name);
             }
@@ -3640,14 +3825,14 @@ public function addStringEmbeddedImage(
                 throw new Exception($this->lang('encoding') . $encoding);
             }
 
-            // Append to $attachment array
+            //Append to $attachment array
             $this->attachment[] = [
                 0 => $string,
                 1 => $name,
                 2 => $name,
                 3 => $encoding,
                 4 => $type,
-                5 => true, // isStringAttachment
+                5 => true, //isStringAttachment
                 6 => $disposition,
                 7 => $cid,
             ];
@@ -3847,13 +4032,13 @@ protected function setError($msg)
             if (!empty($lasterror['error'])) {
                 $msg .= $this->lang('smtp_error') . $lasterror['error'];
                 if (!empty($lasterror['detail'])) {
-                    $msg .= ' Detail: ' . $lasterror['detail'];
+                    $msg .= ' ' . $this->lang('smtp_detail') . $lasterror['detail'];
                 }
                 if (!empty($lasterror['smtp_code'])) {
-                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
+                    $msg .= ' ' . $this->lang('smtp_code') . $lasterror['smtp_code'];
                 }
                 if (!empty($lasterror['smtp_code_ex'])) {
-                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
+                    $msg .= ' ' . $this->lang('smtp_code_ex') . $lasterror['smtp_code_ex'];
                 }
             }
         }
@@ -3867,8 +4052,8 @@ protected function setError($msg)
      */
     public static function rfcDate()
     {
-        // Set the time zone to whatever the default is to avoid 500 errors
-        // Will default to UTC if it's not set properly in php.ini
+        //Set the time zone to whatever the default is to avoid 500 errors
+        //Will default to UTC if it's not set properly in php.ini
         date_default_timezone_set(@date_default_timezone_get());
 
         return date('D, j M Y H:i:s O');
@@ -3914,7 +4099,7 @@ public static function isValidHost($host)
             empty($host)
             || !is_string($host)
             || strlen($host) > 256
-            || !preg_match('/^([a-zA-Z\d.-]*|\[[a-fA-F\d:]+])$/', $host)
+            || !preg_match('/^([a-zA-Z\d.-]*|\[[a-fA-F\d:]+\])$/', $host)
         ) {
             return false;
         }
@@ -3928,12 +4113,8 @@ public static function isValidHost($host)
             //Is it a valid IPv4 address?
             return filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;
         }
-        if (filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false) {
-            //Is it a syntactically valid hostname?
-            return true;
-        }
-
-        return false;
+        //Is it a syntactically valid hostname (when embeded in a URL)?
+        return filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false;
     }
 
     /**
@@ -3946,13 +4127,13 @@ public static function isValidHost($host)
     protected function lang($key)
     {
         if (count($this->language) < 1) {
-            $this->setLanguage(); // set the default language
+            $this->setLanguage(); //Set the default language
         }
 
         if (array_key_exists($key, $this->language)) {
             if ('smtp_connect_failed' === $key) {
-                //Include a link to troubleshooting docs on SMTP connection failure
-                //this is by far the biggest cause of support questions
+                //Include a link to troubleshooting docs on SMTP connection failure.
+                //This is by far the biggest cause of support questions
                 //but it's usually not PHPMailer's fault.
                 return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
             }
@@ -3964,6 +4145,26 @@ protected function lang($key)
         return $key;
     }
 
+    /**
+     * Build an error message starting with a generic one and adding details if possible.
+     *
+     * @param string $base_key
+     * @return string
+     */
+    private function getSmtpErrorMessage($base_key)
+    {
+        $message = $this->lang($base_key);
+        $error = $this->smtp->getError();
+        if (!empty($error['error'])) {
+            $message .= ' ' . $error['error'];
+            if (!empty($error['detail'])) {
+                $message .= ' ' . $error['detail'];
+            }
+        }
+
+        return $message;
+    }
+
     /**
      * Check if an error occurred.
      *
@@ -3987,15 +4188,15 @@ public function isError()
     public function addCustomHeader($name, $value = null)
     {
         if (null === $value && strpos($name, ':') !== false) {
-            // Value passed in as name:value
+            //Value passed in as name:value
             list($name, $value) = explode(':', $name, 2);
         }
         $name = trim($name);
-        $value = trim($value);
+        $value = (null === $value) ? '' : trim($value);
         //Ensure name is not empty, and that neither name nor value contain line breaks
         if (empty($name) || strpbrk($name . $value, "\r\n") !== false) {
             if ($this->exceptions) {
-                throw new Exception('Invalid header name or value');
+                throw new Exception($this->lang('invalid_header'));
             }
 
             return false;
@@ -4041,11 +4242,11 @@ public function msgHTML($message, $basedir = '', $advanced = false)
         preg_match_all('/(?<!-)(src|background)=["\'](.*)["\']/Ui', $message, $images);
         if (array_key_exists(2, $images)) {
             if (strlen($basedir) > 1 && '/' !== substr($basedir, -1)) {
-                // Ensure $basedir has a trailing /
+                //Ensure $basedir has a trailing /
                 $basedir .= '/';
             }
             foreach ($images[2] as $imgindex => $url) {
-                // Convert data URIs into embedded images
+                //Convert data URIs into embedded images
                 //e.g. "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
                 $match = [];
                 if (preg_match('#^data:(image/(?:jpe?g|gif|png));?(base64)?,(.+)#', $url, $match)) {
@@ -4059,7 +4260,7 @@ public function msgHTML($message, $basedir = '', $advanced = false)
                     }
                     //Hash the decoded data, not the URL, so that the same data-URI image used in multiple places
                     //will only be embedded once, even if it used a different encoding
-                    $cid = substr(hash('sha256', $data), 0, 32) . '@phpmailer.0'; // RFC2392 S 2
+                    $cid = substr(hash('sha256', $data), 0, 32) . '@phpmailer.0'; //RFC2392 S 2
 
                     if (!$this->cidExists($cid)) {
                         $this->addStringEmbeddedImage(
@@ -4078,13 +4279,13 @@ public function msgHTML($message, $basedir = '', $advanced = false)
                     continue;
                 }
                 if (
-                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
+                    //Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                     !empty($basedir)
-                    // Ignore URLs containing parent dir traversal (..)
+                    //Ignore URLs containing parent dir traversal (..)
                     && (strpos($url, '..') === false)
-                    // Do not change urls that are already inline images
+                    //Do not change urls that are already inline images
                     && 0 !== strpos($url, 'cid:')
-                    // Do not change absolute URLs, including anonymous protocol
+                    //Do not change absolute URLs, including anonymous protocol
                     && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                 ) {
                     $filename = static::mb_pathinfo($url, PATHINFO_BASENAME);
@@ -4092,7 +4293,7 @@ public function msgHTML($message, $basedir = '', $advanced = false)
                     if ('.' === $directory) {
                         $directory = '';
                     }
-                    // RFC2392 S 2
+                    //RFC2392 S 2
                     $cid = substr(hash('sha256', $url), 0, 32) . '@phpmailer.0';
                     if (strlen($basedir) > 1 && '/' !== substr($basedir, -1)) {
                         $basedir .= '/';
@@ -4119,7 +4320,7 @@ public function msgHTML($message, $basedir = '', $advanced = false)
             }
         }
         $this->isHTML();
-        // Convert all message body line breaks to LE, makes quoted-printable encoding work much better
+        //Convert all message body line breaks to LE, makes quoted-printable encoding work much better
         $this->Body = static::normalizeBreaks($message);
         $this->AltBody = static::normalizeBreaks($this->html2text($message, $advanced));
         if (!$this->alternativeExists()) {
@@ -4138,9 +4339,9 @@ public function msgHTML($message, $basedir = '', $advanced = false)
      * Example usage:
      *
      * ```php
-     * // Use default conversion
+     * //Use default conversion
      * $plain = $mail->html2text($html);
-     * // Use your own custom converter
+     * //Use your own custom converter
      * $plain = $mail->html2text($html, function($html) {
      *     $converter = new MyHtml2text($html);
      *     return $converter->get_text();
@@ -4149,7 +4350,8 @@ public function msgHTML($message, $basedir = '', $advanced = false)
      *
      * @param string        $html     The HTML text to convert
      * @param bool|callable $advanced Any boolean value to use the internal converter,
-     *                                or provide your own callable for custom conversion
+     *                                or provide your own callable for custom conversion.
+     *                                *Never* pass user-supplied data into this parameter
      *
      * @return string
      */
@@ -4275,6 +4477,7 @@ public static function _mime_types($ext = '')
             'ics' => 'text/calendar',
             'xml' => 'text/xml',
             'xsl' => 'text/xml',
+            'csv' => 'text/csv',
             'wmv' => 'video/x-ms-wmv',
             'mpeg' => 'video/mpeg',
             'mpe' => 'video/mpeg',
@@ -4307,7 +4510,7 @@ public static function _mime_types($ext = '')
      */
     public static function filenameToType($filename)
     {
-        // In case the path is a URL, strip any query string before getting extension
+        //In case the path is a URL, strip any query string before getting extension
         $qpos = strpos($filename, '?');
         if (false !== $qpos) {
             $filename = substr($filename, 0, $qpos);
@@ -4382,7 +4585,7 @@ public static function mb_pathinfo($path, $options = null)
     public function set($name, $value = '')
     {
         if (property_exists($this, $name)) {
-            $this->$name = $value;
+            $this->{$name} = $value;
 
             return true;
         }
@@ -4418,9 +4621,9 @@ public static function normalizeBreaks($text, $breaktype = null)
         if (null === $breaktype) {
             $breaktype = static::$LE;
         }
-        // Normalise to \n
+        //Normalise to \n
         $text = str_replace([self::CRLF, "\r"], "\n", $text);
-        // Now convert LE as needed
+        //Now convert LE as needed
         if ("\n" !== $breaktype) {
             $text = str_replace("\n", $breaktype, $text);
         }
@@ -4526,13 +4729,13 @@ public function DKIM_Sign($signHeader)
             $privKey = openssl_pkey_get_private($privKeyStr);
         }
         if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
-            if (PHP_MAJOR_VERSION < 8) {
+            if (\PHP_MAJOR_VERSION < 8) {
                 openssl_pkey_free($privKey);
             }
 
             return base64_encode($signature);
         }
-        if (PHP_MAJOR_VERSION < 8) {
+        if (\PHP_MAJOR_VERSION < 8) {
             openssl_pkey_free($privKey);
         }
 
@@ -4599,7 +4802,7 @@ public function DKIM_BodyC($body)
         if (empty($body)) {
             return self::CRLF;
         }
-        // Normalize line endings to CRLF
+        //Normalize line endings to CRLF
         $body = static::normalizeBreaks($body, self::CRLF);
 
         //Reduce multiple trailing line breaks to a single one
@@ -4619,9 +4822,9 @@ public function DKIM_BodyC($body)
      */
     public function DKIM_Add($headers_line, $subject, $body)
     {
-        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
-        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization methods of header & body
-        $DKIMquery = 'dns/txt'; // Query method
+        $DKIMsignatureType = 'rsa-sha256'; //Signature & hash algorithms
+        $DKIMcanonicalization = 'relaxed/simple'; //Canonicalization methods of header & body
+        $DKIMquery = 'dns/txt'; //Query method
         $DKIMtime = time();
         //Always sign these headers without being asked
         //Recommended list from https://tools.ietf.org/html/rfc6376#section-5.4.1
@@ -4722,7 +4925,8 @@ public function DKIM_Add($headers_line, $subject, $body)
         $headerKeys = ' h=' . implode(':', $headersToSignKeys) . ';' . static::$LE;
         $headerValues = implode(static::$LE, $headersToSign);
         $body = $this->DKIM_BodyC($body);
-        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
+        //Base64 of packed binary SHA-256 hash of body
+        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body)));
         $ident = '';
         if ('' !== $this->DKIM_identity) {
             $ident = ' i=' . $this->DKIM_identity . ';' . static::$LE;
@@ -4862,9 +5066,9 @@ protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from, $
     }
 
     /**
-     * Get the OAuth instance.
+     * Get the OAuthTokenProvider instance.
      *
-     * @return OAuth
+     * @return OAuthTokenProvider
      */
     public function getOAuth()
     {
@@ -4872,9 +5076,9 @@ public function getOAuth()
     }
 
     /**
-     * Set an OAuth instance.
+     * Set an OAuthTokenProvider instance.
      */
-    public function setOAuth(OAuth $oauth)
+    public function setOAuth(OAuthTokenProvider $oauth)
     {
         $this->oauth = $oauth;
     }
diff --git a/vendor/phpmailer/phpmailer/src/POP3.php b/vendor/phpmailer/phpmailer/src/POP3.php
index 235e6372d2a04aac49d65f414af040dbc97d7326..78e91e49a7348a5038be7aaa7a1f7ad649ac6f6e 100644
--- a/vendor/phpmailer/phpmailer/src/POP3.php
+++ b/vendor/phpmailer/phpmailer/src/POP3.php
@@ -46,7 +46,7 @@ class POP3
      *
      * @var string
      */
-    const VERSION = '6.2.0';
+    const VERSION = '6.6.4';
 
     /**
      * Default POP3 port number.
@@ -199,13 +199,13 @@ public static function popBeforeSmtp(
     public function authorise($host, $port = false, $timeout = false, $username = '', $password = '', $debug_level = 0)
     {
         $this->host = $host;
-        // If no port value provided, use default
+        //If no port value provided, use default
         if (false === $port) {
             $this->port = static::DEFAULT_PORT;
         } else {
             $this->port = (int) $port;
         }
-        // If no timeout value provided, use default
+        //If no timeout value provided, use default
         if (false === $timeout) {
             $this->tval = static::DEFAULT_TIMEOUT;
         } else {
@@ -214,9 +214,9 @@ public function authorise($host, $port = false, $timeout = false, $username = ''
         $this->do_debug = $debug_level;
         $this->username = $username;
         $this->password = $password;
-        //  Reset the error log
+        //Reset the error log
         $this->errors = [];
-        //  connect
+        //Connect
         $result = $this->connect($this->host, $this->port, $this->tval);
         if ($result) {
             $login_result = $this->login($this->username, $this->password);
@@ -226,7 +226,7 @@ public function authorise($host, $port = false, $timeout = false, $username = ''
                 return true;
             }
         }
-        // We need to disconnect regardless of whether the login succeeded
+        //We need to disconnect regardless of whether the login succeeded
         $this->disconnect();
 
         return false;
@@ -243,7 +243,7 @@ public function authorise($host, $port = false, $timeout = false, $username = ''
      */
     public function connect($host, $port = false, $tval = 30)
     {
-        //  Are we already connected?
+        //Are we already connected?
         if ($this->connected) {
             return true;
         }
@@ -256,22 +256,22 @@ public function connect($host, $port = false, $tval = 30)
             $port = static::DEFAULT_PORT;
         }
 
-        //  connect to the POP3 server
+        //Connect to the POP3 server
         $errno = 0;
         $errstr = '';
         $this->pop_conn = fsockopen(
-            $host, //  POP3 Host
-            $port, //  Port #
-            $errno, //  Error Number
-            $errstr, //  Error Message
+            $host, //POP3 Host
+            $port, //Port #
+            $errno, //Error Number
+            $errstr, //Error Message
             $tval
-        ); //  Timeout (seconds)
-        //  Restore the error handler
+        ); //Timeout (seconds)
+        //Restore the error handler
         restore_error_handler();
 
-        //  Did we connect?
+        //Did we connect?
         if (false === $this->pop_conn) {
-            //  It would appear not...
+            //It would appear not...
             $this->setError(
                 "Failed to connect to server $host on port $port. errno: $errno; errstr: $errstr"
             );
@@ -279,14 +279,14 @@ public function connect($host, $port = false, $tval = 30)
             return false;
         }
 
-        //  Increase the stream time-out
+        //Increase the stream time-out
         stream_set_timeout($this->pop_conn, $tval, 0);
 
-        //  Get the POP3 server response
+        //Get the POP3 server response
         $pop3_response = $this->getResponse();
-        //  Check for the +OK
+        //Check for the +OK
         if ($this->checkResponse($pop3_response)) {
-            //  The connection is established and the POP3 server is talking
+            //The connection is established and the POP3 server is talking
             $this->connected = true;
 
             return true;
@@ -308,6 +308,7 @@ public function login($username = '', $password = '')
     {
         if (!$this->connected) {
             $this->setError('Not connected to POP3 server');
+            return false;
         }
         if (empty($username)) {
             $username = $this->username;
@@ -316,11 +317,11 @@ public function login($username = '', $password = '')
             $password = $this->password;
         }
 
-        // Send the Username
+        //Send the Username
         $this->sendString("USER $username" . static::LE);
         $pop3_response = $this->getResponse();
         if ($this->checkResponse($pop3_response)) {
-            // Send the Password
+            //Send the Password
             $this->sendString("PASS $password" . static::LE);
             $pop3_response = $this->getResponse();
             if ($this->checkResponse($pop3_response)) {
@@ -337,6 +338,15 @@ public function login($username = '', $password = '')
     public function disconnect()
     {
         $this->sendString('QUIT');
+
+        // RFC 1939 shows POP3 server sending a +OK response to the QUIT command.
+        // Try to get it.  Ignore any failures here.
+        try {
+            $this->getResponse();
+        } catch (Exception $e) {
+            //Do nothing
+        }
+
         //The QUIT command may cause the daemon to exit, which will kill our connection
         //So ignore errors here
         try {
@@ -344,6 +354,10 @@ public function disconnect()
         } catch (Exception $e) {
             //Do nothing
         }
+
+        // Clean up attributes.
+        $this->connected = false;
+        $this->pop_conn  = false;
     }
 
     /**
diff --git a/vendor/phpmailer/phpmailer/src/SMTP.php b/vendor/phpmailer/phpmailer/src/SMTP.php
index ab7f46e4c85adcd68e0fb393c42bbfc8dcdbc379..cc1711d2e2459bd43b1af1577de1ee7826b2cd20 100644
--- a/vendor/phpmailer/phpmailer/src/SMTP.php
+++ b/vendor/phpmailer/phpmailer/src/SMTP.php
@@ -35,7 +35,7 @@ class SMTP
      *
      * @var string
      */
-    const VERSION = '6.2.0';
+    const VERSION = '6.6.4';
 
     /**
      * SMTP line break constant.
@@ -186,6 +186,8 @@ class SMTP
         'Amazon_SES' => '/[\d]{3} Ok (.*)/',
         'SendGrid' => '/[\d]{3} Ok: queued as (.*)/',
         'CampaignMonitor' => '/[\d]{3} 2.0.0 OK:([a-zA-Z\d]{48})/',
+        'Haraka' => '/[\d]{3} Message Queued \((.*)\)/',
+        'Mailjet' => '/[\d]{3} OK queued as (.*)/',
     ];
 
     /**
@@ -312,11 +314,11 @@ protected function edebug($str, $level = 0)
      */
     public function connect($host, $port = null, $timeout = 30, $options = [])
     {
-        // Clear errors to avoid confusion
+        //Clear errors to avoid confusion
         $this->setError('');
-        // Make sure we are __not__ connected
+        //Make sure we are __not__ connected
         if ($this->connected()) {
-            // Already connected, generate error
+            //Already connected, generate error
             $this->setError('Already connected to a server');
 
             return false;
@@ -324,7 +326,7 @@ public function connect($host, $port = null, $timeout = 30, $options = [])
         if (empty($port)) {
             $port = self::DEFAULT_PORT;
         }
-        // Connect to the SMTP server
+        //Connect to the SMTP server
         $this->edebug(
             "Connection: opening to $host:$port, timeout=$timeout, options=" .
             (count($options) > 0 ? var_export($options, true) : 'array()'),
@@ -340,11 +342,23 @@ public function connect($host, $port = null, $timeout = 30, $options = [])
 
         $this->edebug('Connection: opened', self::DEBUG_CONNECTION);
 
-        // Get any announcement
+        //Get any announcement
         $this->last_reply = $this->get_lines();
         $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
-
-        return true;
+        $responseCode = (int)substr($this->last_reply, 0, 3);
+        if ($responseCode === 220) {
+            return true;
+        }
+        //Anything other than a 220 response means something went wrong
+        //RFC 5321 says the server will wait for us to send a QUIT in response to a 554 error
+        //https://tools.ietf.org/html/rfc5321#section-3.1
+        if ($responseCode === 554) {
+            $this->quit();
+        }
+        //This will handle 421 responses which may not wait for a QUIT (e.g. if the server is being shut down)
+        $this->edebug('Connection: closing due to error', self::DEBUG_CONNECTION);
+        $this->close();
+        return false;
     }
 
     /**
@@ -379,7 +393,6 @@ protected function getSMTPConnection($host, $port = null, $timeout = 30, $option
                 STREAM_CLIENT_CONNECT,
                 $socket_context
             );
-            restore_error_handler();
         } else {
             //Fall back to fsockopen which should work in more places, but is missing some features
             $this->edebug(
@@ -394,10 +407,10 @@ protected function getSMTPConnection($host, $port = null, $timeout = 30, $option
                 $errstr,
                 $timeout
             );
-            restore_error_handler();
         }
+        restore_error_handler();
 
-        // Verify we connected properly
+        //Verify we connected properly
         if (!is_resource($connection)) {
             $this->setError(
                 'Failed to connect to server',
@@ -414,11 +427,11 @@ protected function getSMTPConnection($host, $port = null, $timeout = 30, $option
             return false;
         }
 
-        // SMTP server can take longer to respond, give longer timeout for first read
-        // Windows does not have support for this timeout function
+        //SMTP server can take longer to respond, give longer timeout for first read
+        //Windows does not have support for this timeout function
         if (strpos(PHP_OS, 'WIN') !== 0) {
             $max = (int)ini_get('max_execution_time');
-            // Don't bother if unlimited, or if set_time_limit is disabled
+            //Don't bother if unlimited, or if set_time_limit is disabled
             if (0 !== $max && $timeout > $max && strpos(ini_get('disable_functions'), 'set_time_limit') === false) {
                 @set_time_limit($timeout);
             }
@@ -449,7 +462,7 @@ public function startTLS()
             $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
         }
 
-        // Begin encrypted connection
+        //Begin encrypted connection
         set_error_handler([$this, 'errorHandler']);
         $crypto_ok = stream_socket_enable_crypto(
             $this->smtp_conn,
@@ -470,7 +483,7 @@ public function startTLS()
      * @param string $username The user name
      * @param string $password The password
      * @param string $authtype The auth type (CRAM-MD5, PLAIN, LOGIN, XOAUTH2)
-     * @param OAuth  $OAuth    An optional OAuth instance for XOAUTH2 authentication
+     * @param OAuthTokenProvider $OAuth An optional OAuthTokenProvider instance for XOAUTH2 authentication
      *
      * @return bool True if successfully authenticated
      */
@@ -487,11 +500,11 @@ public function authenticate(
         }
 
         if (array_key_exists('EHLO', $this->server_caps)) {
-            // SMTP extensions are available; try to find a proper authentication method
+            //SMTP extensions are available; try to find a proper authentication method
             if (!array_key_exists('AUTH', $this->server_caps)) {
                 $this->setError('Authentication is not allowed at this stage');
-                // 'at this stage' means that auth may be allowed after the stage changes
-                // e.g. after STARTTLS
+                //'at this stage' means that auth may be allowed after the stage changes
+                //e.g. after STARTTLS
 
                 return false;
             }
@@ -535,12 +548,14 @@ public function authenticate(
         }
         switch ($authtype) {
             case 'PLAIN':
-                // Start authentication
+                //Start authentication
                 if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
                     return false;
                 }
-                // Send encoded username and password
+                //Send encoded username and password
                 if (
+                    //Format from https://tools.ietf.org/html/rfc4616#section-2
+                    //We skip the first field (it's forgery), so the string starts with a null byte
                     !$this->sendCommand(
                         'User & Password',
                         base64_encode("\0" . $username . "\0" . $password),
@@ -551,7 +566,7 @@ public function authenticate(
                 }
                 break;
             case 'LOGIN':
-                // Start authentication
+                //Start authentication
                 if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
                     return false;
                 }
@@ -563,17 +578,17 @@ public function authenticate(
                 }
                 break;
             case 'CRAM-MD5':
-                // Start authentication
+                //Start authentication
                 if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
                     return false;
                 }
-                // Get the challenge
+                //Get the challenge
                 $challenge = base64_decode(substr($this->last_reply, 4));
 
-                // Build the response
+                //Build the response
                 $response = $username . ' ' . $this->hmac($challenge, $password);
 
-                // send encoded credentials
+                //send encoded credentials
                 return $this->sendCommand('Username', base64_encode($response), 235);
             case 'XOAUTH2':
                 //The OAuth instance must be set up prior to requesting auth.
@@ -582,7 +597,7 @@ public function authenticate(
                 }
                 $oauth = $OAuth->getOauth64();
 
-                // Start authentication
+                //Start authentication
                 if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth, 235)) {
                     return false;
                 }
@@ -612,15 +627,15 @@ protected function hmac($data, $key)
             return hash_hmac('md5', $data, $key);
         }
 
-        // The following borrowed from
-        // http://php.net/manual/en/function.mhash.php#27225
+        //The following borrowed from
+        //http://php.net/manual/en/function.mhash.php#27225
 
-        // RFC 2104 HMAC implementation for php.
-        // Creates an md5 HMAC.
-        // Eliminates the need to install mhash to compute a HMAC
-        // by Lance Rushing
+        //RFC 2104 HMAC implementation for php.
+        //Creates an md5 HMAC.
+        //Eliminates the need to install mhash to compute a HMAC
+        //by Lance Rushing
 
-        $bytelen = 64; // byte length for md5
+        $bytelen = 64; //byte length for md5
         if (strlen($key) > $bytelen) {
             $key = pack('H*', md5($key));
         }
@@ -643,7 +658,7 @@ public function connected()
         if (is_resource($this->smtp_conn)) {
             $sock_status = stream_get_meta_data($this->smtp_conn);
             if ($sock_status['eof']) {
-                // The socket is valid but we are not connected
+                //The socket is valid but we are not connected
                 $this->edebug(
                     'SMTP NOTICE: EOF caught while checking if connected',
                     self::DEBUG_CLIENT
@@ -653,7 +668,7 @@ public function connected()
                 return false;
             }
 
-            return true; // everything looks good
+            return true; //everything looks good
         }
 
         return false;
@@ -671,7 +686,7 @@ public function close()
         $this->server_caps = null;
         $this->helo_rply = null;
         if (is_resource($this->smtp_conn)) {
-            // close the connection and cleanup
+            //Close the connection and cleanup
             fclose($this->smtp_conn);
             $this->smtp_conn = null; //Makes for cleaner serialization
             $this->edebug('Connection: closed', self::DEBUG_CONNECTION);
@@ -681,7 +696,7 @@ public function close()
     /**
      * Send an SMTP DATA command.
      * Issues a data command and sends the msg_data to the server,
-     * finializing the mail transaction. $msg_data is the message
+     * finalizing the mail transaction. $msg_data is the message
      * that is to be send with the headers. Each header needs to be
      * on a single line followed by a <CRLF> with the message headers
      * and the message body being separated by an additional <CRLF>.
@@ -706,7 +721,7 @@ public function data($msg_data)
          * NOTE: this does not count towards line-length limit.
          */
 
-        // Normalize line breaks before exploding
+        //Normalize line breaks before exploding
         $lines = explode("\n", str_replace(["\r\n", "\r"], "\n", $msg_data));
 
         /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
@@ -752,7 +767,8 @@ public function data($msg_data)
 
             //Send the lines to the server
             foreach ($lines_out as $line_out) {
-                //RFC2821 section 4.5.2
+                //Dot-stuffing as per RFC5321 section 4.5.2
+                //https://tools.ietf.org/html/rfc5321#section-4.5.2
                 if (!empty($line_out) && $line_out[0] === '.') {
                     $line_out = '.' . $line_out;
                 }
@@ -786,7 +802,16 @@ public function data($msg_data)
     public function hello($host = '')
     {
         //Try extended hello first (RFC 2821)
-        return $this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host);
+        if ($this->sendHello('EHLO', $host)) {
+            return true;
+        }
+
+        //Some servers shut down the SMTP service here (RFC 5321)
+        if (substr($this->helo_rply, 0, 3) == '421') {
+            return false;
+        }
+
+        return $this->sendHello('HELO', $host);
     }
 
     /**
@@ -976,12 +1001,12 @@ protected function sendCommand($command, $commandstring, $expect)
         $this->client_send($commandstring . static::LE, $command);
 
         $this->last_reply = $this->get_lines();
-        // Fetch SMTP code and possible error code explanation
+        //Fetch SMTP code and possible error code explanation
         $matches = [];
         if (preg_match('/^([\d]{3})[ -](?:([\d]\\.[\d]\\.[\d]{1,2}) )?/', $this->last_reply, $matches)) {
             $code = (int) $matches[1];
             $code_ex = (count($matches) > 2 ? $matches[2] : null);
-            // Cut off error code from each response line
+            //Cut off error code from each response line
             $detail = preg_replace(
                 "/{$code}[ -]" .
                 ($code_ex ? str_replace('.', '\\.', $code_ex) . ' ' : '') . '/m',
@@ -989,7 +1014,7 @@ protected function sendCommand($command, $commandstring, $expect)
                 $this->last_reply
             );
         } else {
-            // Fall back to simple parsing if regex fails
+            //Fall back to simple parsing if regex fails
             $code = (int) substr($this->last_reply, 0, 3);
             $code_ex = null;
             $detail = substr($this->last_reply, 4);
@@ -1012,7 +1037,10 @@ protected function sendCommand($command, $commandstring, $expect)
             return false;
         }
 
-        $this->setError('');
+        //Don't clear the error store when using keepalive
+        if ($command !== 'RSET') {
+            $this->setError('');
+        }
 
         return true;
     }
@@ -1145,7 +1173,7 @@ public function getServerExt($name)
         if (!$this->server_caps) {
             $this->setError('No HELO/EHLO was sent');
 
-            return;
+            return null;
         }
 
         if (!array_key_exists($name, $this->server_caps)) {
@@ -1157,7 +1185,7 @@ public function getServerExt($name)
             }
             $this->setError('HELO handshake was used; No information about server extensions available');
 
-            return;
+            return null;
         }
 
         return $this->server_caps[$name];
@@ -1184,7 +1212,7 @@ public function getLastReply()
      */
     protected function get_lines()
     {
-        // If the connection is bad, give up straight away
+        //If the connection is bad, give up straight away
         if (!is_resource($this->smtp_conn)) {
             return '';
         }
@@ -1237,13 +1265,13 @@ protected function get_lines()
             $str = @fgets($this->smtp_conn, self::MAX_REPLY_LENGTH);
             $this->edebug('SMTP INBOUND: "' . trim($str) . '"', self::DEBUG_LOWLEVEL);
             $data .= $str;
-            // If response is only 3 chars (not valid, but RFC5321 S4.2 says it must be handled),
-            // or 4th character is a space or a line break char, we are done reading, break the loop.
-            // String array access is a significant micro-optimisation over strlen
+            //If response is only 3 chars (not valid, but RFC5321 S4.2 says it must be handled),
+            //or 4th character is a space or a line break char, we are done reading, break the loop.
+            //String array access is a significant micro-optimisation over strlen
             if (!isset($str[3]) || $str[3] === ' ' || $str[3] === "\r" || $str[3] === "\n") {
                 break;
             }
-            // Timed-out? Log and break
+            //Timed-out? Log and break
             $info = stream_get_meta_data($this->smtp_conn);
             if ($info['timed_out']) {
                 $this->edebug(
@@ -1252,7 +1280,7 @@ protected function get_lines()
                 );
                 break;
             }
-            // Now check if reads took too long
+            //Now check if reads took too long
             if ($endtime && time() > $endtime) {
                 $this->edebug(
                     'SMTP -> get_lines(): timelimit reached (' .
diff --git a/vendor/simplesamlphp/assert/.gitignore b/vendor/simplesamlphp/assert/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..bbd0745d580ab1f676d60b6a7313e95fa9442e6e
--- /dev/null
+++ b/vendor/simplesamlphp/assert/.gitignore
@@ -0,0 +1,6 @@
+/build/
+/cache.properties
+/composer.lock
+/composer.phar
+/.phpunit.result.cache
+/vendor/
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.php_cs.dist b/vendor/simplesamlphp/assert/.php_cs.dist
similarity index 57%
rename from vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.php_cs.dist
rename to vendor/simplesamlphp/assert/.php_cs.dist
index e7d314696c7e461b645c3d603f3a5d3034082ba5..44e6279affe5f51cbd233571ac66268c0f31218e 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.php_cs.dist
+++ b/vendor/simplesamlphp/assert/.php_cs.dist
@@ -1,15 +1,12 @@
 <?php
+
 $finder = PhpCsFixer\Finder::create()
     ->in([
-        __DIR__ . '/lib',
+        __DIR__ . '/src',
         __DIR__ . '/tests',
-    ])
-;
+    ]);
+
 return PhpCsFixer\Config::create()
     ->setRules([
         '@PSR2' => true,
-        '@PSR4' => true,
-        '@PSR5' => true,
-    ])
-    ->setFinder($finder)
-;
+    ])->setFinder($finder) ;
diff --git a/vendor/simplesamlphp/assert/.travis.yml b/vendor/simplesamlphp/assert/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..11403dad4466e38a677d2be0c47ecbebfd88f856
--- /dev/null
+++ b/vendor/simplesamlphp/assert/.travis.yml
@@ -0,0 +1,127 @@
+language: php
+
+stages:
+  - pre-conditions
+  - test
+  - quality
+
+################
+#  Test stage  #
+################
+
+php:
+  - 7.2
+  - 7.3
+  - 7.4
+
+env:
+  - COMMAND="composer install"
+  - COMMAND="composer update"
+
+before_script:
+  - ${COMMAND}
+
+script:
+  - php vendor/bin/phpunit --no-coverage
+
+jobs:
+  fast_finish: true
+
+  allow_failures:
+    - php: 7.3
+      env: Security check (composer install)
+    - php: 7.3
+      env: Security check (composer update)
+    - php: 7.3
+      env: Psalm
+    - php: 7.3
+      env: PHP Codesniffer
+
+  include:
+
+    ##########################
+    #  Pre-conditions stage  #
+    ##########################
+
+    - stage: pre-conditions
+      env: Syntax check PHP
+      php: 7.2
+      before_script:
+        - composer install
+      script:
+        - vendor/bin/check-syntax-php.sh
+
+    - stage: pre-conditions
+      env: Syntax check PHP
+      php: 7.3
+      before_script:
+        - composer install
+      script:
+        - vendor/bin/check-syntax-php.sh
+
+    - stage: pre-conditions
+      env: Syntax check PHP
+      php: 7.4
+      before_script:
+        - composer install
+      script:
+        - vendor/bin/check-syntax-php.sh
+
+    - stage: pre-conditions
+      env: Syntax check YAML / XML / JSON
+      before_script:
+        - composer require simplesamlphp/simplesamlphp-test-framework --dev
+      script:
+        - vendor/simplesamlphp/simplesamlphp-test-framework/bin/check-syntax-json.sh
+        - vendor/simplesamlphp/simplesamlphp-test-framework/bin/check-syntax-xml.sh
+        - vendor/simplesamlphp/simplesamlphp-test-framework/bin/check-syntax-yaml.sh
+
+    ###################
+    #  Quality stage  #
+    ###################
+
+    - stage: quality
+      php: 7.3
+      env: Security check (composer install)
+      before_script:
+        - composer install
+      script:
+        - vendor/bin/security-checker security:check
+
+    - stage: quality
+      php: 7.3
+      env: Security check (composer update)
+      before_script:
+        - composer update
+      script:
+        - vendor/bin/security-checker security:check
+
+    - stage: quality
+      php: 7.3
+      env: Codecov
+      before_script:
+        - composer update
+        - php vendor/bin/phpunit
+      script:
+        - bash <(curl -s https://codecov.io/bash)
+
+    - stage: quality
+      php: 7.3
+      env: Psalm
+      before_script:
+        - composer update
+      script:
+        - vendor/bin/psalm
+        - vendor/bin/psalter --issues=UnnecessaryVarAnnotation --dry-run
+
+    - stage: quality
+      php: 7.3
+      env: PHP Codesniffer
+      before_script:
+        - composer update
+      script:
+        - vendor/bin/phpcs src/
+
+notifications:
+  slack:
+    secure: jgkeIXi7Hzkc907ZKGpuJZ9va+KjHNV0LZoWc22skkDqNIu2wshvqx4wOMFK8CXtRcRgCambtXxyTio17Q4B4mFu1uf7qVN6x18QyLNhfypB/d808kLoJCzlmGB7477jrw5xvgSVOMxWmic8QTjkcMOWSiG4fJE86zIthZP0OOY=
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/LICENSE b/vendor/simplesamlphp/assert/LICENSE
similarity index 92%
rename from vendor/simplesamlphp/simplesamlphp/modules/statistics/LICENSE
rename to vendor/simplesamlphp/assert/LICENSE
index a345e48d049f9c6756e9364e908b3f26e36c9df1..8000a6faacf471c537530805ab29523c7732e11a 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/LICENSE
+++ b/vendor/simplesamlphp/assert/LICENSE
@@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
 that what they have is not the original version, so that the original
 author's reputation will not be affected by problems that might be
 introduced by others.
-
+
   Finally, software patents pose a constant threat to the existence of
 any free program.  We wish to make sure that a company cannot
 effectively restrict the users of a free program by obtaining a
@@ -111,7 +111,7 @@ modification follow.  Pay close attention to the difference between a
 "work based on the library" and a "work that uses the library".  The
 former contains code derived from the library, whereas the latter must
 be combined with the library in order to run.
-
+
                   GNU LESSER GENERAL PUBLIC LICENSE
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
@@ -158,7 +158,7 @@ Library.
   You may charge a fee for the physical act of transferring a copy,
 and you may at your option offer warranty protection in exchange for a
 fee.
-
+
   2. You may modify your copy or copies of the Library or any portion
 of it, thus forming a work based on the Library, and copy and
 distribute such modifications or work under the terms of Section 1
@@ -216,7 +216,7 @@ instead of to this License.  (If a newer version than version 2 of the
 ordinary GNU General Public License has appeared, then you can specify
 that version instead if you wish.)  Do not make any other change in
 these notices.
-
+
   Once this change is made in a given copy, it is irreversible for
 that copy, so the ordinary GNU General Public License applies to all
 subsequent copies and derivative works made from that copy.
@@ -267,7 +267,7 @@ Library will still fall under Section 6.)
 distribute the object code for the work under the terms of Section 6.
 Any executables containing that work also fall under Section 6,
 whether or not they are linked directly with the Library itself.
-
+
   6. As an exception to the Sections above, you may also combine or
 link a "work that uses the Library" with the Library to produce a
 work containing portions of the Library, and distribute that work
@@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
 accompany the operating system.  Such a contradiction means you cannot
 use both them and the Library together in an executable that you
 distribute.
-
+
   7. You may place library facilities that are a work based on the
 Library side-by-side in a single library together with other library
 facilities not covered by this License, and distribute such a combined
@@ -370,7 +370,7 @@ subject to these terms and conditions.  You may not impose any further
 restrictions on the recipients' exercise of the rights granted herein.
 You are not responsible for enforcing compliance by third parties with
 this License.
-
+
   11. If, as a consequence of a court judgment or allegation of patent
 infringement or for any other reason (not limited to patent issues),
 conditions are imposed on you (whether by court order, agreement or
@@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
 the Free Software Foundation.  If the Library does not specify a
 license version number, you may choose any version ever published by
 the Free Software Foundation.
-
+
   14. If you wish to incorporate parts of the Library into other free
 programs whose distribution conditions are incompatible with these,
 write to the author to ask for permission.  For software which is
@@ -456,4 +456,49 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 DAMAGES.
 
                      END OF TERMS AND CONDITIONS
-
\ No newline at end of file
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
+    USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random
+  Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/.codecov.yml b/vendor/simplesamlphp/assert/codecov.yml
similarity index 91%
rename from vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/.codecov.yml
rename to vendor/simplesamlphp/assert/codecov.yml
index f7f39e1e93d0ca23383d5ed120442f62f5f15ac9..cbe651081150dc8b3f5193585e71f7cc58f2b459 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/.codecov.yml
+++ b/vendor/simplesamlphp/assert/codecov.yml
@@ -1,7 +1,7 @@
 coverage:
   status:
     project: yes
-
+    patch: off
 comment:
   layout: "diff"
   behavior: once
diff --git a/vendor/simplesamlphp/assert/composer.json b/vendor/simplesamlphp/assert/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..531a3605de8aff8fdde61440e908a64f0a46b318
--- /dev/null
+++ b/vendor/simplesamlphp/assert/composer.json
@@ -0,0 +1,43 @@
+{
+    "name": "simplesamlphp/assert",
+    "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments",
+    "license": "LGPL-2.1-or-later",
+    "authors": [
+        {
+            "name": "Tim van Dijen",
+            "email": "tvdijen@gmail.com"
+        },
+        {
+            "name": "Jaime Perez Crespo",
+            "email": "jaimepc@gmail.com"
+        }
+    ],
+    "require": {
+        "php": "^7.1 || ^8.0",
+        "ext-SPL": "*",
+
+        "webmozart/assert": "^1.9"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "^8.5",
+        "sensiolabs/security-checker": "~6.0",
+        "simplesamlphp/simplesamlphp-test-framework": "^0.2.7",
+        "squizlabs/php_codesniffer": "~3.5",
+        "vimeo/psalm": "~3.13"
+    },
+    "autoload": {
+        "psr-4": {
+            "SimpleSAML\\Assert\\": "src/"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "SimpleSAML\\Assert\\": "tests/Assert/"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "v0.0.x-dev"
+        }
+    }
+}
diff --git a/vendor/simplesamlphp/assert/phpcs.xml b/vendor/simplesamlphp/assert/phpcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94ce5e4d14ab19f9861758618a7c3b414f0fcd72
--- /dev/null
+++ b/vendor/simplesamlphp/assert/phpcs.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<ruleset name="SimpleSAMLphp SAML2 ruleset">
+    <description>
+        By default it is less stringent about long lines than other coding standards
+    </description>
+
+    <!-- Use this to exclude paths. You can have multiple patterns -->
+    <!--<exclude-pattern>*/tests/*</exclude-pattern>-->
+    <!--<exclude-pattern>*/other/*</exclude-pattern>-->
+
+    <!-- This is the rule we inherit from. If you want to exlude some specific rules, see the docs on how to do that -->
+    <rule ref="PSR12"/>
+
+    <!-- Lines can be a little bit longer before they break the build -->
+    <rule ref="Generic.Files.LineLength">
+        <properties>
+            <property name="lineLimit" value="130"/>
+            <property name="absoluteLineLimit" value="130"/>
+        </properties>
+    </rule>
+</ruleset>
diff --git a/vendor/simplesamlphp/assert/phpunit.xml b/vendor/simplesamlphp/assert/phpunit.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6006700313e2383aca274e388fa0d1f6a6016929
--- /dev/null
+++ b/vendor/simplesamlphp/assert/phpunit.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         bootstrap="./tests/bootstrap.php">
+    <testsuites>
+        <testsuite name="Test Suite">
+            <directory>./tests</directory>
+        </testsuite>
+    </testsuites>
+    <filter>
+        <whitelist processUncoveredFilesFromWhitelist="true">
+            <directory>./src</directory>
+        </whitelist>
+    </filter>
+    <logging>
+        <log type="coverage-clover" target="build/logs/clover.xml"/>
+    </logging>
+</phpunit>
diff --git a/vendor/simplesamlphp/assert/psalm.xml b/vendor/simplesamlphp/assert/psalm.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f3e3bc7f9723fe1cbedc1e6f0045f9331cc4a369
--- /dev/null
+++ b/vendor/simplesamlphp/assert/psalm.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<psalm
+  name="Assertions"
+  useDocblockTypes="true"
+  totallyTyped="false"
+  hideExternalErrors="true"
+>
+  <projectFiles>
+    <directory name="src/" />
+    <directory name="tests/" />
+    <ignoreFiles>
+      <directory name="vendor" />
+    </ignoreFiles>
+  </projectFiles>
+
+  <issueHandlers>
+    <LessSpecificReturnType errorLevel="info" />
+
+    <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives -->
+    <DeprecatedMethod errorLevel="info" />
+
+    <MissingClosureReturnType errorLevel="info" />
+    <MissingPropertyType errorLevel="info" />
+    <InvalidDocblock errorLevel="info" />
+    <MisplacedRequiredParam errorLevel="info" />
+
+    <MissingConstructor errorLevel="info" />
+    <MissingClosureParamType errorLevel="info" />
+    <MissingParamType errorLevel="info" />
+    <UnusedClass errorLevel="info" />
+    <PossiblyUnusedMethod errorLevel="info" />
+    <PropertyNotSetInConstructor errorLevel="suppress" />
+    <MissingClosureReturnType errorLevel="suppress" />
+
+    <PropertyNotSetInConstructor>
+      <errorLevel type="suppress">
+        <directory name="tests" />
+      </errorLevel>
+    </PropertyNotSetInConstructor>
+
+    <InternalMethod>
+      <errorLevel type="suppress">
+        <directory name="tests" />
+      </errorLevel>
+    </InternalMethod>
+
+    <!-- Ignore UnresolvableInclude on CLI-scripts -->
+    <UnresolvableInclude>
+      <errorLevel type="suppress">
+        <file name="tests/bootstrap.php" />
+      </errorLevel>
+    </UnresolvableInclude>
+
+  </issueHandlers>
+</psalm>
diff --git a/vendor/simplesamlphp/assert/src/Assert.php b/vendor/simplesamlphp/assert/src/Assert.php
new file mode 100644
index 0000000000000000000000000000000000000000..108b82ea3a395b9b3e14cb81045b0159eecb5384
--- /dev/null
+++ b/vendor/simplesamlphp/assert/src/Assert.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SimpleSAML\Assert;
+
+use BadMethodCallException;
+use InvalidArgumentException;
+use Throwable;
+use Webmozart\Assert\Assert as Webmozart;
+
+/**
+ * Webmozart\Assert wrapper class
+ *
+ * @author Tim van Dijen, <tvdijen@gmail.com>
+ * @package simplesamlphp/assert
+ */
+final class Assert
+{
+    /**
+     * @param string $name
+     * @param array $arguments
+     * @return void
+     */
+    public static function __callStatic($name, $arguments): void
+    {
+        // Handle Exception-parameter
+        $exception = AssertionFailedException::class;
+        $last = end($arguments);
+        if (is_string($last) && class_exists($last) && is_subclass_of($last, Throwable::class)) {
+            $exception = $last;
+
+            array_pop($arguments);
+        }
+
+        try {
+            call_user_func_array([Webmozart::class, $name], $arguments);
+            return;
+        } catch (InvalidArgumentException $e) {
+            throw new $exception($e->getMessage());
+        }
+    }
+}
diff --git a/vendor/simplesamlphp/assert/src/AssertionFailedException.php b/vendor/simplesamlphp/assert/src/AssertionFailedException.php
new file mode 100644
index 0000000000000000000000000000000000000000..38aa9ef038f6ca59fda4c300108c21a84822c220
--- /dev/null
+++ b/vendor/simplesamlphp/assert/src/AssertionFailedException.php
@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SimpleSAML\Assert;
+
+use UnexpectedValueException;
+
+/**
+ * Generic exception for failing assertions.
+ * Applications may extend from it to create more specific exceptions.
+ *
+ * @author Tim van Dijen, <tvdijen@gmail.com>
+ * @package simplesamlphp/assert
+ */
+class AssertionFailedException extends UnexpectedValueException
+{
+}
diff --git a/vendor/simplesamlphp/assert/tests/Assert/AssertTest.php b/vendor/simplesamlphp/assert/tests/Assert/AssertTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..eea15348e09100b52525a06777204b27f333de40
--- /dev/null
+++ b/vendor/simplesamlphp/assert/tests/Assert/AssertTest.php
@@ -0,0 +1,49 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Assert;
+
+use BadMethodCallException;
+use LogicException;
+use PHPUnit\Framework\TestCase;
+use SimpleSAML\Assert\Assert;
+use SimpleSAML\Assert\AssertionFailedException;
+
+/**
+ * Class \SimpleSAML\Assert\Assert
+ *
+ * @author Tim van Dijen, <tvdijen@gmail.com>
+ * @package simplesamlphp/saml2
+ */
+final class AssertTest extends TestCase
+{
+    /**
+     * @return void
+     */
+    public function testAssertionFailingThrowsException(): void
+    {
+        $this->expectException(AssertionFailedException::class);
+        Assert::nullOrSame('a', 'b');
+    }
+
+
+    /**
+     * @return void
+     */
+    public function testAssertionFailingWithCustomExceptionThrowsCustomException(): void
+    {
+        $this->expectException(LogicException::class);
+        Assert::allSame(['a', 'b', 'c'], 'b', LogicException::class);
+    }
+
+
+    /**
+     * @return void
+     */
+    public function testUnknownAssertionRaisesBadMethodCallException(): void
+    {
+        $this->expectException(BadMethodCallException::class);
+        Assert::thisAssertionDoesNotExist('a', 'b', LogicException::class);
+    }
+}
diff --git a/vendor/simplesamlphp/assert/tests/bootstrap.php b/vendor/simplesamlphp/assert/tests/bootstrap.php
new file mode 100644
index 0000000000000000000000000000000000000000..2551e08084be2b7732af3cc246f0cb54afd4c92a
--- /dev/null
+++ b/vendor/simplesamlphp/assert/tests/bootstrap.php
@@ -0,0 +1,4 @@
+<?php
+
+$projectRoot = dirname(__DIR__);
+require_once($projectRoot . '/vendor/autoload.php');
diff --git a/vendor/simplesamlphp/saml2/.github/workflows/php.yml b/vendor/simplesamlphp/saml2/.github/workflows/php.yml
index bdf261c9465a86bf85797b25f132f204faa39cfb..24eb005d44c571282c3b4e59a57aa4349ab9e528 100644
--- a/vendor/simplesamlphp/saml2/.github/workflows/php.yml
+++ b/vendor/simplesamlphp/saml2/.github/workflows/php.yml
@@ -14,13 +14,14 @@ jobs:
       fail-fast: false
       matrix:
         operating-system: [ubuntu-latest, windows-latest]
-        php-versions: ['7.1', '7.2', '7.3', '7.4']
+        php-versions: ['7.1', '7.2', '7.3', '7.4', '8.0', '8.1']
 
     steps:
       - name: Setup PHP, with composer and extensions
         uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
         with:
           php-version: ${{ matrix.php-versions }}
+          ini-values: error_reporting=E_ALL^E_DEPRECATED
           extensions: mbstring, xml
           coverage: xdebug
 
@@ -58,7 +59,7 @@ jobs:
         run: bash vendor/bin/check-syntax-php.sh
 
       - name: Decide whether to run code coverage or not
-        if: ${{ matrix.php-versions != '7.4' || matrix.operating-system != 'ubuntu-latest' }}
+        if: ${{ matrix.php-versions != '8.0' || matrix.operating-system != 'ubuntu-latest' }}
         run: |
           echo "NO_COVERAGE=--no-coverage" >> $GITHUB_ENV
 
@@ -68,7 +69,7 @@ jobs:
           ./vendor/bin/phpunit $NO_COVERAGE
 
       - name: Save coverage data
-        if: ${{ matrix.php-versions == '7.4' && matrix.operating-system == 'ubuntu-latest' }}
+        if: ${{ matrix.php-versions == '8.0' && matrix.operating-system == 'ubuntu-latest' }}
         uses: actions/upload-artifact@v1
         with:
             name: build-data
@@ -81,8 +82,9 @@ jobs:
       - name: Setup PHP, with composer and extensions
         uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
         with:
-            php-version: '7.4'
+            php-version: '8.0'
             extensions: mbstring, xml
+            tools: composer:v2
             coverage: none
 
       - name: Setup problem matchers for PHP
@@ -102,16 +104,16 @@ jobs:
             restore-keys: ${{ runner.os }}-composer-
 
       - name: Install Composer dependencies
-        run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader
+        run: composer install --no-progress --prefer-dist --optimize-autoloader
 
       - name: Security check for locked dependencies
-        run: ./vendor/bin/security-checker security:check
+        uses: symfonycorp/security-checker-action@v2
 
       - name: Update Composer dependencies
-        run: composer update --no-progress --no-suggest --prefer-dist --optimize-autoloader
+        run: composer update --no-progress --prefer-dist --optimize-autoloader
 
       - name: Security check for updated dependencies
-        run: ./vendor/bin/security-checker security:check
+        uses: symfonycorp/security-checker-action@v2
 
   sanity-check:
     name: Sanity checks
@@ -121,7 +123,7 @@ jobs:
       - name: Setup PHP, with composer and extensions
         uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
         with:
-          php-version: '7.4'
+          php-version: '8.0'
           extensions: mbstring, xml
           coverage: none
 
@@ -159,7 +161,7 @@ jobs:
       - name: Setup PHP, with composer and extensions
         uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
         with:
-          php-version: '7.4'
+          php-version: '8.0'
           extensions: mbstring, xml
 
       - name: Setup problem matchers for PHP
diff --git a/vendor/simplesamlphp/saml2/composer.json b/vendor/simplesamlphp/saml2/composer.json
index df357ea8fe7c6eb3d7e8c842d8e2d333ddbdca8e..05d36d351f238e753e826dd0b4c140cd7ef19b30 100644
--- a/vendor/simplesamlphp/saml2/composer.json
+++ b/vendor/simplesamlphp/saml2/composer.json
@@ -9,21 +9,20 @@
         }
     ],
     "require": {
-        "php": ">=7.1",
+        "php": ">=7.1 || ^8.0",
         "ext-openssl": "*",
         "ext-dom": "*",
         "ext-zlib": "*",
 
-        "psr/log": "~1.1",
-        "robrichards/xmlseclibs": "^3.1.0",
-        "webmozart/assert": "^1.5"
+        "psr/log": "~1.1 || ^2.0 || ^3.0",
+        "robrichards/xmlseclibs": "^3.1.1",
+        "webmozart/assert": "^1.9"
     },
     "require-dev": {
-        "mockery/mockery": "~1.2",
-        "phpunit/phpunit": "^7.5",
+        "mockery/mockery": "^1.3",
+        "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
         "simplesamlphp/simplesamlphp-test-framework": "~0.1.0",
-        "sensiolabs/security-checker": "~6.0",
-        "sebastian/phpcpd": "~4.1",
+        "sebastian/phpcpd": "~4.1 || ^5.0 || ^6.0",
         "squizlabs/php_codesniffer": "~3.5"
     },
     "autoload": {
@@ -33,12 +32,18 @@
     },
     "autoload-dev": {
         "psr-4": {
+            "Test\\SAML2\\": "tests/SAML2/",
             "SAML2\\": "tests/SAML2/"
         }
     },
     "extra": {
         "branch-alias": {
-            "dev-master": "v4.0.x-dev"
+            "dev-master": "v4.2.x-dev"
+        }
+    },
+    "config": {
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true
         }
     }
 }
diff --git a/vendor/simplesamlphp/saml2/phpunit.xml b/vendor/simplesamlphp/saml2/phpunit.xml
index ff592aed94c0bd12aa4c6a9a520f9103b879a37a..142213024fb9d5f3929aae10cfd05b9830647161 100644
--- a/vendor/simplesamlphp/saml2/phpunit.xml
+++ b/vendor/simplesamlphp/saml2/phpunit.xml
@@ -6,7 +6,7 @@
          convertErrorsToExceptions="true"
          convertNoticesToExceptions="true"
          convertWarningsToExceptions="true"
-         processIsolation="false"
+         processIsolation="true"
          stopOnFailure="false"
          bootstrap="./tests/autoload.php">
     <testsuites>
diff --git a/vendor/simplesamlphp/saml2/psalm.xml b/vendor/simplesamlphp/saml2/psalm.xml
index 50ad1256a908734235af10cb6376f0d0b7b216b5..04562d217932fb4f885c5b9b8293df5cd79ee036 100644
--- a/vendor/simplesamlphp/saml2/psalm.xml
+++ b/vendor/simplesamlphp/saml2/psalm.xml
@@ -22,7 +22,6 @@
     <MissingReturnType errorLevel="info" />
     <MissingPropertyType errorLevel="info" />
     <InvalidDocblock errorLevel="info" />
-    <MisplacedRequiredParam errorLevel="info" />
 
     <PropertyNotSetInConstructor errorLevel="info" />
     <MissingConstructor errorLevel="info" />
@@ -33,4 +32,10 @@
     <PropertyNotSetInConstructor errorLevel="suppress" />
     <MissingClosureReturnType errorLevel="suppress" />
   </issueHandlers>
+
+<!--
+  <stubs>
+    <file name="tests/resources/stubs/soap.php" />
+  </stubs>
+-->
 </psalm>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-assertion-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-assertion-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..2b2f7b8018a7390584352c42a5db5654d6bd6033
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-assertion-2.0.xsd
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<schema
+    targetNamespace="urn:oasis:names:tc:SAML:2.0:assertion"
+    xmlns="http://www.w3.org/2001/XMLSchema"
+    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
+    xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
+    elementFormDefault="unqualified"
+    attributeFormDefault="unqualified"
+    blockDefault="substitution"
+    version="2.0">
+    <import namespace="http://www.w3.org/2000/09/xmldsig#"
+        schemaLocation="xmldsig-core-schema.xsd"/>
+    <import namespace="http://www.w3.org/2001/04/xmlenc#"
+        schemaLocation="xenc-schema.xsd"/>
+    <annotation>
+        <documentation>
+            Document identifier: saml-schema-assertion-2.0
+            Location: http://docs.oasis-open.org/security/saml/v2.0/
+            Revision history:
+            V1.0 (November, 2002):
+              Initial Standard Schema.
+            V1.1 (September, 2003):
+              Updates within the same V1.0 namespace.
+            V2.0 (March, 2005):
+              New assertion schema for SAML V2.0 namespace.
+        </documentation>
+    </annotation>
+    <attributeGroup name="IDNameQualifiers">
+        <attribute name="NameQualifier" type="string" use="optional"/>
+        <attribute name="SPNameQualifier" type="string" use="optional"/>
+    </attributeGroup>
+    <element name="BaseID" type="saml:BaseIDAbstractType"/>
+    <complexType name="BaseIDAbstractType" abstract="true">
+        <attributeGroup ref="saml:IDNameQualifiers"/>
+    </complexType>
+    <element name="NameID" type="saml:NameIDType"/>
+    <complexType name="NameIDType">
+        <simpleContent>
+            <extension base="string">
+                <attributeGroup ref="saml:IDNameQualifiers"/>
+                <attribute name="Format" type="anyURI" use="optional"/>
+                <attribute name="SPProvidedID" type="string" use="optional"/>
+            </extension>
+        </simpleContent>
+    </complexType>
+    <complexType name="EncryptedElementType">
+        <sequence>
+            <element ref="xenc:EncryptedData"/>
+            <element ref="xenc:EncryptedKey" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+    </complexType>
+    <element name="EncryptedID" type="saml:EncryptedElementType"/>
+    <element name="Issuer" type="saml:NameIDType"/>
+    <element name="AssertionIDRef" type="NCName"/>
+    <element name="AssertionURIRef" type="anyURI"/>
+    <element name="Assertion" type="saml:AssertionType"/>
+    <complexType name="AssertionType">
+        <sequence>
+            <element ref="saml:Issuer"/>
+            <element ref="ds:Signature" minOccurs="0"/>
+            <element ref="saml:Subject" minOccurs="0"/>
+            <element ref="saml:Conditions" minOccurs="0"/>
+            <element ref="saml:Advice" minOccurs="0"/>
+            <choice minOccurs="0" maxOccurs="unbounded">
+                <element ref="saml:Statement"/>
+                <element ref="saml:AuthnStatement"/>
+                <element ref="saml:AuthzDecisionStatement"/>
+                <element ref="saml:AttributeStatement"/>
+            </choice>
+        </sequence>
+        <attribute name="Version" type="string" use="required"/>
+        <attribute name="ID" type="ID" use="required"/>
+        <attribute name="IssueInstant" type="dateTime" use="required"/>
+    </complexType>
+    <element name="Subject" type="saml:SubjectType"/>
+    <complexType name="SubjectType">
+        <choice>
+            <sequence>
+                <choice>
+                    <element ref="saml:BaseID"/>
+                    <element ref="saml:NameID"/>
+                    <element ref="saml:EncryptedID"/>
+                </choice>
+                <element ref="saml:SubjectConfirmation" minOccurs="0" maxOccurs="unbounded"/>
+            </sequence>
+            <element ref="saml:SubjectConfirmation" maxOccurs="unbounded"/>
+        </choice>
+    </complexType>
+    <element name="SubjectConfirmation" type="saml:SubjectConfirmationType"/>
+    <complexType name="SubjectConfirmationType">
+        <sequence>
+            <choice minOccurs="0">
+                <element ref="saml:BaseID"/>
+                <element ref="saml:NameID"/>
+                <element ref="saml:EncryptedID"/>
+            </choice>
+            <element ref="saml:SubjectConfirmationData" minOccurs="0"/>
+        </sequence>
+        <attribute name="Method" type="anyURI" use="required"/>
+    </complexType>
+    <element name="SubjectConfirmationData" type="saml:SubjectConfirmationDataType"/>
+    <complexType name="SubjectConfirmationDataType" mixed="true">
+        <complexContent>
+            <restriction base="anyType">
+                <sequence>
+                    <any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+                </sequence>
+                <attribute name="NotBefore" type="dateTime" use="optional"/>
+                <attribute name="NotOnOrAfter" type="dateTime" use="optional"/>
+                <attribute name="Recipient" type="anyURI" use="optional"/>
+                <attribute name="InResponseTo" type="NCName" use="optional"/>
+                <attribute name="Address" type="string" use="optional"/>
+                <anyAttribute namespace="##other" processContents="lax"/>
+            </restriction>
+        </complexContent>
+    </complexType>
+    <complexType name="KeyInfoConfirmationDataType" mixed="false">
+        <complexContent>
+            <restriction base="saml:SubjectConfirmationDataType">
+                <sequence>
+                    <element ref="ds:KeyInfo" maxOccurs="unbounded"/>
+                </sequence>
+            </restriction>
+        </complexContent>
+    </complexType>
+    <element name="Conditions" type="saml:ConditionsType"/>
+    <complexType name="ConditionsType">
+        <choice minOccurs="0" maxOccurs="unbounded">
+            <element ref="saml:Condition"/>
+            <element ref="saml:AudienceRestriction"/>
+            <element ref="saml:OneTimeUse"/>
+            <element ref="saml:ProxyRestriction"/>
+        </choice>
+        <attribute name="NotBefore" type="dateTime" use="optional"/>
+        <attribute name="NotOnOrAfter" type="dateTime" use="optional"/>
+    </complexType>
+    <element name="Condition" type="saml:ConditionAbstractType"/>
+    <complexType name="ConditionAbstractType" abstract="true"/>
+    <element name="AudienceRestriction" type="saml:AudienceRestrictionType"/>
+    <complexType name="AudienceRestrictionType">
+        <complexContent>
+            <extension base="saml:ConditionAbstractType">
+                <sequence>
+                    <element ref="saml:Audience" maxOccurs="unbounded"/>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="Audience" type="anyURI"/>
+    <element name="OneTimeUse" type="saml:OneTimeUseType" />
+    <complexType name="OneTimeUseType">
+        <complexContent>
+            <extension base="saml:ConditionAbstractType"/>
+        </complexContent>
+    </complexType>
+    <element name="ProxyRestriction" type="saml:ProxyRestrictionType"/>
+    <complexType name="ProxyRestrictionType">
+    <complexContent>
+        <extension base="saml:ConditionAbstractType">
+            <sequence>
+                <element ref="saml:Audience" minOccurs="0" maxOccurs="unbounded"/>
+            </sequence>
+            <attribute name="Count" type="nonNegativeInteger" use="optional"/>
+        </extension>
+	</complexContent>
+    </complexType>
+    <element name="Advice" type="saml:AdviceType"/>
+    <complexType name="AdviceType">
+        <choice minOccurs="0" maxOccurs="unbounded">
+            <element ref="saml:AssertionIDRef"/>
+            <element ref="saml:AssertionURIRef"/>
+            <element ref="saml:Assertion"/>
+            <element ref="saml:EncryptedAssertion"/>
+            <any namespace="##other" processContents="lax"/>
+        </choice>
+    </complexType>
+    <element name="EncryptedAssertion" type="saml:EncryptedElementType"/>
+    <element name="Statement" type="saml:StatementAbstractType"/>
+    <complexType name="StatementAbstractType" abstract="true"/>
+    <element name="AuthnStatement" type="saml:AuthnStatementType"/>
+    <complexType name="AuthnStatementType">
+        <complexContent>
+            <extension base="saml:StatementAbstractType">
+                <sequence>
+                    <element ref="saml:SubjectLocality" minOccurs="0"/>
+                    <element ref="saml:AuthnContext"/>
+                </sequence>
+                <attribute name="AuthnInstant" type="dateTime" use="required"/>
+                <attribute name="SessionIndex" type="string" use="optional"/>
+                <attribute name="SessionNotOnOrAfter" type="dateTime" use="optional"/>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="SubjectLocality" type="saml:SubjectLocalityType"/>
+    <complexType name="SubjectLocalityType">
+        <attribute name="Address" type="string" use="optional"/>
+        <attribute name="DNSName" type="string" use="optional"/>
+    </complexType>
+    <element name="AuthnContext" type="saml:AuthnContextType"/>
+    <complexType name="AuthnContextType">
+        <sequence>
+            <choice>
+                <sequence>
+                    <element ref="saml:AuthnContextClassRef"/>
+                    <choice minOccurs="0">
+                        <element ref="saml:AuthnContextDecl"/>
+                        <element ref="saml:AuthnContextDeclRef"/>
+                    </choice>
+                </sequence>
+                <choice>
+                    <element ref="saml:AuthnContextDecl"/>
+                    <element ref="saml:AuthnContextDeclRef"/>
+                </choice>
+            </choice>
+            <element ref="saml:AuthenticatingAuthority" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+    </complexType>
+    <element name="AuthnContextClassRef" type="anyURI"/>
+    <element name="AuthnContextDeclRef" type="anyURI"/>
+    <element name="AuthnContextDecl" type="anyType"/>
+    <element name="AuthenticatingAuthority" type="anyURI"/>
+    <element name="AuthzDecisionStatement" type="saml:AuthzDecisionStatementType"/>
+    <complexType name="AuthzDecisionStatementType">
+        <complexContent>
+            <extension base="saml:StatementAbstractType">
+                <sequence>
+                    <element ref="saml:Action" maxOccurs="unbounded"/>
+                    <element ref="saml:Evidence" minOccurs="0"/>
+                </sequence>
+                <attribute name="Resource" type="anyURI" use="required"/>
+                <attribute name="Decision" type="saml:DecisionType" use="required"/>
+            </extension>
+        </complexContent>
+    </complexType>
+    <simpleType name="DecisionType">
+        <restriction base="string">
+            <enumeration value="Permit"/>
+            <enumeration value="Deny"/>
+            <enumeration value="Indeterminate"/>
+        </restriction>
+    </simpleType>
+    <element name="Action" type="saml:ActionType"/>
+    <complexType name="ActionType">
+        <simpleContent>
+            <extension base="string">
+                <attribute name="Namespace" type="anyURI" use="required"/>
+            </extension>
+        </simpleContent>
+    </complexType>
+    <element name="Evidence" type="saml:EvidenceType"/>
+    <complexType name="EvidenceType">
+        <choice maxOccurs="unbounded">
+            <element ref="saml:AssertionIDRef"/>
+            <element ref="saml:AssertionURIRef"/>
+            <element ref="saml:Assertion"/>
+            <element ref="saml:EncryptedAssertion"/>
+        </choice>
+    </complexType>
+    <element name="AttributeStatement" type="saml:AttributeStatementType"/>
+    <complexType name="AttributeStatementType">
+        <complexContent>
+            <extension base="saml:StatementAbstractType">
+                <choice maxOccurs="unbounded">
+                    <element ref="saml:Attribute"/>
+                    <element ref="saml:EncryptedAttribute"/>
+                </choice>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="Attribute" type="saml:AttributeType"/>
+    <complexType name="AttributeType">
+        <sequence>
+            <element ref="saml:AttributeValue" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+        <attribute name="Name" type="string" use="required"/>
+        <attribute name="NameFormat" type="anyURI" use="optional"/>
+        <attribute name="FriendlyName" type="string" use="optional"/>
+        <anyAttribute namespace="##other" processContents="lax"/>
+    </complexType>
+    <element name="AttributeValue" type="anyType" nillable="true"/>
+    <element name="EncryptedAttribute" type="saml:EncryptedElementType"/>
+</schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..e4754faf8c44218741ed4e292059bb739349f4bd
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-2.0.xsd
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+  targetNamespace="urn:oasis:names:tc:SAML:2.0:ac"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema"
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:annotation>
+    <xs:documentation>
+      Document identifier: saml-schema-authn-context-2.0
+      Location: http://docs.oasis-open.org/security/saml/v2.0/
+      Revision history:
+        V2.0 (March, 2005):
+          New core authentication context schema for SAML V2.0. 
+          This is just an include of all types from the schema
+          referred to in the include statement below.
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:include schemaLocation="saml-schema-authn-context-types-2.0.xsd"/>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-auth-telephony-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-auth-telephony-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..da59934bed8f4696761a146de56e47a1547455a0
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-auth-telephony-2.0.xsd
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:AuthenticatedTelephony"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:AuthenticatedTelephony"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:AuthenticatedTelephony
+        Document identifier: saml-schema-authn-context-auth-telephony-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="Password"/>
+            <xs:element ref="SubscriberLineNumber"/>
+            <xs:element ref="UserSuffix"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorTransportProtocolType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorTransportProtocolType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="PSTN"/>
+              <xs:element ref="ISDN"/>
+              <xs:element ref="ADSL"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-ip-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-ip-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..d4e7dfba1a94f795f56f363b5da48a52c38c90f0
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-ip-2.0.xsd
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema
+  targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocol"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocol"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocol
+        Document identifier: saml-schema-authn-context-ip-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="IPAddress"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-ippword-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-ippword-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..708f5964360d550516619620ffcc8ae8c7e4d172
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-ippword-2.0.xsd
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocolPassword"
+  xmlns:ac="urn:oasis:names:tc:SAML:2.0:ac" 
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocolPassword"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocolPassword
+        Document identifier: saml-schema-authn-context-ippword-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="Password"/>
+            <xs:element ref="IPAddress"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-kerberos-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-kerberos-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..4b6a3a5da57d212ee1edfaca8ef50a2ce29c79d0
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-kerberos-2.0.xsd
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos
+        Document identifier: saml-schema-authn-context-kerberos-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="RestrictedPassword"/>
+          </xs:sequence>
+          <xs:attribute name="preauth" type="xs:integer" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="SharedSecretChallengeResponse"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="SharedSecretChallengeResponseType">
+      <xs:complexContent>
+        <xs:restriction base="SharedSecretChallengeResponseType">
+          <xs:attribute name="method" type="xs:anyURI" fixed="urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobileonefactor-reg-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobileonefactor-reg-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..f72443437faaef015228728edbcc4a3e9f0cdffa
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobileonefactor-reg-2.0.xsd
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorContract"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorContract"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorContract
+        Document identifier: saml-schema-authn-context-mobileonefactor-reg-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="DigSig"/>
+              <xs:element ref="ZeroKnowledge"/>
+              <xs:element ref="SharedSecretChallengeResponse"/>
+              <xs:element ref="SharedSecretDynamicPlaintext"/>
+              <xs:element ref="AsymmetricDecryption"/>
+              <xs:element ref="AsymmetricKeyAgreement"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorTransportProtocolType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorTransportProtocolType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="SSL"/>
+              <xs:element ref="MobileNetworkNoEncryption"/>
+              <xs:element ref="MobileNetworkRadioEncryption"/>
+              <xs:element ref="MobileNetworkEndToEndEncryption"/>
+              <xs:element ref="WTLS"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="OperationalProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="OperationalProtectionType">
+          <xs:sequence>
+            <xs:element ref="SecurityAudit"/>
+            <xs:element ref="DeactivationCallCenter"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="TechnicalProtectionBaseType">
+      <xs:complexContent>
+        <xs:restriction base="TechnicalProtectionBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="PrivateKeyProtection"/>
+              <xs:element ref="SecretKeyProtection"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PrivateKeyProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="PrivateKeyProtectionType">
+          <xs:sequence>
+            <xs:element ref="KeyStorage"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="SecretKeyProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="SecretKeyProtectionType">
+          <xs:sequence>
+            <xs:element ref="KeyStorage"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="KeyStorageType">
+      <xs:complexContent>
+        <xs:restriction base="KeyStorageType">
+          <xs:attribute name="medium" use="required">
+            <xs:simpleType>
+              <xs:restriction base="mediumType">
+                <xs:enumeration value="smartcard"/>
+                <xs:enumeration value="MobileDevice"/>
+                <xs:enumeration value="MobileAuthCard"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="SecurityAuditType">
+      <xs:complexContent>
+        <xs:restriction base="SecurityAuditType">
+          <xs:sequence>
+            <xs:element ref="SwitchAudit"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="IdentificationType">
+      <xs:complexContent>
+        <xs:restriction base="IdentificationType">
+          <xs:sequence>
+            <xs:element ref="PhysicalVerification"/>
+            <xs:element ref="WrittenConsent"/>
+            <xs:element ref="GoverningAgreements"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="nym">
+            <xs:simpleType>
+              <xs:restriction base="nymType">
+                <xs:enumeration value="anonymity"/>
+                <xs:enumeration value="verinymity"/>
+                <xs:enumeration value="pseudonymity"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobileonefactor-unreg-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobileonefactor-unreg-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..9727c45fde9d68d5f3a14b985aa8a50e6b6b4b15
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobileonefactor-unreg-2.0.xsd
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorUnregistered"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorUnregistered"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorUnregistered
+        Document identifier: saml-schema-authn-context-mobileonefactor-unreg-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="DigSig"/>
+              <xs:element ref="ZeroKnowledge"/>
+              <xs:element ref="SharedSecretChallengeResponse"/>
+              <xs:element ref="SharedSecretDynamicPlaintext"/>
+              <xs:element ref="AsymmetricDecryption"/>
+              <xs:element ref="AsymmetricKeyAgreement"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorTransportProtocolType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorTransportProtocolType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="SSL"/>
+              <xs:element ref="MobileNetworkNoEncryption"/>
+              <xs:element ref="MobileNetworkRadioEncryption"/>
+              <xs:element ref="MobileNetworkEndToEndEncryption"/>
+              <xs:element ref="WTLS"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="OperationalProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="OperationalProtectionType">
+          <xs:sequence>
+            <xs:element ref="SecurityAudit"/>
+            <xs:element ref="DeactivationCallCenter"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="TechnicalProtectionBaseType">
+      <xs:complexContent>
+        <xs:restriction base="TechnicalProtectionBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="PrivateKeyProtection"/>
+              <xs:element ref="SecretKeyProtection"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PrivateKeyProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="PrivateKeyProtectionType">
+          <xs:sequence>
+            <xs:element ref="KeyStorage"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="SecretKeyProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="SecretKeyProtectionType">
+          <xs:sequence>
+            <xs:element ref="KeyStorage"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="KeyStorageType">
+      <xs:complexContent>
+        <xs:restriction base="KeyStorageType">
+          <xs:attribute name="medium" use="required">
+            <xs:simpleType>
+              <xs:restriction base="mediumType">
+                <xs:enumeration value="MobileDevice"/>
+                <xs:enumeration value="MobileAuthCard"/>
+                <xs:enumeration value="smartcard"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="SecurityAuditType">
+      <xs:complexContent>
+        <xs:restriction base="SecurityAuditType">
+          <xs:sequence>
+            <xs:element ref="SwitchAudit"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="IdentificationType">
+      <xs:complexContent>
+        <xs:restriction base="IdentificationType">
+          <xs:sequence>
+            <xs:element ref="GoverningAgreements"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="nym">
+            <xs:simpleType>
+              <xs:restriction base="nymType">
+                <xs:enumeration value="anonymity"/>
+                <xs:enumeration value="pseudonymity"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobiletwofactor-reg-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobiletwofactor-reg-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..d0c59aa138613f53fd06f914d6b71bba79626474
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobiletwofactor-reg-2.0.xsd
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract
+        Document identifier: saml-schema-authn-context-mobiletwofactor-reg-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="DigSig"/>
+              <xs:element ref="ZeroKnowledge"/>
+              <xs:element ref="SharedSecretChallengeResponse"/>
+              <xs:element ref="SharedSecretDynamicPlaintext"/>
+              <xs:element ref="AsymmetricDecryption"/>
+              <xs:element ref="AsymmetricKeyAgreement"/>
+              <xs:element ref="ComplexAuthenticator"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="ComplexAuthenticatorType">
+      <xs:complexContent>
+        <xs:restriction base="ComplexAuthenticatorType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="SharedSecretChallengeResponse"/>
+              <xs:element ref="SharedSecretDynamicPlaintext"/>
+            </xs:choice>
+            <xs:element ref="Password"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="AuthenticatorTransportProtocolType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorTransportProtocolType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="SSL"/>
+              <xs:element ref="MobileNetworkNoEncryption"/>
+              <xs:element ref="MobileNetworkRadioEncryption"/>
+              <xs:element ref="MobileNetworkEndToEndEncryption"/>
+              <xs:element ref="WTLS"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="OperationalProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="OperationalProtectionType">
+          <xs:sequence>
+            <xs:element ref="SecurityAudit"/>
+            <xs:element ref="DeactivationCallCenter"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="TechnicalProtectionBaseType">
+      <xs:complexContent>
+        <xs:restriction base="TechnicalProtectionBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="PrivateKeyProtection"/>
+              <xs:element ref="SecretKeyProtection"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PrivateKeyProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="PrivateKeyProtectionType">
+          <xs:sequence>
+            <xs:element ref="KeyActivation"/>
+            <xs:element ref="KeyStorage"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="SecretKeyProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="SecretKeyProtectionType">
+          <xs:sequence>
+            <xs:element ref="KeyActivation"/>
+            <xs:element ref="KeyStorage"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="KeyStorageType">
+      <xs:complexContent>
+        <xs:restriction base="KeyStorageType">
+          <xs:attribute name="medium" use="required">
+            <xs:simpleType>
+              <xs:restriction base="mediumType">
+                <xs:enumeration value="MobileDevice"/>
+                <xs:enumeration value="MobileAuthCard"/>
+                <xs:enumeration value="smartcard"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  
+    <xs:complexType name="SecurityAuditType">
+      <xs:complexContent>
+        <xs:restriction base="SecurityAuditType">
+          <xs:sequence>
+            <xs:element ref="SwitchAudit"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  
+    <xs:complexType name="IdentificationType">
+      <xs:complexContent>
+        <xs:restriction base="IdentificationType">
+          <xs:sequence>
+            <xs:element ref="PhysicalVerification"/>
+            <xs:element ref="WrittenConsent"/>
+            <xs:element ref="GoverningAgreements"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="nym">
+            <xs:simpleType>
+              <xs:restriction base="nymType">
+                <xs:enumeration value="anonymity"/>
+                <xs:enumeration value="verinymity"/>
+                <xs:enumeration value="pseudonymity"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobiletwofactor-unreg-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobiletwofactor-unreg-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..1a4578cd89f9a27ae9674100766f695a0a3652b1
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-mobiletwofactor-unreg-2.0.xsd
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorUnregistered"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorUnregistered"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorUnregistered
+        Document identifier: saml-schema-authn-context-mobiletwofactor-unreg-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="DigSig"/>
+              <xs:element ref="ZeroKnowledge"/>
+              <xs:element ref="SharedSecretChallengeResponse"/>
+              <xs:element ref="SharedSecretDynamicPlaintext"/>
+              <xs:element ref="AsymmetricDecryption"/>
+              <xs:element ref="AsymmetricKeyAgreement"/>
+              <xs:element ref="ComplexAuthenticator"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="ComplexAuthenticatorType">
+      <xs:complexContent>
+        <xs:restriction base="ComplexAuthenticatorType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="SharedSecretChallengeResponse"/>
+              <xs:element ref="SharedSecretDynamicPlaintext"/>
+            </xs:choice>
+            <xs:element ref="Password"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorTransportProtocolType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorTransportProtocolType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="SSL"/>
+              <xs:element ref="MobileNetworkNoEncryption"/>
+              <xs:element ref="MobileNetworkRadioEncryption"/>
+              <xs:element ref="MobileNetworkEndToEndEncryption"/>
+              <xs:element ref="WTLS"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="OperationalProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="OperationalProtectionType">
+          <xs:sequence>
+            <xs:element ref="SecurityAudit"/>
+            <xs:element ref="DeactivationCallCenter"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="TechnicalProtectionBaseType">
+      <xs:complexContent>
+        <xs:restriction base="TechnicalProtectionBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="PrivateKeyProtection"/>
+              <xs:element ref="SecretKeyProtection"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PrivateKeyProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="PrivateKeyProtectionType">
+          <xs:sequence>
+            <xs:element ref="KeyActivation"/>
+            <xs:element ref="KeyStorage"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="SecretKeyProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="SecretKeyProtectionType">
+          <xs:sequence>
+            <xs:element ref="KeyActivation"/>
+            <xs:element ref="KeyStorage"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="KeyStorageType">
+      <xs:complexContent>
+        <xs:restriction base="KeyStorageType">
+          <xs:attribute name="medium" use="required">
+            <xs:simpleType>
+              <xs:restriction base="mediumType">
+                <xs:enumeration value="MobileDevice"/>
+                <xs:enumeration value="MobileAuthCard"/>
+                <xs:enumeration value="smartcard"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="SecurityAuditType">
+      <xs:complexContent>
+        <xs:restriction base="SecurityAuditType">
+          <xs:sequence>
+            <xs:element ref="SwitchAudit"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="IdentificationType">
+      <xs:complexContent>
+        <xs:restriction base="IdentificationType">
+          <xs:sequence>
+            <xs:element ref="GoverningAgreements"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="nym">
+            <xs:simpleType>
+              <xs:restriction base="nymType">
+                <xs:enumeration value="anonymity"/>
+                <xs:enumeration value="pseudonymity"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-nomad-telephony-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-nomad-telephony-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..0eb861f935690555f19629f56a0bf0b8898fc0a2
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-nomad-telephony-2.0.xsd
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:NomadTelephony"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:NomadTelephony"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:NomadTelephony
+        Document identifier: saml-schema-authn-context-nomad-telephony-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="Password"/>
+            <xs:element ref="SubscriberLineNumber"/>
+            <xs:element ref="UserSuffix"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorTransportProtocolType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorTransportProtocolType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="PSTN"/>
+              <xs:element ref="ISDN"/>
+              <xs:element ref="ADSL"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-personal-telephony-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-personal-telephony-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..a9eebf4256bddfd0afa37b6384bf3a4f7bb5405e
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-personal-telephony-2.0.xsd
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:PersonalizedTelephony"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:PersonalizedTelephony"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:PersonalizedTelephony
+        Document identifier: saml-schema-authn-context-personal-telephony-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="SubscriberLineNumber"/>
+            <xs:element ref="UserSuffix"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorTransportProtocolType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorTransportProtocolType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="PSTN"/>
+              <xs:element ref="ISDN"/>
+              <xs:element ref="ADSL"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-pgp-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-pgp-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..74c73c1c284454a870e09251e2a1c381215ecd99
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-pgp-2.0.xsd
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:PGP"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:PGP"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:PGP
+        Document identifier: saml-schema-authn-context-pgp-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="RestrictedPassword"/>
+          </xs:sequence>
+          <xs:attribute name="preauth" type="xs:integer" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="DigSig"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PublicKeyType">
+      <xs:complexContent>
+        <xs:restriction base="PublicKeyType">
+          <xs:attribute name="keyValidation" fixed="urn:oasis:names:tc:SAML:2.0:ac:classes:PGP"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-ppt-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-ppt-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..257296541c9f47dc20071300e65fdd428ada8c97
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-ppt-2.0.xsd
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
+        Document identifier: saml-schema-authn-context-ppt-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="RestrictedPassword"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorTransportProtocolType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorTransportProtocolType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="SSL"/>
+              <xs:element ref="MobileNetworkRadioEncryption"/>
+              <xs:element ref="MobileNetworkEndToEndEncryption"/>
+              <xs:element ref="WTLS"/>
+              <xs:element ref="IPSec"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-pword-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-pword-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..0c18a42c891d0b181297f1c04cab3c3f5133b3f4
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-pword-2.0.xsd
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:Password"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:Password"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:Password
+        Document identifier: saml-schema-authn-context-pword-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="RestrictedPassword"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-session-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-session-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..77ef000ac91749369781197ca503b602026e4dc0
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-session-2.0.xsd
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:PreviousSession"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:PreviousSession"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:PreviousSession
+        Document identifier: saml-schema-authn-context-session-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="PreviousSession"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-smartcard-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-smartcard-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..1bd084a41db90ead051b8a9999746f416f3a914a
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-smartcard-2.0.xsd
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:Smartcard"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:Smartcard"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:Smartcard
+        Document identifier: saml-schema-authn-context-smartcard-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="Smartcard"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+  
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-smartcardpki-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-smartcardpki-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..0508d4d5d22d249e7d558b4bc946b0359216e1e5
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-smartcardpki-2.0.xsd
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI
+        Document identifier: saml-schema-authn-context-smartcardpki-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="TechnicalProtectionBaseType">
+      <xs:complexContent>
+        <xs:restriction base="TechnicalProtectionBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="PrivateKeyProtection"/>
+            </xs:choice>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="Smartcard"/>
+            <xs:element ref="ActivationPin"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="DigSig"/>
+              <xs:element ref="AsymmetricDecryption"/>
+              <xs:element ref="AsymmetricKeyAgreement"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="PrivateKeyProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="PrivateKeyProtectionType">
+          <xs:sequence>
+            <xs:element ref="KeyActivation"/>
+            <xs:element ref="KeyStorage"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="KeyActivationType">
+      <xs:complexContent>
+        <xs:restriction base="KeyActivationType">
+          <xs:sequence>
+            <xs:element ref="ActivationPin"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="KeyStorageType">
+      <xs:complexContent>
+        <xs:restriction base="KeyStorageType">
+          <xs:attribute name="medium" use="required">
+            <xs:simpleType>
+              <xs:restriction base="mediumType">
+                <xs:enumeration value="smartcard"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-softwarepki-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-softwarepki-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..5c41a2f246fb068ad4b8d1546a8900141b9e94e3
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-softwarepki-2.0.xsd
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:SoftwarePKI"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:SoftwarePKI"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:SoftwarePKI
+        Document identifier: saml-schema-authn-context-softwarepki-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="TechnicalProtectionBaseType">
+      <xs:complexContent>
+        <xs:restriction base="TechnicalProtectionBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="PrivateKeyProtection"/>
+            </xs:choice>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="ActivationPin"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="DigSig"/>
+              <xs:element ref="AsymmetricDecryption"/>
+              <xs:element ref="AsymmetricKeyAgreement"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PrivateKeyProtectionType">
+      <xs:complexContent>
+        <xs:restriction base="PrivateKeyProtectionType">
+          <xs:sequence>
+            <xs:element ref="KeyActivation"/>
+            <xs:element ref="KeyStorage"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="KeyActivationType">
+      <xs:complexContent>
+        <xs:restriction base="KeyActivationType">
+          <xs:sequence>
+            <xs:element ref="ActivationPin"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="KeyStorageType">
+      <xs:complexContent>
+        <xs:restriction base="KeyStorageType">
+          <xs:attribute name="medium" use="required">
+            <xs:simpleType>
+              <xs:restriction base="mediumType">
+                <xs:enumeration value="memory"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-spki-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-spki-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..ce57d79572ba14b96dc19264b57f36e84aa6bb60
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-spki-2.0.xsd
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:SPKI"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:SPKI"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:SPKI
+        Document identifier: saml-schema-authn-context-spki-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="RestrictedPassword"/>
+          </xs:sequence>
+          <xs:attribute name="preauth" type="xs:integer" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="DigSig"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PublicKeyType">
+      <xs:complexContent>
+        <xs:restriction base="PublicKeyType">
+          <xs:attribute name="keyValidation" fixed="urn:oasis:names:tc:SAML:2.0:ac:classes:SPKI"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-srp-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-srp-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..9051dd5ab65fc1b7d5495e846a0b0606375ac630
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-srp-2.0.xsd
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword
+        Document identifier: saml-schema-authn-context-srp-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="RestrictedPassword"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="SharedSecretChallengeResponse"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="SharedSecretChallengeResponseType">
+      <xs:complexContent>
+        <xs:restriction base="SharedSecretChallengeResponseType">
+          <xs:attribute name="method" type="xs:anyURI" fixed="urn:ietf:rfc:2945"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-sslcert-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-sslcert-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..723103b0000ac3d502c3113ddab84137a18d99a9
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-sslcert-2.0.xsd
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient
+        Document identifier: saml-schema-authn-context-sslcert-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="RestrictedPassword"/>
+          </xs:sequence>
+          <xs:attribute name="preauth" type="xs:integer" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="DigSig"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="PublicKeyType">
+      <xs:complexContent>
+        <xs:restriction base="PublicKeyType">
+          <xs:attribute name="keyValidation" type="xs:anyURI" fixed="urn:oasis:names:tc:SAML:2.0:ac:classes:X509"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorTransportProtocolType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorTransportProtocolType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="SSL"/>            
+              <xs:element ref="WTLS"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-telephony-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-telephony-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..15ff7531364c7a59666abbebcc25d6ee27277ad4
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-telephony-2.0.xsd
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:Telephony"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:Telephony"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:Telephony
+        Document identifier: saml-schema-authn-context-telephony-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="SubscriberLineNumber"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorTransportProtocolType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorTransportProtocolType">
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="PSTN"/>
+              <xs:element ref="ISDN"/>
+              <xs:element ref="ADSL"/>
+            </xs:choice>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
\ No newline at end of file
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-timesync-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-timesync-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..afc92f398d7b1d2bd3d6112d063a5092674fa382
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-timesync-2.0.xsd
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken
+        Document identifier: saml-schema-authn-context-timesync-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="Token"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="TokenType">
+      <xs:complexContent>
+        <xs:restriction base="TokenType">
+          <xs:sequence>
+            <xs:element ref="TimeSyncToken"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="TimeSyncTokenType">
+      <xs:complexContent>
+        <xs:restriction base="TimeSyncTokenType">
+          <xs:attribute name="DeviceType" use="required">
+            <xs:simpleType>
+              <xs:restriction base="DeviceTypeType">
+                <xs:enumeration value="hardware"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+
+          <xs:attribute name="SeedLength" use="required">
+            <xs:simpleType>
+              <xs:restriction base="xs:integer">
+                <xs:minInclusive value="64"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+
+          <xs:attribute name="DeviceInHand" use="required">
+            <xs:simpleType>
+              <xs:restriction base="booleanType">
+                <xs:enumeration value="true"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-types-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-types-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..8513959a5d5bde4eba75202aaa7c2d11084339fe
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-types-2.0.xsd
@@ -0,0 +1,821 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+  xmlns:xs="http://www.w3.org/2001/XMLSchema"
+  elementFormDefault="qualified"
+  version="2.0">
+
+  <xs:annotation>
+    <xs:documentation>
+      Document identifier: saml-schema-authn-context-types-2.0
+      Location: http://docs.oasis-open.org/security/saml/v2.0/
+      Revision history:
+          V2.0 (March, 2005):
+          New core authentication context schema types for SAML V2.0. 
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:element name="AuthenticationContextDeclaration" type="AuthnContextDeclarationBaseType">
+    <xs:annotation>
+      <xs:documentation>
+        A particular assertion on an identity
+        provider's part with respect to the authentication
+        context associated with an authentication assertion.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="Identification" type="IdentificationType">
+    <xs:annotation>
+      <xs:documentation>
+        Refers to those characteristics that describe the
+        processes and mechanisms
+        the Authentication Authority uses to initially create
+        an association between a Principal
+        and the identity (or name) by which the Principal will
+        be known
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="PhysicalVerification">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that identification has been
+        performed in a physical
+        face-to-face meeting with the principal and not in an
+        online manner.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:attribute name="credentialLevel">
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="primary"/>
+            <xs:enumeration value="secondary"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="WrittenConsent" type="ExtensionOnlyType"/>
+
+  <xs:element name="TechnicalProtection" type="TechnicalProtectionBaseType">
+    <xs:annotation>
+      <xs:documentation>
+        Refers to those characterstics that describe how the
+        'secret' (the knowledge or possession
+        of which allows the Principal to authenticate to the
+        Authentication Authority) is kept secure
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="SecretKeyProtection" type="SecretKeyProtectionType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates the types and strengths of
+        facilities
+        of a UA used to protect a shared secret key from
+        unauthorized access and/or use.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="PrivateKeyProtection" type="PrivateKeyProtectionType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates the types and strengths of
+        facilities
+        of a UA used to protect a private key from
+        unauthorized access and/or use.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="KeyActivation" type="KeyActivationType">
+    <xs:annotation>
+      <xs:documentation>The actions that must be performed
+        before the private key can be used. </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="KeySharing" type="KeySharingType">
+    <xs:annotation>
+      <xs:documentation>Whether or not the private key is shared
+        with the certificate authority.</xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="KeyStorage" type="KeyStorageType">
+    <xs:annotation>
+      <xs:documentation>
+        In which medium is the key stored.
+        memory - the key is stored in memory.
+        smartcard - the key is stored in a smartcard.
+        token - the key is stored in a hardware token.
+        MobileDevice - the key is stored in a mobile device.
+        MobileAuthCard - the key is stored in a mobile
+        authentication card.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="SubscriberLineNumber" type="ExtensionOnlyType"/>
+  <xs:element name="UserSuffix" type="ExtensionOnlyType"/>
+
+  <xs:element name="Password" type="PasswordType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that a password (or passphrase)
+        has been used to
+        authenticate the Principal to a remote system.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="ActivationPin" type="ActivationPinType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that a Pin (Personal
+        Identification Number) has been used to authenticate the Principal to
+        some local system in order to activate a key.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="Token" type="TokenType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that a hardware or software
+        token is used
+        as a method of identifying the Principal.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="TimeSyncToken" type="TimeSyncTokenType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that a time synchronization
+        token is used to identify the Principal. hardware -
+        the time synchonization
+        token has been implemented in hardware. software - the
+        time synchronization
+        token has been implemented in software. SeedLength -
+        the length, in bits, of the
+        random seed used in the time synchronization token.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="Smartcard" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that a smartcard is used to
+        identity the Principal.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="Length" type="LengthType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates the minimum and/or maximum
+        ASCII length of the password which is enforced (by the UA or the
+        IdP). In other words, this is the minimum and/or maximum number of
+        ASCII characters required to represent a valid password.
+        min - the minimum number of ASCII characters required
+        in a valid password, as enforced by the UA or the IdP.
+        max - the maximum number of ASCII characters required
+        in a valid password, as enforced by the UA or the IdP.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="ActivationLimit" type="ActivationLimitType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates the length of time for which an
+        PIN-based authentication is valid.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="Generation">
+    <xs:annotation>
+      <xs:documentation>
+        Indicates whether the password was chosen by the
+        Principal or auto-supplied by the Authentication Authority.
+        principalchosen - the Principal is allowed to choose
+        the value of the password. This is true even if
+        the initial password is chosen at random by the UA or
+        the IdP and the Principal is then free to change
+        the password.
+        automatic - the password is chosen by the UA or the
+        IdP to be cryptographically strong in some sense,
+        or to satisfy certain password rules, and that the
+        Principal is not free to change it or to choose a new password.
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType>
+      <xs:attribute name="mechanism" use="required">
+        <xs:simpleType>
+          <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="principalchosen"/>
+            <xs:enumeration value="automatic"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="AuthnMethod" type="AuthnMethodBaseType">
+    <xs:annotation>
+      <xs:documentation>
+        Refers to those characteristics that define the
+        mechanisms by which the Principal authenticates to the Authentication
+        Authority.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="PrincipalAuthenticationMechanism" type="PrincipalAuthenticationMechanismType">
+    <xs:annotation>
+      <xs:documentation>
+        The method that a Principal employs to perform
+        authentication to local system components.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="Authenticator" type="AuthenticatorBaseType">
+    <xs:annotation>
+      <xs:documentation>
+        The method applied to validate a principal's
+        authentication across a network
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="ComplexAuthenticator" type="ComplexAuthenticatorType">
+    <xs:annotation>
+      <xs:documentation>
+        Supports Authenticators with nested combinations of
+        additional complexity.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="PreviousSession" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        Indicates that the Principal has been strongly
+        authenticated in a previous session during which the IdP has set a
+        cookie in the UA. During the present session the Principal has only
+        been authenticated by the UA returning the cookie to the IdP.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="ResumeSession" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        Rather like PreviousSession but using stronger
+        security. A secret that was established in a previous session with
+        the Authentication Authority has been cached by the local system and
+        is now re-used (e.g. a Master Secret is used to derive new session
+        keys in TLS, SSL, WTLS).
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="ZeroKnowledge" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Principal has been
+        authenticated by a zero knowledge technique as specified in ISO/IEC
+        9798-5.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="SharedSecretChallengeResponse" type="SharedSecretChallengeResponseType"/>
+
+  <xs:complexType name="SharedSecretChallengeResponseType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Principal has been
+        authenticated by a challenge-response protocol utilizing shared secret
+        keys and symmetric cryptography.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:sequence>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="method" type="xs:anyURI" use="optional"/>
+  </xs:complexType>
+
+  <xs:element name="DigSig" type="PublicKeyType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Principal has been
+        authenticated by a mechanism which involves the Principal computing a
+        digital signature over at least challenge data provided by the IdP.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="AsymmetricDecryption" type="PublicKeyType">
+    <xs:annotation>
+      <xs:documentation>
+        The local system has a private key but it is used
+        in decryption mode, rather than signature mode. For example, the
+        Authentication Authority generates a secret and encrypts it using the
+        local system's public key: the local system then proves it has
+        decrypted the secret.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="AsymmetricKeyAgreement" type="PublicKeyType">
+    <xs:annotation>
+      <xs:documentation>
+        The local system has a private key and uses it for
+        shared secret key agreement with the Authentication Authority (e.g.
+        via Diffie Helman).
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:complexType name="PublicKeyType">
+    <xs:sequence>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="keyValidation" use="optional"/>
+  </xs:complexType>
+
+  <xs:element name="IPAddress" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Principal has been
+        authenticated through connection from a particular IP address.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="SharedSecretDynamicPlaintext" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        The local system and Authentication Authority
+        share a secret key. The local system uses this to encrypt a
+        randomised string to pass to the Authentication Authority.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="AuthenticatorTransportProtocol" type="AuthenticatorTransportProtocolType">
+    <xs:annotation>
+      <xs:documentation>
+        The protocol across which Authenticator information is
+        transferred to an Authentication Authority verifier.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="HTTP" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Authenticator has been
+        transmitted using bare HTTP utilizing no additional security
+        protocols.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="IPSec" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Authenticator has been
+        transmitted using a transport mechanism protected by an IPSEC session.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+  
+  <xs:element name="WTLS" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Authenticator has been
+        transmitted using a transport mechanism protected by a WTLS session.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="MobileNetworkNoEncryption" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Authenticator has been
+        transmitted solely across a mobile network using no additional
+        security mechanism.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="MobileNetworkRadioEncryption" type="ExtensionOnlyType"/>
+  <xs:element name="MobileNetworkEndToEndEncryption" type="ExtensionOnlyType"/>
+
+  <xs:element name="SSL" type="ExtensionOnlyType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Authenticator has been
+        transmitted using a transport mechnanism protected by an SSL or TLS
+        session.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+  
+  <xs:element name="PSTN" type="ExtensionOnlyType"/>
+  <xs:element name="ISDN" type="ExtensionOnlyType"/>
+  <xs:element name="ADSL" type="ExtensionOnlyType"/>
+
+  <xs:element name="OperationalProtection" type="OperationalProtectionType">
+    <xs:annotation>
+      <xs:documentation>
+        Refers to those characteristics that describe
+        procedural security controls employed by the Authentication Authority.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="SecurityAudit" type="SecurityAuditType"/>
+  <xs:element name="SwitchAudit" type="ExtensionOnlyType"/>
+  <xs:element name="DeactivationCallCenter" type="ExtensionOnlyType"/>
+
+  <xs:element name="GoverningAgreements" type="GoverningAgreementsType">
+    <xs:annotation>
+      <xs:documentation>
+        Provides a mechanism for linking to external (likely
+        human readable) documents in which additional business agreements,
+        (e.g. liability constraints, obligations, etc) can be placed.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="GoverningAgreementRef" type="GoverningAgreementRefType"/>
+
+  <xs:simpleType name="nymType">
+    <xs:restriction base="xs:NMTOKEN">
+      <xs:enumeration value="anonymity"/>
+      <xs:enumeration value="verinymity"/>
+      <xs:enumeration value="pseudonymity"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:complexType name="AuthnContextDeclarationBaseType">
+    <xs:sequence>
+      <xs:element ref="Identification" minOccurs="0"/>
+      <xs:element ref="TechnicalProtection" minOccurs="0"/>
+      <xs:element ref="OperationalProtection" minOccurs="0"/>
+      <xs:element ref="AuthnMethod" minOccurs="0"/>
+      <xs:element ref="GoverningAgreements" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="ID" type="xs:ID" use="optional"/>
+  </xs:complexType>
+  
+  <xs:complexType name="IdentificationType">
+    <xs:sequence>
+      <xs:element ref="PhysicalVerification" minOccurs="0"/>
+      <xs:element ref="WrittenConsent" minOccurs="0"/>
+      <xs:element ref="GoverningAgreements" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="nym" type="nymType">
+      <xs:annotation>
+        <xs:documentation>
+          This attribute indicates whether or not the
+          Identification mechanisms allow the actions of the Principal to be
+          linked to an actual end user.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="TechnicalProtectionBaseType">
+    <xs:sequence>
+      <xs:choice minOccurs="0">
+        <xs:element ref="PrivateKeyProtection"/>
+        <xs:element ref="SecretKeyProtection"/>
+      </xs:choice>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="OperationalProtectionType">
+    <xs:sequence>
+      <xs:element ref="SecurityAudit" minOccurs="0"/>
+      <xs:element ref="DeactivationCallCenter" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="AuthnMethodBaseType">
+    <xs:sequence>
+      <xs:element ref="PrincipalAuthenticationMechanism" minOccurs="0"/>
+      <xs:element ref="Authenticator" minOccurs="0"/>
+      <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="GoverningAgreementsType">
+    <xs:sequence>
+      <xs:element ref="GoverningAgreementRef" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="GoverningAgreementRefType">
+    <xs:attribute name="governingAgreementRef" type="xs:anyURI" use="required"/>
+  </xs:complexType>
+
+  <xs:complexType name="PrincipalAuthenticationMechanismType">
+    <xs:sequence>
+      <xs:element ref="Password" minOccurs="0"/>
+      <xs:element ref="RestrictedPassword" minOccurs="0"/>
+      <xs:element ref="Token" minOccurs="0"/>
+      <xs:element ref="Smartcard" minOccurs="0"/>
+      <xs:element ref="ActivationPin" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="preauth" type="xs:integer" use="optional"/>
+  </xs:complexType>
+  
+  <xs:group name="AuthenticatorChoiceGroup">
+    <xs:choice>
+      <xs:element ref="PreviousSession"/>
+      <xs:element ref="ResumeSession"/>
+      <xs:element ref="DigSig"/>
+      <xs:element ref="Password"/>
+      <xs:element ref="RestrictedPassword"/>
+      <xs:element ref="ZeroKnowledge"/>
+      <xs:element ref="SharedSecretChallengeResponse"/>
+      <xs:element ref="SharedSecretDynamicPlaintext"/>
+      <xs:element ref="IPAddress"/>
+      <xs:element ref="AsymmetricDecryption"/>
+      <xs:element ref="AsymmetricKeyAgreement"/>
+      <xs:element ref="SubscriberLineNumber"/>
+      <xs:element ref="UserSuffix"/>
+      <xs:element ref="ComplexAuthenticator"/>
+    </xs:choice>
+  </xs:group>
+  
+  <xs:group name="AuthenticatorSequenceGroup">
+    <xs:sequence>
+      <xs:element ref="PreviousSession" minOccurs="0"/>
+      <xs:element ref="ResumeSession" minOccurs="0"/>
+      <xs:element ref="DigSig" minOccurs="0"/>
+      <xs:element ref="Password" minOccurs="0"/>
+      <xs:element ref="RestrictedPassword" minOccurs="0"/>
+      <xs:element ref="ZeroKnowledge" minOccurs="0"/>
+      <xs:element ref="SharedSecretChallengeResponse" minOccurs="0"/>
+      <xs:element ref="SharedSecretDynamicPlaintext" minOccurs="0"/>
+      <xs:element ref="IPAddress" minOccurs="0"/>
+      <xs:element ref="AsymmetricDecryption" minOccurs="0"/>
+      <xs:element ref="AsymmetricKeyAgreement" minOccurs="0"/>
+      <xs:element ref="SubscriberLineNumber" minOccurs="0"/>
+      <xs:element ref="UserSuffix" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:group>
+
+  <xs:complexType name="AuthenticatorBaseType">
+    <xs:sequence>
+      <xs:group ref="AuthenticatorChoiceGroup"/>
+      <xs:group ref="AuthenticatorSequenceGroup"/>
+    </xs:sequence>
+  </xs:complexType>
+  
+  <xs:complexType name="ComplexAuthenticatorType">
+    <xs:sequence>
+      <xs:group ref="AuthenticatorChoiceGroup"/>
+      <xs:group ref="AuthenticatorSequenceGroup"/>
+    </xs:sequence>
+  </xs:complexType>
+  
+  <xs:complexType name="AuthenticatorTransportProtocolType">
+    <xs:sequence>
+      <xs:choice minOccurs="0">
+        <xs:element ref="HTTP"/>
+        <xs:element ref="SSL"/>
+        <xs:element ref="MobileNetworkNoEncryption"/>
+        <xs:element ref="MobileNetworkRadioEncryption"/>
+        <xs:element ref="MobileNetworkEndToEndEncryption"/>
+        <xs:element ref="WTLS"/>
+        <xs:element ref="IPSec"/>
+        <xs:element ref="PSTN"/>
+        <xs:element ref="ISDN"/>
+        <xs:element ref="ADSL"/>
+      </xs:choice>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="KeyActivationType">
+    <xs:sequence>
+      <xs:element ref="ActivationPin" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="KeySharingType">
+    <xs:attribute name="sharing" type="xs:boolean" use="required"/>
+  </xs:complexType>
+
+  <xs:complexType name="PrivateKeyProtectionType">
+    <xs:sequence>
+      <xs:element ref="KeyActivation" minOccurs="0"/>
+      <xs:element ref="KeyStorage" minOccurs="0"/>
+      <xs:element ref="KeySharing" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="PasswordType">
+    <xs:sequence>
+      <xs:element ref="Length" minOccurs="0"/>
+      <xs:element ref="Alphabet" minOccurs="0"/>
+      <xs:element ref="Generation" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="ExternalVerification" type="xs:anyURI" use="optional"/>
+  </xs:complexType>
+
+  <xs:element name="RestrictedPassword" type="RestrictedPasswordType"/>
+
+  <xs:complexType name="RestrictedPasswordType">
+    <xs:complexContent>
+      <xs:restriction base="PasswordType">
+        <xs:sequence>
+          <xs:element name="Length" type="RestrictedLengthType" minOccurs="1"/>
+          <xs:element ref="Generation" minOccurs="0"/>
+          <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+        <xs:attribute name="ExternalVerification" type="xs:anyURI" use="optional"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <xs:complexType name="RestrictedLengthType">
+    <xs:complexContent>
+      <xs:restriction base="LengthType">
+        <xs:attribute name="min" use="required">
+          <xs:simpleType>
+            <xs:restriction base="xs:integer">
+              <xs:minInclusive value="3"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute name="max" type="xs:integer" use="optional"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="ActivationPinType">
+    <xs:sequence>
+      <xs:element ref="Length" minOccurs="0"/>
+      <xs:element ref="Alphabet" minOccurs="0"/>
+      <xs:element ref="Generation" minOccurs="0"/>
+      <xs:element ref="ActivationLimit" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  
+  <xs:element name="Alphabet" type="AlphabetType"/>
+  <xs:complexType name="AlphabetType">
+    <xs:attribute name="requiredChars" type="xs:string" use="required"/>
+    <xs:attribute name="excludedChars" type="xs:string" use="optional"/>
+    <xs:attribute name="case" type="xs:string" use="optional"/>
+  </xs:complexType>
+  
+  <xs:complexType name="TokenType">
+    <xs:sequence>
+      <xs:element ref="TimeSyncToken"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  
+  <xs:simpleType name="DeviceTypeType">
+    <xs:restriction base="xs:NMTOKEN">
+      <xs:enumeration value="hardware"/>
+      <xs:enumeration value="software"/>
+    </xs:restriction>
+  </xs:simpleType>
+  
+  <xs:simpleType name="booleanType">
+    <xs:restriction base="xs:NMTOKEN">
+      <xs:enumeration value="true"/>
+      <xs:enumeration value="false"/>
+    </xs:restriction>
+  </xs:simpleType>
+  
+  <xs:complexType name="TimeSyncTokenType">
+    <xs:attribute name="DeviceType" type="DeviceTypeType" use="required"/>
+    <xs:attribute name="SeedLength" type="xs:integer" use="required"/>
+    <xs:attribute name="DeviceInHand" type="booleanType" use="required"/>
+  </xs:complexType>
+  
+  <xs:complexType name="ActivationLimitType">
+    <xs:choice>
+      <xs:element ref="ActivationLimitDuration"/>
+      <xs:element ref="ActivationLimitUsages"/>
+      <xs:element ref="ActivationLimitSession"/>
+    </xs:choice>
+  </xs:complexType>
+  
+  <xs:element name="ActivationLimitDuration" type="ActivationLimitDurationType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Key Activation Limit is
+        defined as a specific duration of time.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+  
+  <xs:element name="ActivationLimitUsages" type="ActivationLimitUsagesType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Key Activation Limit is
+        defined as a number of usages.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+  
+  <xs:element name="ActivationLimitSession" type="ActivationLimitSessionType">
+    <xs:annotation>
+      <xs:documentation>
+        This element indicates that the Key Activation Limit is
+        the session.
+      </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+  
+  <xs:complexType name="ActivationLimitDurationType">
+    <xs:attribute name="duration" type="xs:duration" use="required"/>
+  </xs:complexType>
+  
+  <xs:complexType name="ActivationLimitUsagesType">
+    <xs:attribute name="number" type="xs:integer" use="required"/>
+  </xs:complexType>
+  
+  <xs:complexType name="ActivationLimitSessionType"/>
+  
+  <xs:complexType name="LengthType">
+    <xs:attribute name="min" type="xs:integer" use="required"/>
+    <xs:attribute name="max" type="xs:integer" use="optional"/>
+  </xs:complexType>
+
+  <xs:simpleType name="mediumType">
+    <xs:restriction base="xs:NMTOKEN">
+      <xs:enumeration value="memory"/>
+      <xs:enumeration value="smartcard"/>
+      <xs:enumeration value="token"/>
+      <xs:enumeration value="MobileDevice"/>
+      <xs:enumeration value="MobileAuthCard"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:complexType name="KeyStorageType">
+    <xs:attribute name="medium" type="mediumType" use="required"/>
+  </xs:complexType>
+
+  <xs:complexType name="SecretKeyProtectionType">
+    <xs:sequence>
+      <xs:element ref="KeyActivation" minOccurs="0"/>
+      <xs:element ref="KeyStorage" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="SecurityAuditType">
+    <xs:sequence>
+      <xs:element ref="SwitchAudit" minOccurs="0"/>
+      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="ExtensionOnlyType">
+    <xs:sequence>
+      <xs:element ref="Extension" minOccurs="0"  maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  
+  <xs:element name="Extension" type="ExtensionType"/>
+
+  <xs:complexType name="ExtensionType">
+    <xs:sequence>
+      <xs:any namespace="##other" processContents="lax" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-x509-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-x509-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..ce4bd65e0ef65c4be84b1b4b9cedbf1faf0b51eb
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-x509-2.0.xsd
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:X509"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:X509"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:X509
+        Document identifier: saml-schema-authn-context-x509-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="RestrictedPassword"/>
+          </xs:sequence>
+          <xs:attribute name="preauth" type="xs:integer" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+    
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="DigSig"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PublicKeyType">
+      <xs:complexContent>
+        <xs:restriction base="PublicKeyType">
+          <xs:attribute name="keyValidation" type="xs:anyURI" fixed="urn:oasis:names:tc:SAML:2.0:ac:classes:X509"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-xmldsig-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-xmldsig-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..61fe0ac8e112ab56e9d64388ba82648315ddeccd
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-authn-context-xmldsig-2.0.xsd
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema targetNamespace="urn:oasis:names:tc:SAML:2.0:ac:classes:XMLDSig"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns="urn:oasis:names:tc:SAML:2.0:ac:classes:XMLDSig"
+  finalDefault="extension"
+  blockDefault="substitution"
+  version="2.0">
+
+  <xs:redefine schemaLocation="saml-schema-authn-context-types-2.0.xsd">
+
+    <xs:annotation>
+      <xs:documentation> 
+        Class identifier: urn:oasis:names:tc:SAML:2.0:ac:classes:XMLDSig
+        Document identifier: saml-schema-authn-context-xmldsig-2.0
+        Location: http://docs.oasis-open.org/security/saml/v2.0/
+        Revision history:
+          V2.0 (March, 2005):
+            New authentication context class schema for SAML V2.0. 
+      </xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="AuthnContextDeclarationBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnContextDeclarationBaseType">
+          <xs:sequence>
+            <xs:element ref="Identification" minOccurs="0"/>
+            <xs:element ref="TechnicalProtection" minOccurs="0"/>
+            <xs:element ref="OperationalProtection" minOccurs="0"/>
+            <xs:element ref="AuthnMethod"/>
+            <xs:element ref="GoverningAgreements" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="ID" type="xs:ID" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthnMethodBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthnMethodBaseType">
+          <xs:sequence>
+            <xs:element ref="PrincipalAuthenticationMechanism"/>
+            <xs:element ref="Authenticator"/>
+            <xs:element ref="AuthenticatorTransportProtocol" minOccurs="0"/>
+            <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>    
+    
+    <xs:complexType name="PrincipalAuthenticationMechanismType">
+      <xs:complexContent>
+        <xs:restriction base="PrincipalAuthenticationMechanismType">
+          <xs:sequence>
+            <xs:element ref="RestrictedPassword"/>
+          </xs:sequence>
+          <xs:attribute name="preauth" type="xs:integer" use="optional"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="AuthenticatorBaseType">
+      <xs:complexContent>
+        <xs:restriction base="AuthenticatorBaseType">
+          <xs:sequence>
+            <xs:element ref="DigSig"/>
+          </xs:sequence>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="PublicKeyType">
+      <xs:complexContent>
+        <xs:restriction base="PublicKeyType">
+          <xs:attribute name="keyValidation" type="xs:anyURI" fixed="urn:ietf:rfc:3075"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+
+  </xs:redefine>
+
+</xs:schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-dce-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-dce-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..e89be866a0975f7e4f813ea41172e98f9da6d425
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-dce-2.0.xsd
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="urn:oasis:names:tc:SAML:2.0:profiles:attribute:DCE"
+    xmlns:dce="urn:oasis:names:tc:SAML:2.0:profiles:attribute:DCE"
+    xmlns="http://www.w3.org/2001/XMLSchema"
+    elementFormDefault="unqualified"
+    attributeFormDefault="unqualified"
+    blockDefault="substitution"
+    version="2.0">
+    <annotation>
+        <documentation>
+            Document identifier: saml-schema-dce-2.0
+            Location: http://docs.oasis-open.org/security/saml/v2.0/
+            Revision history:
+            V2.0 (March, 2005):
+                Custom schema for DCE attribute profile, first published in SAML 2.0.
+        </documentation>
+    </annotation>
+    <complexType name="DCEValueType">
+        <simpleContent>
+            <extension base="anyURI">
+                <attribute ref="dce:Realm" use="optional"/>
+                <attribute ref="dce:FriendlyName" use="optional"/>
+            </extension>
+        </simpleContent>
+    </complexType>
+    <attribute name="Realm" type="anyURI"/>
+    <attribute name="FriendlyName" type="string"/>
+</schema>
+
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-ecp-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-ecp-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..e3f24b9a5c0ab000427bc9bc7a1db35b64eb7f8b
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-ecp-2.0.xsd
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema
+    targetNamespace="urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp"
+    xmlns="http://www.w3.org/2001/XMLSchema"
+    xmlns:ecp="urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp"
+    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
+    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+    xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
+    elementFormDefault="unqualified"
+    attributeFormDefault="unqualified"
+    blockDefault="substitution"
+    version="2.0">
+    <import namespace="urn:oasis:names:tc:SAML:2.0:protocol"
+        schemaLocation="saml-schema-protocol-2.0.xsd"/>
+    <import namespace="urn:oasis:names:tc:SAML:2.0:assertion"
+        schemaLocation="saml-schema-assertion-2.0.xsd"/>
+    <import namespace="http://schemas.xmlsoap.org/soap/envelope/"
+        schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
+    <annotation>
+        <documentation>
+            Document identifier: saml-schema-ecp-2.0
+            Location: http://docs.oasis-open.org/security/saml/v2.0/
+            Revision history:
+              V2.0 (March, 2005):
+                Custom schema for ECP profile, first published in SAML 2.0.
+        </documentation>
+    </annotation>
+
+    <element name="Request" type="ecp:RequestType"/>
+    <complexType name="RequestType">
+        <sequence>
+            <element ref="saml:Issuer"/>
+            <element ref="samlp:IDPList" minOccurs="0"/>
+        </sequence>
+        <attribute ref="S:mustUnderstand" use="required"/>
+        <attribute ref="S:actor" use="required"/>
+        <attribute name="ProviderName" type="string" use="optional"/>
+        <attribute name="IsPassive" type="boolean" use="optional"/>
+    </complexType>
+    
+    <element name="Response" type="ecp:ResponseType"/>
+    <complexType name="ResponseType">
+        <attribute ref="S:mustUnderstand" use="required"/>
+        <attribute ref="S:actor" use="required"/>
+        <attribute name="AssertionConsumerServiceURL" type="anyURI" use="required"/>
+    </complexType>
+    
+    <element name="RelayState" type="ecp:RelayStateType"/>
+    <complexType name="RelayStateType">
+        <simpleContent>
+            <extension base="string">
+                <attribute ref="S:mustUnderstand" use="required"/>
+                <attribute ref="S:actor" use="required"/>
+            </extension>
+        </simpleContent>
+    </complexType>
+</schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-metadata-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-metadata-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..b656d4f414dcbcac4bb98ccb729af280ea7b2a48
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-metadata-2.0.xsd
@@ -0,0 +1,337 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema
+    targetNamespace="urn:oasis:names:tc:SAML:2.0:metadata"
+    xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
+    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
+    xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
+    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+    xmlns="http://www.w3.org/2001/XMLSchema"
+    elementFormDefault="unqualified"
+    attributeFormDefault="unqualified"
+    blockDefault="substitution"
+    version="2.0">
+    <import namespace="http://www.w3.org/2000/09/xmldsig#"
+        schemaLocation="xmldsig-core-schema.xsd"/>
+    <import namespace="http://www.w3.org/2001/04/xmlenc#"
+        schemaLocation="xenc-schema.xsd"/>
+    <import namespace="urn:oasis:names:tc:SAML:2.0:assertion"
+        schemaLocation="saml-schema-assertion-2.0.xsd"/>
+    <import namespace="http://www.w3.org/XML/1998/namespace"
+        schemaLocation="xml.xsd"/>
+    <annotation>
+        <documentation>
+            Document identifier: saml-schema-metadata-2.0
+            Location: http://docs.oasis-open.org/security/saml/v2.0/
+            Revision history:
+              V2.0 (March, 2005):
+                Schema for SAML metadata, first published in SAML 2.0.
+        </documentation>
+    </annotation>
+
+    <simpleType name="entityIDType">
+        <restriction base="anyURI">
+            <maxLength value="1024"/>
+        </restriction>
+    </simpleType>
+    <complexType name="localizedNameType">
+        <simpleContent>
+            <extension base="string">
+                <attribute ref="xml:lang" use="required"/>
+            </extension>
+        </simpleContent>
+    </complexType>
+    <complexType name="localizedURIType">
+        <simpleContent>
+            <extension base="anyURI">
+                <attribute ref="xml:lang" use="required"/>
+            </extension>
+        </simpleContent>
+    </complexType>
+    
+    <element name="Extensions" type="md:ExtensionsType"/>
+    <complexType final="#all" name="ExtensionsType">
+        <sequence>
+            <any namespace="##other" processContents="lax" maxOccurs="unbounded"/>
+        </sequence>
+    </complexType>
+    
+    <complexType name="EndpointType">
+        <sequence>
+            <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+        <attribute name="Binding" type="anyURI" use="required"/>
+        <attribute name="Location" type="anyURI" use="required"/>
+        <attribute name="ResponseLocation" type="anyURI" use="optional"/>
+        <anyAttribute namespace="##other" processContents="lax"/>
+    </complexType>
+    
+    <complexType name="IndexedEndpointType">
+        <complexContent>
+            <extension base="md:EndpointType">
+                <attribute name="index" type="unsignedShort" use="required"/>
+                <attribute name="isDefault" type="boolean" use="optional"/>
+            </extension>
+        </complexContent>
+    </complexType>
+    
+    <element name="EntitiesDescriptor" type="md:EntitiesDescriptorType"/>
+    <complexType name="EntitiesDescriptorType">
+        <sequence>
+            <element ref="ds:Signature" minOccurs="0"/>
+            <element ref="md:Extensions" minOccurs="0"/>
+            <choice minOccurs="1" maxOccurs="unbounded">
+                <element ref="md:EntityDescriptor"/>
+                <element ref="md:EntitiesDescriptor"/>
+            </choice>
+        </sequence>
+        <attribute name="validUntil" type="dateTime" use="optional"/>
+        <attribute name="cacheDuration" type="duration" use="optional"/>
+        <attribute name="ID" type="ID" use="optional"/>
+        <attribute name="Name" type="string" use="optional"/>
+    </complexType>
+
+    <element name="EntityDescriptor" type="md:EntityDescriptorType"/>
+    <complexType name="EntityDescriptorType">
+        <sequence>
+            <element ref="ds:Signature" minOccurs="0"/>
+            <element ref="md:Extensions" minOccurs="0"/>
+            <choice>
+                <choice maxOccurs="unbounded">
+                    <element ref="md:RoleDescriptor"/>
+                    <element ref="md:IDPSSODescriptor"/>
+                    <element ref="md:SPSSODescriptor"/>
+                    <element ref="md:AuthnAuthorityDescriptor"/>
+                    <element ref="md:AttributeAuthorityDescriptor"/>
+                    <element ref="md:PDPDescriptor"/>
+                </choice>
+                <element ref="md:AffiliationDescriptor"/>
+            </choice>
+            <element ref="md:Organization" minOccurs="0"/>
+            <element ref="md:ContactPerson" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="md:AdditionalMetadataLocation" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+        <attribute name="entityID" type="md:entityIDType" use="required"/>
+        <attribute name="validUntil" type="dateTime" use="optional"/>
+        <attribute name="cacheDuration" type="duration" use="optional"/>
+        <attribute name="ID" type="ID" use="optional"/>
+        <anyAttribute namespace="##other" processContents="lax"/>
+    </complexType>
+    
+    <element name="Organization" type="md:OrganizationType"/>
+    <complexType name="OrganizationType">
+        <sequence>
+            <element ref="md:Extensions" minOccurs="0"/>
+            <element ref="md:OrganizationName" maxOccurs="unbounded"/>
+            <element ref="md:OrganizationDisplayName" maxOccurs="unbounded"/>
+            <element ref="md:OrganizationURL" maxOccurs="unbounded"/>
+        </sequence>
+        <anyAttribute namespace="##other" processContents="lax"/>
+    </complexType>
+    <element name="OrganizationName" type="md:localizedNameType"/>
+    <element name="OrganizationDisplayName" type="md:localizedNameType"/>
+    <element name="OrganizationURL" type="md:localizedURIType"/>
+    <element name="ContactPerson" type="md:ContactType"/>
+    <complexType name="ContactType">
+        <sequence>
+            <element ref="md:Extensions" minOccurs="0"/>
+            <element ref="md:Company" minOccurs="0"/>
+            <element ref="md:GivenName" minOccurs="0"/>
+            <element ref="md:SurName" minOccurs="0"/>
+            <element ref="md:EmailAddress" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="md:TelephoneNumber" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+        <attribute name="contactType" type="md:ContactTypeType" use="required"/>
+        <anyAttribute namespace="##other" processContents="lax"/>
+    </complexType>
+    <element name="Company" type="string"/>
+    <element name="GivenName" type="string"/>
+    <element name="SurName" type="string"/>
+    <element name="EmailAddress" type="anyURI"/>
+    <element name="TelephoneNumber" type="string"/>
+    <simpleType name="ContactTypeType">
+        <restriction base="string">
+            <enumeration value="technical"/>
+            <enumeration value="support"/>
+            <enumeration value="administrative"/>
+            <enumeration value="billing"/>
+            <enumeration value="other"/>
+        </restriction>
+    </simpleType>
+
+    <element name="AdditionalMetadataLocation" type="md:AdditionalMetadataLocationType"/>
+    <complexType name="AdditionalMetadataLocationType">
+        <simpleContent>
+            <extension base="anyURI">
+                <attribute name="namespace" type="anyURI" use="required"/>
+            </extension>
+        </simpleContent>
+    </complexType>
+
+    <element name="RoleDescriptor" type="md:RoleDescriptorType"/>
+    <complexType name="RoleDescriptorType" abstract="true">
+        <sequence>
+            <element ref="ds:Signature" minOccurs="0"/>
+            <element ref="md:Extensions" minOccurs="0"/>
+            <element ref="md:KeyDescriptor" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="md:Organization" minOccurs="0"/>
+            <element ref="md:ContactPerson" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+        <attribute name="ID" type="ID" use="optional"/>
+        <attribute name="validUntil" type="dateTime" use="optional"/>
+        <attribute name="cacheDuration" type="duration" use="optional"/>
+        <attribute name="protocolSupportEnumeration" type="md:anyURIListType" use="required"/>
+        <attribute name="errorURL" type="anyURI" use="optional"/>
+        <anyAttribute namespace="##other" processContents="lax"/>
+    </complexType>
+    <simpleType name="anyURIListType">
+        <list itemType="anyURI"/>
+    </simpleType>
+
+    <element name="KeyDescriptor" type="md:KeyDescriptorType"/>
+    <complexType name="KeyDescriptorType">
+        <sequence>
+            <element ref="ds:KeyInfo"/>
+            <element ref="md:EncryptionMethod" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+        <attribute name="use" type="md:KeyTypes" use="optional"/>
+    </complexType>
+    <simpleType name="KeyTypes">
+        <restriction base="string">
+            <enumeration value="encryption"/>
+            <enumeration value="signing"/>
+        </restriction>
+    </simpleType>
+    <element name="EncryptionMethod" type="xenc:EncryptionMethodType"/>
+    
+    <complexType name="SSODescriptorType" abstract="true">
+        <complexContent>
+            <extension base="md:RoleDescriptorType">
+                <sequence>
+                    <element ref="md:ArtifactResolutionService" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="md:SingleLogoutService" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="md:ManageNameIDService" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="md:NameIDFormat" minOccurs="0" maxOccurs="unbounded"/>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="ArtifactResolutionService" type="md:IndexedEndpointType"/>
+    <element name="SingleLogoutService" type="md:EndpointType"/>
+    <element name="ManageNameIDService" type="md:EndpointType"/>
+    <element name="NameIDFormat" type="anyURI"/>
+
+    <element name="IDPSSODescriptor" type="md:IDPSSODescriptorType"/>
+    <complexType name="IDPSSODescriptorType">
+        <complexContent>
+            <extension base="md:SSODescriptorType">
+                <sequence>
+                    <element ref="md:SingleSignOnService" maxOccurs="unbounded"/>
+                    <element ref="md:NameIDMappingService" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="md:AssertionIDRequestService" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="md:AttributeProfile" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="saml:Attribute" minOccurs="0" maxOccurs="unbounded"/>
+                </sequence>
+                <attribute name="WantAuthnRequestsSigned" type="boolean" use="optional"/>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="SingleSignOnService" type="md:EndpointType"/>
+    <element name="NameIDMappingService" type="md:EndpointType"/>
+    <element name="AssertionIDRequestService" type="md:EndpointType"/>
+    <element name="AttributeProfile" type="anyURI"/>
+    
+    <element name="SPSSODescriptor" type="md:SPSSODescriptorType"/>
+    <complexType name="SPSSODescriptorType">
+        <complexContent>
+            <extension base="md:SSODescriptorType">
+                <sequence>
+                    <element ref="md:AssertionConsumerService" maxOccurs="unbounded"/>
+                    <element ref="md:AttributeConsumingService" minOccurs="0" maxOccurs="unbounded"/>
+                </sequence>
+                <attribute name="AuthnRequestsSigned" type="boolean" use="optional"/>
+                <attribute name="WantAssertionsSigned" type="boolean" use="optional"/>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="AssertionConsumerService" type="md:IndexedEndpointType"/>
+    <element name="AttributeConsumingService" type="md:AttributeConsumingServiceType"/>
+    <complexType name="AttributeConsumingServiceType">
+        <sequence>
+            <element ref="md:ServiceName" maxOccurs="unbounded"/>
+            <element ref="md:ServiceDescription" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="md:RequestedAttribute" maxOccurs="unbounded"/>
+        </sequence>
+        <attribute name="index" type="unsignedShort" use="required"/>
+        <attribute name="isDefault" type="boolean" use="optional"/>
+    </complexType>
+    <element name="ServiceName" type="md:localizedNameType"/>
+    <element name="ServiceDescription" type="md:localizedNameType"/>
+    <element name="RequestedAttribute" type="md:RequestedAttributeType"/>
+    <complexType name="RequestedAttributeType">
+        <complexContent>
+            <extension base="saml:AttributeType">
+                <attribute name="isRequired" type="boolean" use="optional"/>
+            </extension>
+        </complexContent>
+    </complexType>
+  
+    <element name="AuthnAuthorityDescriptor" type="md:AuthnAuthorityDescriptorType"/>
+    <complexType name="AuthnAuthorityDescriptorType">
+        <complexContent>
+            <extension base="md:RoleDescriptorType">
+                <sequence>
+                    <element ref="md:AuthnQueryService" maxOccurs="unbounded"/>
+                    <element ref="md:AssertionIDRequestService" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="md:NameIDFormat" minOccurs="0" maxOccurs="unbounded"/>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="AuthnQueryService" type="md:EndpointType"/>
+
+    <element name="PDPDescriptor" type="md:PDPDescriptorType"/>
+    <complexType name="PDPDescriptorType">
+        <complexContent>
+            <extension base="md:RoleDescriptorType">
+                <sequence>
+                    <element ref="md:AuthzService" maxOccurs="unbounded"/>
+                    <element ref="md:AssertionIDRequestService" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="md:NameIDFormat" minOccurs="0" maxOccurs="unbounded"/>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="AuthzService" type="md:EndpointType"/>
+
+    <element name="AttributeAuthorityDescriptor" type="md:AttributeAuthorityDescriptorType"/>
+    <complexType name="AttributeAuthorityDescriptorType">
+        <complexContent>
+            <extension base="md:RoleDescriptorType">
+                <sequence>
+                    <element ref="md:AttributeService" maxOccurs="unbounded"/>
+                    <element ref="md:AssertionIDRequestService" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="md:NameIDFormat" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="md:AttributeProfile" minOccurs="0" maxOccurs="unbounded"/>
+                    <element ref="saml:Attribute" minOccurs="0" maxOccurs="unbounded"/>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="AttributeService" type="md:EndpointType"/>
+   
+    <element name="AffiliationDescriptor" type="md:AffiliationDescriptorType"/>
+    <complexType name="AffiliationDescriptorType">
+        <sequence>
+            <element ref="ds:Signature" minOccurs="0"/>
+            <element ref="md:Extensions" minOccurs="0"/>
+            <element ref="md:AffiliateMember" maxOccurs="unbounded"/>
+            <element ref="md:KeyDescriptor" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+        <attribute name="affiliationOwnerID" type="md:entityIDType" use="required"/>
+        <attribute name="validUntil" type="dateTime" use="optional"/>
+        <attribute name="cacheDuration" type="duration" use="optional"/>
+        <attribute name="ID" type="ID" use="optional"/>
+        <anyAttribute namespace="##other" processContents="lax"/>
+    </complexType>
+    <element name="AffiliateMember" type="md:entityIDType"/>
+</schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-protocol-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-protocol-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..7fa6f489d684a7375e0581bcf53ca9e34a4e6d10
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-protocol-2.0.xsd
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema
+    targetNamespace="urn:oasis:names:tc:SAML:2.0:protocol"
+    xmlns="http://www.w3.org/2001/XMLSchema"
+    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
+    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
+    elementFormDefault="unqualified"
+    attributeFormDefault="unqualified"
+    blockDefault="substitution"
+    version="2.0">
+    <import namespace="urn:oasis:names:tc:SAML:2.0:assertion"
+        schemaLocation="saml-schema-assertion-2.0.xsd"/>
+    <import namespace="http://www.w3.org/2000/09/xmldsig#"
+        schemaLocation="xmldsig-core-schema.xsd"/>
+    <annotation>
+        <documentation>
+            Document identifier: saml-schema-protocol-2.0
+            Location: http://docs.oasis-open.org/security/saml/v2.0/
+            Revision history:
+            V1.0 (November, 2002):
+              Initial Standard Schema.
+            V1.1 (September, 2003):
+              Updates within the same V1.0 namespace.
+            V2.0 (March, 2005):
+              New protocol schema based in a SAML V2.0 namespace.
+     </documentation>
+    </annotation>
+    <complexType name="RequestAbstractType" abstract="true">
+        <sequence>
+            <element ref="saml:Issuer" minOccurs="0"/>
+            <element ref="ds:Signature" minOccurs="0"/>
+            <element ref="samlp:Extensions" minOccurs="0"/>
+        </sequence>
+        <attribute name="ID" type="ID" use="required"/>
+        <attribute name="Version" type="string" use="required"/>
+        <attribute name="IssueInstant" type="dateTime" use="required"/>
+        <attribute name="Destination" type="anyURI" use="optional"/>
+    	<attribute name="Consent" type="anyURI" use="optional"/>
+    </complexType>
+    <element name="Extensions" type="samlp:ExtensionsType"/>
+    <complexType name="ExtensionsType">
+        <sequence>
+            <any namespace="##other" processContents="lax" maxOccurs="unbounded"/>
+        </sequence>
+    </complexType>
+    <complexType name="StatusResponseType">
+    	<sequence>
+            <element ref="saml:Issuer" minOccurs="0"/>
+            <element ref="ds:Signature" minOccurs="0"/>
+            <element ref="samlp:Extensions" minOccurs="0"/>
+            <element ref="samlp:Status"/>
+    	</sequence>
+    	<attribute name="ID" type="ID" use="required"/>
+    	<attribute name="InResponseTo" type="NCName" use="optional"/>
+    	<attribute name="Version" type="string" use="required"/>
+    	<attribute name="IssueInstant" type="dateTime" use="required"/>
+    	<attribute name="Destination" type="anyURI" use="optional"/>
+    	<attribute name="Consent" type="anyURI" use="optional"/>
+    </complexType>
+    <element name="Status" type="samlp:StatusType"/>
+    <complexType name="StatusType">
+        <sequence>
+            <element ref="samlp:StatusCode"/>
+            <element ref="samlp:StatusMessage" minOccurs="0"/>
+            <element ref="samlp:StatusDetail" minOccurs="0"/>
+        </sequence>
+    </complexType>
+    <element name="StatusCode" type="samlp:StatusCodeType"/>
+    <complexType name="StatusCodeType">
+        <sequence>
+            <element ref="samlp:StatusCode" minOccurs="0"/>
+        </sequence>
+        <attribute name="Value" type="anyURI" use="required"/>
+    </complexType>
+    <element name="StatusMessage" type="string"/>
+    <element name="StatusDetail" type="samlp:StatusDetailType"/>
+    <complexType name="StatusDetailType">
+        <sequence>
+            <any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+    </complexType>
+    <element name="AssertionIDRequest" type="samlp:AssertionIDRequestType"/>
+    <complexType name="AssertionIDRequestType">
+    	<complexContent>
+            <extension base="samlp:RequestAbstractType">
+                <sequence>
+                    <element ref="saml:AssertionIDRef" maxOccurs="unbounded"/>
+                </sequence>
+            </extension>
+    	</complexContent>
+    </complexType>
+    <element name="SubjectQuery" type="samlp:SubjectQueryAbstractType"/>
+    <complexType name="SubjectQueryAbstractType" abstract="true">
+    	<complexContent>
+            <extension base="samlp:RequestAbstractType">
+                <sequence>
+                    <element ref="saml:Subject"/>
+                </sequence>
+            </extension>
+    	</complexContent>
+    </complexType>
+    <element name="AuthnQuery" type="samlp:AuthnQueryType"/>
+    <complexType name="AuthnQueryType">
+        <complexContent>
+            <extension base="samlp:SubjectQueryAbstractType">
+                <sequence>
+                    <element ref="samlp:RequestedAuthnContext" minOccurs="0"/>
+                </sequence>
+                <attribute name="SessionIndex" type="string" use="optional"/>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="RequestedAuthnContext" type="samlp:RequestedAuthnContextType"/>
+    <complexType name="RequestedAuthnContextType">
+        <choice>
+            <element ref="saml:AuthnContextClassRef" maxOccurs="unbounded"/>
+            <element ref="saml:AuthnContextDeclRef" maxOccurs="unbounded"/>
+        </choice>
+        <attribute name="Comparison" type="samlp:AuthnContextComparisonType" use="optional"/>
+    </complexType>
+    <simpleType name="AuthnContextComparisonType">
+        <restriction base="string">
+            <enumeration value="exact"/>
+            <enumeration value="minimum"/>
+            <enumeration value="maximum"/>
+            <enumeration value="better"/>
+        </restriction>
+    </simpleType>
+    <element name="AttributeQuery" type="samlp:AttributeQueryType"/>
+    <complexType name="AttributeQueryType">
+        <complexContent>
+            <extension base="samlp:SubjectQueryAbstractType">
+                <sequence>
+                    <element ref="saml:Attribute" minOccurs="0" maxOccurs="unbounded"/>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="AuthzDecisionQuery" type="samlp:AuthzDecisionQueryType"/>
+    <complexType name="AuthzDecisionQueryType">
+        <complexContent>
+            <extension base="samlp:SubjectQueryAbstractType">
+                <sequence>
+                    <element ref="saml:Action" maxOccurs="unbounded"/>
+                    <element ref="saml:Evidence" minOccurs="0"/>
+                </sequence>
+                <attribute name="Resource" type="anyURI" use="required"/>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="AuthnRequest" type="samlp:AuthnRequestType"/>
+    <complexType name="AuthnRequestType">
+        <complexContent>
+            <extension base="samlp:RequestAbstractType">
+                <sequence>
+                    <element ref="saml:Subject" minOccurs="0"/>
+                    <element ref="samlp:NameIDPolicy" minOccurs="0"/>
+                    <element ref="saml:Conditions" minOccurs="0"/>
+                    <element ref="samlp:RequestedAuthnContext" minOccurs="0"/>
+                    <element ref="samlp:Scoping" minOccurs="0"/>
+                </sequence>
+                <attribute name="ForceAuthn" type="boolean" use="optional"/>
+                <attribute name="IsPassive" type="boolean" use="optional"/>
+                <attribute name="ProtocolBinding" type="anyURI" use="optional"/>
+                <attribute name="AssertionConsumerServiceIndex" type="unsignedShort" use="optional"/>
+                <attribute name="AssertionConsumerServiceURL" type="anyURI" use="optional"/>
+                <attribute name="AttributeConsumingServiceIndex" type="unsignedShort" use="optional"/>
+                <attribute name="ProviderName" type="string" use="optional"/>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="NameIDPolicy" type="samlp:NameIDPolicyType"/>
+    <complexType name="NameIDPolicyType">
+        <attribute name="Format" type="anyURI" use="optional"/>
+        <attribute name="SPNameQualifier" type="string" use="optional"/>
+        <attribute name="AllowCreate" type="boolean" use="optional"/>
+    </complexType>
+    <element name="Scoping" type="samlp:ScopingType"/>
+    <complexType name="ScopingType">
+        <sequence>
+            <element ref="samlp:IDPList" minOccurs="0"/>
+            <element ref="samlp:RequesterID" minOccurs="0" maxOccurs="unbounded"/>
+        </sequence>
+        <attribute name="ProxyCount" type="nonNegativeInteger" use="optional"/>
+    </complexType>
+    <element name="RequesterID" type="anyURI"/>
+    <element name="IDPList" type="samlp:IDPListType"/>
+    <complexType name="IDPListType">
+        <sequence>
+            <element ref="samlp:IDPEntry" maxOccurs="unbounded"/>
+            <element ref="samlp:GetComplete" minOccurs="0"/>
+        </sequence>
+    </complexType>
+    <element name="IDPEntry" type="samlp:IDPEntryType"/>
+    <complexType name="IDPEntryType">
+        <attribute name="ProviderID" type="anyURI" use="required"/>
+        <attribute name="Name" type="string" use="optional"/>
+        <attribute name="Loc" type="anyURI" use="optional"/>
+    </complexType>
+    <element name="GetComplete" type="anyURI"/>
+    <element name="Response" type="samlp:ResponseType"/>
+    <complexType name="ResponseType">
+    	<complexContent>
+            <extension base="samlp:StatusResponseType">
+                <choice minOccurs="0" maxOccurs="unbounded">
+                    <element ref="saml:Assertion"/>
+                    <element ref="saml:EncryptedAssertion"/>
+                </choice>
+            </extension>
+    	</complexContent>
+    </complexType>
+    <element name="ArtifactResolve" type="samlp:ArtifactResolveType"/>
+    <complexType name="ArtifactResolveType">
+    	<complexContent>
+            <extension base="samlp:RequestAbstractType">
+                <sequence>
+                    <element ref="samlp:Artifact"/>
+                </sequence>
+            </extension>
+    	</complexContent>
+    </complexType>
+    <element name="Artifact" type="string"/>
+    <element name="ArtifactResponse" type="samlp:ArtifactResponseType"/>
+    <complexType name="ArtifactResponseType">
+    	<complexContent>
+            <extension base="samlp:StatusResponseType">
+                <sequence>
+                    <any namespace="##any" processContents="lax" minOccurs="0"/>
+                </sequence>
+            </extension>
+    	</complexContent>
+    </complexType>
+    <element name="ManageNameIDRequest" type="samlp:ManageNameIDRequestType"/>
+    <complexType name="ManageNameIDRequestType">
+    	<complexContent>
+            <extension base="samlp:RequestAbstractType">
+                <sequence>
+                    <choice>
+                        <element ref="saml:NameID"/>
+                        <element ref="saml:EncryptedID"/>
+                    </choice>
+                    <choice>
+                        <element ref="samlp:NewID"/>
+                        <element ref="samlp:NewEncryptedID"/>
+                        <element ref="samlp:Terminate"/>
+                    </choice>
+                </sequence>
+            </extension>
+    	</complexContent>
+    </complexType>
+    <element name="NewID" type="string"/>
+    <element name="NewEncryptedID" type="saml:EncryptedElementType"/>
+    <element name="Terminate" type="samlp:TerminateType"/>
+    <complexType name="TerminateType"/>
+    <element name="ManageNameIDResponse" type="samlp:StatusResponseType"/>
+    <element name="LogoutRequest" type="samlp:LogoutRequestType"/>
+    <complexType name="LogoutRequestType">
+        <complexContent>
+            <extension base="samlp:RequestAbstractType">
+                <sequence>
+                    <choice>
+                        <element ref="saml:BaseID"/>
+                        <element ref="saml:NameID"/>
+                        <element ref="saml:EncryptedID"/>
+                    </choice>
+                    <element ref="samlp:SessionIndex" minOccurs="0" maxOccurs="unbounded"/>
+                </sequence>
+                <attribute name="Reason" type="string" use="optional"/>
+                <attribute name="NotOnOrAfter" type="dateTime" use="optional"/>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="SessionIndex" type="string"/>
+    <element name="LogoutResponse" type="samlp:StatusResponseType"/>
+    <element name="NameIDMappingRequest" type="samlp:NameIDMappingRequestType"/>
+    <complexType name="NameIDMappingRequestType">
+        <complexContent>
+            <extension base="samlp:RequestAbstractType">
+                <sequence>
+                    <choice>
+                        <element ref="saml:BaseID"/>
+                        <element ref="saml:NameID"/>
+                        <element ref="saml:EncryptedID"/>
+                    </choice>
+                    <element ref="samlp:NameIDPolicy"/>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+    <element name="NameIDMappingResponse" type="samlp:NameIDMappingResponseType"/>
+    <complexType name="NameIDMappingResponseType">
+        <complexContent>
+            <extension base="samlp:StatusResponseType">
+                <choice>
+                    <element ref="saml:NameID"/>
+                    <element ref="saml:EncryptedID"/>
+                </choice>
+            </extension>
+        </complexContent>
+    </complexType>
+</schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-x500-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-x500-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..f67f1b04aa8661499908256ab251ff9416d032d6
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-x500-2.0.xsd
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema
+    targetNamespace="urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500"
+    xmlns="http://www.w3.org/2001/XMLSchema"
+    elementFormDefault="unqualified"
+    attributeFormDefault="unqualified"
+    blockDefault="substitution"
+    version="2.0">
+    <annotation>
+        <documentation>
+            Document identifier: saml-schema-x500-2.0
+            Location: http://docs.oasis-open.org/security/saml/v2.0/
+            Revision history:
+              V2.0 (March, 2005):
+                Custom schema for X.500 attribute profile, first published in SAML 2.0.
+        </documentation>
+    </annotation>
+    <attribute name="Encoding" type="string"/>
+</schema>
+
diff --git a/vendor/simplesamlphp/saml2/schemas/saml-schema-xacml-2.0.xsd b/vendor/simplesamlphp/saml2/schemas/saml-schema-xacml-2.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..836f9db047a9710abe3a4dc47ada28f3a17d7285
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/saml-schema-xacml-2.0.xsd
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema
+    targetNamespace="urn:oasis:names:tc:SAML:2.0:profiles:attribute:XACML"
+    xmlns="http://www.w3.org/2001/XMLSchema"
+    elementFormDefault="unqualified"
+    attributeFormDefault="unqualified"
+    blockDefault="substitution"
+    version="2.0">
+    <annotation>
+        <documentation>
+            Document identifier: saml-schema-xacml-2.0
+            Location: http://docs.oasis-open.org/security/saml/v2.0/
+            Revision history:
+            V2.0 (March, 2005):
+              Custom schema for XACML attribute profile, first published in SAML 2.0.
+        </documentation>
+    </annotation>
+    <attribute name="DataType" type="anyURI"/>
+</schema>
diff --git a/vendor/simplesamlphp/saml2/schemas/xenc-schema.xsd b/vendor/simplesamlphp/saml2/schemas/xenc-schema.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..d61229fd50c3da59409a86aebbee2ca83df4cb58
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/xenc-schema.xsd
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE schema  PUBLIC "-//W3C//DTD XMLSchema 200102//EN"
+ "http://www.w3.org/2001/XMLSchema.dtd"
+ [
+   <!ATTLIST schema
+     xmlns:xenc CDATA #FIXED 'http://www.w3.org/2001/04/xmlenc#'
+     xmlns:ds CDATA #FIXED 'http://www.w3.org/2000/09/xmldsig#'>
+   <!ENTITY xenc 'http://www.w3.org/2001/04/xmlenc#'>
+   <!ENTITY % p ''>
+   <!ENTITY % s ''>
+  ]>
+
+<schema xmlns='http://www.w3.org/2001/XMLSchema' version='1.0'
+        xmlns:xenc='http://www.w3.org/2001/04/xmlenc#'
+        xmlns:ds='http://www.w3.org/2000/09/xmldsig#'
+        targetNamespace='http://www.w3.org/2001/04/xmlenc#'
+        elementFormDefault='qualified'>
+
+  <import namespace='http://www.w3.org/2000/09/xmldsig#'
+          schemaLocation='xmldsig-core-schema.xsd'/>
+
+  <complexType name='EncryptedType' abstract='true'>
+    <sequence>
+      <element name='EncryptionMethod' type='xenc:EncryptionMethodType'
+       minOccurs='0'/>
+      <element ref='ds:KeyInfo' minOccurs='0'/>
+      <element ref='xenc:CipherData'/>
+      <element ref='xenc:EncryptionProperties' minOccurs='0'/>
+    </sequence>
+    <attribute name='Id' type='ID' use='optional'/>
+    <attribute name='Type' type='anyURI' use='optional'/>
+    <attribute name='MimeType' type='string' use='optional'/>
+    <attribute name='Encoding' type='anyURI' use='optional'/>
+  </complexType>
+  
+  <complexType name='EncryptionMethodType' mixed='true'>
+    <sequence>
+      <element name='KeySize' minOccurs='0' type='xenc:KeySizeType'/>
+      <element name='OAEPparams' minOccurs='0' type='base64Binary'/>
+      <any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
+    </sequence>
+    <attribute name='Algorithm' type='anyURI' use='required'/>
+  </complexType>
+
+    <simpleType name='KeySizeType'>
+      <restriction base="integer"/>
+    </simpleType>
+
+  <element name='CipherData' type='xenc:CipherDataType'/>
+  <complexType name='CipherDataType'>
+     <choice>
+       <element name='CipherValue' type='base64Binary'/>
+       <element ref='xenc:CipherReference'/>
+     </choice>
+    </complexType>
+
+   <element name='CipherReference' type='xenc:CipherReferenceType'/>
+   <complexType name='CipherReferenceType'>
+       <choice>
+         <element name='Transforms' type='xenc:TransformsType' minOccurs='0'/>
+       </choice>
+       <attribute name='URI' type='anyURI' use='required'/>
+   </complexType>
+
+     <complexType name='TransformsType'>
+       <sequence>
+         <element ref='ds:Transform' maxOccurs='unbounded'/>
+       </sequence>
+     </complexType>
+
+
+  <element name='EncryptedData' type='xenc:EncryptedDataType'/>
+  <complexType name='EncryptedDataType'>
+    <complexContent>
+      <extension base='xenc:EncryptedType'>
+       </extension>
+    </complexContent>
+  </complexType>
+
+  <!-- Children of ds:KeyInfo -->
+
+  <element name='EncryptedKey' type='xenc:EncryptedKeyType'/>
+  <complexType name='EncryptedKeyType'>
+    <complexContent>
+      <extension base='xenc:EncryptedType'>
+        <sequence>
+          <element ref='xenc:ReferenceList' minOccurs='0'/>
+          <element name='CarriedKeyName' type='string' minOccurs='0'/>
+        </sequence>
+        <attribute name='Recipient' type='string'
+         use='optional'/>
+      </extension>
+    </complexContent>
+  </complexType>
+
+    <element name="AgreementMethod" type="xenc:AgreementMethodType"/>
+    <complexType name="AgreementMethodType" mixed="true">
+      <sequence>
+        <element name="KA-Nonce" minOccurs="0" type="base64Binary"/>
+        <!-- <element ref="ds:DigestMethod" minOccurs="0"/> -->
+        <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+        <element name="OriginatorKeyInfo" minOccurs="0" type="ds:KeyInfoType"/>
+        <element name="RecipientKeyInfo" minOccurs="0" type="ds:KeyInfoType"/>
+      </sequence>
+      <attribute name="Algorithm" type="anyURI" use="required"/>
+    </complexType>
+
+  <!-- End Children of ds:KeyInfo -->
+
+  <element name='ReferenceList'>
+    <complexType>
+      <choice minOccurs='1' maxOccurs='unbounded'>
+        <element name='DataReference' type='xenc:ReferenceType'/>
+        <element name='KeyReference' type='xenc:ReferenceType'/>
+      </choice>
+    </complexType>
+  </element>
+
+  <complexType name='ReferenceType'>
+    <sequence>
+      <any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
+    </sequence>
+    <attribute name='URI' type='anyURI' use='required'/>
+  </complexType>
+
+
+  <element name='EncryptionProperties' type='xenc:EncryptionPropertiesType'/>
+  <complexType name='EncryptionPropertiesType'>
+    <sequence>
+      <element ref='xenc:EncryptionProperty' maxOccurs='unbounded'/>
+    </sequence>
+    <attribute name='Id' type='ID' use='optional'/>
+  </complexType>
+
+    <element name='EncryptionProperty' type='xenc:EncryptionPropertyType'/>
+    <complexType name='EncryptionPropertyType' mixed='true'>
+      <choice maxOccurs='unbounded'>
+        <any namespace='##other' processContents='lax'/>
+      </choice>
+      <attribute name='Target' type='anyURI' use='optional'/>
+      <attribute name='Id' type='ID' use='optional'/>
+      <anyAttribute namespace="http://www.w3.org/XML/1998/namespace"/>
+    </complexType>
+
+</schema>
+
diff --git a/vendor/simplesamlphp/saml2/schemas/xml.xsd b/vendor/simplesamlphp/saml2/schemas/xml.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..aea7d0db0a423b962247aa2b4d3d48fc73cda659
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/xml.xsd
@@ -0,0 +1,287 @@
+<?xml version='1.0'?>
+<?xml-stylesheet href="../2008/09/xsd.xsl" type="text/xsl"?>
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" 
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns   ="http://www.w3.org/1999/xhtml"
+  xml:lang="en">
+
+ <xs:annotation>
+  <xs:documentation>
+   <div>
+    <h1>About the XML namespace</h1>
+
+    <div class="bodytext">
+     <p>
+      This schema document describes the XML namespace, in a form
+      suitable for import by other schema documents.
+     </p>
+     <p>
+      See <a href="http://www.w3.org/XML/1998/namespace.html">
+      http://www.w3.org/XML/1998/namespace.html</a> and
+      <a href="http://www.w3.org/TR/REC-xml">
+      http://www.w3.org/TR/REC-xml</a> for information 
+      about this namespace.
+     </p>
+     <p>
+      Note that local names in this namespace are intended to be
+      defined only by the World Wide Web Consortium or its subgroups.
+      The names currently defined in this namespace are listed below.
+      They should not be used with conflicting semantics by any Working
+      Group, specification, or document instance.
+     </p>
+     <p>   
+      See further below in this document for more information about <a
+      href="#usage">how to refer to this schema document from your own
+      XSD schema documents</a> and about <a href="#nsversioning">the
+      namespace-versioning policy governing this schema document</a>.
+     </p>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>lang (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose value
+       is a language code for the natural language of the content of
+       any element; its value is inherited.  This name is reserved
+       by virtue of its definition in the XML specification.</p>
+     
+    </div>
+    <div>
+     <h4>Notes</h4>
+     <p>
+      Attempting to install the relevant ISO 2- and 3-letter
+      codes as the enumerated possible values is probably never
+      going to be a realistic possibility.  
+     </p>
+     <p>
+      See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
+       http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
+      and the IANA language subtag registry at
+      <a href="http://www.iana.org/assignments/language-subtag-registry">
+       http://www.iana.org/assignments/language-subtag-registry</a>
+      for further information.
+     </p>
+     <p>
+      The union allows for the 'un-declaration' of xml:lang with
+      the empty string.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:union memberTypes="xs:language">
+    <xs:simpleType>    
+     <xs:restriction base="xs:string">
+      <xs:enumeration value=""/>
+     </xs:restriction>
+    </xs:simpleType>
+   </xs:union>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="space">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>space (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose
+       value is a keyword indicating what whitespace processing
+       discipline is intended for the content of the element; its
+       value is inherited.  This name is reserved by virtue of its
+       definition in the XML specification.</p>
+     
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:restriction base="xs:NCName">
+    <xs:enumeration value="default"/>
+    <xs:enumeration value="preserve"/>
+   </xs:restriction>
+  </xs:simpleType>
+ </xs:attribute>
+ 
+ <xs:attribute name="base" type="xs:anyURI"> <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>base (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose value
+       provides a URI to be used as the base for interpreting any
+       relative URIs in the scope of the element on which it
+       appears; its value is inherited.  This name is reserved
+       by virtue of its definition in the XML Base specification.</p>
+     
+     <p>
+      See <a
+      href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
+      for information about this attribute.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+ 
+ <xs:attribute name="id" type="xs:ID">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>id (as an attribute name)</h3> 
+      <p>
+       denotes an attribute whose value
+       should be interpreted as if declared to be of type ID.
+       This name is reserved by virtue of its definition in the
+       xml:id specification.</p>
+     
+     <p>
+      See <a
+      href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a>
+      for information about this attribute.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+  <xs:attribute ref="xml:base"/>
+  <xs:attribute ref="xml:lang"/>
+  <xs:attribute ref="xml:space"/>
+  <xs:attribute ref="xml:id"/>
+ </xs:attributeGroup>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div>
+   
+    <h3>Father (in any context at all)</h3> 
+
+    <div class="bodytext">
+     <p>
+      denotes Jon Bosak, the chair of 
+      the original XML Working Group.  This name is reserved by 
+      the following decision of the W3C XML Plenary and 
+      XML Coordination groups:
+     </p>
+     <blockquote>
+       <p>
+	In appreciation for his vision, leadership and
+	dedication the W3C XML Plenary on this 10th day of
+	February, 2000, reserves for Jon Bosak in perpetuity
+	the XML name "xml:Father".
+       </p>
+     </blockquote>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div xml:id="usage" id="usage">
+    <h2><a name="usage">About this schema document</a></h2>
+
+    <div class="bodytext">
+     <p>
+      This schema defines attributes and an attribute group suitable
+      for use by schemas wishing to allow <code>xml:base</code>,
+      <code>xml:lang</code>, <code>xml:space</code> or
+      <code>xml:id</code> attributes on elements they define.
+     </p>
+     <p>
+      To enable this, such a schema must import this schema for
+      the XML namespace, e.g. as follows:
+     </p>
+     <pre>
+          &lt;schema . . .>
+           . . .
+           &lt;import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+     </pre>
+     <p>
+      or
+     </p>
+     <pre>
+           &lt;import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+     </pre>
+     <p>
+      Subsequently, qualified reference to any of the attributes or the
+      group defined below will have the desired effect, e.g.
+     </p>
+     <pre>
+          &lt;type . . .>
+           . . .
+           &lt;attributeGroup ref="xml:specialAttrs"/>
+     </pre>
+     <p>
+      will define a type which will schema-validate an instance element
+      with any of those attributes.
+     </p>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div id="nsversioning" xml:id="nsversioning">
+    <h2><a name="nsversioning">Versioning policy for this schema document</a></h2>
+    <div class="bodytext">
+     <p>
+      In keeping with the XML Schema WG's standard versioning
+      policy, this schema document will persist at
+      <a href="http://www.w3.org/2009/01/xml.xsd">
+       http://www.w3.org/2009/01/xml.xsd</a>.
+     </p>
+     <p>
+      At the date of issue it can also be found at
+      <a href="http://www.w3.org/2001/xml.xsd">
+       http://www.w3.org/2001/xml.xsd</a>.
+     </p>
+     <p>
+      The schema document at that URI may however change in the future,
+      in order to remain compatible with the latest version of XML
+      Schema itself, or with the XML namespace itself.  In other words,
+      if the XML Schema or XML namespaces change, the version of this
+      document at <a href="http://www.w3.org/2001/xml.xsd">
+       http://www.w3.org/2001/xml.xsd 
+      </a> 
+      will change accordingly; the version at 
+      <a href="http://www.w3.org/2009/01/xml.xsd">
+       http://www.w3.org/2009/01/xml.xsd 
+      </a> 
+      will not change.
+     </p>
+     <p>
+      Previous dated (and unchanging) versions of this schema 
+      document are at:
+     </p>
+     <ul>
+      <li><a href="http://www.w3.org/2009/01/xml.xsd">
+	http://www.w3.org/2009/01/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2007/08/xml.xsd">
+	http://www.w3.org/2007/08/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2004/10/xml.xsd">
+	http://www.w3.org/2004/10/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2001/03/xml.xsd">
+	http://www.w3.org/2001/03/xml.xsd</a></li>
+     </ul>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+</xs:schema>
+
diff --git a/vendor/simplesamlphp/saml2/schemas/xmldsig-core-schema.xsd b/vendor/simplesamlphp/saml2/schemas/xmldsig-core-schema.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..df126b30e684091b32a748cd2e408f5fb9d651a9
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/schemas/xmldsig-core-schema.xsd
@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE schema
+  PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd"
+ [
+   <!ATTLIST schema 
+     xmlns:ds CDATA #FIXED "http://www.w3.org/2000/09/xmldsig#">
+   <!ENTITY dsig 'http://www.w3.org/2000/09/xmldsig#'>
+   <!ENTITY % p ''>
+   <!ENTITY % s ''>
+  ]>
+
+<!-- Schema for XML Signatures
+    http://www.w3.org/2000/09/xmldsig#
+    $Revision: 1.1 $ on $Date: 2002/02/08 20:32:26 $ by $Author: reagle $
+
+    Copyright 2001 The Internet Society and W3C (Massachusetts Institute
+    of Technology, Institut National de Recherche en Informatique et en
+    Automatique, Keio University). All Rights Reserved.
+    http://www.w3.org/Consortium/Legal/
+
+    This document is governed by the W3C Software License [1] as described
+    in the FAQ [2].
+
+    [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
+    [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
+-->
+
+
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+        xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
+        targetNamespace="http://www.w3.org/2000/09/xmldsig#"
+        version="0.1" elementFormDefault="qualified"> 
+
+<!-- Basic Types Defined for Signatures -->
+
+<simpleType name="CryptoBinary">
+  <restriction base="base64Binary">
+  </restriction>
+</simpleType>
+
+<!-- Start Signature -->
+
+<element name="Signature" type="ds:SignatureType"/>
+<complexType name="SignatureType">
+  <sequence> 
+    <element ref="ds:SignedInfo"/> 
+    <element ref="ds:SignatureValue"/> 
+    <element ref="ds:KeyInfo" minOccurs="0"/> 
+    <element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/> 
+  </sequence>  
+  <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+  <element name="SignatureValue" type="ds:SignatureValueType"/> 
+  <complexType name="SignatureValueType">
+    <simpleContent>
+      <extension base="base64Binary">
+        <attribute name="Id" type="ID" use="optional"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+
+<!-- Start SignedInfo -->
+
+<element name="SignedInfo" type="ds:SignedInfoType"/>
+<complexType name="SignedInfoType">
+  <sequence> 
+    <element ref="ds:CanonicalizationMethod"/> 
+    <element ref="ds:SignatureMethod"/> 
+    <element ref="ds:Reference" maxOccurs="unbounded"/> 
+  </sequence>  
+  <attribute name="Id" type="ID" use="optional"/> 
+</complexType>
+
+  <element name="CanonicalizationMethod" type="ds:CanonicalizationMethodType"/> 
+  <complexType name="CanonicalizationMethodType" mixed="true">
+    <sequence>
+      <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>
+      <!-- (0,unbounded) elements from (1,1) namespace -->
+    </sequence>
+    <attribute name="Algorithm" type="anyURI" use="required"/> 
+  </complexType>
+
+  <element name="SignatureMethod" type="ds:SignatureMethodType"/>
+  <complexType name="SignatureMethodType" mixed="true">
+    <sequence>
+      <element name="HMACOutputLength" minOccurs="0" type="ds:HMACOutputLengthType"/>
+      <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+      <!-- (0,unbounded) elements from (1,1) external namespace -->
+    </sequence>
+    <attribute name="Algorithm" type="anyURI" use="required"/> 
+  </complexType>
+
+<!-- Start Reference -->
+
+<element name="Reference" type="ds:ReferenceType"/>
+<complexType name="ReferenceType">
+  <sequence> 
+    <element ref="ds:Transforms" minOccurs="0"/> 
+    <element ref="ds:DigestMethod"/> 
+    <element ref="ds:DigestValue"/> 
+  </sequence>
+  <attribute name="Id" type="ID" use="optional"/> 
+  <attribute name="URI" type="anyURI" use="optional"/> 
+  <attribute name="Type" type="anyURI" use="optional"/> 
+</complexType>
+
+  <element name="Transforms" type="ds:TransformsType"/>
+  <complexType name="TransformsType">
+    <sequence>
+      <element ref="ds:Transform" maxOccurs="unbounded"/>  
+    </sequence>
+  </complexType>
+
+  <element name="Transform" type="ds:TransformType"/>
+  <complexType name="TransformType" mixed="true">
+    <choice minOccurs="0" maxOccurs="unbounded"> 
+      <any namespace="##other" processContents="lax"/>
+      <!-- (1,1) elements from (0,unbounded) namespaces -->
+      <element name="XPath" type="string"/> 
+    </choice>
+    <attribute name="Algorithm" type="anyURI" use="required"/> 
+  </complexType>
+
+<!-- End Reference -->
+
+<element name="DigestMethod" type="ds:DigestMethodType"/>
+<complexType name="DigestMethodType" mixed="true"> 
+  <sequence>
+    <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+  </sequence>    
+  <attribute name="Algorithm" type="anyURI" use="required"/> 
+</complexType>
+
+<element name="DigestValue" type="ds:DigestValueType"/>
+<simpleType name="DigestValueType">
+  <restriction base="base64Binary"/>
+</simpleType>
+
+<!-- End SignedInfo -->
+
+<!-- Start KeyInfo -->
+
+<element name="KeyInfo" type="ds:KeyInfoType"/> 
+<complexType name="KeyInfoType" mixed="true">
+  <choice maxOccurs="unbounded">     
+    <element ref="ds:KeyName"/> 
+    <element ref="ds:KeyValue"/> 
+    <element ref="ds:RetrievalMethod"/> 
+    <element ref="ds:X509Data"/> 
+    <element ref="ds:PGPData"/> 
+    <element ref="ds:SPKIData"/>
+    <element ref="ds:MgmtData"/>
+    <any processContents="lax" namespace="##other"/>
+    <!-- (1,1) elements from (0,unbounded) namespaces -->
+  </choice>
+  <attribute name="Id" type="ID" use="optional"/> 
+</complexType>
+
+  <element name="KeyName" type="string"/>
+  <element name="MgmtData" type="string"/>
+
+  <element name="KeyValue" type="ds:KeyValueType"/> 
+  <complexType name="KeyValueType" mixed="true">
+   <choice>
+     <element ref="ds:DSAKeyValue"/>
+     <element ref="ds:RSAKeyValue"/>
+     <any namespace="##other" processContents="lax"/>
+   </choice>
+  </complexType>
+
+  <element name="RetrievalMethod" type="ds:RetrievalMethodType"/> 
+  <complexType name="RetrievalMethodType">
+    <sequence>
+      <element ref="ds:Transforms" minOccurs="0"/> 
+    </sequence>  
+    <attribute name="URI" type="anyURI"/>
+    <attribute name="Type" type="anyURI" use="optional"/>
+  </complexType>
+
+<!-- Start X509Data -->
+
+<element name="X509Data" type="ds:X509DataType"/> 
+<complexType name="X509DataType">
+  <sequence maxOccurs="unbounded">
+    <choice>
+      <element name="X509IssuerSerial" type="ds:X509IssuerSerialType"/>
+      <element name="X509SKI" type="base64Binary"/>
+      <element name="X509SubjectName" type="string"/>
+      <element name="X509Certificate" type="base64Binary"/>
+      <element name="X509CRL" type="base64Binary"/>
+      <any namespace="##other" processContents="lax"/>
+    </choice>
+  </sequence>
+</complexType>
+
+<complexType name="X509IssuerSerialType"> 
+  <sequence> 
+    <element name="X509IssuerName" type="string"/> 
+    <element name="X509SerialNumber" type="integer"/> 
+  </sequence>
+</complexType>
+
+<!-- End X509Data -->
+
+<!-- Begin PGPData -->
+
+<element name="PGPData" type="ds:PGPDataType"/> 
+<complexType name="PGPDataType"> 
+  <choice>
+    <sequence>
+      <element name="PGPKeyID" type="base64Binary"/> 
+      <element name="PGPKeyPacket" type="base64Binary" minOccurs="0"/> 
+      <any namespace="##other" processContents="lax" minOccurs="0"
+       maxOccurs="unbounded"/>
+    </sequence>
+    <sequence>
+      <element name="PGPKeyPacket" type="base64Binary"/> 
+      <any namespace="##other" processContents="lax" minOccurs="0"
+       maxOccurs="unbounded"/>
+    </sequence>
+  </choice>
+</complexType>
+
+<!-- End PGPData -->
+
+<!-- Begin SPKIData -->
+
+<element name="SPKIData" type="ds:SPKIDataType"/> 
+<complexType name="SPKIDataType">
+  <sequence maxOccurs="unbounded">
+    <element name="SPKISexp" type="base64Binary"/>
+    <any namespace="##other" processContents="lax" minOccurs="0"/>
+  </sequence>
+</complexType> 
+
+<!-- End SPKIData -->
+
+<!-- End KeyInfo -->
+
+<!-- Start Object (Manifest, SignatureProperty) -->
+
+<element name="Object" type="ds:ObjectType"/> 
+<complexType name="ObjectType" mixed="true">
+  <sequence minOccurs="0" maxOccurs="unbounded">
+    <any namespace="##any" processContents="lax"/>
+  </sequence>
+  <attribute name="Id" type="ID" use="optional"/> 
+  <attribute name="MimeType" type="string" use="optional"/> <!-- add a grep facet -->
+  <attribute name="Encoding" type="anyURI" use="optional"/> 
+</complexType>
+
+<element name="Manifest" type="ds:ManifestType"/> 
+<complexType name="ManifestType">
+  <sequence>
+    <element ref="ds:Reference" maxOccurs="unbounded"/> 
+  </sequence>
+  <attribute name="Id" type="ID" use="optional"/> 
+</complexType>
+
+<element name="SignatureProperties" type="ds:SignaturePropertiesType"/> 
+<complexType name="SignaturePropertiesType">
+  <sequence>
+    <element ref="ds:SignatureProperty" maxOccurs="unbounded"/> 
+  </sequence>
+  <attribute name="Id" type="ID" use="optional"/> 
+</complexType>
+
+   <element name="SignatureProperty" type="ds:SignaturePropertyType"/> 
+   <complexType name="SignaturePropertyType" mixed="true">
+     <choice maxOccurs="unbounded">
+       <any namespace="##other" processContents="lax"/>
+       <!-- (1,1) elements from (1,unbounded) namespaces -->
+     </choice>
+     <attribute name="Target" type="anyURI" use="required"/> 
+     <attribute name="Id" type="ID" use="optional"/> 
+   </complexType>
+
+<!-- End Object (Manifest, SignatureProperty) -->
+
+<!-- Start Algorithm Parameters -->
+
+<simpleType name="HMACOutputLengthType">
+  <restriction base="integer"/>
+</simpleType>
+
+<!-- Start KeyValue Element-types -->
+
+<element name="DSAKeyValue" type="ds:DSAKeyValueType"/>
+<complexType name="DSAKeyValueType">
+  <sequence>
+    <sequence minOccurs="0">
+      <element name="P" type="ds:CryptoBinary"/>
+      <element name="Q" type="ds:CryptoBinary"/>
+    </sequence>
+    <element name="G" type="ds:CryptoBinary" minOccurs="0"/>
+    <element name="Y" type="ds:CryptoBinary"/>
+    <element name="J" type="ds:CryptoBinary" minOccurs="0"/>
+    <sequence minOccurs="0">
+      <element name="Seed" type="ds:CryptoBinary"/>
+      <element name="PgenCounter" type="ds:CryptoBinary"/>
+    </sequence>
+  </sequence>
+</complexType>
+
+<element name="RSAKeyValue" type="ds:RSAKeyValueType"/>
+<complexType name="RSAKeyValueType">
+  <sequence>
+    <element name="Modulus" type="ds:CryptoBinary"/> 
+    <element name="Exponent" type="ds:CryptoBinary"/> 
+  </sequence>
+</complexType> 
+
+<!-- End KeyValue Element-types -->
+
+<!-- End Signature -->
+
+</schema>
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Binding.php b/vendor/simplesamlphp/saml2/src/SAML2/Binding.php
index 8803c5a17f89fbe1cbbc77448b4602db2cff4687..282221c80fb52ededaf2cd5646eea2b27e2ce38d 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Binding.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Binding.php
@@ -4,6 +4,8 @@
 
 namespace SAML2;
 
+use SAML2\Exception\Protocol\UnsupportedBindingException;
+
 /**
  * Base class for SAML 2 bindings.
  *
@@ -26,7 +28,7 @@ abstract class Binding
      * Will throw an exception if it is unable to locate the binding.
      *
      * @param string $urn The URN of the binding.
-     * @throws \Exception
+     * @throws \SAML2\Exception\Protocol\UnsupportedBindingException
      * @return \SAML2\Binding The binding.
      */
     public static function getBinding(string $urn) : Binding
@@ -46,7 +48,7 @@ public static function getBinding(string $urn) : Binding
             case Constants::BINDING_PAOS:
                 return new SOAP();
             default:
-                throw new \Exception('Unsupported binding: '.var_export($urn, true));
+                throw new UnsupportedBindingException('Unsupported binding: '.var_export($urn, true));
         }
     }
 
@@ -59,7 +61,7 @@ public static function getBinding(string $urn) : Binding
      *
      * An exception will be thrown if it is unable to guess the binding.
      *
-     * @throws \Exception
+     * @throws \SAML2\Exception\Protocol\UnsupportedBindingException
      * @return \SAML2\Binding The binding.
      */
     public static function getCurrentBinding() : Binding
@@ -104,7 +106,7 @@ public static function getCurrentBinding() : Binding
             $logger->warning('Content-Type: '.var_export($_SERVER['CONTENT_TYPE'], true));
         }
 
-        throw new \Exception('Unable to find the SAML 2 binding used for this request.');
+        throw new UnsupportedBindingException('Unable to find the SAML 2 binding used for this request.');
     }
 
 
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Certificate/Key.php b/vendor/simplesamlphp/saml2/src/SAML2/Certificate/Key.php
index 442c6707f2b774f528fba076260ce82119e7426d..8629a143e5f34bf49e59c23bb733faca1fa27afe 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Certificate/Key.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Certificate/Key.php
@@ -87,6 +87,7 @@ public function offsetExists($offset) : bool
      *
      * Type hint not possible due to upstream method signature
      */
+    #[\ReturnTypeWillChange]
     public function offsetGet($offset)
     {
         if (!is_string($offset)) {
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Compat/Ssp/Container.php b/vendor/simplesamlphp/saml2/src/SAML2/Compat/Ssp/Container.php
index 8659b35498f0e462c88887e9798ec9e8bbd2da48..10e179e161648e2c52c4f338b1a104a07a68d095 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Compat/Ssp/Container.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Compat/Ssp/Container.php
@@ -19,6 +19,25 @@ class Container extends AbstractContainer
      */
     protected $logger;
 
+    /**
+     * @var \SimpleSAML\Utils\HTTP
+     */
+    protected $utilsHttp;
+
+    /**
+     * @var \SimpleSAML\Utils\Random
+     */
+    protected $utilsRandom;
+
+    /**
+     * @var \SimpleSAML\Utils\System
+     */
+    protected $utilsSystem;
+
+    /**
+     * @var \SimpleSAML\Utils\XML
+     */
+    protected $utilsXml;
 
     /**
      * Create a new SimpleSAMLphp compatible container.
@@ -26,6 +45,10 @@ class Container extends AbstractContainer
     public function __construct()
     {
         $this->logger = new Logger();
+        $this->utilsHttp = new HTTP();
+        $this->utilsRandom = new Random();
+        $this->utilsSystem = new System();
+        $this->utilsXml = new XML();
     }
 
 
@@ -45,8 +68,7 @@ public function getLogger() : LoggerInterface
      */
     public function generateId() : string
     {
-        /** @psalm-suppress UndefinedClass */
-        return Random::generateID();
+        return $this->utilsRandom->generateID();
     }
 
 
@@ -58,8 +80,7 @@ public function generateId() : string
      */
     public function debugMessage($message, string $type) : void
     {
-        /** @psalm-suppress UndefinedClass */
-        XML::debugSAMLMessage($message, $type);
+        $this->utilsXml->debugSAMLMessage($message, $type);
     }
 
 
@@ -71,8 +92,7 @@ public function debugMessage($message, string $type) : void
      */
     public function redirect(string $url, array $data = []) : void
     {
-        /** @psalm-suppress UndefinedClass */
-        HTTP::redirectTrustedURL($url, $data);
+        $this->utilsHttp->redirectTrustedURL($url, $data);
     }
 
 
@@ -84,8 +104,7 @@ public function redirect(string $url, array $data = []) : void
      */
     public function postRedirect(string $url, array $data = []) : void
     {
-        /** @psalm-suppress UndefinedClass */
-        HTTP::submitPOSTData($url, $data);
+        $this->utilsHttp->submitPOSTData($url, $data);
     }
 
 
@@ -95,8 +114,7 @@ public function postRedirect(string $url, array $data = []) : void
      */
     public function getTempDir() : string
     {
-        /** @psalm-suppress UndefinedClass */
-        return System::getTempDir();
+        return $this->utilsSystem->getTempDir();
     }
 
 
@@ -112,7 +130,6 @@ public function writeFile(string $filename, string $data, int $mode = null) : vo
         if ($mode === null) {
             $mode = 0600;
         }
-        /** @psalm-suppress UndefinedClass */
-        System::writeFile($filename, $data, $mode);
+        $this->utilsSystem->writeFile($filename, $data, $mode);
     }
 }
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Configuration/Queryable.php b/vendor/simplesamlphp/saml2/src/SAML2/Configuration/Queryable.php
index 26d97fea45cbcdd8b5096e714106dcfb4bae7e37..665bc4a2e93d1f2061e7881f213c609dd4dbbcc8 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Configuration/Queryable.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Configuration/Queryable.php
@@ -23,9 +23,9 @@ public function has(string $key) : bool;
      * returned
      *
      * @param string     $key
-     * @param null|mixed $default
+     * @param null|mixed $defaultValue
      *
      * @return mixed
      */
-    public function get(string $key, $default = null);
+    public function get(string $key, $defaultValue = null);
 }
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Constants.php b/vendor/simplesamlphp/saml2/src/SAML2/Constants.php
index a7f66e265583e04435f310ab6b0cb7cd74eed72c..0cc5cee718714c001e70b7d5f833f35369190669 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Constants.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Constants.php
@@ -152,6 +152,16 @@ class Constants
 
     const EPTI_URN_OID = 'urn:oid:1.3.6.1.4.1.5923.1.1.1.10';
 
+    /**
+     * LogoutRequest Reason - user wishes to terminate the session
+     */
+    public const LOGOUT_REASON_USER = 'urn:oasis:names:tc:SAML:2.0:logout:user';
+
+    /**
+     * LogoutRequest Reason - admin wishes to terminate the session
+     */
+    public const LOGOUT_REASON_ADMIN = 'urn:oasis:names:tc:SAML:2.0:logout:admin';
+
     /**
      * The interpretation of the attribute name is left to individual implementations.
      */
@@ -432,4 +442,14 @@ class Constants
      * Second-level status code.
      */
     const STATUS_UNSUPPORTED_BINDING = 'urn:oasis:names:tc:SAML:2.0:status:UnsupportedBinding';
+
+    /**
+     * The maximum size for any entityid as per specification
+     */
+    public const ENTITYID_MAX_LENGTH = 1024;
+
+    /**
+     * The maximum size for any entityid as per SAML2INT-specification
+     */
+    public const SAML2INT_ENTITYID_MAX_LENGTH = 256;
 }
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/DOMDocumentFactory.php b/vendor/simplesamlphp/saml2/src/SAML2/DOMDocumentFactory.php
index 9db9c62e1dd551a912703bd4e6430953c7a798f6..4cdaef06442dd22ccecd7ce5a625efbacde6b870 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/DOMDocumentFactory.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/DOMDocumentFactory.php
@@ -30,9 +30,10 @@ public static function fromString(string $xml) : DOMDocument
     {
         if (trim($xml) === '') {
             throw InvalidArgumentException::invalidType('non-empty string', $xml);
+        } elseif (PHP_VERSION_ID < 80000) {
+            $entityLoader = libxml_disable_entity_loader(true);
         }
 
-        $entityLoader = libxml_disable_entity_loader(true);
         $internalErrors = libxml_use_internal_errors(true);
         libxml_clear_errors();
 
@@ -43,9 +44,12 @@ public static function fromString(string $xml) : DOMDocument
         }
 
         $loaded = $domDocument->loadXML($xml, $options);
-
         libxml_use_internal_errors($internalErrors);
-        libxml_disable_entity_loader($entityLoader);
+
+        if (PHP_VERSION_ID < 80000) {
+            /** @psalm-suppress PossiblyUndefinedVariable */
+            libxml_disable_entity_loader($entityLoader);
+        }
 
         if (!$loaded) {
             $error = libxml_get_last_error();
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/InvalidArgumentException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/InvalidArgumentException.php
index 9daebe837fcac1b5992e3bc2977ac3f9078cf9ad..0335e7790d44cafb1729a666cbe460a204be4216 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Exception/InvalidArgumentException.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/InvalidArgumentException.php
@@ -4,7 +4,9 @@
 
 namespace SAML2\Exception;
 
-class InvalidArgumentException extends \InvalidArgumentException implements Throwable
+use InvalidArgumentException as BuiltinInvalidArgumentException;
+
+class InvalidArgumentException extends BuiltinInvalidArgumentException implements Throwable
 {
     /**
      * @param string $expected description of expected type
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/MetadataExpiredException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/MetadataExpiredException.php
new file mode 100644
index 0000000000000000000000000000000000000000..f126329faaa1ef0de61968b3bb94755c4ea4cc61
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/MetadataExpiredException.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception;
+
+/**
+ * Named exception
+ */
+class MetadataExpiredException extends RuntimeException
+{
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/AuthnFailedException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/AuthnFailedException.php
new file mode 100644
index 0000000000000000000000000000000000000000..a243ed03e8ef814b36851ff433b4ba4e10fc4ca9
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/AuthnFailedException.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the provider was unable to succesfully authenticate the principal.
+ *
+ * @package simplesamlphp/saml2
+ */
+class AuthnFailedException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Authentication failed.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/InvalidAttrNameOrValueException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/InvalidAttrNameOrValueException.php
new file mode 100644
index 0000000000000000000000000000000000000000..d75fefc65ac2183a1e7e8619fb61a34622c2182b
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/InvalidAttrNameOrValueException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that unexpected or invalid content was encountered
+ *   within a <saml:Attribute> or <saml:AttributeValue> element.
+ *
+ * @package simplesamlphp/saml2
+ */
+class InvalidAttrNameOrValueException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Invalid attribute name or value.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/InvalidNameIDPolicyException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/InvalidNameIDPolicyException.php
new file mode 100644
index 0000000000000000000000000000000000000000..57187cb84764ee9c3a5fbffda17ef5390c892819
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/InvalidNameIDPolicyException.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the provider cannot or will not support the requested NameIDPolicy.
+ *
+ * @package simplesamlphp/saml2
+ */
+class InvalidNameIDPolicyException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Invalid NameID policy.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoAuthnContextException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoAuthnContextException.php
new file mode 100644
index 0000000000000000000000000000000000000000..582dda48fcfe71f2506cb74521ffcc29058fd6e3
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoAuthnContextException.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that none of the requested AuthnContexts can be used.
+ *
+ * @package simplesamlphp/saml2
+ */
+class NoAuthnContextException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'None of the requested AuthnContext can be used.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoAvailableIDPException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoAvailableIDPException.php
new file mode 100644
index 0000000000000000000000000000000000000000..aad7df24780008acedecb2cc8968adc0c399213b
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoAvailableIDPException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error used by an intermediary to indicate that none of the IDPEntry Loc-attributes
+ *   can be resolved or that none of the supported identity providers are available.
+ *
+ * @package simplesamlphp/saml2
+ */
+class NoAvailableIDPException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'No IDP available.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoPassiveException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoPassiveException.php
new file mode 100644
index 0000000000000000000000000000000000000000..be5a45053623abeccf4c2a1fcec7aea2456d47cd
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoPassiveException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the responding provider cannot authenticate the principal
+ *   passively, as has been requested.
+ *
+ * @package simplesamlphp/saml2
+ */
+class NoPassiveException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Cannot perform passive authentication.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoSupportedIDPException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoSupportedIDPException.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e620fe664c79d830994952930c8096877e75827
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/NoSupportedIDPException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error used by an intermediary to indicate that none of the identity providers
+ *   in an IDPList are supported by the intermediary.
+ *
+ * @package simplesamlphp/saml2
+ */
+class NoSupportedIDPException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'No supported IDP.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/PartialLogoutException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/PartialLogoutException.php
new file mode 100644
index 0000000000000000000000000000000000000000..1d0d2fd64fad6d11ccac213082e7bc90e7e8d71d
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/PartialLogoutException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error used by a session authority to indicate to a session participant
+ *   that it was not able to propagate logout to all other session participants.
+ *
+ * @package simplesamlphp/saml2
+ */
+class PartialLogoutException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Unable to propagate logout to all other session participants.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/ProxyCountExceededException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/ProxyCountExceededException.php
new file mode 100644
index 0000000000000000000000000000000000000000..1ec880f7901ade8b95833290ed7184aa71be76c3
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/ProxyCountExceededException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the responding provider cannot authenticate the principal
+ *   and is not permitted to proxy the request further.
+ *
+ * @package simplesamlphp/saml2
+ */
+class ProxyCountExceededException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Proxy count exceeded.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestDeniedException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestDeniedException.php
new file mode 100644
index 0000000000000000000000000000000000000000..6677a1fda409d24e2ae563ead58f1f3d476e5305
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestDeniedException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the SAML responder or SAML authority is able to process the request
+ *   but has chosen not to respond.
+ *
+ * @package simplesamlphp/saml2
+ */
+class RequestDeniedException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Request denied.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestUnsupportedException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestUnsupportedException.php
new file mode 100644
index 0000000000000000000000000000000000000000..9b84b21ffaed8efcf1e986ce59d400a4ebcae518
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestUnsupportedException.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the SAML responder or SAML authority does not support the request.
+ *
+ * @package simplesamlphp/saml2
+ */
+class RequestUnsupportedException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Unsupported request.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionDeprecatedException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionDeprecatedException.php
new file mode 100644
index 0000000000000000000000000000000000000000..12573c2cfd77016de2753ae95a36cb76891e46e7
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionDeprecatedException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the SAML responder cannot any requests with the protocol
+ *   version specified in the request.
+ *
+ * @package simplesamlphp/saml2
+ */
+class RequestVersionDeprecatedException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Deprecated version used.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionTooHighException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionTooHighException.php
new file mode 100644
index 0000000000000000000000000000000000000000..ebc704d8c20c921bf4901d101a19051176cc70cc
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionTooHighException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the SAML responder cannot process the request because the protocol version
+ *   specified in the request message is a major upgrade from the highest protocol version supported.
+ *
+ * @package simplesamlphp/saml2
+ */
+class RequestVersionTooHighException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Protocol version too high.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionTooLowException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionTooLowException.php
new file mode 100644
index 0000000000000000000000000000000000000000..bd382e6cea17d95771d05274c91e18ff832e566c
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/RequestVersionTooLowException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the SAML responder cannot process the request because the protocol
+ *   version specified in the request message is too low.
+ *
+ * @package simplesamlphp/saml2
+ */
+class RequestVersionTooLowException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Protocol version too low.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/ResourceNotRecognizedException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/ResourceNotRecognizedException.php
new file mode 100644
index 0000000000000000000000000000000000000000..452b9d267056ca8f9ada7a5843677670da7c460f
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/ResourceNotRecognizedException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the resource value provided in the request
+ *   message is invalid or unrecognized.
+ *
+ * @package simplesamlphp/saml2
+ */
+class ResourceNotRecognizedException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Resource not recognized.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/TooManyResponsesException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/TooManyResponsesException.php
new file mode 100644
index 0000000000000000000000000000000000000000..93c9bc66ba49796abbcbcc8a601d288deef7c344
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/TooManyResponsesException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the response message would contain more elements than
+ *   the SAML responder is able to return.
+ *
+ * @package simplesamlphp/saml2
+ */
+class TooManyResponsesException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Too many responses.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnknownAttrProfileException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnknownAttrProfileException.php
new file mode 100644
index 0000000000000000000000000000000000000000..8afb94c5b195c90f2bc40c4e607bd0111f030549
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnknownAttrProfileException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that an entity that has no knowledge of a particular attribute profile
+ *   has been presented with an attribute drawn from that profile.
+ *
+ * @package simplesamlphp/saml2
+ */
+class UnknownAttrProfileException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Unknown attribute profile.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnknownPrincipalException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnknownPrincipalException.php
new file mode 100644
index 0000000000000000000000000000000000000000..a7ba84d1f78634315c3d415659ebddb0303c6b35
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnknownPrincipalException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating the responding provider does not recognize the principal
+ *   specified or implied by the request.
+ *
+ * @package simplesamlphp/saml2
+ */
+class UnknownPrincipalException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Unknown principal.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnsupportedBindingException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnsupportedBindingException.php
new file mode 100644
index 0000000000000000000000000000000000000000..99d9e978f495147950313003284dac0f816a2025
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/Protocol/UnsupportedBindingException.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception\Protocol;
+
+use SAML2\Exception\ProtocolViolationException;
+
+/**
+ * A SAML error indicating that the SAML provider cannot properly fullfil the request using
+ *   the protocol binding specified in the request.
+ *
+ * @package simplesamlphp/saml2
+ */
+class UnsupportedBindingException extends ProtocolViolationException
+{
+    /**
+     * @param string $message
+     */
+    public function __construct(string $message = 'Unsupported binding.')
+    {
+        parent::__construct($message);
+    }
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/ProtocolViolationException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/ProtocolViolationException.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9bbcbe9d2cd390e7f72f4c388373a4cb6dfc799
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/ProtocolViolationException.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SAML2\Exception;
+
+/**
+ * This exception may be raised when a violation of the SAML2 is detected
+ *
+ * @package simplesamlphp/saml2
+ */
+class ProtocolViolationException extends RuntimeException
+{
+}
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/RuntimeException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/RuntimeException.php
index 6e96d3658fdeaea504bc1207aa7edc500a4a9d49..841e30fd486fd5303a778f126f3d763e0eeff5f7 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Exception/RuntimeException.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/RuntimeException.php
@@ -4,9 +4,11 @@
 
 namespace SAML2\Exception;
 
+use RuntimeException as BuiltinRuntimeException;
+
 /**
  * Named exception
  */
-class RuntimeException extends \RuntimeException implements Throwable
+class RuntimeException extends BuiltinRuntimeException implements Throwable
 {
 }
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Exception/UnparseableXmlException.php b/vendor/simplesamlphp/saml2/src/SAML2/Exception/UnparseableXmlException.php
index b41b3bb2c047a80fa8c8f35160ee9682130aa4b7..44182cdcb98c7a36938d5d01d1c08709eaf0cbea 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Exception/UnparseableXmlException.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Exception/UnparseableXmlException.php
@@ -4,7 +4,7 @@
 
 namespace SAML2\Exception;
 
-use \LibXMLError;
+use LibXMLError;
 
 final class UnparseableXmlException extends RuntimeException
 {
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/HTTPArtifact.php b/vendor/simplesamlphp/saml2/src/SAML2/HTTPArtifact.php
index 23e26e02e0dce98b1302b95ab323bdb3ed8dfa6d..0e87e45a572d007770aa619b7f770b5c04af0dcc 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/HTTPArtifact.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/HTTPArtifact.php
@@ -66,8 +66,8 @@ public function getRedirectURL(Message $message) : string
         if ($destination === null) {
             throw new \Exception('Cannot get redirect URL, no destination set in the message.');
         }
-        /** @psalm-suppress UndefinedClass */
-        return HTTP::addURLparameters($destination, $params);
+        $httpUtils = new HTTP();
+        return $httpUtils->addURLparameters($destination, $params);
     }
 
 
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/LogoutRequest.php b/vendor/simplesamlphp/saml2/src/SAML2/LogoutRequest.php
index 4e0694b0d88a052ca09404de4971de2834f9c02a..2ad66d4353eb47b59e1e73887ad427cb58e58b8c 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/LogoutRequest.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/LogoutRequest.php
@@ -47,6 +47,15 @@ class LogoutRequest extends Request
      */
     private $sessionIndexes = [];
 
+    /**
+     * The optional reason for the logout, typically a URN
+     * See \SAML2\Constants::LOGOUT_REASON_*
+     * From the standard section 3.7.3: "other values MAY be agreed on between participants"
+     *
+     * @var string|null
+     */
+    protected $reason = null;
+
 
     /**
      * Constructor for SAML 2 logout request messages.
@@ -68,6 +77,10 @@ public function __construct(DOMElement $xml = null)
             $this->notOnOrAfter = Utils::xsDateTimeToTimestamp($xml->getAttribute('NotOnOrAfter'));
         }
 
+        if ($xml->hasAttribute('Reason')) {
+            $this->reason = $xml->getAttribute('Reason');
+        }
+
         /** @var \DOMElement[] $nameId */
         $nameId = Utils::xpQuery($xml, './saml_assertion:NameID | ./saml_assertion:EncryptedID/xenc:EncryptedData');
         if (empty($nameId)) {
@@ -112,6 +125,28 @@ public function setNotOnOrAfter(int $notOnOrAfter = null) : void
         $this->notOnOrAfter = $notOnOrAfter;
     }
 
+    /**
+     * Retrieve the reason for this request.
+     *
+     * @return string|null The reason for this request.
+     */
+    public function getReason(): ?string
+    {
+        return $this->reason;
+    }
+
+
+    /**
+     * Set the reason for this request.
+     *
+     * @param string|null $reason The optional reason for this request in URN format
+     * @return void
+     */
+    public function setReason($reason = null): void
+    {
+        $this->reason = $reason;
+    }
+
 
     /**
      * Check whether the NameId is encrypted.
@@ -287,6 +322,10 @@ public function toUnsignedXML() : DOMElement
             $root->setAttribute('NotOnOrAfter', gmdate('Y-m-d\TH:i:s\Z', $this->notOnOrAfter));
         }
 
+        if ($this->reason !== null) {
+            $root->setAttribute('Reason', $this->reason);
+        }
+
         if ($this->encryptedNameId === null) {
             $this->nameId->toXML($root);
         } else {
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/SOAP.php b/vendor/simplesamlphp/saml2/src/SAML2/SOAP.php
index e54b27b419d5d256f5a7cd72467b8f28a49fcd66..1a442a87bdb119c7f07d6ac5646c171aa53adbc9 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/SOAP.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/SOAP.php
@@ -6,6 +6,7 @@
 
 use DOMDocument;
 
+use SAML2\Exception\Protocol\UnsupportedBindingException;
 use SAML2\XML\ecp\Response as ECPResponse;
 
 /**
@@ -101,8 +102,8 @@ public function receive() : Message
     {
         $postText = $this->getInputStream();
 
-        if ($postText === false) {
-            throw new \Exception('Invalid message received to AssertionConsumerService endpoint.');
+        if (empty($postText)) {
+            throw new UnsupportedBindingException('Invalid message received at AssertionConsumerService endpoint.');
         }
 
         $document = DOMDocumentFactory::fromString($postText);
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/SOAPClient.php b/vendor/simplesamlphp/saml2/src/SAML2/SOAPClient.php
index 3bb08639e9dca49e26d503363e29585b8c96efed..01812dc5f50c8ddb3f123f20a0ff9b3bbb070176 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/SOAPClient.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/SOAPClient.php
@@ -5,15 +5,17 @@
 namespace SAML2;
 
 use DOMDocument;
+use Exception;
 use RobRichards\XMLSecLibs\XMLSecurityKey;
+use SAML2\Compat\ContainerSingleton;
+use SAML2\Exception\RuntimeException;
 use SAML2\Exception\InvalidArgumentException;
 use SAML2\Exception\UnparseableXmlException;
 use SimpleSAML\Configuration;
 use SimpleSAML\Utils\Config;
 use SimpleSAML\Utils\Crypto;
-
-use SAML2\Compat\ContainerSingleton;
-use SAML2\Exception\RuntimeException;
+//use SoapClient as BuiltinSoapClient;
+use SOAP_1_1;
 
 /**
  * Implementation of the SAML 2.0 SOAP binding.
@@ -131,16 +133,15 @@ public function send(Message $msg, Configuration $srcMetadata, Configuration $ds
         $container->debugMessage($request, 'out');
 
         $action = 'http://www.oasis-open.org/committees/security';
-        $version = SOAP_1_1;
         $destination = $msg->getDestination();
         if ($destination === null) {
-            throw new \Exception('Cannot send SOAP message, no destination set.');
+            throw new Exception('Cannot send SOAP message, no destination set.');
         }
 
         /* Perform SOAP Request over HTTP */
-        $soapresponsexml = $x->__doRequest($request, $destination, $action, $version);
+        $soapresponsexml = $x->__doRequest($request, $destination, $action, SOAP_1_1);
         if (empty($soapresponsexml)) {
-            throw new \Exception('Empty SOAP response, check peer certificate.');
+            throw new Exception('Empty SOAP response, check peer certificate.');
         }
 
         Utils::getContainer()->debugMessage($soapresponsexml, 'in');
@@ -149,17 +150,17 @@ public function send(Message $msg, Configuration $srcMetadata, Configuration $ds
         try {
             $dom = DOMDocumentFactory::fromString($soapresponsexml);
         } catch (InvalidArgumentException | UnparseableXmlException | RuntimeException $e) {
-            throw new \Exception($e->getMessage(), 0, $e);
+            throw new Exception($e->getMessage(), 0, $e);
         }
         $soapresponse = Utils::xpQuery($dom->firstChild, '/soap-env:Envelope/soap-env:Body/*[1]');
         if (empty($soapresponse)) {
-            throw new \Exception('Not a SOAP response', 0);
+            throw new Exception('Not a SOAP response', 0);
         }
         $container->debugMessage($dom->documentElement, 'in');
 
         $soapfault = $this->getSOAPFault($dom);
         if (isset($soapfault)) {
-            throw new \Exception($soapfault);
+            throw new Exception($soapfault);
         }
         //Extract the message from the response
         /** @var \DOMElement[] $samlresponse */
@@ -228,11 +229,11 @@ public static function validateSSL(string $data, XMLSecurityKey $key) : void
         /** @psalm-suppress PossiblyNullArgument */
         $keyInfo = openssl_pkey_get_details($key->key);
         if ($keyInfo === false) {
-            throw new \Exception('Unable to get key details from XMLSecurityKey.');
+            throw new Exception('Unable to get key details from XMLSecurityKey.');
         }
 
         if (!isset($keyInfo['key'])) {
-            throw new \Exception('Missing key in public key details.');
+            throw new Exception('Missing key in public key details.');
         }
 
         if ($keyInfo['key'] !== $data) {
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Utilities/ArrayCollection.php b/vendor/simplesamlphp/saml2/src/SAML2/Utilities/ArrayCollection.php
index a6252f5aec491b769bfa4f6ce93e7e5b51a68d6a..355c0d6f5babbb12d3c0ad06b0f9094b8ab37d5b 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Utilities/ArrayCollection.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Utilities/ArrayCollection.php
@@ -32,13 +32,13 @@ public function __construct(array $elements = [])
 
 
     /**
-     * @param mixed $element
+     * @param mixed $key
      *
      * @return void
      */
-    public function add($element) : void
+    public function add($key) : void
     {
-        $this->elements[] = $element;
+        $this->elements[] = $key;
     }
 
 
@@ -58,9 +58,9 @@ public function get($key)
      *
      * @return ArrayCollection
      */
-    public function filter(Closure $f) : Collection
+    public function filter(Closure $filterFunction) : Collection
     {
-        return new self(array_filter($this->elements, $f));
+        return new self(array_filter($this->elements, $filterFunction));
     }
 
 
@@ -76,17 +76,17 @@ public function set($key, $value) : void
 
 
     /**
-     * @param mixed $element
+     * @param mixed $key
      *
      * @return void
      */
-    public function remove($element) : void
+    public function remove($key) : void
     {
-        $key = array_search($element, $this->elements);
-        if ($key === false) {
+        $elt = array_search($key, $this->elements);
+        if ($elt === false) {
             return;
         }
-        unset($this->elements[$key]);
+        unset($this->elements[$elt]);
     }
 
 
@@ -171,6 +171,7 @@ public function offsetExists($offset) : bool
      *
      * @return mixed
      */
+    #[\ReturnTypeWillChange]
     public function offsetGet($offset)
     {
         return $this->elements[$offset];
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Utilities/Collection.php b/vendor/simplesamlphp/saml2/src/SAML2/Utilities/Collection.php
index 7b176503ea7a9a585d4c930d5d583a27e7810ac8..7f098b84f473645bfade3ed8b6fb77dad0f3e964 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Utilities/Collection.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Utilities/Collection.php
@@ -11,11 +11,11 @@ interface Collection extends \ArrayAccess, \Countable, \IteratorAggregate
     /**
      * Add an element to the collection
      *
-     * @param mixed $element
+     * @param mixed $key
      *
      * @return void
      */
-    public function add($element) : void;
+    public function add($key) : void;
 
 
     /**
@@ -77,7 +77,7 @@ public function get($key);
      * @param mixed $element
      * @return void
      */
-    public function remove($element) : void;
+    public function remove($key) : void;
 
 
     /**
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/Utils.php b/vendor/simplesamlphp/saml2/src/SAML2/Utils.php
index e894a3eb58145d6a0bf1bca525aa290149dc488f..2d84dd480d8954114ffcebb0d430239f341fe72f 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/Utils.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/Utils.php
@@ -20,6 +20,7 @@
 use SAML2\XML\ds\KeyInfo;
 use SAML2\XML\ds\X509Certificate;
 use SAML2\XML\ds\X509Data;
+use SAML2\XML\ds\KeyName;
 use SAML2\XML\md\KeyDescriptor;
 
 /**
@@ -649,23 +650,34 @@ public static function addStrings(
     /**
      * Create a KeyDescriptor with the given certificate.
      *
-     * @param string $x509Data The certificate, as a base64-encoded DER data.
+     * @param string|null $x509Data The certificate, as a base64-encoded DER data.
+     * @param string|null $keyName The name of the key as specified in the KeyInfo
      * @return \SAML2\XML\md\KeyDescriptor The keydescriptor.
      */
-    public static function createKeyDescriptor(string $x509Data) : KeyDescriptor
+    public static function createKeyDescriptor(?string $x509Data = null, ?string $keyName = null) : KeyDescriptor
     {
-        $x509Certificate = new X509Certificate();
-        $x509Certificate->setCertificate($x509Data);
-
-        $x509Data = new X509Data();
-        $x509Data->addData($x509Certificate);
+        if ($keyName === null && $x509Data === null) {
+            throw new \Exception('KeyDescriptor should contain either x509Data and/or keyName!');
+        }
 
         $keyInfo = new KeyInfo();
-        $keyInfo->addInfo($x509Data);
+
+        if ($keyName !== null) {
+            $keynameEl = new KeyName();
+            $keynameEl->setName($keyName);
+            $keyInfo->addInfo($keynameEl);
+        }
+
+        if ($x509Data !== null) {
+            $x509Certificate = new X509Certificate();
+            $x509Certificate->setCertificate($x509Data);
+            $x509Data = new X509Data();
+            $x509Data->addData($x509Certificate);
+            $keyInfo->addInfo($x509Data);
+        }
 
         $keyDescriptor = new KeyDescriptor();
         $keyDescriptor->setKeyInfo($keyInfo);
-
         return $keyDescriptor;
     }
 
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/XML/Chunk.php b/vendor/simplesamlphp/saml2/src/SAML2/XML/Chunk.php
index 88b05c2b1e81778898242d4df024f3ca3096526e..72db68a55fdf94f0292cf937e001c0b7533044ea 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/XML/Chunk.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/XML/Chunk.php
@@ -8,13 +8,14 @@
 
 use SAML2\DOMDocumentFactory;
 use SAML2\Utils;
+use Serializable;
 
 /**
  * Serializable class used to hold an XML element.
  *
  * @package SimpleSAMLphp
  */
-class Chunk implements \Serializable
+class Chunk implements Serializable
 {
     /**
      * The localName of the element.
@@ -131,7 +132,7 @@ public function serialize() : string
         return serialize($this->xml->ownerDocument->saveXML($this->xml));
     }
 
-    
+
     /**
      * Un-serialize this XML chunk.
      *
@@ -147,4 +148,41 @@ public function unserialize($serialized) : void
         $this->setLocalName($this->xml->localName);
         $this->setNamespaceURI($this->xml->namespaceURI);
     }
+
+
+
+    /**
+     * Serialize this XML chunk.
+     *
+     * This method will be invoked by any calls to serialize().
+     *
+     * @return array The serialized representation of this XML object.
+     */
+    public function __serialize(): array
+    {
+        $xml = $this->getXML();
+        /** @psalm-var \DOMDocument $xml->ownerDocument */
+        return [$xml->ownerDocument->saveXML($xml)];
+    }
+
+
+    /**
+     * Unserialize an XML object and load it..
+     *
+     * This method will be invoked by any calls to unserialize(), allowing us to restore any data that might not
+     * be serializable in its original form (e.g.: DOM objects).
+     *
+     * @param array $vars The XML object that we want to restore.
+     */
+    public function __unserialize(array $serialized): void
+    {
+        $xml = new self(
+            DOMDocumentFactory::fromString(array_pop($serialized))->documentElement
+        );
+
+        $vars = get_object_vars($xml);
+        foreach ($vars as $k => $v) {
+            $this->$k = $v;
+        }
+    }
 }
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/XML/ds/X509Certificate.php b/vendor/simplesamlphp/saml2/src/SAML2/XML/ds/X509Certificate.php
index dabc1f949c62d1b9bd0b86acd2200991d21d1664..979c16343ee1e6b4e7e0d28f0cd26c5e36675fd4 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/XML/ds/X509Certificate.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/XML/ds/X509Certificate.php
@@ -46,7 +46,7 @@ public function __construct(DOMElement $xml = null)
      */
     public function getCertificate() : string
     {
-        return $this->certificate;
+        return str_replace(["\r\n", "\r", "\n", "\t", ' '], '', $this->certificate);
     }
 
 
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/XML/ecp/Response.php b/vendor/simplesamlphp/saml2/src/SAML2/XML/ecp/Response.php
index dd0d32cf593e3e808e76f58e2e36569288629b56..ab4558e93075d6f68cf296187492c4f08ab9fb13 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/XML/ecp/Response.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/XML/ecp/Response.php
@@ -72,7 +72,7 @@ public function getAssertionConsumerServiceURL() : string
      * @param string $assertionConsumerServiceURL
      * @throws InvalidArgumentException
      * @return void
-     */
+-     */
     public function setAssertionConsumerServiceURL(string $assertionConsumerServiceURL) : void
     {
         if (!filter_var($assertionConsumerServiceURL, FILTER_VALIDATE_URL)) {
@@ -91,7 +91,8 @@ public function setAssertionConsumerServiceURL(string $assertionConsumerServiceU
      */
     public function toXML(DOMElement $parent) : DOMElement
     {
-        if (!is_string($this->getAssertionConsumerServiceURL())) {
+        $acs = $this->getAssertionConsumerServiceURL();
+        if (!isset($acs)) {
             throw new InvalidArgumentException("AssertionConsumerServiceURL must be a string");
         }
 
@@ -102,7 +103,7 @@ public function toXML(DOMElement $parent) : DOMElement
 
         $response->setAttributeNS(Constants::NS_SOAP, 'SOAP-ENV:mustUnderstand', '1');
         $response->setAttributeNS(Constants::NS_SOAP, 'SOAP-ENV:actor', 'http://schemas.xmlsoap.org/soap/actor/next');
-        $response->setAttribute('AssertionConsumerServiceURL', $this->getAssertionConsumerServiceURL());
+        $response->setAttribute('AssertionConsumerServiceURL', $acs);
 
         return $response;
     }
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/XML/md/ContactPerson.php b/vendor/simplesamlphp/saml2/src/SAML2/XML/md/ContactPerson.php
index 2ad70685483d79329b28a4e201ea7fd18ff1d645..7e230a71ad3d9ca39e64df0293ef560fb2005174 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/XML/md/ContactPerson.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/XML/md/ContactPerson.php
@@ -17,6 +17,17 @@
  */
 class ContactPerson
 {
+    /**
+     * The several different contact types as defined per specification
+     */
+    public const CONTACT_TYPES = [
+        'technical',
+        'support',
+        'administrative',
+        'billing',
+        'other',
+    ];
+
     /**
      * The contact type.
      *
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/XML/saml/AttributeValue.php b/vendor/simplesamlphp/saml2/src/SAML2/XML/saml/AttributeValue.php
index 3159f79c98cc7c3311af349538cc886f1aea1c78..acb09e08ad12c7fc5132f047f639c6eaab482831 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/XML/saml/AttributeValue.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/XML/saml/AttributeValue.php
@@ -10,13 +10,14 @@
 use SAML2\Constants;
 use SAML2\DOMDocumentFactory;
 use SAML2\Utils;
+use Serializable;
 
 /**
  * Serializable class representing an AttributeValue.
  *
  * @package SimpleSAMLphp
  */
-class AttributeValue implements \Serializable
+class AttributeValue implements Serializable
 {
     /**
      * The raw \DOMElement representing this value.
@@ -154,4 +155,39 @@ public function unserialize($serialized) : void
         $doc = DOMDocumentFactory::fromString(unserialize($serialized));
         $this->element = $doc->documentElement;
     }
+
+
+
+    /**
+     * Serialize this XML chunk.
+     *
+     * This method will be invoked by any calls to serialize().
+     *
+     * @return array The serialized representation of this XML object.
+     */
+    public function __serialize(): array
+    {
+        return [$this->element->ownerDocument->saveXML($this->element)];
+    }
+
+
+    /**
+     * Unserialize an XML object and load it..
+     *
+     * This method will be invoked by any calls to unserialize(), allowing us to restore any data that might not
+     * be serializable in its original form (e.g.: DOM objects).
+     *
+     * @param array $vars The XML object that we want to restore.
+     */
+    public function __unserialize(array $serialized): void
+    {
+        $xml = new self(
+            DOMDocumentFactory::fromString(array_pop($serialized))->documentElement
+        );
+
+        $vars = get_object_vars($xml);
+        foreach ($vars as $k => $v) {
+            $this->$k = $v;
+        }
+    }
 }
diff --git a/vendor/simplesamlphp/saml2/src/SAML2/XML/saml/BaseIDType.php b/vendor/simplesamlphp/saml2/src/SAML2/XML/saml/BaseIDType.php
index 0eb118e621d854e252bd0311b797208b6416dee6..a04ea5a5f25fad16a91288f108bff90b3d0654d8 100644
--- a/vendor/simplesamlphp/saml2/src/SAML2/XML/saml/BaseIDType.php
+++ b/vendor/simplesamlphp/saml2/src/SAML2/XML/saml/BaseIDType.php
@@ -12,7 +12,6 @@
 namespace SAML2\XML\saml;
 
 use DOMElement;
-
 use SAML2\Constants;
 use SAML2\DOMDocumentFactory;
 
@@ -47,11 +46,6 @@ abstract class BaseIDType
      */
     protected $nodeName;
 
-    /**
-     * @var \DOMElement
-     */
-    protected $element;
-
 
     /**
      * Initialize a saml:BaseID, either from scratch or from an existing \DOMElement.
@@ -64,8 +58,6 @@ public function __construct(DOMElement $xml = null)
             return;
         }
 
-        $this->element = $xml;
-
         if ($xml->hasAttribute('NameQualifier')) {
             $this->NameQualifier = $xml->getAttribute('NameQualifier');
         }
diff --git a/vendor/simplesamlphp/saml2/tests/resources/stubs/soap.php b/vendor/simplesamlphp/saml2/tests/resources/stubs/soap.php
new file mode 100644
index 0000000000000000000000000000000000000000..b941db9eb5fc6f1c42cfa2ef846c72acbce5eb28
--- /dev/null
+++ b/vendor/simplesamlphp/saml2/tests/resources/stubs/soap.php
@@ -0,0 +1,882 @@
+<?php
+
+// Start of soap v.
+
+/**
+ * The SoapClient class provides a client for SOAP 1.1, SOAP 1.2 servers. It can be used in WSDL
+ * or non-WSDL mode.
+ * @link http://php.net/manual/en/class.soapclient.php
+ */
+class SoapClient  {
+
+	/**
+	 * SoapClient constructor
+	 * @link http://php.net/manual/en/soapclient.soapclient.php
+	 * @param mixed $wsdl <p>
+	 * URI of the WSDL file or <b>NULL</b> if working in
+	 * non-WSDL mode.
+	 * </p>
+	 * <p>
+	 * During development, WSDL caching may be disabled by the
+	 * use of the soap.wsdl_cache_ttl <i>php.ini</i> setting
+	 * otherwise changes made to the WSDL file will have no effect until
+	 * soap.wsdl_cache_ttl is expired.
+	 * </p>
+	 * @param array $options [optional] <p>
+	 * An array of options. If working in WSDL mode, this parameter is optional.
+	 * If working in non-WSDL mode, the location and
+	 * uri options must be set, where location
+	 * is the URL of the SOAP server to send the request to, and uri
+	 * is the target namespace of the SOAP service.
+	 * </p>
+	 * <p>
+	 * The style and use options only work in
+	 * non-WSDL mode. In WSDL mode, they come from the WSDL file.
+	 * </p>
+	 * <p>
+	 * The soap_version option should be one of either
+	 * <b>SOAP_1_1</b> or <b>SOAP_1_2</b> to
+	 * select SOAP 1.1 or 1.2, respectively. If omitted, 1.1 is used.
+	 * </p>
+	 * <p>
+	 * For HTTP authentication, the login and
+	 * password options can be used to supply credentials.
+	 * For making an HTTP connection through
+	 * a proxy server, the options proxy_host,
+	 * proxy_port, proxy_login
+	 * and proxy_password are also available.
+	 * For HTTPS client certificate authentication use
+	 * local_cert and passphrase options. An
+	 * authentication may be supplied in the authentication
+	 * option. The authentication method may be either
+	 * <b>SOAP_AUTHENTICATION_BASIC</b> (default) or
+	 * <b>SOAP_AUTHENTICATION_DIGEST</b>.
+	 * </p>
+	 * <p>
+	 * The compression option allows to use compression
+	 * of HTTP SOAP requests and responses.
+	 * </p>
+	 * <p>
+	 * The encoding option defines internal character
+	 * encoding. This option does not change the encoding of SOAP requests (it is
+	 * always utf-8), but converts strings into it.
+	 * </p>
+	 * <p>
+	 * The trace option enables tracing of request so faults
+	 * can be backtraced. This defaults to <b>FALSE</b>
+	 * </p>
+	 * <p>
+	 * The classmap option can be used to map some WSDL
+	 * types to PHP classes. This option must be an array with WSDL types
+	 * as keys and names of PHP classes as values.
+	 * </p>
+	 * <p>
+	 * Setting the boolean trace option enables use of the
+	 * methods
+	 * SoapClient->__getLastRequest,
+	 * SoapClient->__getLastRequestHeaders,
+	 * SoapClient->__getLastResponse and
+	 * SoapClient->__getLastResponseHeaders.
+	 * </p>
+	 * <p>
+	 * The exceptions option is a boolean value defining whether
+	 * soap errors throw exceptions of type
+	 * SoapFault.
+	 * </p>
+	 * <p>
+	 * The connection_timeout option defines a timeout in seconds
+	 * for the connection to the SOAP service. This option does not define a timeout
+	 * for services with slow responses. To limit the time to wait for calls to finish the
+	 * default_socket_timeout setting
+	 * is available.
+	 * </p>
+	 * <p>
+	 * The typemap option is an array of type mappings.
+	 * Type mapping is an array with keys type_name,
+	 * type_ns (namespace URI), from_xml
+	 * (callback accepting one string parameter) and to_xml
+	 * (callback accepting one object parameter).
+	 * </p>
+	 * <p>
+	 * The cache_wsdl option is one of
+	 * <b>WSDL_CACHE_NONE</b>,
+	 * <b>WSDL_CACHE_DISK</b>,
+	 * <b>WSDL_CACHE_MEMORY</b> or
+	 * <b>WSDL_CACHE_BOTH</b>.
+	 * </p>
+	 * <p>
+	 * The user_agent option specifies string to use in
+	 * User-Agent header.
+	 * </p>
+	 * <p>
+	 * The stream_context option is a resource
+	 * for context.
+	 * </p>
+	 * <p>
+	 * The features option is a bitmask of
+	 * <b>SOAP_SINGLE_ELEMENT_ARRAYS</b>,
+	 * <b>SOAP_USE_XSI_ARRAY_TYPE</b>,
+	 * <b>SOAP_WAIT_ONE_WAY_CALLS</b>.
+	 * </p>
+	 * <p>
+	 * The keep_alive option is a boolean value defining whether
+	 * to send the Connection: Keep-Alive header or
+	 * Connection: close.
+	 * </p>
+	 * <p>
+	 * The ssl_method option is one of
+	 * <b>SOAP_SSL_METHOD_TLS</b>,
+	 * <b>SOAP_SSL_METHOD_SSLv2</b>,
+	 * <b>SOAP_SSL_METHOD_SSLv3</b> or
+	 * <b>SOAP_SSL_METHOD_SSLv23</b>.
+	 * </p>
+	 * @since 5.0.1
+	 */
+	public function SoapClient ($wsdl, array $options = null) {}
+
+    /**
+     * SoapClient constructor
+     * @link http://php.net/manual/en/soapclient.soapclient.php
+     * @param mixed $wsdl <p>
+     * URI of the WSDL file or <b>NULL</b> if working in
+     * non-WSDL mode.
+     * </p>
+     * <p>
+     * During development, WSDL caching may be disabled by the
+     * use of the soap.wsdl_cache_ttl <i>php.ini</i> setting
+     * otherwise changes made to the WSDL file will have no effect until
+     * soap.wsdl_cache_ttl is expired.
+     * </p>
+     * @param array $options [optional] <p>
+     * An array of options. If working in WSDL mode, this parameter is optional.
+     * If working in non-WSDL mode, the location and
+     * uri options must be set, where location
+     * is the URL of the SOAP server to send the request to, and uri
+     * is the target namespace of the SOAP service.
+     * </p>
+     * <p>
+     * The style and use options only work in
+     * non-WSDL mode. In WSDL mode, they come from the WSDL file.
+     * </p>
+     * <p>
+     * The soap_version option should be one of either
+     * <b>SOAP_1_1</b> or <b>SOAP_1_2</b> to
+     * select SOAP 1.1 or 1.2, respectively. If omitted, 1.1 is used.
+     * </p>
+     * <p>
+     * For HTTP authentication, the login and
+     * password options can be used to supply credentials.
+     * For making an HTTP connection through
+     * a proxy server, the options proxy_host,
+     * proxy_port, proxy_login
+     * and proxy_password are also available.
+     * For HTTPS client certificate authentication use
+     * local_cert and passphrase options. An
+     * authentication may be supplied in the authentication
+     * option. The authentication method may be either
+     * <b>SOAP_AUTHENTICATION_BASIC</b> (default) or
+     * <b>SOAP_AUTHENTICATION_DIGEST</b>.
+     * </p>
+     * <p>
+     * The compression option allows to use compression
+     * of HTTP SOAP requests and responses.
+     * </p>
+     * <p>
+     * The encoding option defines internal character
+     * encoding. This option does not change the encoding of SOAP requests (it is
+     * always utf-8), but converts strings into it.
+     * </p>
+     * <p>
+     * The trace option enables tracing of request so faults
+     * can be backtraced. This defaults to <b>FALSE</b>
+     * </p>
+     * <p>
+     * The classmap option can be used to map some WSDL
+     * types to PHP classes. This option must be an array with WSDL types
+     * as keys and names of PHP classes as values.
+     * </p>
+     * <p>
+     * Setting the boolean trace option enables use of the
+     * methods
+     * SoapClient->__getLastRequest,
+     * SoapClient->__getLastRequestHeaders,
+     * SoapClient->__getLastResponse and
+     * SoapClient->__getLastResponseHeaders.
+     * </p>
+     * <p>
+     * The exceptions option is a boolean value defining whether
+     * soap errors throw exceptions of type
+     * SoapFault.
+     * </p>
+     * <p>
+     * The connection_timeout option defines a timeout in seconds
+     * for the connection to the SOAP service. This option does not define a timeout
+     * for services with slow responses. To limit the time to wait for calls to finish the
+     * default_socket_timeout setting
+     * is available.
+     * </p>
+     * <p>
+     * The typemap option is an array of type mappings.
+     * Type mapping is an array with keys type_name,
+     * type_ns (namespace URI), from_xml
+     * (callback accepting one string parameter) and to_xml
+     * (callback accepting one object parameter).
+     * </p>
+     * <p>
+     * The cache_wsdl option is one of
+     * <b>WSDL_CACHE_NONE</b>,
+     * <b>WSDL_CACHE_DISK</b>,
+     * <b>WSDL_CACHE_MEMORY</b> or
+     * <b>WSDL_CACHE_BOTH</b>.
+     * </p>
+     * <p>
+     * The user_agent option specifies string to use in
+     * User-Agent header.
+     * </p>
+     * <p>
+     * The stream_context option is a resource
+     * for context.
+     * </p>
+     * <p>
+     * The features option is a bitmask of
+     * <b>SOAP_SINGLE_ELEMENT_ARRAYS</b>,
+     * <b>SOAP_USE_XSI_ARRAY_TYPE</b>,
+     * <b>SOAP_WAIT_ONE_WAY_CALLS</b>.
+     * </p>
+     * <p>
+     * The keep_alive option is a boolean value defining whether
+     * to send the Connection: Keep-Alive header or
+     * Connection: close.
+     * </p>
+     * <p>
+     * The ssl_method option is one of
+     * <b>SOAP_SSL_METHOD_TLS</b>,
+     * <b>SOAP_SSL_METHOD_SSLv2</b>,
+     * <b>SOAP_SSL_METHOD_SSLv3</b> or
+     * <b>SOAP_SSL_METHOD_SSLv23</b>.
+     * </p>
+     * @since 5.0.1
+     */
+    public function __construct ($wsdl, array $options = null) {}
+
+	/**
+	 * Calls a SOAP function (deprecated)
+	 * @link http://php.net/manual/en/soapclient.call.php
+	 * @param string $function_name
+	 * @param array $arguments
+	 * @return mixed
+	 * @since 5.0.1
+	 */
+	public function __call ($function_name, $arguments) {}
+
+	/**
+	 * Calls a SOAP function
+	 * @link http://php.net/manual/en/soapclient.soapcall.php
+	 * @param string $function_name <p>
+	 * The name of the SOAP function to call.
+	 * </p>
+	 * @param array $arguments <p>
+	 * An array of the arguments to pass to the function. This can be either
+	 * an ordered or an associative array. Note that most SOAP servers require
+	 * parameter names to be provided, in which case this must be an
+	 * associative array.
+	 * </p>
+	 * @param array $options [optional] <p>
+	 * An associative array of options to pass to the client.
+	 * </p>
+	 * <p>
+	 * The location option is the URL of the remote Web service.
+	 * </p>
+	 * <p>
+	 * The uri option is the target namespace of the SOAP service.
+	 * </p>
+	 * <p>
+	 * The soapaction option is the action to call.
+	 * </p>
+	 * @param mixed $input_headers [optional] <p>
+	 * An array of headers to be sent along with the SOAP request.
+	 * </p>
+	 * @param array $output_headers [optional] <p>
+	 * If supplied, this array will be filled with the headers from the SOAP response.
+	 * </p>
+	 * @return mixed SOAP functions may return one, or multiple values. If only one value is returned
+	 * by the SOAP function, the return value of __soapCall will be
+	 * a simple value (e.g. an integer, a string, etc). If multiple values are
+	 * returned, __soapCall will return
+	 * an associative array of named output parameters.
+	 * </p>
+	 * <p>
+	 * On error, if the SoapClient object was constructed with the exceptions
+	 * option set to <b>FALSE</b>, a SoapFault object will be returned.
+	 * @since 5.0.1
+	 */
+	public function __soapCall ($function_name, array $arguments, array $options = null, $input_headers = null, array &$output_headers = null) {}
+
+	/**
+	 * Returns last SOAP request
+	 * @link http://php.net/manual/en/soapclient.getlastrequest.php
+	 * @return string The last SOAP request, as an XML string.
+	 * @since 5.0.1
+	 */
+	public function __getLastRequest () {}
+
+	/**
+	 * Returns last SOAP response
+	 * @link http://php.net/manual/en/soapclient.getlastresponse.php
+	 * @return string The last SOAP response, as an XML string.
+	 * @since 5.0.1
+	 */
+	public function __getLastResponse () {}
+
+	/**
+	 * Returns the SOAP headers from the last request
+	 * @link http://php.net/manual/en/soapclient.getlastrequestheaders.php
+	 * @return string The last SOAP request headers.
+	 * @since 5.0.1
+	 */
+	public function __getLastRequestHeaders () {}
+
+	/**
+	 * Returns the SOAP headers from the last response
+	 * @link http://php.net/manual/en/soapclient.getlastresponseheaders.php
+	 * @return string The last SOAP response headers.
+	 * @since 5.0.1
+	 */
+	public function __getLastResponseHeaders () {}
+
+	/**
+	 * Returns list of available SOAP functions
+	 * @link http://php.net/manual/en/soapclient.getfunctions.php
+	 * @return array The array of SOAP function prototypes, detailing the return type,
+	 * the function name and type-hinted paramaters.
+	 * @since 5.0.1
+	 */
+	public function __getFunctions () {}
+
+	/**
+	 * Returns a list of SOAP types
+	 * @link http://php.net/manual/en/soapclient.gettypes.php
+	 * @return array The array of SOAP types, detailing all structures and types.
+	 * @since 5.0.1
+	 */
+	public function __getTypes () {}
+
+	/**
+	 * Performs a SOAP request
+	 * @link http://php.net/manual/en/soapclient.dorequest.php
+	 * @param string $request <p>
+	 * The XML SOAP request.
+	 * </p>
+	 * @param string $location <p>
+	 * The URL to request.
+	 * </p>
+	 * @param string $action <p>
+	 * The SOAP action.
+	 * </p>
+	 * @param int $version <p>
+	 * The SOAP version.
+	 * </p>
+	 * @param int $one_way [optional] <p>
+	 * If one_way is set to 1, this method returns nothing.
+	 * Use this where a response is not expected.
+	 * </p>
+	 * @return string The XML SOAP response.
+	 * @since 5.0.1
+	 */
+	public function __doRequest ($request, $location, $action, $version, $one_way = 0) {}
+
+	/**
+	 * The __setCookie purpose
+	 * @link http://php.net/manual/en/soapclient.setcookie.php
+	 * @param string $name <p>
+	 * The name of the cookie.
+	 * </p>
+	 * @param string $value [optional] <p>
+	 * The value of the cookie. If not specified, the cookie will be deleted.
+	 * </p>
+	 * @return void No value is returned.
+	 * @since 5.0.4
+	 */
+	public function __setCookie ($name, $value = null) {}
+
+	/**
+	 * Sets the location of the Web service to use
+	 * @link http://php.net/manual/en/soapclient.setlocation.php
+	 * @param string $new_location [optional] <p>
+	 * The new endpoint URL.
+	 * </p>
+	 * @return string The old endpoint URL.
+	 * @since 5.0.1
+	 */
+	public function __setLocation ($new_location = null) {}
+
+	/**
+	 * Sets SOAP headers for subsequent calls
+	 * @link http://php.net/manual/en/soapclient.setsoapheaders.php
+	 * @param mixed $soapheaders [optional] <p>
+	 * The headers to be set. It could be <b>SoapHeader</b>
+	 * object or array of <b>SoapHeader</b> objects.
+	 * If not specified or set to <b>NULL</b>, the headers will be deleted.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+	 * @since 5.0.5
+	 */
+	public function __setSoapHeaders ($soapheaders = null) {}
+
+}
+
+/**
+ * A class representing a variable or object for use with SOAP services.
+ * @link http://php.net/manual/en/class.soapvar.php
+ */
+class SoapVar  {
+
+	/**
+	 * SoapVar constructor
+	 * @link http://php.net/manual/en/soapvar.soapvar.php
+	 * @param mixed $data <p>
+	 * The data to pass or return.
+	 * </p>
+	 * @param string $encoding <p>
+	 * The encoding ID, one of the XSD_... constants.
+	 * </p>
+	 * @param string $type_name [optional] <p>
+	 * The type name.
+	 * </p>
+	 * @param string $type_namespace [optional] <p>
+	 * The type namespace.
+	 * </p>
+	 * @param string $node_name [optional] <p>
+	 * The XML node name.
+	 * </p>
+	 * @param string $node_namespace [optional] <p>
+	 * The XML node namespace.
+	 * </p>
+	 * @since 5.0.1
+	 */
+	public function SoapVar ($data, $encoding, $type_name = null, $type_namespace = null, $node_name = null, $node_namespace = null) {}
+
+}
+
+/**
+ * The SoapServer class provides a server for the SOAP 1.1 and SOAP 1.2 protocols. It can be used with or without a WSDL service description.
+ * @link http://php.net/manual/en/class.soapserver.php
+ */
+class SoapServer  {
+
+	/**
+	 * SoapServer constructor
+	 * @link http://php.net/manual/en/soapserver.soapserver.php
+	 * @param mixed $wsdl <p>
+	 * To use the SoapServer in WSDL mode, pass the URI of a WSDL file.
+	 * Otherwise, pass <b>NULL</b> and set the uri option to the
+	 * target namespace for the server.
+	 * </p>
+	 * @param array $options [optional] <p>
+	 * Allow setting a default SOAP version (soap_version),
+	 * internal character encoding (encoding),
+	 * and actor URI (actor).
+	 * </p>
+	 * <p>
+	 * The classmap option can be used to map some WSDL
+	 * types to PHP classes. This option must be an array with WSDL types
+	 * as keys and names of PHP classes as values.
+	 * </p>
+	 * <p>
+	 * The typemap option is an array of type mappings.
+	 * Type mapping is an array with keys type_name,
+	 * type_ns (namespace URI), from_xml
+	 * (callback accepting one string parameter) and to_xml
+	 * (callback accepting one object parameter).
+	 * </p>
+	 * <p>
+	 * The cache_wsdl option is one of
+	 * <b>WSDL_CACHE_NONE</b>,
+	 * <b>WSDL_CACHE_DISK</b>,
+	 * <b>WSDL_CACHE_MEMORY</b> or
+	 * <b>WSDL_CACHE_BOTH</b>.
+	 * </p>
+	 * <p>
+	 * There is also a features option which can be set to
+	 * <b>SOAP_WAIT_ONE_WAY_CALLS</b>,
+	 * <b>SOAP_SINGLE_ELEMENT_ARRAYS</b>,
+	 * <b>SOAP_USE_XSI_ARRAY_TYPE</b>.
+	 * </p>
+	 * @since 5.0.1
+	 */
+	public function SoapServer ($wsdl, array $options = null) {}
+
+	/**
+	 * Sets SoapServer persistence mode
+	 * @link http://php.net/manual/en/soapserver.setpersistence.php
+	 * @param int $mode <p>
+	 * One of the SOAP_PERSISTENCE_XXX constants.
+	 * </p>
+	 * <p>
+	 * <b>SOAP_PERSISTENCE_REQUEST</b> - SoapServer data does not persist between
+	 * requests. This is the default behavior of any SoapServer
+	 * object after setClass is called.
+	 * </p>
+	 * <p>
+	 * <b>SOAP_PERSISTENCE_SESSION</b> - SoapServer data persists between requests.
+	 * This is accomplished by serializing the SoapServer class data into
+	 * $_SESSION['_bogus_session_name'], because of this
+	 * <b>session_start</b> must be called before this persistence mode is set.
+	 * </p>
+	 * @return void No value is returned.
+	 * @since 5.1.2
+	 */
+	public function setPersistence ($mode) {}
+
+	/**
+	 * Sets the class which handles SOAP requests
+	 * @link http://php.net/manual/en/soapserver.setclass.php
+	 * @param string $class_name <p>
+	 * The name of the exported class.
+	 * </p>
+	 * @param mixed $args [optional] <p>
+	 * These optional parameters will be passed to the default class constructor
+	 * during object creation.
+	 * </p>
+	 * @param mixed $_ [optional]
+	 * @return void No value is returned.
+	 * @since 5.0.1
+	 */
+	public function setClass ($class_name, $args = null, $_ = null) {}
+
+	/**
+	 * Sets the object which will be used to handle SOAP requests
+	 * @link http://php.net/manual/en/soapserver.setobject.php
+	 * @param object $object <p>
+	 * The object to handle the requests.
+	 * </p>
+	 * @return void No value is returned.
+	 * @since 5.2.0
+	 */
+	public function setObject ($object) {}
+
+	/**
+	 * Adds one or more functions to handle SOAP requests
+	 * @link http://php.net/manual/en/soapserver.addfunction.php
+	 * @param mixed $functions <p>
+	 * To export one function, pass the function name into this parameter as
+	 * a string.
+	 * </p>
+	 * <p>
+	 * To export several functions, pass an array of function names.
+	 * </p>
+	 * <p>
+	 * To export all the functions, pass a special constant <b>SOAP_FUNCTIONS_ALL</b>.
+	 * </p>
+	 * <p>
+	 * <i>functions</i> must receive all input arguments in the same
+	 * order as defined in the WSDL file (They should not receive any output parameters
+	 * as arguments) and return one or more values. To return several values they must
+	 * return an array with named output parameters.
+	 * </p>
+	 * @return void No value is returned.
+	 * @since 5.0.1
+	 */
+	public function addFunction ($functions) {}
+
+	/**
+	 * Returns list of defined functions
+	 * @link http://php.net/manual/en/soapserver.getfunctions.php
+	 * @return array An array of the defined functions.
+	 * @since 5.0.1
+	 */
+	public function getFunctions () {}
+
+	/**
+	 * Handles a SOAP request
+	 * @link http://php.net/manual/en/soapserver.handle.php
+	 * @param string $soap_request [optional] <p>
+	 * The SOAP request. If this argument is omitted, the request is assumed to be
+	 * in the raw POST data of the HTTP request.
+	 * </p>
+	 * @return void No value is returned.
+	 * @since 5.0.1
+	 */
+	public function handle ($soap_request = null) {}
+
+	/**
+	 * Issue SoapServer fault indicating an error
+	 * @link http://php.net/manual/en/soapserver.fault.php
+	 * @param string $code <p>
+	 * The error code to return
+	 * </p>
+	 * @param string $string <p>
+	 * A brief description of the error
+	 * </p>
+	 * @param string $actor [optional] <p>
+	 * A string identifying the actor that caused the fault.
+	 * </p>
+	 * @param string $details [optional] <p>
+	 * More details of the fault
+	 * </p>
+	 * @param string $name [optional] <p>
+	 * The name of the fault. This can be used to select a name from a WSDL file.
+	 * </p>
+	 * @return void No value is returned.
+	 * @since 5.0.1
+	 */
+	public function fault ($code, $string, $actor = null, $details = null, $name = null) {}
+
+	/**
+	 * Add a SOAP header to the response
+	 * @link http://php.net/manual/en/soapserver.addsoapheader.php
+	 * @param SoapHeader $object <p>
+	 * The header to be returned.
+	 * </p>
+	 * @return void No value is returned.
+	 * @since 5.0.1
+	 */
+	public function addSoapHeader (SoapHeader $object) {}
+
+}
+
+/**
+ * Represents a SOAP fault.
+ * @link http://php.net/manual/en/class.soapfault.php
+ */
+class SoapFault extends Exception  {
+    /**
+     * @var string
+     */
+	public $faultcode;
+    /**
+     * @var string
+     */
+	public $faultstring;
+    /**
+     * @var string
+     */
+    public $faultactor;
+    /**
+     * @var mixed
+     */
+    public $detail;
+    /**
+     * @var string
+     */
+    public $faultname;
+    /**
+     * @var mixed
+     */
+    public $headerfault;
+
+	/**
+	 * SoapFault constructor
+	 * @link http://php.net/manual/en/soapfault.soapfault.php
+	 * @param string $faultcode <p>
+	 * The error code of the <b>SoapFault</b>.
+	 * </p>
+	 * @param string $faultstring <p>
+	 * The error message of the <b>SoapFault</b>.
+	 * </p>
+	 * @param string $faultactor [optional] <p>
+	 * A string identifying the actor that caused the error.
+	 * </p>
+	 * @param mixed $detail [optional] <p>
+	 * More details about the cause of the error.
+	 * </p>
+	 * @param string $faultname [optional] <p>
+	 * Can be used to select the proper fault encoding from WSDL.
+	 * </p>
+	 * @param mixed $headerfault [optional] <p>
+	 * Can be used during SOAP header handling to report an error in the
+	 * response header.
+	 * </p>
+	 * @since 5.0.1
+	 */
+	public function SoapFault ($faultcode, $faultstring, $faultactor = null, $detail = null, $faultname = null, $headerfault = null) {}
+
+	/**
+	 * Obtain a string representation of a SoapFault
+	 * @link http://php.net/manual/en/soapfault.tostring.php
+	 * @return string A string describing the SoapFault.
+	 * @since 5.0.1
+	 */
+	public function __toString () {}
+
+
+}
+
+/**
+ * Represents parameter to a SOAP call.
+ * @link http://php.net/manual/en/class.soapparam.php
+ */
+class SoapParam  {
+
+	/**
+	 * SoapParam constructor
+	 * @link http://php.net/manual/en/soapparam.soapparam.php
+	 * @param mixed $data <p>
+	 * The data to pass or return. This parameter can be passed directly as PHP
+	 * value, but in this case it will be named as paramN and
+	 * the SOAP service may not understand it.
+	 * </p>
+	 * @param string $name <p>
+	 * The parameter name.
+	 * </p>
+	 * @since 5.0.1
+	 */
+	public function SoapParam ($data, $name) {}
+
+}
+
+/**
+ * Represents a SOAP header.
+ * @link http://php.net/manual/en/class.soapheader.php
+ */
+class SoapHeader  {
+
+	/**
+	 * SoapHeader constructor
+	 * @link http://php.net/manual/en/soapheader.soapheader.php
+	 * @param string $namespace <p>
+	 * The namespace of the SOAP header element.
+	 * </p>
+	 * @param string $name <p>
+	 * The name of the SoapHeader object.
+	 * </p>
+	 * @param mixed $data [optional] <p>
+	 * A SOAP header's content. It can be a PHP value or a
+	 * <b>SoapVar</b> object.
+	 * </p>
+	 * @param bool $mustunderstand [optional]
+	 * @param string $actor [optional] <p>
+	 * Value of the actor attribute of the SOAP header
+	 * element.
+	 * </p>
+	 * @since 5.0.1
+	 */
+	public function SoapHeader ($namespace, $name, $data = null, $mustunderstand = false, $actor = null) {}
+
+}
+
+/**
+ * Set whether to use the SOAP error handler
+ * @link http://php.net/manual/en/function.use-soap-error-handler.php
+ * @param bool $handler [optional] <p>
+ * Set to <b>TRUE</b> to send error details to clients.
+ * </p>
+ * @return bool the original value.
+ */
+//function use_soap_error_handler ($handler = true) {}
+
+/**
+ * Checks if a SOAP call has failed
+ * @link http://php.net/manual/en/function.is-soap-fault.php
+ * @param mixed $object <p>
+ * The object to test.
+ * </p>
+ * @return bool This will return <b>TRUE</b> on error, and <b>FALSE</b> otherwise.
+ */
+//function is_soap_fault ($object) {}
+
+define ('SOAP_1_1', 1);
+define ('SOAP_1_2', 2);
+define ('SOAP_PERSISTENCE_SESSION', 1);
+define ('SOAP_PERSISTENCE_REQUEST', 2);
+define ('SOAP_FUNCTIONS_ALL', 999);
+define ('SOAP_ENCODED', 1);
+define ('SOAP_LITERAL', 2);
+define ('SOAP_RPC', 1);
+define ('SOAP_DOCUMENT', 2);
+define ('SOAP_ACTOR_NEXT', 1);
+define ('SOAP_ACTOR_NONE', 2);
+define ('SOAP_ACTOR_UNLIMATERECEIVER', 3);
+define ('SOAP_COMPRESSION_ACCEPT', 32);
+define ('SOAP_COMPRESSION_GZIP', 0);
+define ('SOAP_COMPRESSION_DEFLATE', 16);
+define ('SOAP_AUTHENTICATION_BASIC', 0);
+define ('SOAP_AUTHENTICATION_DIGEST', 1);
+define ('UNKNOWN_TYPE', 999998);
+define ('XSD_STRING', 101);
+define ('XSD_BOOLEAN', 102);
+define ('XSD_DECIMAL', 103);
+define ('XSD_FLOAT', 104);
+define ('XSD_DOUBLE', 105);
+define ('XSD_DURATION', 106);
+define ('XSD_DATETIME', 107);
+define ('XSD_TIME', 108);
+define ('XSD_DATE', 109);
+define ('XSD_GYEARMONTH', 110);
+define ('XSD_GYEAR', 111);
+define ('XSD_GMONTHDAY', 112);
+define ('XSD_GDAY', 113);
+define ('XSD_GMONTH', 114);
+define ('XSD_HEXBINARY', 115);
+define ('XSD_BASE64BINARY', 116);
+define ('XSD_ANYURI', 117);
+define ('XSD_QNAME', 118);
+define ('XSD_NOTATION', 119);
+define ('XSD_NORMALIZEDSTRING', 120);
+define ('XSD_TOKEN', 121);
+define ('XSD_LANGUAGE', 122);
+define ('XSD_NMTOKEN', 123);
+define ('XSD_NAME', 124);
+define ('XSD_NCNAME', 125);
+define ('XSD_ID', 126);
+define ('XSD_IDREF', 127);
+define ('XSD_IDREFS', 128);
+define ('XSD_ENTITY', 129);
+define ('XSD_ENTITIES', 130);
+define ('XSD_INTEGER', 131);
+define ('XSD_NONPOSITIVEINTEGER', 132);
+define ('XSD_NEGATIVEINTEGER', 133);
+define ('XSD_LONG', 134);
+define ('XSD_INT', 135);
+define ('XSD_SHORT', 136);
+define ('XSD_BYTE', 137);
+define ('XSD_NONNEGATIVEINTEGER', 138);
+define ('XSD_UNSIGNEDLONG', 139);
+define ('XSD_UNSIGNEDINT', 140);
+define ('XSD_UNSIGNEDSHORT', 141);
+define ('XSD_UNSIGNEDBYTE', 142);
+define ('XSD_POSITIVEINTEGER', 143);
+define ('XSD_NMTOKENS', 144);
+define ('XSD_ANYTYPE', 145);
+define ('XSD_ANYXML', 147);
+define ('APACHE_MAP', 200);
+define ('SOAP_ENC_OBJECT', 301);
+define ('SOAP_ENC_ARRAY', 300);
+define ('XSD_1999_TIMEINSTANT', 401);
+define ('XSD_NAMESPACE', "http://www.w3.org/2001/XMLSchema");
+define ('XSD_1999_NAMESPACE', "http://www.w3.org/1999/XMLSchema");
+define ('SOAP_SINGLE_ELEMENT_ARRAYS', 1);
+define ('SOAP_WAIT_ONE_WAY_CALLS', 2);
+define ('SOAP_USE_XSI_ARRAY_TYPE', 4);
+define ('WSDL_CACHE_NONE', 0);
+define ('WSDL_CACHE_DISK', 1);
+define ('WSDL_CACHE_MEMORY', 2);
+define ('WSDL_CACHE_BOTH', 3);
+
+/**
+ * @link http://php.net/manual/en/soap.constants.php
+ * @since 5.5.0
+ */
+define ('SOAP_SSL_METHOD_TLS', 0);
+
+/**
+ * @link http://php.net/manual/en/soap.constants.php
+ * @since 5.5.0
+ */
+define ('SOAP_SSL_METHOD_SSLv2', 1);
+
+/**
+ * @link http://php.net/manual/en/soap.constants.php
+ * @since 5.5.0
+ */
+define ('SOAP_SSL_METHOD_SSLv3', 2);
+
+/**
+ * @link http://php.net/manual/en/soap.constants.php
+ * @since 5.5.0
+ */
+define ('SOAP_SSL_METHOD_SSLv23', 3);
+
+// End of soap v.
+?>
+
diff --git a/vendor/simplesamlphp/simplesamlphp/.appveyor.yml b/vendor/simplesamlphp/simplesamlphp/.appveyor.yml
deleted file mode 100644
index 6bae47a324f13ecb5fa1dffc763fef214121741c..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/.appveyor.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-build: false
-shallow_clone: false
-version: '1.17.1.{build}'
-platform: 'x64'
-clone_folder: C:\projects\simplesamlphp
-
-environment:
-  matrix:
-    - PHP_VERSION: "5.6"
-    - PHP_VERSION: "7.0"
-    - PHP_VERSION: "7.1"
-    - PHP_VERSION: "7.2"
-    - PHP_VERSION: "7.3"
-
-install:
-  - ps: Invoke-WebRequest "https://raw.githubusercontent.com/ChadSikorra/ps-install-php/master/Install-PHP.ps1" -OutFile "Install-PHP.ps1"
-  - ps: .\Install-PHP.ps1 -Version $Env:PHP_VERSION -Highest -Arch x64 -Extensions mbstring,intl,openssl,curl,pdo_mysql,pdo_sqlite
-  - refreshenv
-  - cd C:\projects\simplesamlphp
-  - php -r "readfile('https://getcomposer.org/installer');" | php
-
-before_test:
-  - cd C:\projects\simplesamlphp
-  # For 2.0 (or once the externalized modules are no longer included), remove the --ignore-platform-reqs
-  - php composer.phar install --no-interaction --no-progress --optimize-autoloader --prefer-source --no-ansi --ignore-platform-reqs
-
-test_script:
-  - cd C:\projects\simplesamlphp
-  - vendor\bin\phpunit.bat
-  
diff --git a/vendor/simplesamlphp/simplesamlphp/.github/workflows/php.yml b/vendor/simplesamlphp/simplesamlphp/.github/workflows/php.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2819ca0b31fa107a5128e3b86b6be244bddfd40a
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/.github/workflows/php.yml
@@ -0,0 +1,202 @@
+name: CI
+
+on:
+  push:
+    branches: [ '**' ]
+  pull_request:
+    branches: [ master, release-* ]
+
+jobs:
+  basic-tests:
+    name: Syntax and unit tests, PHP ${{ matrix.php-versions }}, ${{ matrix.operating-system }}
+    runs-on: ${{ matrix.operating-system }}
+    strategy:
+      fail-fast: false
+      matrix:
+        operating-system: [ubuntu-latest, windows-latest]
+        php-versions: ['7.1', '7.2', '7.3', '7.4']
+
+    steps:
+      - name: Setup PHP, with composer and extensions
+        uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
+        with:
+          php-version: ${{ matrix.php-versions }}
+          extensions: mbstring, mysql, pdo, pdo_sqlite, xml
+          coverage: xdebug
+
+      - name: Setup problem matchers for PHP
+        run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
+
+      - name: Setup problem matchers for PHPUnit
+        run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
+
+      - name: Set git to use LF
+        run: |
+          git config --global core.autocrlf false
+          git config --global core.eol lf
+
+      - uses: actions/checkout@v2
+
+      - name: Get composer cache directory
+        id: composer-cache
+        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+      - name: Cache composer dependencies
+        uses: actions/cache@v1
+        with:
+          path: ${{ steps.composer-cache.outputs.dir }}
+          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+          restore-keys: ${{ runner.os }}-composer-
+
+      - name: Validate composer.json and composer.lock
+        run: composer validate
+
+      - name: Install Composer dependencies
+        run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader
+
+      - name: Syntax check PHP
+        run: bash vendor/bin/check-syntax-php.sh
+
+      - name: Decide whether to run code coverage or not
+        if: ${{ matrix.php-versions != '7.4' || matrix.operating-system != 'ubuntu-latest' }}
+        run: |
+          echo "NO_COVERAGE=--no-coverage" >> $GITHUB_ENV
+
+      - name: Run unit tests
+        run: |
+          echo $NO_COVERAGE
+          ./vendor/bin/phpunit $NO_COVERAGE
+
+      - name: Save coverage data
+        if: ${{ matrix.php-versions == '7.4' && matrix.operating-system == 'ubuntu-latest' }}
+        uses: actions/upload-artifact@v1
+        with:
+            name: build-data
+            path: ${{ github.workspace }}/build
+
+  security:
+    name: Security checks
+    runs-on: [ubuntu-latest]
+    steps:
+      - name: Setup PHP, with composer and extensions
+        uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
+        with:
+            php-version: '7.4'
+            extensions: mbstring, xml
+            coverage: none
+
+      - name: Setup problem matchers for PHP
+        run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
+
+      - uses: actions/checkout@v2
+
+      - name: Get composer cache directory
+        id: composer-cache
+        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+      - name: Cache composer dependencies
+        uses: actions/cache@v1
+        with:
+            path: ${{ steps.composer-cache.outputs.dir }}
+            key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+            restore-keys: ${{ runner.os }}-composer-
+
+      - name: Install Composer dependencies
+        run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader
+
+      - name: Security check for locked dependencies
+        uses: symfonycorp/security-checker-action@v2
+
+      - name: Update Composer dependencies
+        run: composer update --no-progress --no-suggest --prefer-dist --optimize-autoloader
+
+      - name: Security check for updated dependencies
+        uses: symfonycorp/security-checker-action@v2
+
+  sanity-check:
+    name: Sanity checks
+    runs-on: [ubuntu-latest]
+
+    steps:
+      - name: Setup PHP, with composer and extensions
+        uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
+        with:
+          php-version: '7.4'
+          extensions: mbstring, xml
+          coverage: none
+
+      - name: Setup problem matchers for PHP
+        run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
+
+      - uses: actions/checkout@v2
+
+      - name: Get composer cache directory
+        id: composer-cache
+        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+      - name: Cache composer dependencies
+        uses: actions/cache@v1
+        with:
+            path: ${{ steps.composer-cache.outputs.dir }}
+            key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+            restore-keys: ${{ runner.os }}-composer-
+
+      - name: Install Composer dependencies
+        run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader
+
+      - name: Syntax check YAML / XML / JSON
+        run: |
+          bash vendor/bin/check-syntax-yaml.sh
+          bash vendor/bin/check-syntax-xml.sh
+          bash vendor/bin/check-syntax-json.sh
+
+  quality:
+    name: Quality control
+    runs-on: [ubuntu-latest]
+    needs: [basic-tests]
+
+    steps:
+      - name: Setup PHP, with composer and extensions
+        uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
+        with:
+          php-version: '7.4'
+          extensions: mbstring, xml
+
+      - name: Setup problem matchers for PHP
+        run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
+
+      - uses: actions/checkout@v2
+
+      - name: Get composer cache directory
+        id: composer-cache
+        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+      - name: Cache composer dependencies
+        uses: actions/cache@v1
+        with:
+            path: ${{ steps.composer-cache.outputs.dir }}
+            key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+            restore-keys: ${{ runner.os }}-composer-
+
+      - name: Install Composer dependencies
+        run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader
+
+      - uses: actions/download-artifact@v1
+        with:
+          name: build-data
+          path: ${{ github.workspace }}/build
+
+      - name: Codecov
+        uses: codecov/codecov-action@v1
+
+      - name: PHP Code Sniffer
+        continue-on-error: true
+        run: php vendor/bin/phpcs
+
+      - name: Psalm
+        continue-on-error: true
+        run: php vendor/bin/psalm --show-info=true
+
+      - name: Psalter
+        continue-on-error: true
+        run: php vendor/bin/psalter --issues=UnnecessaryVarAnnotation --dry-run
diff --git a/vendor/simplesamlphp/simplesamlphp/COPYING b/vendor/simplesamlphp/simplesamlphp/COPYING
index 7b542386fa5806e792957e87faa012637f632d7c..322d4c4ea0d9b3c2e9dfa55b385420358779eb33 100644
--- a/vendor/simplesamlphp/simplesamlphp/COPYING
+++ b/vendor/simplesamlphp/simplesamlphp/COPYING
@@ -1,4 +1,4 @@
-Copyright 2007-2015 UNINETT AS, http://www.uninett.no
+Copyright 2007-2021 UNINETT AS, https://www.uninett.no
 
 SimpleSAMLphp is licensed under the CC-GNU LGPL version 2.1.
 http://creativecommons.org/licenses/LGPL/2.1/
diff --git a/vendor/simplesamlphp/simplesamlphp/README.md b/vendor/simplesamlphp/simplesamlphp/README.md
index d4f424d2ad8166f3e15d3a30925efbcd9144789c..2e7a36e0e157d80d0d5be2d37478e3770286fd2a 100644
--- a/vendor/simplesamlphp/simplesamlphp/README.md
+++ b/vendor/simplesamlphp/simplesamlphp/README.md
@@ -2,6 +2,8 @@ SimpleSAMLphp
 =============
 [![Build Status](https://travis-ci.org/simplesamlphp/simplesamlphp.svg?branch=master)](https://travis-ci.org/simplesamlphp/simplesamlphp)
 [![Coverage Status](https://codecov.io/gh/simplesamlphp/simplesamlphp/branch/master/graph/badge.svg)](https://codecov.io/gh/simplesamlphp/simplesamlphp)
+[![BrowserStack Status](https://automate.browserstack.com/badge.svg?badge_key=LzlCL29sZEVDRXJpdGtxZUdITFA3YjYyUFBBYkVVZDVDcG1YZXRaN2pvTT0tLVhCNzkwVUNGVFVjVFVicUg0R1BNR0E9PQ==--f9efb6f330bd98dd6e3c7b816ac2f0982275a872)](https://automate.browserstack.com/public-build/LzlCL29sZEVDRXJpdGtxZUdITFA3YjYyUFBBYkVVZDVDcG1YZXRaN2pvTT0tLVhCNzkwVUNGVFVjVFVicUg0R1BNR0E9PQ==--f9efb6f330bd98dd6e3c7b816ac2f0982275a872)
+
 
 This is the official repository of the SimpleSAMLphp software.
 
diff --git a/vendor/simplesamlphp/simplesamlphp/TESTING.md b/vendor/simplesamlphp/simplesamlphp/TESTING.md
index 302fb309a30fb4b27d4cad87c37b6793f95b805f..6b70cbb63d9b6a3f225b3e40dd237fa63114df0f 100644
--- a/vendor/simplesamlphp/simplesamlphp/TESTING.md
+++ b/vendor/simplesamlphp/simplesamlphp/TESTING.md
@@ -33,7 +33,7 @@ the ones prefixed with "test".
 
 You will usually make use of the `assert*()` methods provided by
 `PHPUnit\Framework\TestCase`, but you can also tell `phpunit` to expect
-an exception to be thrown using *phpdoc*. For example, if you want to
+an exception to be thrown using the `expectException()`-method. For example, if you want to
 ensure that the `SimpleSAML\Utils\HTTP::addURLParameters()` method
 throws an exception in a specific situation:
 
@@ -65,7 +65,6 @@ the old version installed by composer
 ./vendor/bin/phpunit -c ./phpunit.xml
 ```
 
-All the tests are run by our *continuous integration* platform,
-[travis](https://travis-ci.org/simplesamlphp/simplesamlphp). If you are
-submitting a pull request, Travis will run your tests and notify whether
-your code builds or not according to them.
+All the tests are run by our *continuous integration* platform using GitHub
+Actions. If you are submitting a pull request, GitHub Actions will run your
+tests and notify whether your code builds or not according to them.
diff --git a/vendor/simplesamlphp/simplesamlphp/bin/build-release.sh b/vendor/simplesamlphp/simplesamlphp/bin/build-release.sh
index c2b880b4a089b6d2253ae0fa937857685e3ebff4..40b00e80303fe829f511396c32fd2feedae69a8b 100755
--- a/vendor/simplesamlphp/simplesamlphp/bin/build-release.sh
+++ b/vendor/simplesamlphp/simplesamlphp/bin/build-release.sh
@@ -40,6 +40,9 @@
     curl -sS https://getcomposer.org/installer | php -- --install-dir=$TARGET
 fi
 
+# Downgrade composer to v1 to remain compatible with composer <1.8.5 (Debian 10)
+php "$TARGET/composer.phar" self-update --1
+
 # Set the version in composer.json
 php "$TARGET/composer.phar" config version "v$VERSION" -d "$TARGET"
 
@@ -58,13 +61,14 @@
 rm -rf "$TARGET/.git"
 rm -rf "$TARGET/node_modules"
 rm "$TARGET/www/assets/js/stylesheet.js"*
-rm "$TARGET/.coveralls.yml"
 rm "$TARGET/.editorconfig"
 rm "$TARGET/.gitattributes"
-rm "$TARGET/.php_cs.dist"
-rm "$TARGET/.travis.yml"
-rm "$TARGET/psalm.xml"
-rm "$TARGET"/{,modules}/.gitignore
+rm -r "$TARGET/.github"
+rm "$TARGET"/{,modules/*}/.php_cs.dist
+rm "$TARGET"/{,modules/*}/codecov.yml
+rm "$TARGET"/{,modules/*}/phpcs.xml
+rm "$TARGET"/{,modules/*}/psalm.xml
+rm "$TARGET"/{,modules/*}/.gitignore
 rm "$TARGET"/{cache,config,metadata,locales}/.gitkeep
 rm "$TARGET/composer.phar"
 tar --owner 0 --group 0 -cvzf "$TARGET.tar.gz" "$TARGET"
diff --git a/vendor/simplesamlphp/simplesamlphp/bin/console b/vendor/simplesamlphp/simplesamlphp/bin/console
new file mode 100755
index 0000000000000000000000000000000000000000..a01bc1443c80093b2c9590e081770e08a33e069e
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/bin/console
@@ -0,0 +1,18 @@
+#!/usr/bin/env php
+<?php
+
+use SimpleSAML\Console\Application;
+use SimpleSAML\Kernel;
+use Symfony\Component\Console\Input\ArgvInput;
+
+umask(000);
+set_time_limit(0);
+
+require __DIR__.'/../vendor/autoload.php';
+
+$input = new ArgvInput();
+$module = $input->getParameterOption(['--modules', '-m'], 'core');
+$kernel = new Kernel($module);
+
+$application = new Application($kernel);
+$application->run($input);
diff --git a/vendor/simplesamlphp/simplesamlphp/bin/importPdoMetadata.php b/vendor/simplesamlphp/simplesamlphp/bin/importPdoMetadata.php
index 3dbd6cf8caede53c35b0d32507c17fccc7e44162..cbe27039169cd7d1f431fff9c13514118e273d83 100755
--- a/vendor/simplesamlphp/simplesamlphp/bin/importPdoMetadata.php
+++ b/vendor/simplesamlphp/simplesamlphp/bin/importPdoMetadata.php
@@ -1,5 +1,6 @@
 #!/usr/bin/env php
 <?php
+
 $baseDir = dirname(dirname(__FILE__));
 
 require_once $baseDir . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . '_autoload.php';
diff --git a/vendor/simplesamlphp/simplesamlphp/bin/memcacheSync.php b/vendor/simplesamlphp/simplesamlphp/bin/memcacheSync.php
index 910841e1c8e698c646b7f620d0184951054a035d..cc60d614d91e4306db83269c60e1170999e096ad 100755
--- a/vendor/simplesamlphp/simplesamlphp/bin/memcacheSync.php
+++ b/vendor/simplesamlphp/simplesamlphp/bin/memcacheSync.php
@@ -91,7 +91,7 @@
  *
  * @return array An array with all the keys available on the server.
  */
-function getServerKeys($server)
+function getServerKeys(string $server): array
 {
     $server = explode(':', $server);
     $host = $server[0];
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/discopower/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/codecov.yml
similarity index 91%
rename from vendor/simplesamlphp/simplesamlphp/modules/discopower/.codecov.yml
rename to vendor/simplesamlphp/simplesamlphp/codecov.yml
index f7f39e1e93d0ca23383d5ed120442f62f5f15ac9..cbe651081150dc8b3f5193585e71f7cc58f2b459 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/discopower/.codecov.yml
+++ b/vendor/simplesamlphp/simplesamlphp/codecov.yml
@@ -1,7 +1,7 @@
 coverage:
   status:
     project: yes
-
+    patch: off
 comment:
   layout: "diff"
   behavior: once
diff --git a/vendor/simplesamlphp/simplesamlphp/composer.json b/vendor/simplesamlphp/simplesamlphp/composer.json
index 7041c4259bbc3a0148824ebf4112cb87dd991bac..9df445cca80743009aee0a0438720343c29452b0 100644
--- a/vendor/simplesamlphp/simplesamlphp/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/composer.json
@@ -5,7 +5,7 @@
     "keywords": [ "saml2", "shibboleth","oauth","ws-federation","sp","idp" ],
     "homepage": "http://simplesamlphp.org",
     "license": "LGPL-2.1-or-later",
-    "version": "v1.18.8",
+    "version": "v1.19.6",
     "authors": [
         {
             "name": "Andreas Åkre Solberg",
@@ -33,7 +33,7 @@
         "files": ["tests/_autoload_modules.php"]
     },
     "require": {
-        "php": ">=5.6",
+        "php": ">=7.1|^8",
         "ext-SPL": "*",
         "ext-zlib": "*",
         "ext-pcre": "*",
@@ -43,11 +43,12 @@
         "ext-hash": "*",
         "ext-json": "*",
         "ext-mbstring": "*",
-        "gettext/gettext": "^4.6",
-        "phpmailer/phpmailer": "^6.0",
-        "robrichards/xmlseclibs": "^3.0.4",
-        "simplesamlphp/saml2": "^3.4 || ^4.0",
-        "simplesamlphp/simplesamlphp-module-adfs": "^0.9",
+        "gettext/gettext": "v4.x-dev#3e7460f8d9c90174824e3f39240bd578bb3d376a",
+        "phpmailer/phpmailer": "^6.1",
+        "robrichards/xmlseclibs": "^3.1",
+        "simplesamlphp/assert": "^0.0.13",
+        "simplesamlphp/saml2": "^4.5",
+        "simplesamlphp/simplesamlphp-module-adfs": "^1.0",
         "simplesamlphp/simplesamlphp-module-authcrypt": "^0.9",
         "simplesamlphp/simplesamlphp-module-authfacebook": "^0.9",
         "simplesamlphp/simplesamlphp-module-authorize": "^0.9",
@@ -59,15 +60,15 @@
         "simplesamlphp/simplesamlphp-module-cdc": "^0.9",
         "simplesamlphp/simplesamlphp-module-consent": "^0.9",
         "simplesamlphp/simplesamlphp-module-consentadmin": "^0.9",
-        "simplesamlphp/simplesamlphp-module-discopower": "^0.9",
+        "simplesamlphp/simplesamlphp-module-discopower": "^0.10",
         "simplesamlphp/simplesamlphp-module-exampleattributeserver": "^1.0",
         "simplesamlphp/simplesamlphp-module-expirycheck": "^0.9",
-        "simplesamlphp/simplesamlphp-module-ldap": "^0.9",
+        "simplesamlphp/simplesamlphp-module-ldap": "^0.9 | ^1.0",
         "simplesamlphp/simplesamlphp-module-memcookie": "^1.2",
         "simplesamlphp/simplesamlphp-module-memcachemonitor": "^0.9",
-        "simplesamlphp/simplesamlphp-module-metarefresh": "^0.9",
+        "simplesamlphp/simplesamlphp-module-metarefresh": "^0.10",
         "simplesamlphp/simplesamlphp-module-negotiate": "^0.9",
-        "simplesamlphp/simplesamlphp-module-oauth": "^0.9",
+        "simplesamlphp/simplesamlphp-module-oauth": "^0.9.3",
         "simplesamlphp/simplesamlphp-module-preprodwarning": "^0.9",
         "simplesamlphp/simplesamlphp-module-radius": "^0.9",
         "simplesamlphp/simplesamlphp-module-riak": "^0.9",
@@ -75,23 +76,26 @@
         "simplesamlphp/simplesamlphp-module-sanitycheck": "^0.9",
         "simplesamlphp/simplesamlphp-module-statistics": "^0.9",
         "simplesamlphp/simplesamlphp-module-sqlauth": "^0.9",
-        "simplesamlphp/twig-configurable-i18n": "^2.2",
-        "symfony/routing": "^3.4 || ^4.0",
-        "symfony/http-foundation": "^3.4 || ^4.0",
-        "symfony/config": "^3.4 || ^4.0",
-        "symfony/http-kernel": "^3.4 || ^4.0",
-        "symfony/dependency-injection": "^3.4 || ^4.0",
-        "symfony/yaml": "^3.4 || ^4.0",
-        "twig/twig": "~1.0 || ~2.0"
+        "simplesamlphp/twig-configurable-i18n": "~2.3.3",
+        "symfony/cache": "^4.4 || ^5.0",
+        "symfony/config": "^4.4 || ^5.0",
+        "symfony/console": "^4.4 || ^5.0",
+        "symfony/dependency-injection": "^4.4 || ^5.0",
+        "symfony/finder": "^4.4 || ^5.0",
+        "symfony/framework-bundle": "^4.4 || ^5.0",
+        "symfony/http-foundation": "^4.4 || ^5.0",
+        "symfony/http-kernel": "^4.4 || ^5.0",
+        "symfony/routing": "^4.4 || ^5.0",
+        "symfony/var-exporter": "^4.4 || ^5.0",
+        "symfony/yaml": "^4.4 || ^5.0",
+        "twig/twig": "^2.14.11"
     },
     "require-dev": {
         "ext-curl": "*",
         "mikey179/vfsstream": "~1.6",
-        "phpunit/phpunit": "~5.7",
-        "sensiolabs/security-checker": "^5.0.3",
-        "simplesamlphp/simplesamlphp-test-framework": "^0.0.14",
-        "squizlabs/php_codesniffer": "^3.5",
-        "vimeo/psalm": "~1.1.9"
+        "phpunit/phpunit": "^7.5",
+        "simplesamlphp/simplesamlphp-test-framework": "^0.1.2",
+        "vimeo/psalm": "~3.14"
     },
     "suggest": {
         "predis/predis": "Needed if a Redis server is used to store session information",
@@ -106,5 +110,11 @@
     "support": {
         "issues": "https://github.com/simplesamlphp/simplesamlphp/issues",
         "source": "https://github.com/simplesamlphp/simplesamlphp"
+    },
+    "config": {
+        "allow-plugins": {
+            "simplesamlphp/composer-module-installer": true,
+            "composer/package-versions-deprecated": true
+        }
     }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/composer.lock b/vendor/simplesamlphp/simplesamlphp/composer.lock
index 5d46b544b16a9e106c72fb9a85808b19d9c89b02..bbdae2fa9e9afacc15096137e02c0ef9787fc505 100644
--- a/vendor/simplesamlphp/simplesamlphp/composer.lock
+++ b/vendor/simplesamlphp/simplesamlphp/composer.lock
@@ -4,20 +4,20 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "bf371c4b318dde371166f24e06842287",
+    "content-hash": "5514c37a771e696645bc7613ad0c0050",
     "packages": [
         {
             "name": "gettext/gettext",
-            "version": "v4.8.2",
+            "version": "4.x-dev",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-gettext/Gettext.git",
-                "reference": "e474f872f2c8636cf53fd283ec4ce1218f3d236a"
+                "reference": "3e7460f8d9c90174824e3f39240bd578bb3d376a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/e474f872f2c8636cf53fd283ec4ce1218f3d236a",
-                "reference": "e474f872f2c8636cf53fd283ec4ce1218f3d236a",
+                "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/3e7460f8d9c90174824e3f39240bd578bb3d376a",
+                "reference": "3e7460f8d9c90174824e3f39240bd578bb3d376a",
                 "shasum": ""
             },
             "require": {
@@ -25,7 +25,7 @@
                 "php": ">=5.4.0"
             },
             "require-dev": {
-                "illuminate/view": "*",
+                "illuminate/view": "^5.0.x-dev",
                 "phpunit/phpunit": "^4.8|^5.7|^6.5",
                 "squizlabs/php_codesniffer": "^3.0",
                 "symfony/yaml": "~2",
@@ -66,27 +66,45 @@
                 "po",
                 "translation"
             ],
-            "time": "2019-12-02T10:21:14+00:00"
+            "support": {
+                "email": "oom@oscarotero.com",
+                "issues": "https://github.com/oscarotero/Gettext/issues",
+                "source": "https://github.com/php-gettext/Gettext/tree/4.x"
+            },
+            "funding": [
+                {
+                    "url": "https://paypal.me/oscarotero",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/oscarotero",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/misteroom",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2022-02-17T10:14:02+00:00"
         },
         {
             "name": "gettext/languages",
-            "version": "2.6.0",
+            "version": "2.9.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-gettext/Languages.git",
-                "reference": "38ea0482f649e0802e475f0ed19fa993bcb7a618"
+                "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-gettext/Languages/zipball/38ea0482f649e0802e475f0ed19fa993bcb7a618",
-                "reference": "38ea0482f649e0802e475f0ed19fa993bcb7a618",
+                "url": "https://api.github.com/repos/php-gettext/Languages/zipball/ed56dd2c7f4024cc953ed180d25f02f2640e3ffa",
+                "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3"
             },
             "require-dev": {
-                "friendsofphp/php-cs-fixer": "^2.16.0",
                 "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4"
             },
             "bin": [
@@ -127,56 +145,21 @@
                 "translations",
                 "unicode"
             ],
-            "time": "2019-11-13T10:30:21+00:00"
-        },
-        {
-            "name": "paragonie/random_compat",
-            "version": "v2.0.18",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/paragonie/random_compat.git",
-                "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
-                "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.2.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "4.*|5.*"
-            },
-            "suggest": {
-                "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
-            },
-            "type": "library",
-            "autoload": {
-                "files": [
-                    "lib/random.php"
-                ]
+            "support": {
+                "issues": "https://github.com/php-gettext/Languages/issues",
+                "source": "https://github.com/php-gettext/Languages/tree/2.9.0"
             },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
+            "funding": [
                 {
-                    "name": "Paragon Initiative Enterprises",
-                    "email": "security@paragonie.com",
-                    "homepage": "https://paragonie.com"
+                    "url": "https://paypal.me/mlocati",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/mlocati",
+                    "type": "github"
                 }
             ],
-            "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
-            "keywords": [
-                "csprng",
-                "polyfill",
-                "pseudorandom",
-                "random"
-            ],
-            "time": "2019-01-03T20:59:08+00:00"
+            "time": "2021-11-11T17:30:39+00:00"
         },
         {
             "name": "phpfastcache/riak-client",
@@ -248,34 +231,44 @@
                 "nosql",
                 "riak"
             ],
+            "support": {
+                "issues": "https://github.com/PHPSocialNetwork/riak-php-client/issues",
+                "source": "https://github.com/PHPSocialNetwork/riak-php-client/tree/develop"
+            },
             "time": "2017-11-23T21:33:15+00:00"
         },
         {
             "name": "phpmailer/phpmailer",
-            "version": "v6.1.7",
+            "version": "v6.6.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHPMailer/PHPMailer.git",
-                "reference": "2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0"
+                "reference": "9400f305a898f194caff5521f64e5dfa926626f3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0",
-                "reference": "2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0",
+                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/9400f305a898f194caff5521f64e5dfa926626f3",
+                "reference": "9400f305a898f194caff5521f64e5dfa926626f3",
                 "shasum": ""
             },
             "require": {
                 "ext-ctype": "*",
                 "ext-filter": "*",
+                "ext-hash": "*",
                 "php": ">=5.5.0"
             },
             "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
                 "doctrine/annotations": "^1.2",
-                "friendsofphp/php-cs-fixer": "^2.2",
-                "phpunit/phpunit": "^4.8 || ^5.7"
+                "php-parallel-lint/php-console-highlighter": "^1.0.0",
+                "php-parallel-lint/php-parallel-lint": "^1.3.2",
+                "phpcompatibility/php-compatibility": "^9.3.5",
+                "roave/security-advisories": "dev-latest",
+                "squizlabs/php_codesniffer": "^3.6.2",
+                "yoast/phpunit-polyfills": "^1.0.0"
             },
             "suggest": {
-                "ext-mbstring": "Needed to send email in multibyte encoding charset",
+                "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
                 "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
                 "league/oauth2-google": "Needed for Google XOAUTH2 authentication",
                 "psr/log": "For optional PSR-3 debug logging",
@@ -310,13 +303,66 @@
                 }
             ],
             "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
+            "support": {
+                "issues": "https://github.com/PHPMailer/PHPMailer/issues",
+                "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.3"
+            },
             "funding": [
                 {
-                    "url": "https://github.com/synchro",
+                    "url": "https://github.com/Synchro",
                     "type": "github"
                 }
             ],
-            "time": "2020-07-14T18:50:27+00:00"
+            "time": "2022-06-20T09:21:02+00:00"
+        },
+        {
+            "name": "psr/cache",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/cache.git",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for caching libraries",
+            "keywords": [
+                "cache",
+                "psr",
+                "psr-6"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/cache/tree/master"
+            },
+            "time": "2016-08-06T20:24:11+00:00"
         },
         {
             "name": "psr/container",
@@ -365,20 +411,24 @@
                 "container-interop",
                 "psr"
             ],
+            "support": {
+                "issues": "https://github.com/php-fig/container/issues",
+                "source": "https://github.com/php-fig/container/tree/master"
+            },
             "time": "2017-02-14T16:28:37+00:00"
         },
         {
             "name": "psr/log",
-            "version": "1.1.3",
+            "version": "1.1.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/log.git",
-                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+                "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
-                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+                "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
                 "shasum": ""
             },
             "require": {
@@ -402,7 +452,7 @@
             "authors": [
                 {
                     "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/"
+                    "homepage": "https://www.php-fig.org/"
                 }
             ],
             "description": "Common interface for logging libraries",
@@ -412,20 +462,23 @@
                 "psr",
                 "psr-3"
             ],
-            "time": "2020-03-23T09:12:05+00:00"
+            "support": {
+                "source": "https://github.com/php-fig/log/tree/1.1.4"
+            },
+            "time": "2021-05-03T11:20:27+00:00"
         },
         {
             "name": "robrichards/xmlseclibs",
-            "version": "3.1.0",
+            "version": "3.1.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/robrichards/xmlseclibs.git",
-                "reference": "8d8e56ca7914440a8c60caff1a865e7dff1d9a5a"
+                "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/8d8e56ca7914440a8c60caff1a865e7dff1d9a5a",
-                "reference": "8d8e56ca7914440a8c60caff1a865e7dff1d9a5a",
+                "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/f8f19e58f26cdb42c54b214ff8a820760292f8df",
+                "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df",
                 "shasum": ""
             },
             "require": {
@@ -450,7 +503,69 @@
                 "xml",
                 "xmldsig"
             ],
-            "time": "2020-04-22T17:19:51+00:00"
+            "support": {
+                "issues": "https://github.com/robrichards/xmlseclibs/issues",
+                "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.1"
+            },
+            "time": "2020-09-05T13:00:25+00:00"
+        },
+        {
+            "name": "simplesamlphp/assert",
+            "version": "v0.0.13",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/simplesamlphp/assert.git",
+                "reference": "5429921b320ca4f9d1844225884ac52f649ea1e3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/5429921b320ca4f9d1844225884ac52f649ea1e3",
+                "reference": "5429921b320ca4f9d1844225884ac52f649ea1e3",
+                "shasum": ""
+            },
+            "require": {
+                "ext-spl": "*",
+                "php": "^7.1 || ^8.0",
+                "webmozart/assert": "^1.9"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5",
+                "sensiolabs/security-checker": "~6.0",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.2.7",
+                "squizlabs/php_codesniffer": "~3.5",
+                "vimeo/psalm": "~3.13"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "v0.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "SimpleSAML\\Assert\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-2.1-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "Tim van Dijen",
+                    "email": "tvdijen@gmail.com"
+                },
+                {
+                    "name": "Jaime Perez Crespo",
+                    "email": "jaimepc@gmail.com"
+                }
+            ],
+            "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments",
+            "support": {
+                "issues": "https://github.com/simplesamlphp/assert/issues",
+                "source": "https://github.com/simplesamlphp/assert/tree/master"
+            },
+            "time": "2020-08-17T20:40:49+00:00"
         },
         {
             "name": "simplesamlphp/composer-module-installer",
@@ -484,53 +599,52 @@
                 "LGPL-2.1-only"
             ],
             "description": "A Composer plugin that allows installing SimpleSAMLphp modules through Composer.",
+            "support": {
+                "issues": "https://github.com/simplesamlphp/composer-module-installer/issues",
+                "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.1.8"
+            },
             "time": "2020-08-25T19:04:33+00:00"
         },
         {
             "name": "simplesamlphp/saml2",
-            "version": "v3.4.5",
+            "version": "v4.6.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/saml2.git",
-                "reference": "acc47782592866423942dc30002c5220203ab466"
+                "reference": "bfc9c79dd6b728a41d1de988f545f6e64728a51d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/acc47782592866423942dc30002c5220203ab466",
-                "reference": "acc47782592866423942dc30002c5220203ab466",
+                "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/bfc9c79dd6b728a41d1de988f545f6e64728a51d",
+                "reference": "bfc9c79dd6b728a41d1de988f545f6e64728a51d",
                 "shasum": ""
             },
             "require": {
                 "ext-dom": "*",
                 "ext-openssl": "*",
                 "ext-zlib": "*",
-                "php": ">=5.4",
-                "psr/log": "~1.0",
-                "robrichards/xmlseclibs": "^3.0.4",
-                "webmozart/assert": "^1.4"
+                "php": ">=7.1 || ^8.0",
+                "psr/log": "~1.1 || ^2.0 || ^3.0",
+                "robrichards/xmlseclibs": "^3.1.1",
+                "webmozart/assert": "^1.9"
             },
             "require-dev": {
-                "mockery/mockery": "~0.9",
-                "phpmd/phpmd": "~2.6",
-                "phpunit/phpunit": "~5.7",
-                "sebastian/phpcpd": "~2.0",
-                "sensiolabs/security-checker": "~4.1",
-                "simplesamlphp/simplesamlphp-test-framework": "0.0.11",
-                "squizlabs/php_codesniffer": "~3.2"
+                "mockery/mockery": "^1.3",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "sebastian/phpcpd": "~4.1 || ^5.0 || ^6.0",
+                "simplesamlphp/simplesamlphp-test-framework": "~0.1.0",
+                "squizlabs/php_codesniffer": "~3.5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "v3.1.x-dev"
+                    "dev-master": "v4.2.x-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
-                    "SAML2\\": "src/"
-                },
-                "files": [
-                    "src/_autoload.php"
-                ]
+                "psr-4": {
+                    "SAML2\\": "src/SAML2"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -543,30 +657,34 @@
                 }
             ],
             "description": "SAML2 PHP library from SimpleSAMLphp",
-            "time": "2020-05-14T16:38:12+00:00"
+            "support": {
+                "issues": "https://github.com/simplesamlphp/saml2/issues",
+                "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.3"
+            },
+            "time": "2022-06-13T14:04:10+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-adfs",
-            "version": "v0.9.6",
+            "version": "v1.0.9",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-adfs.git",
-                "reference": "425e5ebbdd097c92fe5265a6b48d32a3095c7237"
+                "reference": "c47daabc262b7e14a76879015fd9db85319752ec"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/425e5ebbdd097c92fe5265a6b48d32a3095c7237",
-                "reference": "425e5ebbdd097c92fe5265a6b48d32a3095c7237",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/c47daabc262b7e14a76879015fd9db85319752ec",
+                "reference": "c47daabc262b7e14a76879015fd9db85319752ec",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
-                "simplesamlphp/composer-module-installer": "~1.1"
+                "php": ">=7.1",
+                "simplesamlphp/assert": "^0.0.13",
+                "simplesamlphp/composer-module-installer": "^1.1.7"
             },
             "require-dev": {
-                "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17",
-                "webmozart/assert": "<1.7"
+                "simplesamlphp/simplesamlphp": "^1.18",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.1.2"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -589,26 +707,30 @@
                 "adfs",
                 "simplesamlphp"
             ],
-            "time": "2020-03-31T14:29:24+00:00"
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-adfs/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-adfs"
+            },
+            "time": "2022-04-11T10:24:25+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authcrypt",
-            "version": "v0.9.2",
+            "version": "v0.9.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authcrypt.git",
-                "reference": "2ad0f234b92ab0abe94e97fa3e1e04f9c743eb9d"
+                "reference": "62555123e61b11463be3cd7adb708562023cff28"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authcrypt/zipball/2ad0f234b92ab0abe94e97fa3e1e04f9c743eb9d",
-                "reference": "2ad0f234b92ab0abe94e97fa3e1e04f9c743eb9d",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authcrypt/zipball/62555123e61b11463be3cd7adb708562023cff28",
+                "reference": "62555123e61b11463be3cd7adb708562023cff28",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.6",
                 "simplesamlphp/composer-module-installer": "~1.1",
-                "webmozart/assert": "~1.4 <1.7",
+                "webmozart/assert": "~1.4",
                 "whitehat101/apr1-md5": "~1.0"
             },
             "require-dev": {
@@ -636,7 +758,11 @@
                 "authcrypt",
                 "simplesamlphp"
             ],
-            "time": "2020-08-12T21:30:50+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-authcrypt/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-authcrypt"
+            },
+            "time": "2022-01-03T20:50:47+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authfacebook",
@@ -685,20 +811,25 @@
                 "facebook",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-authfacebook/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-authfacebook"
+            },
+            "abandoned": true,
             "time": "2020-03-13T11:29:21+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authorize",
-            "version": "v0.9.2",
+            "version": "v0.9.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authorize.git",
-                "reference": "c2607a5252ee1256b50ce7795e35513b116998d4"
+                "reference": "4c7ce4eaa54fc301f131c62e803fc843e4d88056"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authorize/zipball/c2607a5252ee1256b50ce7795e35513b116998d4",
-                "reference": "c2607a5252ee1256b50ce7795e35513b116998d4",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authorize/zipball/4c7ce4eaa54fc301f131c62e803fc843e4d88056",
+                "reference": "4c7ce4eaa54fc301f131c62e803fc843e4d88056",
                 "shasum": ""
             },
             "require": {
@@ -717,7 +848,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -730,20 +861,24 @@
                 "authorize",
                 "simplesamlphp"
             ],
-            "time": "2020-02-25T15:16:57+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-authorize/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-authorize"
+            },
+            "time": "2022-01-03T20:56:53+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authtwitter",
-            "version": "v0.9.1",
+            "version": "v0.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authtwitter.git",
-                "reference": "29a15e58061222632fea9eb2c807aef5e2c0d54a"
+                "reference": "6e178e7aae7827a64dc462b5bb2f28d6eddc4381"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authtwitter/zipball/29a15e58061222632fea9eb2c807aef5e2c0d54a",
-                "reference": "29a15e58061222632fea9eb2c807aef5e2c0d54a",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authtwitter/zipball/6e178e7aae7827a64dc462b5bb2f28d6eddc4381",
+                "reference": "6e178e7aae7827a64dc462b5bb2f28d6eddc4381",
                 "shasum": ""
             },
             "require": {
@@ -753,7 +888,8 @@
             },
             "require-dev": {
                 "phpunit/phpunit": "~4.8.35",
-                "simplesamlphp/simplesamlphp": "^1.17"
+                "simplesamlphp/simplesamlphp": "^1.17",
+                "webmozart/assert": "<1.7"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -763,7 +899,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -780,7 +916,11 @@
                 "simplesamlphp",
                 "twitter"
             ],
-            "time": "2019-12-03T09:00:09+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-authtwitter/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-authtwitter"
+            },
+            "time": "2022-01-03T23:01:48+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authwindowslive",
@@ -831,20 +971,25 @@
                 "windows",
                 "windowslive"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-authwindowslive/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-authwindowslive"
+            },
+            "abandoned": true,
             "time": "2019-12-03T09:01:13+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authx509",
-            "version": "v0.9.5",
+            "version": "v0.9.9",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authX509.git",
-                "reference": "d4bae5d1c02f291d420607c14a157cef3bc36f5c"
+                "reference": "b138f41b2bc725371f42abb63b5a39ac11b5432a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authX509/zipball/d4bae5d1c02f291d420607c14a157cef3bc36f5c",
-                "reference": "d4bae5d1c02f291d420607c14a157cef3bc36f5c",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authX509/zipball/b138f41b2bc725371f42abb63b5a39ac11b5432a",
+                "reference": "b138f41b2bc725371f42abb63b5a39ac11b5432a",
                 "shasum": ""
             },
             "require": {
@@ -884,20 +1029,24 @@
                 "simplesamlphp",
                 "x509"
             ],
-            "time": "2020-07-31T14:36:54+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-authx509/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-authx509"
+            },
+            "time": "2022-01-06T19:02:38+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-authyubikey",
-            "version": "v0.9.1",
+            "version": "v0.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-authyubikey.git",
-                "reference": "8c27bfeb4981d2e6fa40a831e945f40c5a4ad3d2"
+                "reference": "414e2a73da4adfee6d97ba66e852ec7c85369913"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authyubikey/zipball/8c27bfeb4981d2e6fa40a831e945f40c5a4ad3d2",
-                "reference": "8c27bfeb4981d2e6fa40a831e945f40c5a4ad3d2",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-authyubikey/zipball/414e2a73da4adfee6d97ba66e852ec7c85369913",
+                "reference": "414e2a73da4adfee6d97ba66e852ec7c85369913",
                 "shasum": ""
             },
             "require": {
@@ -911,7 +1060,7 @@
             },
             "type": "simplesamlphp-module",
             "extra": {
-                "ssp-mixedcase-module-name": "authYubikey"
+                "ssp-mixedcase-module-name": "authYubiKey"
             },
             "autoload": {
                 "psr-4": {
@@ -920,7 +1069,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -933,7 +1082,11 @@
                 "authyubikey",
                 "simplesamlphp"
             ],
-            "time": "2019-12-03T08:52:49+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-authyubikey/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-authyubikey"
+            },
+            "time": "2022-01-06T19:07:32+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-cas",
@@ -980,20 +1133,24 @@
                 "cas",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-cas/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-cas"
+            },
             "time": "2019-12-03T09:03:06+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-cdc",
-            "version": "v0.9.1",
+            "version": "v0.9.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-cdc.git",
-                "reference": "16a5bfac7299e04e5feb472af328e07598708166"
+                "reference": "92498fc3004c02849d96da29ca472d99ed23af73"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-cdc/zipball/16a5bfac7299e04e5feb472af328e07598708166",
-                "reference": "16a5bfac7299e04e5feb472af328e07598708166",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-cdc/zipball/92498fc3004c02849d96da29ca472d99ed23af73",
+                "reference": "92498fc3004c02849d96da29ca472d99ed23af73",
                 "shasum": ""
             },
             "require": {
@@ -1001,7 +1158,8 @@
             },
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17"
+                "simplesamlphp/simplesamlphp": "^1.17",
+                "webmozart/assert": "<1.7"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -1011,7 +1169,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -1029,20 +1187,24 @@
                 "cdc",
                 "simplesamlphp"
             ],
-            "time": "2019-12-03T09:04:11+00:00"
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-cdc/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-cdc/"
+            },
+            "time": "2022-01-06T19:27:16+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-consent",
-            "version": "v0.9.6",
+            "version": "v0.9.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-consent.git",
-                "reference": "2f84d15e96afb5a32b6d1cff93370f501ca7867d"
+                "reference": "8466b0b7c6207b15ca5e265f436299ff2dec85da"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consent/zipball/2f84d15e96afb5a32b6d1cff93370f501ca7867d",
-                "reference": "2f84d15e96afb5a32b6d1cff93370f501ca7867d",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consent/zipball/8466b0b7c6207b15ca5e265f436299ff2dec85da",
+                "reference": "8466b0b7c6207b15ca5e265f436299ff2dec85da",
                 "shasum": ""
             },
             "require": {
@@ -1052,7 +1214,7 @@
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17",
-                "webmozart/assert": "<1.7"
+                "webmozart/assert": "<1.6"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -1075,20 +1237,24 @@
                 "consent",
                 "simplesamlphp"
             ],
-            "time": "2020-06-15T14:26:23+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-consent/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-consent"
+            },
+            "time": "2022-01-06T19:17:22+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-consentadmin",
-            "version": "v0.9.1",
+            "version": "v0.9.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin.git",
-                "reference": "466e8d0d751f0080162d78e63ab2e125b24d17a1"
+                "reference": "62dc5e9d5b1a12a73549c80140b7224d7f7d1c2e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consentadmin/zipball/466e8d0d751f0080162d78e63ab2e125b24d17a1",
-                "reference": "466e8d0d751f0080162d78e63ab2e125b24d17a1",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-consentadmin/zipball/62dc5e9d5b1a12a73549c80140b7224d7f7d1c2e",
+                "reference": "62dc5e9d5b1a12a73549c80140b7224d7f7d1c2e",
                 "shasum": ""
             },
             "require": {
@@ -1107,7 +1273,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -1124,30 +1290,33 @@
                 "consentadmin",
                 "simplesamlphp"
             ],
-            "time": "2019-12-03T09:06:40+00:00"
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin"
+            },
+            "time": "2022-01-06T19:19:38+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-discopower",
-            "version": "v0.9.3",
+            "version": "v0.10.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-discopower.git",
-                "reference": "c892926e8186d0a2c638f7032dfc30540c1f92fb"
+                "reference": "4cb6b7c648b455586903b8932a171397375b50b0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-discopower/zipball/c892926e8186d0a2c638f7032dfc30540c1f92fb",
-                "reference": "c892926e8186d0a2c638f7032dfc30540c1f92fb",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-discopower/zipball/4cb6b7c648b455586903b8932a171397375b50b0",
+                "reference": "4cb6b7c648b455586903b8932a171397375b50b0",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
-                "simplesamlphp/composer-module-installer": "~1.1",
-                "webmozart/assert": "~1.4 <1.6"
+                "php": ">=7.1",
+                "simplesamlphp/composer-module-installer": "~1.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17"
+                "simplesamlphp/simplesamlphp": "^1.19",
+                "simplesamlphp/simplesamlphp-test-framework": "^0.1.2"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -1157,7 +1326,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -1171,7 +1340,11 @@
                 "discovery",
                 "simplesamlphp"
             ],
-            "time": "2019-12-13T07:51:43+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-discopower/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-discopower"
+            },
+            "time": "2021-08-17T14:29:22+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-exampleattributeserver",
@@ -1216,30 +1389,33 @@
                 "exampleattributeserver",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-exampleattributeserver/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-exampleattributeserver"
+            },
             "time": "2019-05-28T12:37:15+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-expirycheck",
-            "version": "v0.9.3",
+            "version": "v0.9.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-expirycheck.git",
-                "reference": "59c59cdf87e2679257b46c07bb4c27666a11cc20"
+                "reference": "02101497281031befba93c48c96ee9133f57241d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-expirycheck/zipball/59c59cdf87e2679257b46c07bb4c27666a11cc20",
-                "reference": "59c59cdf87e2679257b46c07bb4c27666a11cc20",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-expirycheck/zipball/02101497281031befba93c48c96ee9133f57241d",
+                "reference": "02101497281031befba93c48c96ee9133f57241d",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.6",
-                "simplesamlphp/composer-module-installer": "~1.1",
-                "webmozart/assert": "~1.4"
+                "simplesamlphp/composer-module-installer": "~1.1"
             },
             "require-dev": {
-                "simplesamlphp/simplesamlphp": "^1.17",
-                "simplesamlphp/simplesamlphp-test-framework": "^0.0.10"
+                "phpunit/phpunit": "~5.7",
+                "simplesamlphp/simplesamlphp": "^1.17"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -1249,7 +1425,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -1262,20 +1438,24 @@
                 "expirycheck",
                 "simplesamlphp"
             ],
-            "time": "2019-12-14T13:20:46+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-expirycheck/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-expirycheck"
+            },
+            "time": "2022-01-06T21:16:01+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-ldap",
-            "version": "v0.9.9",
+            "version": "v0.9.17",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-ldap.git",
-                "reference": "27f0ef60482ff6a063dac5b7d59e8d3d407b52ac"
+                "reference": "40f1bfe0c4ac2f91cf8e52d22fa6ec2fe1c03066"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-ldap/zipball/27f0ef60482ff6a063dac5b7d59e8d3d407b52ac",
-                "reference": "27f0ef60482ff6a063dac5b7d59e8d3d407b52ac",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-ldap/zipball/40f1bfe0c4ac2f91cf8e52d22fa6ec2fe1c03066",
+                "reference": "40f1bfe0c4ac2f91cf8e52d22fa6ec2fe1c03066",
                 "shasum": ""
             },
             "require": {
@@ -1314,20 +1494,24 @@
                 "ldap",
                 "simplesamlphp"
             ],
-            "time": "2020-07-14T16:33:01+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-ldap/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-ldap"
+            },
+            "time": "2022-01-11T12:50:47+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-memcachemonitor",
-            "version": "v0.9.1",
+            "version": "v0.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-memcachemonitor.git",
-                "reference": "0e08e87707cd7b1fb91bbcf65cc454d8849571b0"
+                "reference": "8d25463ac56b4e2294f59f622a6658e0c67086f4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-memcachemonitor/zipball/0e08e87707cd7b1fb91bbcf65cc454d8849571b0",
-                "reference": "0e08e87707cd7b1fb91bbcf65cc454d8849571b0",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-memcachemonitor/zipball/8d25463ac56b4e2294f59f622a6658e0c67086f4",
+                "reference": "8d25463ac56b4e2294f59f622a6658e0c67086f4",
                 "shasum": ""
             },
             "require": {
@@ -1344,7 +1528,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -1361,7 +1545,11 @@
                 "memcachemonitor",
                 "simplesamlphp"
             ],
-            "time": "2019-12-03T09:19:35+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-memcachemonitor/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-memcachemonitor"
+            },
+            "time": "2022-01-06T22:37:15+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-memcookie",
@@ -1409,20 +1597,24 @@
                 "cookies",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-memcookie/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-memcookie/"
+            },
             "time": "2019-08-08T18:33:47+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-metarefresh",
-            "version": "v0.9.6",
+            "version": "v0.10.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-metarefresh.git",
-                "reference": "e284306a7097297765b5b78a4e28f19f18d4e001"
+                "reference": "488d7809857c274befac89facfa03520a05bc1ba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-metarefresh/zipball/e284306a7097297765b5b78a4e28f19f18d4e001",
-                "reference": "e284306a7097297765b5b78a4e28f19f18d4e001",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-metarefresh/zipball/488d7809857c274befac89facfa03520a05bc1ba",
+                "reference": "488d7809857c274befac89facfa03520a05bc1ba",
                 "shasum": ""
             },
             "require": {
@@ -1454,20 +1646,24 @@
                 "metarefresh",
                 "simplesamlphp"
             ],
-            "time": "2020-07-31T14:43:37+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-metarefresh/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-metarefresh"
+            },
+            "time": "2022-05-03T08:57:30+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-negotiate",
-            "version": "v0.9.9",
+            "version": "v0.9.12",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate.git",
-                "reference": "68c9a1a2b81c68978ba6cfe19f0a7527300768ba"
+                "reference": "48752cea80e81a60ebb522cc10789589ac16df50"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-negotiate/zipball/68c9a1a2b81c68978ba6cfe19f0a7527300768ba",
-                "reference": "68c9a1a2b81c68978ba6cfe19f0a7527300768ba",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-negotiate/zipball/48752cea80e81a60ebb522cc10789589ac16df50",
+                "reference": "48752cea80e81a60ebb522cc10789589ac16df50",
                 "shasum": ""
             },
             "require": {
@@ -1507,20 +1703,24 @@
                 "negotiate",
                 "simplesamlphp"
             ],
-            "time": "2020-08-03T13:02:36+00:00"
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate"
+            },
+            "time": "2022-01-03T23:18:27+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-oauth",
-            "version": "v0.9.2",
+            "version": "v0.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-oauth.git",
-                "reference": "d14d7aca6e699ec12b3f4dd0128373faa1a2cc61"
+                "reference": "2a2433144dca408315e4ee163f9ab73a6110b2b1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-oauth/zipball/d14d7aca6e699ec12b3f4dd0128373faa1a2cc61",
-                "reference": "d14d7aca6e699ec12b3f4dd0128373faa1a2cc61",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-oauth/zipball/2a2433144dca408315e4ee163f9ab73a6110b2b1",
+                "reference": "2a2433144dca408315e4ee163f9ab73a6110b2b1",
                 "shasum": ""
             },
             "require": {
@@ -1531,6 +1731,11 @@
                 "simplesamlphp/simplesamlphp": "^1.17"
             },
             "type": "simplesamlphp-module",
+            "autoload": {
+                "psr-4": {
+                    "SimpleSAML\\Module\\oauth\\": "lib/"
+                }
+            },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
                 "LGPL-2.1-or-later"
@@ -1551,29 +1756,34 @@
                 "oauth1",
                 "simplesamlphp"
             ],
-            "time": "2020-04-29T19:37:43+00:00"
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-oauth/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-oauth/"
+            },
+            "abandoned": true,
+            "time": "2021-08-31T18:55:00+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-preprodwarning",
-            "version": "v0.9.2",
+            "version": "v0.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning.git",
-                "reference": "8e032de33a75eb44857dc06d886ad94ee3af4638"
+                "reference": "b3c6d9d41d009e340f4843ce5c24b4118a38e4c3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-preprodwarning/zipball/8e032de33a75eb44857dc06d886ad94ee3af4638",
-                "reference": "8e032de33a75eb44857dc06d886ad94ee3af4638",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-preprodwarning/zipball/b3c6d9d41d009e340f4843ce5c24b4118a38e4c3",
+                "reference": "b3c6d9d41d009e340f4843ce5c24b4118a38e4c3",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
+                "php": ">=7.0",
                 "simplesamlphp/composer-module-installer": "~1.1"
             },
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
-                "simplesamlphp/simplesamlphp": "^1.17",
+                "simplesamlphp/simplesamlphp": "dev-simplesamlphp-1.19",
                 "webmozart/assert": "^1.4"
             },
             "type": "simplesamlphp-module",
@@ -1597,20 +1807,24 @@
                 "preprodwarning",
                 "simplesamlphp"
             ],
-            "time": "2020-04-09T13:05:27+00:00"
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning"
+            },
+            "time": "2022-01-06T23:21:17+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-radius",
-            "version": "v0.9.3",
+            "version": "v0.9.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-radius.git",
-                "reference": "36bd0f39f9a13f7eb96ead97c97c3634aa1c3f2d"
+                "reference": "dbe2976ba27f5131faeca368a5665f8baeaae8b6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-radius/zipball/36bd0f39f9a13f7eb96ead97c97c3634aa1c3f2d",
-                "reference": "36bd0f39f9a13f7eb96ead97c97c3634aa1c3f2d",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-radius/zipball/dbe2976ba27f5131faeca368a5665f8baeaae8b6",
+                "reference": "dbe2976ba27f5131faeca368a5665f8baeaae8b6",
                 "shasum": ""
             },
             "require": {
@@ -1630,7 +1844,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -1643,7 +1857,11 @@
                 "radius",
                 "simplesamlphp"
             ],
-            "time": "2019-10-03T18:13:07+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-radius/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-radius"
+            },
+            "time": "2022-01-06T23:23:28+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-riak",
@@ -1689,6 +1907,11 @@
                 "riak",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-riak/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-riak"
+            },
+            "abandoned": true,
             "time": "2019-12-03T08:28:45+00:00"
         },
         {
@@ -1735,20 +1958,24 @@
                 "sanitycheck",
                 "simplesamlphp"
             ],
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-sanitycheck/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-sanitycheck"
+            },
             "time": "2020-05-07T11:34:29+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-smartattributes",
-            "version": "v0.9.1",
+            "version": "v0.9.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-smartattributes.git",
-                "reference": "b45d3ecd916e359a9cae05f9ae9df09b5c42f4e6"
+                "reference": "ba6a32fa287db0f8d767104471176f70fad7f0e1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-smartattributes/zipball/b45d3ecd916e359a9cae05f9ae9df09b5c42f4e6",
-                "reference": "b45d3ecd916e359a9cae05f9ae9df09b5c42f4e6",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-smartattributes/zipball/ba6a32fa287db0f8d767104471176f70fad7f0e1",
+                "reference": "ba6a32fa287db0f8d767104471176f70fad7f0e1",
                 "shasum": ""
             },
             "require": {
@@ -1767,7 +1994,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -1780,20 +2007,24 @@
                 "simplesamlphp",
                 "smartattributes"
             ],
-            "time": "2019-12-03T09:24:09+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-smartattributes/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-smartattributes"
+            },
+            "time": "2022-01-06T23:42:07+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-sqlauth",
-            "version": "v0.9.1",
+            "version": "v0.9.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-sqlauth.git",
-                "reference": "31bce8763ad97f4b4473e4ad4a5a96ddc136ef6b"
+                "reference": "8a28f9a9726bab1dbc8fd3734daa08882dd0a25b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-sqlauth/zipball/31bce8763ad97f4b4473e4ad4a5a96ddc136ef6b",
-                "reference": "31bce8763ad97f4b4473e4ad4a5a96ddc136ef6b",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-sqlauth/zipball/8a28f9a9726bab1dbc8fd3734daa08882dd0a25b",
+                "reference": "8a28f9a9726bab1dbc8fd3734daa08882dd0a25b",
                 "shasum": ""
             },
             "require": {
@@ -1803,7 +2034,7 @@
             "require-dev": {
                 "phpunit/phpunit": "~5.7",
                 "simplesamlphp/simplesamlphp": "^1.17",
-                "webmozart/assert": "^1.4"
+                "webmozart/assert": "^1.4 <1.7"
             },
             "type": "simplesamlphp-module",
             "autoload": {
@@ -1813,7 +2044,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -1826,20 +2057,24 @@
                 "simplesamlphp",
                 "sqlauth"
             ],
-            "time": "2019-12-03T09:07:09+00:00"
+            "support": {
+                "issues": "https://github.com/tvdijen/simplesamlphp-module-sqlauth/issues",
+                "source": "https://github.com/tvdijen/simplesamlphp-module-sqlauth"
+            },
+            "time": "2022-01-06T23:50:52+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-module-statistics",
-            "version": "v0.9.4",
+            "version": "v0.9.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-module-statistics.git",
-                "reference": "1bb1e46921d8dc84707bc9cd3c307c8abd723ac7"
+                "reference": "03fb6bdbbf5ce0a0cb257208db79aacac227ac10"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-statistics/zipball/1bb1e46921d8dc84707bc9cd3c307c8abd723ac7",
-                "reference": "1bb1e46921d8dc84707bc9cd3c307c8abd723ac7",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-statistics/zipball/03fb6bdbbf5ce0a0cb257208db79aacac227ac10",
+                "reference": "03fb6bdbbf5ce0a0cb257208db79aacac227ac10",
                 "shasum": ""
             },
             "require": {
@@ -1860,7 +2095,7 @@
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "LGPL-3.0-or-later"
+                "LGPL-2.1-or-later"
             ],
             "authors": [
                 {
@@ -1873,28 +2108,36 @@
                 "simplesamlphp",
                 "statistics"
             ],
-            "time": "2019-12-03T08:42:27+00:00"
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-module-statistics/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-module-statistics"
+            },
+            "time": "2021-01-25T15:15:26+00:00"
         },
         {
             "name": "simplesamlphp/twig-configurable-i18n",
-            "version": "v2.2",
+            "version": "v2.3.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/twig-configurable-i18n.git",
-                "reference": "b036c134157ce40ed66da2fc9d01f63e3b1d3abd"
+                "reference": "e2bffc7eed3112a0b3870ef5b4da0fd74c7c4b8a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/twig-configurable-i18n/zipball/b036c134157ce40ed66da2fc9d01f63e3b1d3abd",
-                "reference": "b036c134157ce40ed66da2fc9d01f63e3b1d3abd",
+                "url": "https://api.github.com/repos/simplesamlphp/twig-configurable-i18n/zipball/e2bffc7eed3112a0b3870ef5b4da0fd74c7c4b8a",
+                "reference": "e2bffc7eed3112a0b3870ef5b4da0fd74c7c4b8a",
                 "shasum": ""
             },
             "require": {
-                "twig/extensions": "^1.5"
+                "php": ">=7.1",
+                "twig/extensions": "@dev"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.8.36 || ~7.5",
-                "twig/twig": "^1.37 || ^2.7"
+                "phpunit/phpunit": "^7.5",
+                "sensiolabs/security-checker": "~6.0.3",
+                "simplesamlphp/simplesamlphp-test-framework": "~0.1.2",
+                "squizlabs/php_codesniffer": "^3.5",
+                "twig/twig": "^2.13"
             },
             "type": "project",
             "autoload": {
@@ -1921,49 +2164,63 @@
                 "translation",
                 "twig"
             ],
-            "time": "2019-07-09T08:35:44+00:00"
+            "support": {
+                "issues": "https://github.com/simplesamlphp/twig-configurable-i18n/issues",
+                "source": "https://github.com/simplesamlphp/twig-configurable-i18n"
+            },
+            "time": "2020-08-27T12:51:10+00:00"
         },
         {
-            "name": "symfony/config",
-            "version": "v3.4.43",
+            "name": "symfony/cache",
+            "version": "v4.4.43",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/config.git",
-                "reference": "9e2aa97f0d51f114983666f5aa362426d53e004a"
+                "url": "https://github.com/symfony/cache.git",
+                "reference": "3b3c6019f3df2fa73d15dfed133e432a9801d7eb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/config/zipball/9e2aa97f0d51f114983666f5aa362426d53e004a",
-                "reference": "9e2aa97f0d51f114983666f5aa362426d53e004a",
+                "url": "https://api.github.com/repos/symfony/cache/zipball/3b3c6019f3df2fa73d15dfed133e432a9801d7eb",
+                "reference": "3b3c6019f3df2fa73d15dfed133e432a9801d7eb",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8",
-                "symfony/filesystem": "~2.8|~3.0|~4.0",
-                "symfony/polyfill-ctype": "~1.8"
+                "php": ">=7.1.3",
+                "psr/cache": "^1.0|^2.0",
+                "psr/log": "^1|^2|^3",
+                "symfony/cache-contracts": "^1.1.7|^2",
+                "symfony/polyfill-php73": "^1.9",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.1|^2",
+                "symfony/var-exporter": "^4.2|^5.0"
             },
             "conflict": {
-                "symfony/dependency-injection": "<3.3",
-                "symfony/finder": "<3.3"
+                "doctrine/dbal": "<2.7",
+                "symfony/dependency-injection": "<3.4",
+                "symfony/http-kernel": "<4.4|>=5.0",
+                "symfony/var-dumper": "<4.4"
             },
-            "require-dev": {
-                "symfony/dependency-injection": "~3.3|~4.0",
-                "symfony/event-dispatcher": "~3.3|~4.0",
-                "symfony/finder": "~3.3|~4.0",
-                "symfony/yaml": "~3.0|~4.0"
+            "provide": {
+                "psr/cache-implementation": "1.0|2.0",
+                "psr/simple-cache-implementation": "1.0|2.0",
+                "symfony/cache-implementation": "1.0|2.0"
             },
-            "suggest": {
-                "symfony/yaml": "To use the yaml reference dumper"
+            "require-dev": {
+                "cache/integration-tests": "dev-master",
+                "doctrine/cache": "^1.6|^2.0",
+                "doctrine/dbal": "^2.7|^3.0",
+                "predis/predis": "^1.1",
+                "psr/simple-cache": "^1.0|^2.0",
+                "symfony/config": "^4.2|^5.0",
+                "symfony/dependency-injection": "^3.4|^4.1|^5.0",
+                "symfony/filesystem": "^4.4|^5.0",
+                "symfony/http-kernel": "^4.4",
+                "symfony/var-dumper": "^4.4|^5.0"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.4-dev"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Component\\Config\\": ""
+                    "Symfony\\Component\\Cache\\": ""
                 },
                 "exclude-from-classmap": [
                     "/Tests/"
@@ -1975,16 +2232,23 @@
             ],
             "authors": [
                 {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
                 },
                 {
                     "name": "Symfony Community",
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony Config Component",
+            "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation",
             "homepage": "https://symfony.com",
+            "keywords": [
+                "caching",
+                "psr6"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache/tree/v4.4.43"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -1999,45 +2263,43 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-23T09:37:51+00:00"
+            "time": "2022-06-19T11:27:12+00:00"
         },
         {
-            "name": "symfony/debug",
-            "version": "v3.4.43",
+            "name": "symfony/cache-contracts",
+            "version": "v1.1.13",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/debug.git",
-                "reference": "7ce874f4432d8b11cc45a80cc5130a6e2609728d"
+                "url": "https://github.com/symfony/cache-contracts.git",
+                "reference": "a872a66e0bf7bac179c89bc96c7098bef1949f81"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/debug/zipball/7ce874f4432d8b11cc45a80cc5130a6e2609728d",
-                "reference": "7ce874f4432d8b11cc45a80cc5130a6e2609728d",
+                "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/a872a66e0bf7bac179c89bc96c7098bef1949f81",
+                "reference": "a872a66e0bf7bac179c89bc96c7098bef1949f81",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8",
-                "psr/log": "~1.0"
-            },
-            "conflict": {
-                "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+                "php": ">=7.1.3",
+                "psr/cache": "^1.0|^2.0|^3.0"
             },
-            "require-dev": {
-                "symfony/http-kernel": "~2.8|~3.0|~4.0"
+            "suggest": {
+                "symfony/cache-implementation": ""
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.4-dev"
+                    "dev-main": "1.1-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Component\\Debug\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
+                    "Symfony\\Contracts\\Cache\\": ""
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -2045,16 +2307,27 @@
             ],
             "authors": [
                 {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
                 },
                 {
                     "name": "Symfony Community",
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony Debug Component",
+            "description": "Generic abstractions related to caching",
             "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache-contracts/tree/v1.1.13"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2069,56 +2342,46 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-16T09:41:49+00:00"
+            "time": "2022-01-02T09:41:36+00:00"
         },
         {
-            "name": "symfony/dependency-injection",
-            "version": "v3.4.43",
+            "name": "symfony/config",
+            "version": "v4.4.42",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/dependency-injection.git",
-                "reference": "3a14abc01c36e81fc1c4c48b42c103b9dd892ed3"
+                "url": "https://github.com/symfony/config.git",
+                "reference": "83cdafd1bd3370de23e3dc2ed01026908863be81"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/3a14abc01c36e81fc1c4c48b42c103b9dd892ed3",
-                "reference": "3a14abc01c36e81fc1c4c48b42c103b9dd892ed3",
+                "url": "https://api.github.com/repos/symfony/config/zipball/83cdafd1bd3370de23e3dc2ed01026908863be81",
+                "reference": "83cdafd1bd3370de23e3dc2ed01026908863be81",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8",
-                "psr/container": "^1.0"
+                "php": ">=7.1.3",
+                "symfony/filesystem": "^3.4|^4.0|^5.0",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/polyfill-php81": "^1.22"
             },
             "conflict": {
-                "symfony/config": "<3.3.7",
-                "symfony/finder": "<3.3",
-                "symfony/proxy-manager-bridge": "<3.4",
-                "symfony/yaml": "<3.4"
-            },
-            "provide": {
-                "psr/container-implementation": "1.0"
+                "symfony/finder": "<3.4"
             },
             "require-dev": {
-                "symfony/config": "~3.3|~4.0",
-                "symfony/expression-language": "~2.8|~3.0|~4.0",
-                "symfony/yaml": "~3.4|~4.0"
+                "symfony/event-dispatcher": "^3.4|^4.0|^5.0",
+                "symfony/finder": "^3.4|^4.0|^5.0",
+                "symfony/messenger": "^4.1|^5.0",
+                "symfony/service-contracts": "^1.1|^2",
+                "symfony/yaml": "^3.4|^4.0|^5.0"
             },
             "suggest": {
-                "symfony/config": "",
-                "symfony/expression-language": "For using expressions in service container configuration",
-                "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required",
-                "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
-                "symfony/yaml": ""
+                "symfony/yaml": "To use the yaml reference dumper"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.4-dev"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Component\\DependencyInjection\\": ""
+                    "Symfony\\Component\\Config\\": ""
                 },
                 "exclude-from-classmap": [
                     "/Tests/"
@@ -2138,8 +2401,11 @@
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony DependencyInjection Component",
+            "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
             "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/config/tree/v4.4.42"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2154,48 +2420,58 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-23T09:37:51+00:00"
+            "time": "2022-05-17T07:10:14+00:00"
         },
         {
-            "name": "symfony/event-dispatcher",
-            "version": "v3.4.43",
+            "name": "symfony/console",
+            "version": "v4.4.43",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "14d978f8e8555f2de719c00eb65376be7d2e9081"
+                "url": "https://github.com/symfony/console.git",
+                "reference": "8a2628d2d5639f35113dc1b833ecd91e1ed1cf46"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/14d978f8e8555f2de719c00eb65376be7d2e9081",
-                "reference": "14d978f8e8555f2de719c00eb65376be7d2e9081",
+                "url": "https://api.github.com/repos/symfony/console/zipball/8a2628d2d5639f35113dc1b833ecd91e1ed1cf46",
+                "reference": "8a2628d2d5639f35113dc1b833ecd91e1ed1cf46",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8"
+                "php": ">=7.1.3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php73": "^1.8",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.1|^2"
             },
             "conflict": {
-                "symfony/dependency-injection": "<3.3"
+                "psr/log": ">=3",
+                "symfony/dependency-injection": "<3.4",
+                "symfony/event-dispatcher": "<4.3|>=5",
+                "symfony/lock": "<4.4",
+                "symfony/process": "<3.3"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0|2.0"
             },
             "require-dev": {
-                "psr/log": "~1.0",
-                "symfony/config": "~2.8|~3.0|~4.0",
-                "symfony/dependency-injection": "~3.3|~4.0",
-                "symfony/expression-language": "~2.8|~3.0|~4.0",
-                "symfony/stopwatch": "~2.8|~3.0|~4.0"
+                "psr/log": "^1|^2",
+                "symfony/config": "^3.4|^4.0|^5.0",
+                "symfony/dependency-injection": "^3.4|^4.0|^5.0",
+                "symfony/event-dispatcher": "^4.3",
+                "symfony/lock": "^4.4|^5.0",
+                "symfony/process": "^3.4|^4.0|^5.0",
+                "symfony/var-dumper": "^4.3|^5.0"
             },
             "suggest": {
-                "symfony/dependency-injection": "",
-                "symfony/http-kernel": ""
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/lock": "",
+                "symfony/process": ""
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.4-dev"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Component\\EventDispatcher\\": ""
+                    "Symfony\\Component\\Console\\": ""
                 },
                 "exclude-from-classmap": [
                     "/Tests/"
@@ -2215,8 +2491,11 @@
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony EventDispatcher Component",
+            "description": "Eases the creation of beautiful and testable command line interfaces",
             "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/console/tree/v4.4.43"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2231,35 +2510,36 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-05-05T15:06:23+00:00"
+            "time": "2022-06-23T12:22:25+00:00"
         },
         {
-            "name": "symfony/filesystem",
-            "version": "v3.4.43",
+            "name": "symfony/debug",
+            "version": "v4.4.41",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/filesystem.git",
-                "reference": "0f625d0cb1e59c8c4ba61abb170125175218ff10"
+                "url": "https://github.com/symfony/debug.git",
+                "reference": "6637e62480b60817b9a6984154a533e8e64c6bd5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/0f625d0cb1e59c8c4ba61abb170125175218ff10",
-                "reference": "0f625d0cb1e59c8c4ba61abb170125175218ff10",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/6637e62480b60817b9a6984154a533e8e64c6bd5",
+                "reference": "6637e62480b60817b9a6984154a533e8e64c6bd5",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8",
-                "symfony/polyfill-ctype": "~1.8"
+                "php": ">=7.1.3",
+                "psr/log": "^1|^2|^3"
             },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.4-dev"
-                }
+            "conflict": {
+                "symfony/http-kernel": "<3.4"
+            },
+            "require-dev": {
+                "symfony/http-kernel": "^3.4|^4.0|^5.0"
             },
+            "type": "library",
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Component\\Filesystem\\": ""
+                    "Symfony\\Component\\Debug\\": ""
                 },
                 "exclude-from-classmap": [
                     "/Tests/"
@@ -2279,8 +2559,11 @@
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony Filesystem Component",
+            "description": "Provides tools to ease debugging PHP code",
             "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/debug/tree/v4.4.41"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2295,39 +2578,55 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-05-30T17:48:24+00:00"
+            "abandoned": "symfony/error-handler",
+            "time": "2022-04-12T15:19:55+00:00"
         },
         {
-            "name": "symfony/http-foundation",
-            "version": "v3.4.43",
+            "name": "symfony/dependency-injection",
+            "version": "v4.4.43",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "5219dba1253aa07ed3ad82f73c08146fb3f517d0"
+                "url": "https://github.com/symfony/dependency-injection.git",
+                "reference": "8d0ae6d87ceea5f3a352413f9d1f71ed2234dcbd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5219dba1253aa07ed3ad82f73c08146fb3f517d0",
-                "reference": "5219dba1253aa07ed3ad82f73c08146fb3f517d0",
+                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8d0ae6d87ceea5f3a352413f9d1f71ed2234dcbd",
+                "reference": "8d0ae6d87ceea5f3a352413f9d1f71ed2234dcbd",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8",
-                "symfony/polyfill-mbstring": "~1.1",
-                "symfony/polyfill-php70": "~1.6"
+                "php": ">=7.1.3",
+                "psr/container": "^1.0",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.1.6|^2"
+            },
+            "conflict": {
+                "symfony/config": "<4.3|>=5.0",
+                "symfony/finder": "<3.4",
+                "symfony/proxy-manager-bridge": "<3.4",
+                "symfony/yaml": "<4.4.26"
+            },
+            "provide": {
+                "psr/container-implementation": "1.0",
+                "symfony/service-implementation": "1.0|2.0"
             },
             "require-dev": {
-                "symfony/expression-language": "~2.8|~3.0|~4.0"
+                "symfony/config": "^4.3",
+                "symfony/expression-language": "^3.4|^4.0|^5.0",
+                "symfony/yaml": "^4.4.26|^5.0"
             },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.4-dev"
-                }
+            "suggest": {
+                "symfony/config": "",
+                "symfony/expression-language": "For using expressions in service container configuration",
+                "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required",
+                "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
+                "symfony/yaml": ""
             },
+            "type": "library",
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Component\\HttpFoundation\\": ""
+                    "Symfony\\Component\\DependencyInjection\\": ""
                 },
                 "exclude-from-classmap": [
                     "/Tests/"
@@ -2347,8 +2646,11 @@
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony HttpFoundation Component",
+            "description": "Allows you to standardize and centralize the way objects are constructed in your application",
             "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/dependency-injection/tree/v4.4.43"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2363,75 +2665,36 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-23T09:37:51+00:00"
+            "time": "2022-06-22T15:01:38+00:00"
         },
         {
-            "name": "symfony/http-kernel",
-            "version": "v3.4.43",
+            "name": "symfony/error-handler",
+            "version": "v4.4.41",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "4a1c6b310806adce0f299411951d06747edf9e28"
+                "url": "https://github.com/symfony/error-handler.git",
+                "reference": "529feb0e03133dbd5fd3707200147cc4903206da"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4a1c6b310806adce0f299411951d06747edf9e28",
-                "reference": "4a1c6b310806adce0f299411951d06747edf9e28",
+                "url": "https://api.github.com/repos/symfony/error-handler/zipball/529feb0e03133dbd5fd3707200147cc4903206da",
+                "reference": "529feb0e03133dbd5fd3707200147cc4903206da",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8",
-                "psr/log": "~1.0",
-                "symfony/debug": "^3.3.3|~4.0",
-                "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
-                "symfony/http-foundation": "~3.4.12|~4.0.12|^4.1.1",
-                "symfony/polyfill-ctype": "~1.8",
-                "symfony/polyfill-php56": "~1.8"
-            },
-            "conflict": {
-                "symfony/config": "<2.8",
-                "symfony/dependency-injection": "<3.4.10|<4.0.10,>=4",
-                "symfony/var-dumper": "<3.3",
-                "twig/twig": "<1.34|<2.4,>=2"
-            },
-            "provide": {
-                "psr/log-implementation": "1.0"
+                "php": ">=7.1.3",
+                "psr/log": "^1|^2|^3",
+                "symfony/debug": "^4.4.5",
+                "symfony/var-dumper": "^4.4|^5.0"
             },
             "require-dev": {
-                "psr/cache": "~1.0",
-                "symfony/browser-kit": "~2.8|~3.0|~4.0",
-                "symfony/class-loader": "~2.8|~3.0",
-                "symfony/config": "~2.8|~3.0|~4.0",
-                "symfony/console": "~2.8|~3.0|~4.0",
-                "symfony/css-selector": "~2.8|~3.0|~4.0",
-                "symfony/dependency-injection": "^3.4.10|^4.0.10",
-                "symfony/dom-crawler": "~2.8|~3.0|~4.0",
-                "symfony/expression-language": "~2.8|~3.0|~4.0",
-                "symfony/finder": "~2.8|~3.0|~4.0",
-                "symfony/process": "~2.8|~3.0|~4.0",
-                "symfony/routing": "~3.4|~4.0",
-                "symfony/stopwatch": "~2.8|~3.0|~4.0",
-                "symfony/templating": "~2.8|~3.0|~4.0",
-                "symfony/translation": "~2.8|~3.0|~4.0",
-                "symfony/var-dumper": "~3.3|~4.0"
-            },
-            "suggest": {
-                "symfony/browser-kit": "",
-                "symfony/config": "",
-                "symfony/console": "",
-                "symfony/dependency-injection": "",
-                "symfony/finder": "",
-                "symfony/var-dumper": ""
+                "symfony/http-kernel": "^4.4|^5.0",
+                "symfony/serializer": "^4.4|^5.0"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.4-dev"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Component\\HttpKernel\\": ""
+                    "Symfony\\Component\\ErrorHandler\\": ""
                 },
                 "exclude-from-classmap": [
                     "/Tests/"
@@ -2451,8 +2714,11 @@
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony HttpKernel Component",
+            "description": "Provides tools to manage errors and ease debugging PHP code",
             "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/error-handler/tree/v4.4.41"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2467,44 +2733,55 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-24T03:48:59+00:00"
+            "time": "2022-04-12T15:19:55+00:00"
         },
         {
-            "name": "symfony/polyfill-ctype",
-            "version": "v1.18.1",
+            "name": "symfony/event-dispatcher",
+            "version": "v4.4.42",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/polyfill-ctype.git",
-                "reference": "1c302646f6efc070cd46856e600e5e0684d6b454"
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "708e761740c16b02c86e3f0c932018a06b895d40"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454",
-                "reference": "1c302646f6efc070cd46856e600e5e0684d6b454",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/708e761740c16b02c86e3f0c932018a06b895d40",
+                "reference": "708e761740c16b02c86e3f0c932018a06b895d40",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.1.3",
+                "symfony/event-dispatcher-contracts": "^1.1",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<3.4"
+            },
+            "provide": {
+                "psr/event-dispatcher-implementation": "1.0",
+                "symfony/event-dispatcher-implementation": "1.1"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^3.4|^4.0|^5.0",
+                "symfony/dependency-injection": "^3.4|^4.0|^5.0",
+                "symfony/error-handler": "~3.4|~4.4",
+                "symfony/expression-language": "^3.4|^4.0|^5.0",
+                "symfony/http-foundation": "^3.4|^4.0|^5.0",
+                "symfony/service-contracts": "^1.1|^2",
+                "symfony/stopwatch": "^3.4|^4.0|^5.0"
             },
             "suggest": {
-                "ext-ctype": "For best performance"
+                "symfony/dependency-injection": "",
+                "symfony/http-kernel": ""
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.18-dev"
-                },
-                "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Polyfill\\Ctype\\": ""
+                    "Symfony\\Component\\EventDispatcher\\": ""
                 },
-                "files": [
-                    "bootstrap.php"
+                "exclude-from-classmap": [
+                    "/Tests/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -2513,22 +2790,19 @@
             ],
             "authors": [
                 {
-                    "name": "Gert de Pagter",
-                    "email": "BackEndTea@gmail.com"
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
                 },
                 {
                     "name": "Symfony Community",
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony polyfill for ctype functions",
+            "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
             "homepage": "https://symfony.com",
-            "keywords": [
-                "compatibility",
-                "ctype",
-                "polyfill",
-                "portable"
-            ],
+            "support": {
+                "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.42"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2543,45 +2817,43 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-14T12:35:20+00:00"
+            "time": "2022-05-05T15:33:49+00:00"
         },
         {
-            "name": "symfony/polyfill-mbstring",
-            "version": "v1.18.1",
+            "name": "symfony/event-dispatcher-contracts",
+            "version": "v1.1.13",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a"
+                "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+                "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a",
-                "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/1d5cd762abaa6b2a4169d3e77610193a7157129e",
+                "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.1.3"
             },
             "suggest": {
-                "ext-mbstring": "For best performance"
+                "psr/event-dispatcher": "",
+                "symfony/event-dispatcher-implementation": ""
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.18-dev"
+                    "dev-main": "1.1-dev"
                 },
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Polyfill\\Mbstring\\": ""
-                },
-                "files": [
-                    "bootstrap.php"
-                ]
+                    "Symfony\\Contracts\\EventDispatcher\\": ""
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -2597,15 +2869,19 @@
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony polyfill for the Mbstring extension",
+            "description": "Generic abstractions related to dispatching event",
             "homepage": "https://symfony.com",
             "keywords": [
-                "compatibility",
-                "mbstring",
-                "polyfill",
-                "portable",
-                "shim"
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
             ],
+            "support": {
+                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.13"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2620,42 +2896,34 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-14T12:35:20+00:00"
+            "time": "2022-01-02T09:41:36+00:00"
         },
         {
-            "name": "symfony/polyfill-php56",
-            "version": "v1.18.1",
+            "name": "symfony/filesystem",
+            "version": "v4.4.42",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/polyfill-php56.git",
-                "reference": "13df84e91cd168f247c2f2ec82cc0fa24901c011"
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "815412ee8971209bd4c1eecd5f4f481eacd44bf5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/13df84e91cd168f247c2f2ec82cc0fa24901c011",
-                "reference": "13df84e91cd168f247c2f2ec82cc0fa24901c011",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/815412ee8971209bd4c1eecd5f4f481eacd44bf5",
+                "reference": "815412ee8971209bd4c1eecd5f4f481eacd44bf5",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
-                "symfony/polyfill-util": "~1.0"
+                "php": ">=7.1.3",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-php80": "^1.16"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.18-dev"
-                },
-                "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Polyfill\\Php56\\": ""
+                    "Symfony\\Component\\Filesystem\\": ""
                 },
-                "files": [
-                    "bootstrap.php"
+                "exclude-from-classmap": [
+                    "/Tests/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -2664,22 +2932,19 @@
             ],
             "authors": [
                 {
-                    "name": "Nicolas Grekas",
-                    "email": "p@tchwork.com"
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
                 },
                 {
                     "name": "Symfony Community",
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
+            "description": "Provides basic utilities for the filesystem",
             "homepage": "https://symfony.com",
-            "keywords": [
-                "compatibility",
-                "polyfill",
-                "portable",
-                "shim"
-            ],
+            "support": {
+                "source": "https://github.com/symfony/filesystem/tree/v4.4.42"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2694,45 +2959,33 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-14T12:35:20+00:00"
+            "time": "2022-05-20T08:49:14+00:00"
         },
         {
-            "name": "symfony/polyfill-php70",
-            "version": "v1.18.1",
+            "name": "symfony/finder",
+            "version": "v4.4.41",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/polyfill-php70.git",
-                "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3"
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "40790bdf293b462798882ef6da72bb49a4a6633a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3",
-                "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/40790bdf293b462798882ef6da72bb49a4a6633a",
+                "reference": "40790bdf293b462798882ef6da72bb49a4a6633a",
                 "shasum": ""
             },
             "require": {
-                "paragonie/random_compat": "~1.0|~2.0|~9.99",
-                "php": ">=5.3.3"
+                "php": ">=7.1.3",
+                "symfony/polyfill-php80": "^1.16"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.18-dev"
-                },
-                "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Polyfill\\Php70\\": ""
+                    "Symfony\\Component\\Finder\\": ""
                 },
-                "files": [
-                    "bootstrap.php"
-                ],
-                "classmap": [
-                    "Resources/stubs"
+                "exclude-from-classmap": [
+                    "/Tests/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -2741,22 +2994,165 @@
             ],
             "authors": [
                 {
-                    "name": "Nicolas Grekas",
-                    "email": "p@tchwork.com"
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
                 },
                 {
                     "name": "Symfony Community",
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
+            "description": "Finds files and directories via an intuitive fluent interface",
             "homepage": "https://symfony.com",
-            "keywords": [
-                "compatibility",
-                "polyfill",
-                "portable",
-                "shim"
+            "support": {
+                "source": "https://github.com/symfony/finder/tree/v4.4.41"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-04-14T15:36:10+00:00"
+        },
+        {
+            "name": "symfony/framework-bundle",
+            "version": "v4.4.43",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/framework-bundle.git",
+                "reference": "07a0ce6656e6de53a529018fe7a1421be838d2ad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/07a0ce6656e6de53a529018fe7a1421be838d2ad",
+                "reference": "07a0ce6656e6de53a529018fe7a1421be838d2ad",
+                "shasum": ""
+            },
+            "require": {
+                "ext-xml": "*",
+                "php": ">=7.1.3",
+                "symfony/cache": "^4.4|^5.0",
+                "symfony/config": "^4.4.11|~5.0.11|^5.1.3",
+                "symfony/dependency-injection": "^4.4.38|^5.0.1",
+                "symfony/error-handler": "^4.4.1|^5.0.1",
+                "symfony/filesystem": "^3.4|^4.0|^5.0",
+                "symfony/finder": "^3.4|^4.0|^5.0",
+                "symfony/http-foundation": "^4.4|^5.0",
+                "symfony/http-kernel": "^4.4",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/routing": "^4.4.12|^5.1.4"
+            },
+            "conflict": {
+                "doctrine/persistence": "<1.3",
+                "phpdocumentor/reflection-docblock": "<3.0|>=3.2.0,<3.2.2",
+                "phpdocumentor/type-resolver": "<0.3.0|1.3.*",
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+                "symfony/asset": "<3.4",
+                "symfony/browser-kit": "<4.3",
+                "symfony/console": "<4.4.21",
+                "symfony/dom-crawler": "<4.3",
+                "symfony/dotenv": "<4.3.6",
+                "symfony/form": "<4.3.5",
+                "symfony/http-client": "<4.4",
+                "symfony/lock": "<4.4",
+                "symfony/mailer": "<4.4",
+                "symfony/messenger": "<4.4",
+                "symfony/mime": "<4.4",
+                "symfony/property-info": "<3.4",
+                "symfony/security-bundle": "<4.4",
+                "symfony/serializer": "<4.4",
+                "symfony/stopwatch": "<3.4",
+                "symfony/translation": "<4.4",
+                "symfony/twig-bridge": "<4.1.1",
+                "symfony/twig-bundle": "<4.4",
+                "symfony/validator": "<4.4",
+                "symfony/web-profiler-bundle": "<4.4",
+                "symfony/workflow": "<4.3.6"
+            },
+            "require-dev": {
+                "doctrine/annotations": "^1.10.4",
+                "doctrine/cache": "^1.0|^2.0",
+                "doctrine/persistence": "^1.3|^2|^3",
+                "paragonie/sodium_compat": "^1.8",
+                "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+                "symfony/asset": "^3.4|^4.0|^5.0",
+                "symfony/browser-kit": "^4.3|^5.0",
+                "symfony/console": "^4.4.42|^5.4.9",
+                "symfony/css-selector": "^3.4|^4.0|^5.0",
+                "symfony/dom-crawler": "^4.4.30|^5.3.7",
+                "symfony/dotenv": "^4.3.6|^5.0",
+                "symfony/expression-language": "^3.4|^4.0|^5.0",
+                "symfony/form": "^4.3.5|^5.0",
+                "symfony/http-client": "^4.4|^5.0",
+                "symfony/lock": "^4.4|^5.0",
+                "symfony/mailer": "^4.4|^5.0",
+                "symfony/messenger": "^4.4|^5.0",
+                "symfony/mime": "^4.4|^5.0",
+                "symfony/polyfill-intl-icu": "~1.0",
+                "symfony/process": "^3.4|^4.0|^5.0",
+                "symfony/property-info": "^3.4|^4.0|^5.0",
+                "symfony/security-core": "^3.4|^4.4|^5.2",
+                "symfony/security-csrf": "^3.4|^4.0|^5.0",
+                "symfony/security-http": "^3.4|^4.0|^5.0",
+                "symfony/serializer": "^4.4|^5.0",
+                "symfony/stopwatch": "^3.4|^4.0|^5.0",
+                "symfony/templating": "^3.4|^4.0|^5.0",
+                "symfony/translation": "^4.4|^5.0",
+                "symfony/twig-bundle": "^4.4|^5.0",
+                "symfony/validator": "^4.4|^5.0",
+                "symfony/web-link": "^4.4|^5.0",
+                "symfony/workflow": "^4.3.6|^5.0",
+                "symfony/yaml": "^3.4|^4.0|^5.0",
+                "twig/twig": "^1.43|^2.13|^3.0.4"
+            },
+            "suggest": {
+                "ext-apcu": "For best performance of the system caches",
+                "symfony/console": "For using the console commands",
+                "symfony/form": "For using forms",
+                "symfony/property-info": "For using the property_info service",
+                "symfony/serializer": "For using the serializer service",
+                "symfony/validator": "For using validation",
+                "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering",
+                "symfony/yaml": "For using the debug:config and lint:yaml commands"
+            },
+            "type": "symfony-bundle",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bundle\\FrameworkBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
             ],
+            "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/framework-bundle/tree/v4.4.43"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2771,38 +3167,41 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-14T12:35:20+00:00"
+            "time": "2022-06-14T12:25:52+00:00"
         },
         {
-            "name": "symfony/polyfill-util",
-            "version": "v1.18.1",
+            "name": "symfony/http-client-contracts",
+            "version": "v1.1.13",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/polyfill-util.git",
-                "reference": "46b910c71e9828f8ec2aa7a0314de1130d9b295a"
+                "url": "https://github.com/symfony/http-client-contracts.git",
+                "reference": "59f37624a82635962f04c98f31aed122e539a89e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/46b910c71e9828f8ec2aa7a0314de1130d9b295a",
-                "reference": "46b910c71e9828f8ec2aa7a0314de1130d9b295a",
+                "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/59f37624a82635962f04c98f31aed122e539a89e",
+                "reference": "59f37624a82635962f04c98f31aed122e539a89e",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.1.3"
+            },
+            "suggest": {
+                "symfony/http-client-implementation": ""
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.18-dev"
+                    "dev-main": "1.1-dev"
                 },
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Polyfill\\Util\\": ""
+                    "Symfony\\Contracts\\HttpClient\\": ""
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -2819,14 +3218,19 @@
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony utilities for portability of PHP codes",
+            "description": "Generic abstractions related to HTTP clients",
             "homepage": "https://symfony.com",
             "keywords": [
-                "compat",
-                "compatibility",
-                "polyfill",
-                "shim"
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
             ],
+            "support": {
+                "source": "https://github.com/symfony/http-client-contracts/tree/v1.1.13"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2841,55 +3245,36 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-14T12:35:20+00:00"
+            "time": "2022-04-11T14:52:04+00:00"
         },
         {
-            "name": "symfony/routing",
-            "version": "v3.4.43",
+            "name": "symfony/http-foundation",
+            "version": "v4.4.43",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/routing.git",
-                "reference": "58381b7b815c1e3afaf60a534fbf769157fe5fe7"
+                "url": "https://github.com/symfony/http-foundation.git",
+                "reference": "4441dada27f9208e03f449d73cb9253c639e53c5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/58381b7b815c1e3afaf60a534fbf769157fe5fe7",
-                "reference": "58381b7b815c1e3afaf60a534fbf769157fe5fe7",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4441dada27f9208e03f449d73cb9253c639e53c5",
+                "reference": "4441dada27f9208e03f449d73cb9253c639e53c5",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8"
-            },
-            "conflict": {
-                "symfony/config": "<3.3.1",
-                "symfony/dependency-injection": "<3.3",
-                "symfony/yaml": "<3.4"
+                "php": ">=7.1.3",
+                "symfony/mime": "^4.3|^5.0",
+                "symfony/polyfill-mbstring": "~1.1",
+                "symfony/polyfill-php80": "^1.16"
             },
             "require-dev": {
-                "doctrine/annotations": "~1.0",
-                "psr/log": "~1.0",
-                "symfony/config": "^3.3.1|~4.0",
-                "symfony/dependency-injection": "~3.3|~4.0",
-                "symfony/expression-language": "~2.8|~3.0|~4.0",
-                "symfony/http-foundation": "~2.8|~3.0|~4.0",
-                "symfony/yaml": "~3.4|~4.0"
-            },
-            "suggest": {
-                "doctrine/annotations": "For using the annotation loader",
-                "symfony/config": "For using the all-in-one router or any loader",
-                "symfony/expression-language": "For using expression matching",
-                "symfony/http-foundation": "For using a Symfony Request object",
-                "symfony/yaml": "For using the YAML loader"
+                "predis/predis": "~1.0",
+                "symfony/expression-language": "^3.4|^4.0|^5.0"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.4-dev"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Component\\Routing\\": ""
+                    "Symfony\\Component\\HttpFoundation\\": ""
                 },
                 "exclude-from-classmap": [
                     "/Tests/"
@@ -2909,14 +3294,11 @@
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony Routing Component",
+            "description": "Defines an object-oriented layer for the HTTP specification",
             "homepage": "https://symfony.com",
-            "keywords": [
-                "router",
-                "routing",
-                "uri",
-                "url"
-            ],
+            "support": {
+                "source": "https://github.com/symfony/http-foundation/tree/v4.4.43"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -2931,44 +3313,72 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-23T09:37:51+00:00"
+            "time": "2022-06-19T13:07:44+00:00"
         },
         {
-            "name": "symfony/yaml",
-            "version": "v3.4.43",
+            "name": "symfony/http-kernel",
+            "version": "v4.4.43",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/yaml.git",
-                "reference": "e7fa05917ae931332a42d65b577ece4d497aad81"
+                "url": "https://github.com/symfony/http-kernel.git",
+                "reference": "c4c33fb9203e6f166ac0f318ce34e00686702522"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/e7fa05917ae931332a42d65b577ece4d497aad81",
-                "reference": "e7fa05917ae931332a42d65b577ece4d497aad81",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c4c33fb9203e6f166ac0f318ce34e00686702522",
+                "reference": "c4c33fb9203e6f166ac0f318ce34e00686702522",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8",
-                "symfony/polyfill-ctype": "~1.8"
+                "php": ">=7.1.3",
+                "psr/log": "^1|^2",
+                "symfony/error-handler": "^4.4",
+                "symfony/event-dispatcher": "^4.4",
+                "symfony/http-client-contracts": "^1.1|^2",
+                "symfony/http-foundation": "^4.4.30|^5.3.7",
+                "symfony/polyfill-ctype": "^1.8",
+                "symfony/polyfill-php73": "^1.9",
+                "symfony/polyfill-php80": "^1.16"
             },
             "conflict": {
-                "symfony/console": "<3.4"
+                "symfony/browser-kit": "<4.3",
+                "symfony/config": "<3.4",
+                "symfony/console": ">=5",
+                "symfony/dependency-injection": "<4.3",
+                "symfony/translation": "<4.2",
+                "twig/twig": "<1.43|<2.13,>=2"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0|2.0"
             },
             "require-dev": {
-                "symfony/console": "~3.4|~4.0"
+                "psr/cache": "^1.0|^2.0|^3.0",
+                "symfony/browser-kit": "^4.3|^5.0",
+                "symfony/config": "^3.4|^4.0|^5.0",
+                "symfony/console": "^3.4|^4.0",
+                "symfony/css-selector": "^3.4|^4.0|^5.0",
+                "symfony/dependency-injection": "^4.3|^5.0",
+                "symfony/dom-crawler": "^3.4|^4.0|^5.0",
+                "symfony/expression-language": "^3.4|^4.0|^5.0",
+                "symfony/finder": "^3.4|^4.0|^5.0",
+                "symfony/process": "^3.4|^4.0|^5.0",
+                "symfony/routing": "^3.4|^4.0|^5.0",
+                "symfony/stopwatch": "^3.4|^4.0|^5.0",
+                "symfony/templating": "^3.4|^4.0|^5.0",
+                "symfony/translation": "^4.2|^5.0",
+                "symfony/translation-contracts": "^1.1|^2",
+                "twig/twig": "^1.43|^2.13|^3.0.4"
             },
             "suggest": {
-                "symfony/console": "For validating YAML files using the lint command"
+                "symfony/browser-kit": "",
+                "symfony/config": "",
+                "symfony/console": "",
+                "symfony/dependency-injection": ""
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.4-dev"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Component\\Yaml\\": ""
+                    "Symfony\\Component\\HttpKernel\\": ""
                 },
                 "exclude-from-classmap": [
                     "/Tests/"
@@ -2988,8 +3398,11 @@
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony Yaml Component",
+            "description": "Provides a structured process for converting a Request into a Response",
             "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/http-kernel/tree/v4.4.43"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -3004,45 +3417,44 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-07-23T09:37:51+00:00"
+            "time": "2022-06-26T16:51:30+00:00"
         },
         {
-            "name": "twig/extensions",
-            "version": "v1.5.4",
+            "name": "symfony/mime",
+            "version": "v4.4.43",
             "source": {
                 "type": "git",
-                "url": "https://github.com/twigphp/Twig-extensions.git",
-                "reference": "57873c8b0c1be51caa47df2cdb824490beb16202"
+                "url": "https://github.com/symfony/mime.git",
+                "reference": "de46889e8844d8327677582950bd227273d8f2f3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202",
-                "reference": "57873c8b0c1be51caa47df2cdb824490beb16202",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/de46889e8844d8327677582950bd227273d8f2f3",
+                "reference": "de46889e8844d8327677582950bd227273d8f2f3",
                 "shasum": ""
             },
             "require": {
-                "twig/twig": "^1.27|^2.0"
+                "php": ">=7.1.3",
+                "symfony/polyfill-intl-idn": "^1.10",
+                "symfony/polyfill-mbstring": "^1.0",
+                "symfony/polyfill-php80": "^1.16"
             },
-            "require-dev": {
-                "symfony/phpunit-bridge": "^3.4",
-                "symfony/translation": "^2.7|^3.4"
+            "conflict": {
+                "egulias/email-validator": "~3.0.0",
+                "symfony/mailer": "<4.4"
             },
-            "suggest": {
-                "symfony/translation": "Allow the time_diff output to be translated"
+            "require-dev": {
+                "egulias/email-validator": "^2.1.10|^3.1",
+                "symfony/dependency-injection": "^3.4|^4.1|^5.0"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.5-dev"
-                }
-            },
             "autoload": {
-                "psr-0": {
-                    "Twig_Extensions_": "lib/"
-                },
                 "psr-4": {
-                    "Twig\\Extensions\\": "src/"
-                }
+                    "Symfony\\Component\\Mime\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -3052,109 +3464,157 @@
                 {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Common additional features for Twig that do not directly belong in core",
+            "description": "Allows manipulating MIME messages",
+            "homepage": "https://symfony.com",
             "keywords": [
-                "i18n",
-                "text"
+                "mime",
+                "mime-type"
             ],
-            "time": "2018-12-05T18:34:18+00:00"
+            "support": {
+                "source": "https://github.com/symfony/mime/tree/v4.4.43"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-06-01T19:35:40+00:00"
         },
         {
-            "name": "twig/twig",
-            "version": "v1.42.5",
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.26.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/twigphp/Twig.git",
-                "reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e"
+                "url": "https://github.com/symfony/polyfill-ctype.git",
+                "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/twigphp/Twig/zipball/87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
-                "reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
+                "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.5.0",
-                "symfony/polyfill-ctype": "^1.8"
+                "php": ">=7.1"
             },
-            "require-dev": {
-                "psr/container": "^1.0",
-                "symfony/phpunit-bridge": "^4.4|^5.0"
+            "provide": {
+                "ext-ctype": "*"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.42-dev"
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
                 }
             },
             "autoload": {
-                "psr-0": {
-                    "Twig_": "lib/"
-                },
+                "files": [
+                    "bootstrap.php"
+                ],
                 "psr-4": {
-                    "Twig\\": "src/"
+                    "Symfony\\Polyfill\\Ctype\\": ""
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "BSD-3-Clause"
+                "MIT"
             ],
             "authors": [
                 {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com",
-                    "homepage": "http://fabien.potencier.org",
-                    "role": "Lead Developer"
-                },
-                {
-                    "name": "Twig Team",
-                    "role": "Contributors"
+                    "name": "Gert de Pagter",
+                    "email": "BackEndTea@gmail.com"
                 },
                 {
-                    "name": "Armin Ronacher",
-                    "email": "armin.ronacher@active-4.com",
-                    "role": "Project Founder"
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Twig, the flexible, fast, and secure template language for PHP",
-            "homepage": "https://twig.symfony.com",
+            "description": "Symfony polyfill for ctype functions",
+            "homepage": "https://symfony.com",
             "keywords": [
-                "templating"
+                "compatibility",
+                "ctype",
+                "polyfill",
+                "portable"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
             ],
-            "time": "2020-02-11T05:59:23+00:00"
+            "time": "2022-05-24T11:49:31+00:00"
         },
         {
-            "name": "webmozart/assert",
-            "version": "1.5.0",
+            "name": "symfony/polyfill-intl-idn",
+            "version": "v1.26.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/webmozart/assert.git",
-                "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4"
+                "url": "https://github.com/symfony/polyfill-intl-idn.git",
+                "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/webmozart/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4",
-                "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8",
+                "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.3.3 || ^7.0",
-                "symfony/polyfill-ctype": "^1.8"
+                "php": ">=7.1",
+                "symfony/polyfill-intl-normalizer": "^1.10",
+                "symfony/polyfill-php72": "^1.10"
             },
-            "require-dev": {
-                "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+            "suggest": {
+                "ext-intl": "For best performance"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.3-dev"
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
                 }
             },
             "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
                 "psr-4": {
-                    "Webmozart\\Assert\\": "src/"
+                    "Symfony\\Polyfill\\Intl\\Idn\\": ""
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -3163,42 +3623,1302 @@
             ],
             "authors": [
                 {
-                    "name": "Bernhard Schussek",
-                    "email": "bschussek@gmail.com"
-                }
-            ],
-            "description": "Assertions to validate method input/output with nice error messages.",
-            "keywords": [
+                    "name": "Laurent Bassin",
+                    "email": "laurent@bassin.info"
+                },
+                {
+                    "name": "Trevor Rowbotham",
+                    "email": "trevor.rowbotham@pm.me"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "idn",
+                "intl",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-normalizer",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+                "reference": "219aa369ceff116e673852dce47c3a41794c14bd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd",
+                "reference": "219aa369ceff116e673852dce47c3a41794c14bd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's Normalizer class and related functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "intl",
+                "normalizer",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+                "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-mbstring": "*"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php72",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php72.git",
+                "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2",
+                "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php72\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php73",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php73.git",
+                "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85",
+                "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php73\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+                "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php80\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ion Bazan",
+                    "email": "ion.bazan@gmail.com"
+                },
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-10T07:21:04+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php81",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php81.git",
+                "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+                "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php81\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/routing",
+            "version": "v4.4.41",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/routing.git",
+                "reference": "c25e38d403c00d5ddcfc514f016f1b534abdf052"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/c25e38d403c00d5ddcfc514f016f1b534abdf052",
+                "reference": "c25e38d403c00d5ddcfc514f016f1b534abdf052",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "symfony/config": "<4.2",
+                "symfony/dependency-injection": "<3.4",
+                "symfony/yaml": "<3.4"
+            },
+            "require-dev": {
+                "doctrine/annotations": "^1.10.4",
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^4.2|^5.0",
+                "symfony/dependency-injection": "^3.4|^4.0|^5.0",
+                "symfony/expression-language": "^3.4|^4.0|^5.0",
+                "symfony/http-foundation": "^3.4|^4.0|^5.0",
+                "symfony/yaml": "^3.4|^4.0|^5.0"
+            },
+            "suggest": {
+                "doctrine/annotations": "For using the annotation loader",
+                "symfony/config": "For using the all-in-one router or any loader",
+                "symfony/expression-language": "For using expression matching",
+                "symfony/http-foundation": "For using a Symfony Request object",
+                "symfony/yaml": "For using the YAML loader"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Routing\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Maps an HTTP request to a set of configuration variables",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "router",
+                "routing",
+                "uri",
+                "url"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/routing/tree/v4.4.41"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-04-12T15:19:55+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v1.1.13",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/service-contracts.git",
+                "reference": "afa00c500c2d6aea6e3b2f4862355f507bc5ebb4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/afa00c500c2d6aea6e3b2f4862355f507bc5ebb4",
+                "reference": "afa00c500c2d6aea6e3b2f4862355f507bc5ebb4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "psr/container": "^1.0"
+            },
+            "suggest": {
+                "symfony/service-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.1-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Service\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to writing services",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/service-contracts/tree/v1.1.13"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-27T14:01:05+00:00"
+        },
+        {
+            "name": "symfony/var-dumper",
+            "version": "v4.4.42",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-dumper.git",
+                "reference": "742aab50ad097bcb62d91fccb613f66b8047d2ca"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/742aab50ad097bcb62d91fccb613f66b8047d2ca",
+                "reference": "742aab50ad097bcb62d91fccb613f66b8047d2ca",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php72": "~1.5",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+                "symfony/console": "<3.4"
+            },
+            "require-dev": {
+                "ext-iconv": "*",
+                "symfony/console": "^3.4|^4.0|^5.0",
+                "symfony/process": "^4.4|^5.0",
+                "twig/twig": "^1.43|^2.13|^3.0.4"
+            },
+            "suggest": {
+                "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+                "ext-intl": "To show region name in time zone dump",
+                "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+            },
+            "bin": [
+                "Resources/bin/var-dump-server"
+            ],
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions/dump.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\VarDumper\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "debug",
+                "dump"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/var-dumper/tree/v4.4.42"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-21T10:00:54+00:00"
+        },
+        {
+            "name": "symfony/var-exporter",
+            "version": "v4.4.43",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-exporter.git",
+                "reference": "4a7a3a3d55c471d396e6d28011368b7b83cb518b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-exporter/zipball/4a7a3a3d55c471d396e6d28011368b7b83cb518b",
+                "reference": "4a7a3a3d55c471d396e6d28011368b7b83cb518b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "require-dev": {
+                "symfony/var-dumper": "^4.4.9|^5.0.9"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\VarExporter\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Allows exporting any serializable PHP data structure to plain PHP code",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "clone",
+                "construct",
+                "export",
+                "hydrate",
+                "instantiate",
+                "serialize"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/var-exporter/tree/v4.4.43"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-27T11:44:32+00:00"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v4.4.43",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/yaml.git",
+                "reference": "07e392f0ef78376d080d5353c081a5e5704835bd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/07e392f0ef78376d080d5353c081a5e5704835bd",
+                "reference": "07e392f0ef78376d080d5353c081a5e5704835bd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-ctype": "~1.8"
+            },
+            "conflict": {
+                "symfony/console": "<3.4"
+            },
+            "require-dev": {
+                "symfony/console": "^3.4|^4.0|^5.0"
+            },
+            "suggest": {
+                "symfony/console": "For validating YAML files using the lint command"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Yaml\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Loads and dumps YAML files",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/yaml/tree/v4.4.43"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-06-20T08:31:17+00:00"
+        },
+        {
+            "name": "twig/extensions",
+            "version": "v1.5.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/twigphp/Twig-extensions.git",
+                "reference": "57873c8b0c1be51caa47df2cdb824490beb16202"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202",
+                "reference": "57873c8b0c1be51caa47df2cdb824490beb16202",
+                "shasum": ""
+            },
+            "require": {
+                "twig/twig": "^1.27|^2.0"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^3.4",
+                "symfony/translation": "^2.7|^3.4"
+            },
+            "suggest": {
+                "symfony/translation": "Allow the time_diff output to be translated"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.5-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Twig_Extensions_": "lib/"
+                },
+                "psr-4": {
+                    "Twig\\Extensions\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Common additional features for Twig that do not directly belong in core",
+            "keywords": [
+                "i18n",
+                "text"
+            ],
+            "support": {
+                "issues": "https://github.com/twigphp/Twig-extensions/issues",
+                "source": "https://github.com/twigphp/Twig-extensions/tree/master"
+            },
+            "abandoned": true,
+            "time": "2018-12-05T18:34:18+00:00"
+        },
+        {
+            "name": "twig/twig",
+            "version": "v2.15.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/twigphp/Twig.git",
+                "reference": "3b7cedb2f736899a7dbd0ba3d6da335a015f5cc4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/twigphp/Twig/zipball/3b7cedb2f736899a7dbd0ba3d6da335a015f5cc4",
+                "reference": "3b7cedb2f736899a7dbd0ba3d6da335a015f5cc4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-ctype": "^1.8",
+                "symfony/polyfill-mbstring": "^1.3",
+                "symfony/polyfill-php72": "^1.8"
+            },
+            "require-dev": {
+                "psr/container": "^1.0",
+                "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.15-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Twig_": "lib/"
+                },
+                "psr-4": {
+                    "Twig\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": "http://fabien.potencier.org",
+                    "role": "Lead Developer"
+                },
+                {
+                    "name": "Twig Team",
+                    "role": "Contributors"
+                },
+                {
+                    "name": "Armin Ronacher",
+                    "email": "armin.ronacher@active-4.com",
+                    "role": "Project Founder"
+                }
+            ],
+            "description": "Twig, the flexible, fast, and secure template language for PHP",
+            "homepage": "https://twig.symfony.com",
+            "keywords": [
+                "templating"
+            ],
+            "support": {
+                "issues": "https://github.com/twigphp/Twig/issues",
+                "source": "https://github.com/twigphp/Twig/tree/v2.15.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-17T05:46:24+00:00"
+        },
+        {
+            "name": "webmozart/assert",
+            "version": "1.9.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/webmozarts/assert.git",
+                "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+                "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.3 || ^7.0 || ^8.0",
+                "symfony/polyfill-ctype": "^1.8"
+            },
+            "conflict": {
+                "phpstan/phpstan": "<0.12.20",
+                "vimeo/psalm": "<3.9.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Webmozart\\Assert\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
+                }
+            ],
+            "description": "Assertions to validate method input/output with nice error messages.",
+            "keywords": [
                 "assert",
                 "check",
                 "validate"
             ],
-            "time": "2019-08-24T08:43:50+00:00"
+            "support": {
+                "issues": "https://github.com/webmozarts/assert/issues",
+                "source": "https://github.com/webmozarts/assert/tree/1.9.1"
+            },
+            "time": "2020-07-08T17:02:28+00:00"
+        },
+        {
+            "name": "whitehat101/apr1-md5",
+            "version": "v1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/whitehat101/apr1-md5.git",
+                "reference": "8b261c9fc0481b4e9fa9d01c6ca70867b5d5e819"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/whitehat101/apr1-md5/zipball/8b261c9fc0481b4e9fa9d01c6ca70867b5d5e819",
+                "reference": "8b261c9fc0481b4e9fa9d01c6ca70867b5d5e819",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.0.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "WhiteHat101\\Crypt\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jeremy Ebler",
+                    "email": "jebler@gmail.com"
+                }
+            ],
+            "description": "Apache's APR1-MD5 algorithm in pure PHP",
+            "homepage": "https://github.com/whitehat101/apr1-md5",
+            "keywords": [
+                "MD5",
+                "apr1"
+            ],
+            "support": {
+                "issues": "https://github.com/whitehat101/apr1-md5/issues",
+                "source": "https://github.com/whitehat101/apr1-md5/tree/master"
+            },
+            "time": "2015-02-11T11:06:42+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "amphp/amp",
+            "version": "v2.6.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/amphp/amp.git",
+                "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
+                "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "require-dev": {
+                "amphp/php-cs-fixer-config": "dev-master",
+                "amphp/phpunit-util": "^1",
+                "ext-json": "*",
+                "jetbrains/phpstorm-stubs": "^2019.3",
+                "phpunit/phpunit": "^7 | ^8 | ^9",
+                "psalm/phar": "^3.11@dev",
+                "react/promise": "^2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "lib/functions.php",
+                    "lib/Internal/functions.php"
+                ],
+                "psr-4": {
+                    "Amp\\": "lib"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Daniel Lowrey",
+                    "email": "rdlowrey@php.net"
+                },
+                {
+                    "name": "Aaron Piotrowski",
+                    "email": "aaron@trowski.com"
+                },
+                {
+                    "name": "Bob Weinand",
+                    "email": "bobwei9@hotmail.com"
+                },
+                {
+                    "name": "Niklas Keller",
+                    "email": "me@kelunik.com"
+                }
+            ],
+            "description": "A non-blocking concurrency framework for PHP applications.",
+            "homepage": "https://amphp.org/amp",
+            "keywords": [
+                "async",
+                "asynchronous",
+                "awaitable",
+                "concurrency",
+                "event",
+                "event-loop",
+                "future",
+                "non-blocking",
+                "promise"
+            ],
+            "support": {
+                "irc": "irc://irc.freenode.org/amphp",
+                "issues": "https://github.com/amphp/amp/issues",
+                "source": "https://github.com/amphp/amp/tree/v2.6.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/amphp",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-02-20T17:52:18+00:00"
         },
         {
-            "name": "whitehat101/apr1-md5",
-            "version": "v1.0.0",
+            "name": "amphp/byte-stream",
+            "version": "v1.8.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/whitehat101/apr1-md5.git",
-                "reference": "8b261c9fc0481b4e9fa9d01c6ca70867b5d5e819"
+                "url": "https://github.com/amphp/byte-stream.git",
+                "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/whitehat101/apr1-md5/zipball/8b261c9fc0481b4e9fa9d01c6ca70867b5d5e819",
-                "reference": "8b261c9fc0481b4e9fa9d01c6ca70867b5d5e819",
+                "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd",
+                "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.0"
+                "amphp/amp": "^2",
+                "php": ">=7.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "4.0.*"
+                "amphp/php-cs-fixer-config": "dev-master",
+                "amphp/phpunit-util": "^1.4",
+                "friendsofphp/php-cs-fixer": "^2.3",
+                "jetbrains/phpstorm-stubs": "^2019.3",
+                "phpunit/phpunit": "^6 || ^7 || ^8",
+                "psalm/phar": "^3.11.4"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
             "autoload": {
+                "files": [
+                    "lib/functions.php"
+                ],
                 "psr-4": {
-                    "WhiteHat101\\Crypt\\": "src"
+                    "Amp\\ByteStream\\": "lib"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -3207,53 +4927,140 @@
             ],
             "authors": [
                 {
-                    "name": "Jeremy Ebler",
-                    "email": "jebler@gmail.com"
+                    "name": "Aaron Piotrowski",
+                    "email": "aaron@trowski.com"
+                },
+                {
+                    "name": "Niklas Keller",
+                    "email": "me@kelunik.com"
                 }
             ],
-            "description": "Apache's APR1-MD5 algorithm in pure PHP",
-            "homepage": "https://github.com/whitehat101/apr1-md5",
+            "description": "A stream abstraction to make working with non-blocking I/O simple.",
+            "homepage": "http://amphp.org/byte-stream",
             "keywords": [
-                "MD5",
-                "apr1"
+                "amp",
+                "amphp",
+                "async",
+                "io",
+                "non-blocking",
+                "stream"
+            ],
+            "support": {
+                "irc": "irc://irc.freenode.org/amphp",
+                "issues": "https://github.com/amphp/byte-stream/issues",
+                "source": "https://github.com/amphp/byte-stream/tree/v1.8.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/amphp",
+                    "type": "github"
+                }
             ],
-            "time": "2015-02-11T11:06:42+00:00"
-        }
-    ],
-    "packages-dev": [
+            "time": "2021-03-30T17:13:30+00:00"
+        },
         {
-            "name": "composer/ca-bundle",
-            "version": "1.2.8",
+            "name": "composer/package-versions-deprecated",
+            "version": "1.11.99.5",
             "source": {
                 "type": "git",
-                "url": "https://github.com/composer/ca-bundle.git",
-                "reference": "8a7ecad675253e4654ea05505233285377405215"
+                "url": "https://github.com/composer/package-versions-deprecated.git",
+                "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215",
-                "reference": "8a7ecad675253e4654ea05505233285377405215",
+                "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d",
+                "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.1.0 || ^2.0",
+                "php": "^7 || ^8"
+            },
+            "replace": {
+                "ocramius/package-versions": "1.11.99"
+            },
+            "require-dev": {
+                "composer/composer": "^1.9.3 || ^2.0@dev",
+                "ext-zip": "^1.13",
+                "phpunit/phpunit": "^6.5 || ^7"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "PackageVersions\\Installer",
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PackageVersions\\": "src/PackageVersions"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be"
+                }
+            ],
+            "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+            "support": {
+                "issues": "https://github.com/composer/package-versions-deprecated/issues",
+                "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5"
+            },
+            "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"
+                }
+            ],
+            "time": "2022-01-17T14:14:24+00:00"
+        },
+        {
+            "name": "composer/semver",
+            "version": "3.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/semver.git",
+                "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
+                "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
                 "shasum": ""
             },
             "require": {
-                "ext-openssl": "*",
-                "ext-pcre": "*",
                 "php": "^5.3.2 || ^7.0 || ^8.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
-                "psr/log": "^1.0",
-                "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
+                "phpstan/phpstan": "^1.4",
+                "symfony/phpunit-bridge": "^4.2 || ^5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.x-dev"
+                    "dev-main": "3.x-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Composer\\CaBundle\\": "src"
+                    "Composer\\Semver\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -3261,20 +5068,34 @@
                 "MIT"
             ],
             "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
                 {
                     "name": "Jordi Boggiano",
                     "email": "j.boggiano@seld.be",
                     "homepage": "http://seld.be"
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "rob.bast@gmail.com",
+                    "homepage": "http://robbast.nl"
                 }
             ],
-            "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+            "description": "Semver library that offers utilities, version constraint parsing and validation.",
             "keywords": [
-                "cabundle",
-                "cacert",
-                "certificate",
-                "ssl",
-                "tls"
+                "semantic",
+                "semver",
+                "validation",
+                "versioning"
             ],
+            "support": {
+                "irc": "irc://irc.freenode.org/composer",
+                "issues": "https://github.com/composer/semver/issues",
+                "source": "https://github.com/composer/semver/tree/3.3.2"
+            },
             "funding": [
                 {
                     "url": "https://packagist.com",
@@ -3289,20 +5110,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-08-23T12:54:47+00:00"
+            "time": "2022-04-01T19:23:25+00:00"
         },
         {
             "name": "composer/xdebug-handler",
-            "version": "1.4.3",
+            "version": "1.4.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/xdebug-handler.git",
-                "reference": "ebd27a9866ae8254e873866f795491f02418c5a5"
+                "reference": "f27e06cd9675801df441b3656569b328e04aa37c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ebd27a9866ae8254e873866f795491f02418c5a5",
-                "reference": "ebd27a9866ae8254e873866f795491f02418c5a5",
+                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f27e06cd9675801df441b3656569b328e04aa37c",
+                "reference": "f27e06cd9675801df441b3656569b328e04aa37c",
                 "shasum": ""
             },
             "require": {
@@ -3310,7 +5131,8 @@
                 "psr/log": "^1.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
+                "phpstan/phpstan": "^0.12.55",
+                "symfony/phpunit-bridge": "^4.2 || ^5"
             },
             "type": "library",
             "autoload": {
@@ -3333,6 +5155,11 @@
                 "Xdebug",
                 "performance"
             ],
+            "support": {
+                "irc": "irc://irc.freenode.org/composer",
+                "issues": "https://github.com/composer/xdebug-handler/issues",
+                "source": "https://github.com/composer/xdebug-handler/tree/1.4.6"
+            },
             "funding": [
                 {
                     "url": "https://packagist.com",
@@ -3347,104 +5174,77 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-08-19T10:27:58+00:00"
+            "time": "2021-03-25T17:01:18+00:00"
         },
         {
-            "name": "doctrine/instantiator",
-            "version": "1.0.5",
+            "name": "dnoegel/php-xdg-base-dir",
+            "version": "v0.1.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/doctrine/instantiator.git",
-                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+                "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
+                "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
-                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+                "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
+                "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3,<8.0-DEV"
+                "php": ">=5.3.2"
             },
             "require-dev": {
-                "athletic/athletic": "~0.1.8",
-                "ext-pdo": "*",
-                "ext-phar": "*",
-                "phpunit/phpunit": "~4.0",
-                "squizlabs/php_codesniffer": "~2.0"
+                "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0.x-dev"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+                    "XdgBaseDir\\": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
                 "MIT"
             ],
-            "authors": [
-                {
-                    "name": "Marco Pivetta",
-                    "email": "ocramius@gmail.com",
-                    "homepage": "http://ocramius.github.com/"
-                }
-            ],
-            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
-            "homepage": "https://github.com/doctrine/instantiator",
-            "keywords": [
-                "constructor",
-                "instantiate"
-            ],
-            "time": "2015-06-14T21:17:01+00:00"
+            "description": "implementation of xdg base directory specification for php",
+            "support": {
+                "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues",
+                "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1"
+            },
+            "time": "2019-12-04T15:06:13+00:00"
         },
         {
-            "name": "guzzlehttp/guzzle",
-            "version": "6.5.5",
+            "name": "doctrine/instantiator",
+            "version": "1.4.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/guzzle/guzzle.git",
-                "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e"
+                "url": "https://github.com/doctrine/instantiator.git",
+                "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
-                "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
+                "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
                 "shasum": ""
             },
             "require": {
-                "ext-json": "*",
-                "guzzlehttp/promises": "^1.0",
-                "guzzlehttp/psr7": "^1.6.1",
-                "php": ">=5.5",
-                "symfony/polyfill-intl-idn": "^1.17.0"
+                "php": "^7.1 || ^8.0"
             },
             "require-dev": {
-                "ext-curl": "*",
-                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
-                "psr/log": "^1.1"
-            },
-            "suggest": {
-                "psr/log": "Required for using the Log middleware"
+                "doctrine/coding-standard": "^9",
+                "ext-pdo": "*",
+                "ext-phar": "*",
+                "phpbench/phpbench": "^0.16 || ^1",
+                "phpstan/phpstan": "^1.4",
+                "phpstan/phpstan-phpunit": "^1",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "vimeo/psalm": "^4.22"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "6.5-dev"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "GuzzleHttp\\": "src/"
-                },
-                "files": [
-                    "src/functions_include.php"
-                ]
+                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -3452,158 +5252,150 @@
             ],
             "authors": [
                 {
-                    "name": "Michael Dowling",
-                    "email": "mtdowling@gmail.com",
-                    "homepage": "https://github.com/mtdowling"
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "https://ocramius.github.io/"
                 }
             ],
-            "description": "Guzzle is a PHP HTTP client library",
-            "homepage": "http://guzzlephp.org/",
+            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+            "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
             "keywords": [
-                "client",
-                "curl",
-                "framework",
-                "http",
-                "http client",
-                "rest",
-                "web service"
-            ],
-            "time": "2020-06-16T21:01:06+00:00"
+                "constructor",
+                "instantiate"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/instantiator/issues",
+                "source": "https://github.com/doctrine/instantiator/tree/1.4.1"
+            },
+            "funding": [
+                {
+                    "url": "https://www.doctrine-project.org/sponsorship.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.patreon.com/phpdoctrine",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-03-03T08:28:38+00:00"
         },
         {
-            "name": "guzzlehttp/promises",
-            "version": "v1.3.1",
+            "name": "felixfbecker/advanced-json-rpc",
+            "version": "v3.2.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/guzzle/promises.git",
-                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+                "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
+                "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
-                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+                "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447",
+                "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.5.0"
+                "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
+                "php": "^7.1 || ^8.0",
+                "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.0"
+                "phpunit/phpunit": "^7.0 || ^8.0"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.4-dev"
-                }
-            },
             "autoload": {
                 "psr-4": {
-                    "GuzzleHttp\\Promise\\": "src/"
-                },
-                "files": [
-                    "src/functions_include.php"
-                ]
+                    "AdvancedJsonRpc\\": "lib/"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "ISC"
             ],
             "authors": [
                 {
-                    "name": "Michael Dowling",
-                    "email": "mtdowling@gmail.com",
-                    "homepage": "https://github.com/mtdowling"
+                    "name": "Felix Becker",
+                    "email": "felix.b@outlook.com"
                 }
             ],
-            "description": "Guzzle promises library",
-            "keywords": [
-                "promise"
-            ],
-            "time": "2016-12-20T10:07:11+00:00"
+            "description": "A more advanced JSONRPC implementation",
+            "support": {
+                "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
+                "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1"
+            },
+            "time": "2021-06-11T22:34:44+00:00"
         },
         {
-            "name": "guzzlehttp/psr7",
-            "version": "1.6.1",
+            "name": "felixfbecker/language-server-protocol",
+            "version": "v1.5.2",
             "source": {
                 "type": "git",
-                "url": "https://github.com/guzzle/psr7.git",
-                "reference": "239400de7a173fe9901b9ac7c06497751f00727a"
+                "url": "https://github.com/felixfbecker/php-language-server-protocol.git",
+                "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
-                "reference": "239400de7a173fe9901b9ac7c06497751f00727a",
+                "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842",
+                "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.4.0",
-                "psr/http-message": "~1.0",
-                "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
-            },
-            "provide": {
-                "psr/http-message-implementation": "1.0"
+                "php": ">=7.1"
             },
             "require-dev": {
-                "ext-zlib": "*",
-                "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
-            },
-            "suggest": {
-                "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
+                "phpstan/phpstan": "*",
+                "squizlabs/php_codesniffer": "^3.1",
+                "vimeo/psalm": "^4.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.6-dev"
+                    "dev-master": "1.x-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "GuzzleHttp\\Psr7\\": "src/"
-                },
-                "files": [
-                    "src/functions_include.php"
-                ]
+                    "LanguageServerProtocol\\": "src/"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "ISC"
             ],
             "authors": [
                 {
-                    "name": "Michael Dowling",
-                    "email": "mtdowling@gmail.com",
-                    "homepage": "https://github.com/mtdowling"
-                },
-                {
-                    "name": "Tobias Schultze",
-                    "homepage": "https://github.com/Tobion"
+                    "name": "Felix Becker",
+                    "email": "felix.b@outlook.com"
                 }
             ],
-            "description": "PSR-7 message implementation that also provides common utility methods",
+            "description": "PHP classes for the Language Server Protocol",
             "keywords": [
-                "http",
-                "message",
-                "psr-7",
-                "request",
-                "response",
-                "stream",
-                "uri",
-                "url"
+                "language",
+                "microsoft",
+                "php",
+                "server"
             ],
-            "time": "2019-07-01T23:21:34+00:00"
+            "support": {
+                "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues",
+                "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2"
+            },
+            "time": "2022-03-02T22:36:06+00:00"
         },
         {
             "name": "mikey179/vfsstream",
-            "version": "v1.6.8",
+            "version": "v1.6.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/bovigo/vfsStream.git",
-                "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe"
+                "reference": "250c0825537d501e327df879fb3d4cd751933b85"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe",
-                "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe",
+                "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/250c0825537d501e327df879fb3d4cd751933b85",
+                "reference": "250c0825537d501e327df879fb3d4cd751933b85",
                 "shasum": ""
             },
             "require": {
@@ -3636,129 +5428,144 @@
             ],
             "description": "Virtual file system to mock the real file system in unit tests.",
             "homepage": "http://vfs.bovigo.org/",
-            "time": "2019-10-30T15:31:00+00:00"
+            "support": {
+                "issues": "https://github.com/bovigo/vfsStream/issues",
+                "source": "https://github.com/bovigo/vfsStream/tree/master",
+                "wiki": "https://github.com/bovigo/vfsStream/wiki"
+            },
+            "time": "2021-09-25T08:05:01+00:00"
         },
         {
-            "name": "muglug/package-versions-56",
-            "version": "1.2.4",
+            "name": "myclabs/deep-copy",
+            "version": "1.11.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/muglug/PackageVersions.git",
-                "reference": "a67bed26deaaf9269a348e53063bc8d4dcc60ffd"
+                "url": "https://github.com/myclabs/DeepCopy.git",
+                "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/muglug/PackageVersions/zipball/a67bed26deaaf9269a348e53063bc8d4dcc60ffd",
-                "reference": "a67bed26deaaf9269a348e53063bc8d4dcc60ffd",
+                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
+                "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
                 "shasum": ""
             },
             "require": {
-                "composer-plugin-api": "^1.0",
-                "php": "^5.6 || ^7.0"
+                "php": "^7.1 || ^8.0"
             },
-            "require-dev": {
-                "composer/composer": "^1.3",
-                "ext-zip": "*",
-                "phpunit/phpunit": "^5.7.5"
+            "conflict": {
+                "doctrine/collections": "<1.6.8",
+                "doctrine/common": "<2.13.3 || >=3,<3.2.2"
             },
-            "type": "composer-plugin",
-            "extra": {
-                "class": "Muglug\\PackageVersions\\Installer",
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
+            "require-dev": {
+                "doctrine/collections": "^1.6.8",
+                "doctrine/common": "^2.13.3 || ^3.2.2",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
             },
+            "type": "library",
             "autoload": {
+                "files": [
+                    "src/DeepCopy/deep_copy.php"
+                ],
                 "psr-4": {
-                    "Muglug\\PackageVersions\\": "src/PackageVersions"
+                    "DeepCopy\\": "src/DeepCopy/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
                 "MIT"
             ],
-            "authors": [
-                {
-                    "name": "Marco Pivetta",
-                    "email": "ocramius@gmail.com"
-                },
-                {
-                    "name": "Abdul Malik Ikhsan",
-                    "email": "samsonasik@gmail.com"
-                },
+            "description": "Create deep copies (clones) of your objects",
+            "keywords": [
+                "clone",
+                "copy",
+                "duplicate",
+                "object",
+                "object graph"
+            ],
+            "support": {
+                "issues": "https://github.com/myclabs/DeepCopy/issues",
+                "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
+            },
+            "funding": [
                 {
-                    "name": "Matt Brown",
-                    "email": "github@muglug.com"
+                    "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+                    "type": "tidelift"
                 }
             ],
-            "description": "A backport of ocramius/package-versions that supports php ^5.6. Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
-            "time": "2018-03-26T03:22:13+00:00"
+            "time": "2022-03-03T13:19:32+00:00"
         },
         {
-            "name": "myclabs/deep-copy",
-            "version": "1.7.0",
+            "name": "netresearch/jsonmapper",
+            "version": "v3.1.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/myclabs/DeepCopy.git",
-                "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e"
+                "url": "https://github.com/cweiske/jsonmapper.git",
+                "reference": "ba09f0e456d4f00cef84e012da5715625594407c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
-                "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
+                "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/ba09f0e456d4f00cef84e012da5715625594407c",
+                "reference": "ba09f0e456d4f00cef84e012da5715625594407c",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.6 || ^7.0"
+                "ext-json": "*",
+                "ext-pcre": "*",
+                "ext-reflection": "*",
+                "ext-spl": "*",
+                "php": ">=5.6"
             },
             "require-dev": {
-                "doctrine/collections": "^1.0",
-                "doctrine/common": "^2.6",
-                "phpunit/phpunit": "^4.1"
+                "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4 || ~7.0",
+                "squizlabs/php_codesniffer": "~3.5"
             },
             "type": "library",
             "autoload": {
-                "psr-4": {
-                    "DeepCopy\\": "src/DeepCopy/"
-                },
-                "files": [
-                    "src/DeepCopy/deep_copy.php"
-                ]
+                "psr-0": {
+                    "JsonMapper": "src/"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "OSL-3.0"
             ],
-            "description": "Create deep copies (clones) of your objects",
-            "keywords": [
-                "clone",
-                "copy",
-                "duplicate",
-                "object",
-                "object graph"
+            "authors": [
+                {
+                    "name": "Christian Weiske",
+                    "email": "cweiske@cweiske.de",
+                    "homepage": "http://github.com/cweiske/jsonmapper/",
+                    "role": "Developer"
+                }
             ],
-            "time": "2017-10-19T19:58:43+00:00"
+            "description": "Map nested JSON structures onto PHP classes",
+            "support": {
+                "email": "cweiske@cweiske.de",
+                "issues": "https://github.com/cweiske/jsonmapper/issues",
+                "source": "https://github.com/cweiske/jsonmapper/tree/v3.1.1"
+            },
+            "time": "2020-11-02T19:19:54+00:00"
         },
         {
             "name": "nikic/php-parser",
-            "version": "v3.1.5",
+            "version": "v4.14.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nikic/PHP-Parser.git",
-                "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce"
+                "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bb87e28e7d7b8d9a7fda231d37457c9210faf6ce",
-                "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
+                "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
                 "shasum": ""
             },
             "require": {
                 "ext-tokenizer": "*",
-                "php": ">=5.5"
+                "php": ">=7.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.0|~5.0"
+                "ircmaxell/php-yacc": "^0.0.7",
+                "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
             },
             "bin": [
                 "bin/php-parse"
@@ -3766,7 +5573,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.0-dev"
+                    "dev-master": "4.9-dev"
                 }
             },
             "autoload": {
@@ -3788,20 +5595,24 @@
                 "parser",
                 "php"
             ],
-            "time": "2018-02-28T20:30:58+00:00"
+            "support": {
+                "issues": "https://github.com/nikic/PHP-Parser/issues",
+                "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0"
+            },
+            "time": "2022-05-31T20:59:12+00:00"
         },
         {
             "name": "openlss/lib-array2xml",
-            "version": "0.5.1",
+            "version": "1.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nullivex/lib-array2xml.git",
-                "reference": "c8b5998a342d7861f2e921403f44e0a2f3ef2be0"
+                "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/c8b5998a342d7861f2e921403f44e0a2f3ef2be0",
-                "reference": "c8b5998a342d7861f2e921403f44e0a2f3ef2be0",
+                "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90",
+                "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90",
                 "shasum": ""
             },
             "require": {
@@ -3820,129 +5631,105 @@
             "authors": [
                 {
                     "name": "Bryan Tong",
-                    "email": "contact@nullivex.com",
-                    "homepage": "http://bryantong.com"
+                    "email": "bryan@nullivex.com",
+                    "homepage": "https://www.nullivex.com"
                 },
                 {
                     "name": "Tony Butler",
                     "email": "spudz76@gmail.com",
-                    "homepage": "http://openlss.org"
+                    "homepage": "https://www.nullivex.com"
                 }
             ],
             "description": "Array2XML conversion library credit to lalit.org",
-            "homepage": "http://openlss.org",
+            "homepage": "https://www.nullivex.com",
             "keywords": [
                 "array",
                 "array conversion",
                 "xml",
                 "xml conversion"
             ],
-            "time": "2016-11-10T19:10:18+00:00"
+            "support": {
+                "issues": "https://github.com/nullivex/lib-array2xml/issues",
+                "source": "https://github.com/nullivex/lib-array2xml/tree/master"
+            },
+            "time": "2019-03-29T20:06:56+00:00"
         },
         {
-            "name": "php-coveralls/php-coveralls",
-            "version": "v2.2.0",
+            "name": "phar-io/manifest",
+            "version": "1.0.3",
             "source": {
                 "type": "git",
-                "url": "https://github.com/php-coveralls/php-coveralls.git",
-                "reference": "3e6420fa666ef7bae5e750ddeac903153e193bae"
+                "url": "https://github.com/phar-io/manifest.git",
+                "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/3e6420fa666ef7bae5e750ddeac903153e193bae",
-                "reference": "3e6420fa666ef7bae5e750ddeac903153e193bae",
+                "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+                "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
                 "shasum": ""
             },
             "require": {
-                "ext-json": "*",
-                "ext-simplexml": "*",
-                "guzzlehttp/guzzle": "^6.0",
-                "php": "^5.5 || ^7.0",
-                "psr/log": "^1.0",
-                "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0",
-                "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0",
-                "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0",
-                "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0"
-            },
-            "suggest": {
-                "symfony/http-kernel": "Allows Symfony integration"
+                "ext-dom": "*",
+                "ext-phar": "*",
+                "phar-io/version": "^2.0",
+                "php": "^5.6 || ^7.0"
             },
-            "bin": [
-                "bin/php-coveralls"
-            ],
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.2-dev"
+                    "dev-master": "1.0.x-dev"
                 }
             },
             "autoload": {
-                "psr-4": {
-                    "PhpCoveralls\\": "src/"
-                }
+                "classmap": [
+                    "src/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "BSD-3-Clause"
             ],
             "authors": [
                 {
-                    "name": "Kitamura Satoshi",
-                    "email": "with.no.parachute@gmail.com",
-                    "homepage": "https://www.facebook.com/satooshi.jp",
-                    "role": "Original creator"
-                },
-                {
-                    "name": "Takashi Matsuo",
-                    "email": "tmatsuo@google.com"
-                },
-                {
-                    "name": "Google Inc"
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
                 },
                 {
-                    "name": "Dariusz Ruminski",
-                    "email": "dariusz.ruminski@gmail.com",
-                    "homepage": "https://github.com/keradus"
+                    "name": "Sebastian Heuer",
+                    "email": "sebastian@phpeople.de",
+                    "role": "Developer"
                 },
                 {
-                    "name": "Contributors",
-                    "homepage": "https://github.com/php-coveralls/php-coveralls/graphs/contributors"
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "Developer"
                 }
             ],
-            "description": "PHP client library for Coveralls API",
-            "homepage": "https://github.com/php-coveralls/php-coveralls",
-            "keywords": [
-                "ci",
-                "coverage",
-                "github",
-                "test"
-            ],
-            "time": "2019-11-20T16:29:20+00:00"
+            "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+            "support": {
+                "issues": "https://github.com/phar-io/manifest/issues",
+                "source": "https://github.com/phar-io/manifest/tree/master"
+            },
+            "time": "2018-07-08T19:23:20+00:00"
         },
         {
-            "name": "php-cs-fixer/diff",
-            "version": "v1.3.0",
+            "name": "phar-io/version",
+            "version": "2.0.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/PHP-CS-Fixer/diff.git",
-                "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756"
+                "url": "https://github.com/phar-io/version.git",
+                "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756",
-                "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756",
+                "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+                "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
                 "shasum": ""
             },
             "require": {
                 "php": "^5.6 || ^7.0"
             },
-            "require-dev": {
-                "phpunit/phpunit": "^5.7.23 || ^6.4.3",
-                "symfony/process": "^3.3"
-            },
             "type": "library",
             "autoload": {
                 "classmap": [
@@ -3955,55 +5742,54 @@
             ],
             "authors": [
                 {
-                    "name": "Kore Nordmann",
-                    "email": "mail@kore-nordmann.de"
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
                 },
                 {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
+                    "name": "Sebastian Heuer",
+                    "email": "sebastian@phpeople.de",
+                    "role": "Developer"
                 },
                 {
-                    "name": "SpacePossum"
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "Developer"
                 }
             ],
-            "description": "sebastian/diff v2 backport support for PHP5.6",
-            "homepage": "https://github.com/PHP-CS-Fixer",
-            "keywords": [
-                "diff"
-            ],
-            "time": "2018-02-15T16:58:55+00:00"
+            "description": "Library for handling version information and constraints",
+            "support": {
+                "issues": "https://github.com/phar-io/version/issues",
+                "source": "https://github.com/phar-io/version/tree/master"
+            },
+            "time": "2018-07-08T19:19:57+00:00"
         },
         {
             "name": "phpdocumentor/reflection-common",
-            "version": "1.0.1",
+            "version": "2.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
-                "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
+                "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
-                "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
+                "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.5"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.6"
+                "php": ">=7.1"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "2.x-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "phpDocumentor\\Reflection\\": [
-                        "src"
-                    ]
+                    "phpDocumentor\\Reflection\\": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -4025,33 +5811,44 @@
                 "reflection",
                 "static analysis"
             ],
-            "time": "2017-09-11T18:02:19+00:00"
+            "support": {
+                "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+                "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master"
+            },
+            "time": "2020-04-27T09:25:28+00:00"
         },
         {
             "name": "phpdocumentor/reflection-docblock",
-            "version": "3.3.2",
+            "version": "4.3.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
-                "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2"
+                "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bf329f6c1aadea3299f08ee804682b7c45b326a2",
-                "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c",
+                "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.6 || ^7.0",
-                "phpdocumentor/reflection-common": "^1.0.0",
-                "phpdocumentor/type-resolver": "^0.4.0",
+                "php": "^7.0",
+                "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0",
+                "phpdocumentor/type-resolver": "~0.4 || ^1.0.0",
                 "webmozart/assert": "^1.0"
             },
             "require-dev": {
-                "mockery/mockery": "^0.9.4",
-                "phpunit/phpunit": "^4.4"
+                "doctrine/instantiator": "^1.0.5",
+                "mockery/mockery": "^1.0",
+                "phpdocumentor/type-resolver": "0.4.*",
+                "phpunit/phpunit": "^6.4"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.x-dev"
+                }
+            },
             "autoload": {
                 "psr-4": {
                     "phpDocumentor\\Reflection\\": [
@@ -4070,41 +5867,44 @@
                 }
             ],
             "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
-            "time": "2017-11-10T14:09:06+00:00"
+            "support": {
+                "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+                "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/4.x"
+            },
+            "time": "2019-12-28T18:55:12+00:00"
         },
         {
             "name": "phpdocumentor/type-resolver",
-            "version": "0.4.0",
+            "version": "1.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/TypeResolver.git",
-                "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
+                "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
-                "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
+                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
+                "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5 || ^7.0",
-                "phpdocumentor/reflection-common": "^1.0"
+                "php": "^7.1",
+                "phpdocumentor/reflection-common": "^2.0"
             },
             "require-dev": {
-                "mockery/mockery": "^0.9.4",
-                "phpunit/phpunit": "^5.2||^4.8.24"
+                "ext-tokenizer": "^7.1",
+                "mockery/mockery": "~1",
+                "phpunit/phpunit": "^7.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "1.x-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "phpDocumentor\\Reflection\\": [
-                        "src/"
-                    ]
+                    "phpDocumentor\\Reflection\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -4117,7 +5917,12 @@
                     "email": "me@mikevanriel.com"
                 }
             ],
-            "time": "2017-07-14T14:27:02+00:00"
+            "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+            "support": {
+                "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+                "source": "https://github.com/phpDocumentor/TypeResolver/tree/0.7.2"
+            },
+            "time": "2019-08-22T18:11:29+00:00"
         },
         {
             "name": "phpspec/prophecy",
@@ -4180,44 +5985,48 @@
                 "spy",
                 "stub"
             ],
+            "support": {
+                "issues": "https://github.com/phpspec/prophecy/issues",
+                "source": "https://github.com/phpspec/prophecy/tree/v1.10.3"
+            },
             "time": "2020-03-05T15:02:03+00:00"
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "4.0.8",
+            "version": "6.1.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
+                "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
-                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
+                "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
                 "shasum": ""
             },
             "require": {
                 "ext-dom": "*",
                 "ext-xmlwriter": "*",
-                "php": "^5.6 || ^7.0",
-                "phpunit/php-file-iterator": "^1.3",
-                "phpunit/php-text-template": "^1.2",
-                "phpunit/php-token-stream": "^1.4.2 || ^2.0",
-                "sebastian/code-unit-reverse-lookup": "^1.0",
-                "sebastian/environment": "^1.3.2 || ^2.0",
-                "sebastian/version": "^1.0 || ^2.0"
+                "php": "^7.1",
+                "phpunit/php-file-iterator": "^2.0",
+                "phpunit/php-text-template": "^1.2.1",
+                "phpunit/php-token-stream": "^3.0",
+                "sebastian/code-unit-reverse-lookup": "^1.0.1",
+                "sebastian/environment": "^3.1 || ^4.0",
+                "sebastian/version": "^2.0.1",
+                "theseer/tokenizer": "^1.1"
             },
             "require-dev": {
-                "ext-xdebug": "^2.1.4",
-                "phpunit/phpunit": "^5.7"
+                "phpunit/phpunit": "^7.0"
             },
             "suggest": {
-                "ext-xdebug": "^2.5.1"
+                "ext-xdebug": "^2.6.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "4.0.x-dev"
+                    "dev-master": "6.1-dev"
                 }
             },
             "autoload": {
@@ -4232,7 +6041,7 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
+                    "email": "sebastian@phpunit.de",
                     "role": "lead"
                 }
             ],
@@ -4243,29 +6052,36 @@
                 "testing",
                 "xunit"
             ],
-            "time": "2017-04-02T07:44:40+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/master"
+            },
+            "time": "2018-10-31T16:06:48+00:00"
         },
         {
             "name": "phpunit/php-file-iterator",
-            "version": "1.4.5",
+            "version": "2.0.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
-                "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
+                "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
-                "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5",
+                "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.4.x-dev"
+                    "dev-master": "2.0.x-dev"
                 }
             },
             "autoload": {
@@ -4280,7 +6096,7 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
+                    "email": "sebastian@phpunit.de",
                     "role": "lead"
                 }
             ],
@@ -4290,7 +6106,17 @@
                 "filesystem",
                 "iterator"
             ],
-            "time": "2017-11-27T13:52:08+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-12-02T12:42:26+00:00"
         },
         {
             "name": "phpunit/php-text-template",
@@ -4331,32 +6157,36 @@
             "keywords": [
                 "template"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+                "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1"
+            },
             "time": "2015-06-21T13:50:34+00:00"
         },
         {
             "name": "phpunit/php-timer",
-            "version": "1.0.9",
+            "version": "2.1.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-timer.git",
-                "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+                "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
-                "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662",
+                "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.3.3 || ^7.0"
+                "php": ">=7.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+                "phpunit/phpunit": "^8.5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0-dev"
+                    "dev-master": "2.1-dev"
                 }
             },
             "autoload": {
@@ -4371,7 +6201,7 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
+                    "email": "sebastian@phpunit.de",
                     "role": "lead"
                 }
             ],
@@ -4380,33 +6210,43 @@
             "keywords": [
                 "timer"
             ],
-            "time": "2017-02-26T11:10:40+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+                "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-30T08:20:02+00:00"
         },
         {
             "name": "phpunit/php-token-stream",
-            "version": "1.4.12",
+            "version": "3.1.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-token-stream.git",
-                "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16"
+                "reference": "9c1da83261628cb24b6a6df371b6e312b3954768"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16",
-                "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768",
+                "reference": "9c1da83261628cb24b6a6df371b6e312b3954768",
                 "shasum": ""
             },
             "require": {
                 "ext-tokenizer": "*",
-                "php": ">=5.3.3"
+                "php": ">=7.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.2"
+                "phpunit/phpunit": "^7.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.4-dev"
+                    "dev-master": "3.1-dev"
                 }
             },
             "autoload": {
@@ -4429,260 +6269,126 @@
             "keywords": [
                 "tokenizer"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
+                "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
             "abandoned": true,
-            "time": "2017-12-04T08:55:13+00:00"
+            "time": "2021-07-26T12:15:06+00:00"
         },
         {
             "name": "phpunit/phpunit",
-            "version": "5.7.27",
+            "version": "7.5.20",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c"
+                "reference": "9467db479d1b0487c99733bb1e7944d32deded2c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
-                "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c",
+                "reference": "9467db479d1b0487c99733bb1e7944d32deded2c",
                 "shasum": ""
             },
             "require": {
+                "doctrine/instantiator": "^1.1",
                 "ext-dom": "*",
                 "ext-json": "*",
                 "ext-libxml": "*",
                 "ext-mbstring": "*",
                 "ext-xml": "*",
-                "myclabs/deep-copy": "~1.3",
-                "php": "^5.6 || ^7.0",
-                "phpspec/prophecy": "^1.6.2",
-                "phpunit/php-code-coverage": "^4.0.4",
-                "phpunit/php-file-iterator": "~1.4",
-                "phpunit/php-text-template": "~1.2",
-                "phpunit/php-timer": "^1.0.6",
-                "phpunit/phpunit-mock-objects": "^3.2",
-                "sebastian/comparator": "^1.2.4",
-                "sebastian/diff": "^1.4.3",
-                "sebastian/environment": "^1.3.4 || ^2.0",
-                "sebastian/exporter": "~2.0",
-                "sebastian/global-state": "^1.1",
-                "sebastian/object-enumerator": "~2.0",
-                "sebastian/resource-operations": "~1.0",
-                "sebastian/version": "^1.0.6|^2.0.1",
-                "symfony/yaml": "~2.1|~3.0|~4.0"
-            },
-            "conflict": {
-                "phpdocumentor/reflection-docblock": "3.0.2"
+                "myclabs/deep-copy": "^1.7",
+                "phar-io/manifest": "^1.0.2",
+                "phar-io/version": "^2.0",
+                "php": "^7.1",
+                "phpspec/prophecy": "^1.7",
+                "phpunit/php-code-coverage": "^6.0.7",
+                "phpunit/php-file-iterator": "^2.0.1",
+                "phpunit/php-text-template": "^1.2.1",
+                "phpunit/php-timer": "^2.1",
+                "sebastian/comparator": "^3.0",
+                "sebastian/diff": "^3.0",
+                "sebastian/environment": "^4.0",
+                "sebastian/exporter": "^3.1",
+                "sebastian/global-state": "^2.0",
+                "sebastian/object-enumerator": "^3.0.3",
+                "sebastian/resource-operations": "^2.0",
+                "sebastian/version": "^2.0.1"
             },
-            "require-dev": {
-                "ext-pdo": "*"
-            },
-            "suggest": {
-                "ext-xdebug": "*",
-                "phpunit/php-invoker": "~1.1"
-            },
-            "bin": [
-                "phpunit"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "5.7.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "lead"
-                }
-            ],
-            "description": "The PHP Unit Testing framework.",
-            "homepage": "https://phpunit.de/",
-            "keywords": [
-                "phpunit",
-                "testing",
-                "xunit"
-            ],
-            "time": "2018-02-01T05:50:59+00:00"
-        },
-        {
-            "name": "phpunit/phpunit-mock-objects",
-            "version": "3.4.4",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
-                "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
-                "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
-                "shasum": ""
-            },
-            "require": {
-                "doctrine/instantiator": "^1.0.2",
-                "php": "^5.6 || ^7.0",
-                "phpunit/php-text-template": "^1.2",
-                "sebastian/exporter": "^1.2 || ^2.0"
-            },
-            "conflict": {
-                "phpunit/phpunit": "<5.4.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.4"
-            },
-            "suggest": {
-                "ext-soap": "*"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.2.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
-                    "role": "lead"
-                }
-            ],
-            "description": "Mock Object library for PHPUnit",
-            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
-            "keywords": [
-                "mock",
-                "xunit"
-            ],
-            "abandoned": true,
-            "time": "2017-06-30T09:13:00+00:00"
-        },
-        {
-            "name": "psr/http-message",
-            "version": "1.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/php-fig/http-message.git",
-                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
-                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Psr\\Http\\Message\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/"
-                }
-            ],
-            "description": "Common interface for HTTP messages",
-            "homepage": "https://github.com/php-fig/http-message",
-            "keywords": [
-                "http",
-                "http-message",
-                "psr",
-                "psr-7",
-                "request",
-                "response"
-            ],
-            "time": "2016-08-06T14:39:51+00:00"
-        },
-        {
-            "name": "ralouphie/getallheaders",
-            "version": "3.0.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/ralouphie/getallheaders.git",
-                "reference": "120b605dfeb996808c31b6477290a714d356e822"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
-                "reference": "120b605dfeb996808c31b6477290a714d356e822",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.6"
+            "conflict": {
+                "phpunit/phpunit-mock-objects": "*"
             },
             "require-dev": {
-                "php-coveralls/php-coveralls": "^2.1",
-                "phpunit/phpunit": "^5 || ^6.5"
+                "ext-pdo": "*"
+            },
+            "suggest": {
+                "ext-soap": "*",
+                "ext-xdebug": "*",
+                "phpunit/php-invoker": "^2.0"
             },
+            "bin": [
+                "phpunit"
+            ],
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "7.5-dev"
+                }
+            },
             "autoload": {
-                "files": [
-                    "src/getallheaders.php"
+                "classmap": [
+                    "src/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "BSD-3-Clause"
             ],
             "authors": [
                 {
-                    "name": "Ralph Khattar",
-                    "email": "ralph.khattar@gmail.com"
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
                 }
             ],
-            "description": "A polyfill for getallheaders.",
-            "time": "2019-03-08T08:55:37+00:00"
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "https://phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "testing",
+                "xunit"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/7.5.20"
+            },
+            "time": "2020-01-08T08:45:45+00:00"
         },
         {
             "name": "sebastian/code-unit-reverse-lookup",
-            "version": "1.0.1",
+            "version": "1.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
-                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+                "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
-                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619",
+                "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.6 || ^7.0"
+                "php": ">=5.6"
             },
             "require-dev": {
-                "phpunit/phpunit": "^5.7 || ^6.0"
+                "phpunit/phpunit": "^8.5"
             },
             "type": "library",
             "extra": {
@@ -4707,34 +6413,44 @@
             ],
             "description": "Looks up which function or method a line of code belongs to",
             "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
-            "time": "2017-03-04T06:30:41+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-30T08:15:22+00:00"
         },
         {
             "name": "sebastian/comparator",
-            "version": "1.2.4",
+            "version": "3.0.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/comparator.git",
-                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+                "reference": "1071dfcef776a57013124ff35e1fc41ccd294758"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
-                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758",
+                "reference": "1071dfcef776a57013124ff35e1fc41ccd294758",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
-                "sebastian/diff": "~1.2",
-                "sebastian/exporter": "~1.2 || ~2.0"
+                "php": ">=7.1",
+                "sebastian/diff": "^3.0",
+                "sebastian/exporter": "^3.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.4"
+                "phpunit/phpunit": "^8.5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.2.x-dev"
+                    "dev-master": "3.0-dev"
                 }
             },
             "autoload": {
@@ -4747,6 +6463,10 @@
                 "BSD-3-Clause"
             ],
             "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
                 {
                     "name": "Jeff Welch",
                     "email": "whatthejeff@gmail.com"
@@ -4758,45 +6478,52 @@
                 {
                     "name": "Bernhard Schussek",
                     "email": "bschussek@2bepublished.at"
-                },
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
                 }
             ],
             "description": "Provides the functionality to compare PHP values for equality",
-            "homepage": "http://www.github.com/sebastianbergmann/comparator",
+            "homepage": "https://github.com/sebastianbergmann/comparator",
             "keywords": [
                 "comparator",
                 "compare",
                 "equality"
             ],
-            "time": "2017-01-29T09:50:25+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/comparator/issues",
+                "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-30T08:04:30+00:00"
         },
         {
             "name": "sebastian/diff",
-            "version": "1.4.3",
+            "version": "3.0.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/diff.git",
-                "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
+                "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
-                "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211",
+                "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.3.3 || ^7.0"
+                "php": ">=7.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+                "phpunit/phpunit": "^7.5 || ^8.0",
+                "symfony/process": "^2 || ^3.3 || ^4"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.4-dev"
+                    "dev-master": "3.0-dev"
                 }
             },
             "autoload": {
@@ -4809,46 +6536,62 @@
                 "BSD-3-Clause"
             ],
             "authors": [
-                {
-                    "name": "Kore Nordmann",
-                    "email": "mail@kore-nordmann.de"
-                },
                 {
                     "name": "Sebastian Bergmann",
                     "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Kore Nordmann",
+                    "email": "mail@kore-nordmann.de"
                 }
             ],
             "description": "Diff implementation",
             "homepage": "https://github.com/sebastianbergmann/diff",
             "keywords": [
-                "diff"
+                "diff",
+                "udiff",
+                "unidiff",
+                "unified diff"
             ],
-            "time": "2017-05-22T07:24:03+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/diff/issues",
+                "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-30T07:59:04+00:00"
         },
         {
             "name": "sebastian/environment",
-            "version": "2.0.0",
+            "version": "4.2.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+                "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
-                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0",
+                "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.6 || ^7.0"
+                "php": ">=7.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "^5.0"
+                "phpunit/phpunit": "^7.5"
+            },
+            "suggest": {
+                "ext-posix": "*"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.0.x-dev"
+                    "dev-master": "4.2-dev"
                 }
             },
             "autoload": {
@@ -4873,34 +6616,44 @@
                 "environment",
                 "hhvm"
             ],
-            "time": "2016-11-26T07:53:53+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/environment/issues",
+                "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-30T07:53:42+00:00"
         },
         {
             "name": "sebastian/exporter",
-            "version": "2.0.0",
+            "version": "3.1.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/exporter.git",
-                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
+                "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
-                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db",
+                "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
-                "sebastian/recursion-context": "~2.0"
+                "php": ">=7.0",
+                "sebastian/recursion-context": "^3.0"
             },
             "require-dev": {
                 "ext-mbstring": "*",
-                "phpunit/phpunit": "~4.4"
+                "phpunit/phpunit": "^8.5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.0.x-dev"
+                    "dev-master": "3.1.x-dev"
                 }
             },
             "autoload": {
@@ -4913,6 +6666,10 @@
                 "BSD-3-Clause"
             ],
             "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
                 {
                     "name": "Jeff Welch",
                     "email": "whatthejeff@gmail.com"
@@ -4921,17 +6678,13 @@
                     "name": "Volker Dusch",
                     "email": "github@wallbash.com"
                 },
-                {
-                    "name": "Bernhard Schussek",
-                    "email": "bschussek@2bepublished.at"
-                },
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                },
                 {
                     "name": "Adam Harvey",
                     "email": "aharvey@php.net"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
                 }
             ],
             "description": "Provides the functionality to export PHP variables for visualization",
@@ -4940,27 +6693,37 @@
                 "export",
                 "exporter"
             ],
-            "time": "2016-11-19T08:54:04+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/exporter/issues",
+                "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-11-11T13:51:24+00:00"
         },
         {
             "name": "sebastian/global-state",
-            "version": "1.1.1",
+            "version": "2.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/global-state.git",
-                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+                "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
-                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
+                "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": "^7.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.2"
+                "phpunit/phpunit": "^6.0"
             },
             "suggest": {
                 "ext-uopz": "*"
@@ -4968,7 +6731,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0-dev"
+                    "dev-master": "2.0-dev"
                 }
             },
             "autoload": {
@@ -4991,33 +6754,38 @@
             "keywords": [
                 "global state"
             ],
-            "time": "2015-10-12T03:26:01+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/global-state/issues",
+                "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0"
+            },
+            "time": "2017-04-27T15:39:26+00:00"
         },
         {
             "name": "sebastian/object-enumerator",
-            "version": "2.0.1",
+            "version": "3.0.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/object-enumerator.git",
-                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
+                "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
-                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
+                "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
-                "sebastian/recursion-context": "~2.0"
+                "php": ">=7.0",
+                "sebastian/object-reflector": "^1.1.1",
+                "sebastian/recursion-context": "^3.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "~5"
+                "phpunit/phpunit": "^6.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.0.x-dev"
+                    "dev-master": "3.0.x-dev"
                 }
             },
             "autoload": {
@@ -5037,32 +6805,97 @@
             ],
             "description": "Traverses array structures and object graphs to enumerate all referenced objects",
             "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
-            "time": "2017-02-18T15:18:39+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-30T07:40:27+00:00"
+        },
+        {
+            "name": "sebastian/object-reflector",
+            "version": "1.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/object-reflector.git",
+                "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
+                "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Allows reflection of object attributes, including inherited and non-public ones",
+            "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+                "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-30T07:37:18+00:00"
         },
         {
             "name": "sebastian/recursion-context",
-            "version": "2.0.0",
+            "version": "3.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/recursion-context.git",
-                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
+                "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
-                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb",
+                "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.4"
+                "phpunit/phpunit": "^6.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.0.x-dev"
+                    "dev-master": "3.0.x-dev"
                 }
             },
             "autoload": {
@@ -5075,14 +6908,14 @@
                 "BSD-3-Clause"
             ],
             "authors": [
-                {
-                    "name": "Jeff Welch",
-                    "email": "whatthejeff@gmail.com"
-                },
                 {
                     "name": "Sebastian Bergmann",
                     "email": "sebastian@phpunit.de"
                 },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
                 {
                     "name": "Adam Harvey",
                     "email": "aharvey@php.net"
@@ -5090,29 +6923,39 @@
             ],
             "description": "Provides functionality to recursively process PHP variables",
             "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
-            "time": "2016-11-19T07:33:16+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+                "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-30T07:34:24+00:00"
         },
         {
             "name": "sebastian/resource-operations",
-            "version": "1.0.0",
+            "version": "2.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/resource-operations.git",
-                "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+                "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
-                "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3",
+                "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6.0"
+                "php": ">=7.1"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "2.0-dev"
                 }
             },
             "autoload": {
@@ -5132,7 +6975,17 @@
             ],
             "description": "Provides a list of PHP built-in functions that operate on resources",
             "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
-            "time": "2015-07-28T20:34:47+00:00"
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+                "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-30T07:30:19+00:00"
         },
         {
             "name": "sebastian/version",
@@ -5175,26 +7028,32 @@
             ],
             "description": "Library that helps with managing the version number of Git-hosted PHP projects",
             "homepage": "https://github.com/sebastianbergmann/version",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/version/issues",
+                "source": "https://github.com/sebastianbergmann/version/tree/master"
+            },
             "time": "2016-10-03T07:35:21+00:00"
         },
         {
             "name": "sensiolabs/security-checker",
-            "version": "v5.0.3",
+            "version": "v6.0.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sensiolabs/security-checker.git",
-                "reference": "46be3f58adac13084497961e10eed9a7fb4d44d1"
+                "reference": "a576c01520d9761901f269c4934ba55448be4a54"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/46be3f58adac13084497961e10eed9a7fb4d44d1",
-                "reference": "46be3f58adac13084497961e10eed9a7fb4d44d1",
+                "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/a576c01520d9761901f269c4934ba55448be4a54",
+                "reference": "a576c01520d9761901f269c4934ba55448be4a54",
                 "shasum": ""
             },
             "require": {
-                "composer/ca-bundle": "^1.0",
-                "php": ">=5.5.9",
-                "symfony/console": "~2.7|~3.0|~4.0"
+                "php": ">=7.1.3",
+                "symfony/console": "^2.8|^3.4|^4.2|^5.0",
+                "symfony/http-client": "^4.3|^5.0",
+                "symfony/mime": "^4.3|^5.0",
+                "symfony/polyfill-ctype": "^1.11"
             },
             "bin": [
                 "security-checker"
@@ -5202,7 +7061,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "5.0-dev"
+                    "dev-master": "6.0-dev"
                 }
             },
             "autoload": {
@@ -5221,31 +7080,36 @@
                 }
             ],
             "description": "A security checker for your composer.lock",
-            "time": "2018-12-19T17:14:59+00:00"
+            "support": {
+                "issues": "https://github.com/sensiolabs/security-checker/issues",
+                "source": "https://github.com/sensiolabs/security-checker/tree/master"
+            },
+            "abandoned": "https://github.com/fabpot/local-php-security-checker",
+            "time": "2019-11-01T13:20:14+00:00"
         },
         {
             "name": "simplesamlphp/simplesamlphp-test-framework",
-            "version": "v0.0.14",
+            "version": "v0.1.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git",
-                "reference": "d9b90d829ffd1597f0119570b4b1f5b7c91a56e1"
+                "reference": "f54a646a95f7b928d06a36d5f7f8303ac07f09b2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/d9b90d829ffd1597f0119570b4b1f5b7c91a56e1",
-                "reference": "d9b90d829ffd1597f0119570b4b1f5b7c91a56e1",
+                "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/f54a646a95f7b928d06a36d5f7f8303ac07f09b2",
+                "reference": "f54a646a95f7b928d06a36d5f7f8303ac07f09b2",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
-                "php-coveralls/php-coveralls": "^2.1",
-                "phpunit/phpunit": "~5.7|^6.0|^7.0|^8.0",
-                "vimeo/psalm": "1.1.9|^2.0|^3.0|^4.0"
+                "php": ">=7.0",
+                "phpunit/phpunit": "^6.5|^7.0|^8.0",
+                "sensiolabs/security-checker": "^5.0|^6.0",
+                "squizlabs/php_codesniffer": "^3.5",
+                "vimeo/psalm": "^3.2|^4.0"
             },
             "require-dev": {
                 "ext-curl": "*",
-                "ext-krb5": "*",
                 "simplesamlphp/simplesamlphp": "dev-master"
             },
             "bin": [
@@ -5274,20 +7138,24 @@
             "keywords": [
                 "test-framework"
             ],
-            "time": "2019-10-22T20:45:13+00:00"
+            "support": {
+                "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues",
+                "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework"
+            },
+            "time": "2019-12-30T21:14:30+00:00"
         },
         {
             "name": "squizlabs/php_codesniffer",
-            "version": "3.5.6",
+            "version": "3.7.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
-                "reference": "e97627871a7eab2f70e59166072a6b767d5834e0"
+                "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/e97627871a7eab2f70e59166072a6b767d5834e0",
-                "reference": "e97627871a7eab2f70e59166072a6b767d5834e0",
+                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619",
+                "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619",
                 "shasum": ""
             },
             "require": {
@@ -5308,150 +7176,74 @@
                 "branch-alias": {
                     "dev-master": "3.x-dev"
                 }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Greg Sherwood",
-                    "role": "lead"
-                }
-            ],
-            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
-            "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
-            "keywords": [
-                "phpcs",
-                "standards"
-            ],
-            "time": "2020-08-10T04:50:15+00:00"
-        },
-        {
-            "name": "symfony/console",
-            "version": "v3.4.43",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/console.git",
-                "reference": "afc7189694d2c59546cf24ea606a236fa46a966e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/afc7189694d2c59546cf24ea606a236fa46a966e",
-                "reference": "afc7189694d2c59546cf24ea606a236fa46a966e",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5.9|>=7.0.8",
-                "symfony/debug": "~2.8|~3.0|~4.0",
-                "symfony/polyfill-mbstring": "~1.0"
-            },
-            "conflict": {
-                "symfony/dependency-injection": "<3.4",
-                "symfony/process": "<3.3"
-            },
-            "provide": {
-                "psr/log-implementation": "1.0"
-            },
-            "require-dev": {
-                "psr/log": "~1.0",
-                "symfony/config": "~3.3|~4.0",
-                "symfony/dependency-injection": "~3.4|~4.0",
-                "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
-                "symfony/lock": "~3.4|~4.0",
-                "symfony/process": "~3.3|~4.0"
-            },
-            "suggest": {
-                "psr/log": "For using the console logger",
-                "symfony/event-dispatcher": "",
-                "symfony/lock": "",
-                "symfony/process": ""
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.4-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\Console\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
             ],
-            "description": "Symfony Console Component",
-            "homepage": "https://symfony.com",
-            "funding": [
-                {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
-                    "type": "github"
-                },
+            "authors": [
                 {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
+                    "name": "Greg Sherwood",
+                    "role": "lead"
                 }
             ],
-            "time": "2020-07-06T08:57:31+00:00"
+            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+            "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
+            "keywords": [
+                "phpcs",
+                "standards"
+            ],
+            "support": {
+                "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
+                "source": "https://github.com/squizlabs/PHP_CodeSniffer",
+                "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
+            },
+            "time": "2022-06-18T07:21:10+00:00"
         },
         {
-            "name": "symfony/polyfill-intl-idn",
-            "version": "v1.18.1",
+            "name": "symfony/http-client",
+            "version": "v4.4.42",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/polyfill-intl-idn.git",
-                "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251"
+                "url": "https://github.com/symfony/http-client.git",
+                "reference": "0366fe9d67709477e86b45e2e51a34ccf5018d04"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/5dcab1bc7146cf8c1beaa4502a3d9be344334251",
-                "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251",
+                "url": "https://api.github.com/repos/symfony/http-client/zipball/0366fe9d67709477e86b45e2e51a34ccf5018d04",
+                "reference": "0366fe9d67709477e86b45e2e51a34ccf5018d04",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
-                "symfony/polyfill-intl-normalizer": "^1.10",
-                "symfony/polyfill-php70": "^1.10",
-                "symfony/polyfill-php72": "^1.10"
+                "php": ">=7.1.3",
+                "psr/log": "^1|^2|^3",
+                "symfony/http-client-contracts": "^1.1.10|^2",
+                "symfony/polyfill-php73": "^1.11",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.0|^2"
             },
-            "suggest": {
-                "ext-intl": "For best performance"
+            "provide": {
+                "php-http/async-client-implementation": "*",
+                "php-http/client-implementation": "*",
+                "psr/http-client-implementation": "1.0",
+                "symfony/http-client-implementation": "1.1|2.0"
             },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.18-dev"
-                },
-                "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
-                }
+            "require-dev": {
+                "guzzlehttp/promises": "^1.4",
+                "nyholm/psr7": "^1.0",
+                "php-http/httplug": "^1.0|^2.0",
+                "psr/http-client": "^1.0",
+                "symfony/dependency-injection": "^4.3|^5.0",
+                "symfony/http-kernel": "^4.4.13",
+                "symfony/process": "^4.2|^5.0"
             },
+            "type": "library",
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Polyfill\\Intl\\Idn\\": ""
+                    "Symfony\\Component\\HttpClient\\": ""
                 },
-                "files": [
-                    "bootstrap.php"
+                "exclude-from-classmap": [
+                    "/Tests/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -5460,28 +7252,19 @@
             ],
             "authors": [
                 {
-                    "name": "Laurent Bassin",
-                    "email": "laurent@bassin.info"
-                },
-                {
-                    "name": "Trevor Rowbotham",
-                    "email": "trevor.rowbotham@pm.me"
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
                 },
                 {
                     "name": "Symfony Community",
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+            "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
             "homepage": "https://symfony.com",
-            "keywords": [
-                "compatibility",
-                "idn",
-                "intl",
-                "polyfill",
-                "portable",
-                "shim"
-            ],
+            "support": {
+                "source": "https://github.com/symfony/http-client/tree/v4.4.42"
+            },
             "funding": [
                 {
                     "url": "https://symfony.com/sponsor",
@@ -5496,123 +7279,134 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-08-04T06:02:08+00:00"
+            "time": "2022-05-17T14:14:05+00:00"
         },
         {
-            "name": "symfony/polyfill-intl-normalizer",
-            "version": "v1.18.1",
+            "name": "theseer/tokenizer",
+            "version": "1.1.3",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
-                "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e"
+                "url": "https://github.com/theseer/tokenizer.git",
+                "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e",
-                "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e",
+                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
+                "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
-            },
-            "suggest": {
-                "ext-intl": "For best performance"
+                "ext-dom": "*",
+                "ext-tokenizer": "*",
+                "ext-xmlwriter": "*",
+                "php": "^7.0"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.18-dev"
-                },
-                "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
-                }
-            },
             "autoload": {
-                "psr-4": {
-                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
-                },
-                "files": [
-                    "bootstrap.php"
-                ],
                 "classmap": [
-                    "Resources/stubs"
+                    "src/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "BSD-3-Clause"
             ],
             "authors": [
                 {
-                    "name": "Nicolas Grekas",
-                    "email": "p@tchwork.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony polyfill for intl's Normalizer class and related functions",
-            "homepage": "https://symfony.com",
-            "keywords": [
-                "compatibility",
-                "intl",
-                "normalizer",
-                "polyfill",
-                "portable",
-                "shim"
-            ],
-            "funding": [
-                {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
                 }
             ],
-            "time": "2020-07-14T12:35:20+00:00"
+            "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+            "support": {
+                "issues": "https://github.com/theseer/tokenizer/issues",
+                "source": "https://github.com/theseer/tokenizer/tree/master"
+            },
+            "time": "2019-06-13T22:48:21+00:00"
         },
         {
-            "name": "symfony/polyfill-php72",
-            "version": "v1.18.1",
+            "name": "vimeo/psalm",
+            "version": "3.18.2",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/polyfill-php72.git",
-                "reference": "639447d008615574653fb3bc60d1986d7172eaae"
+                "url": "https://github.com/vimeo/psalm.git",
+                "reference": "19aa905f7c3c7350569999a93c40ae91ae4e1626"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae",
-                "reference": "639447d008615574653fb3bc60d1986d7172eaae",
+                "url": "https://api.github.com/repos/vimeo/psalm/zipball/19aa905f7c3c7350569999a93c40ae91ae4e1626",
+                "reference": "19aa905f7c3c7350569999a93c40ae91ae4e1626",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "amphp/amp": "^2.1",
+                "amphp/byte-stream": "^1.5",
+                "composer/package-versions-deprecated": "^1.8.0",
+                "composer/semver": "^1.4 || ^2.0 || ^3.0",
+                "composer/xdebug-handler": "^1.1",
+                "dnoegel/php-xdg-base-dir": "^0.1.1",
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-simplexml": "*",
+                "ext-tokenizer": "*",
+                "felixfbecker/advanced-json-rpc": "^3.0.3",
+                "felixfbecker/language-server-protocol": "^1.4",
+                "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0",
+                "nikic/php-parser": "4.3.* || 4.4.* || 4.5.* || 4.6.* || ^4.8",
+                "openlss/lib-array2xml": "^1.0",
+                "php": "^7.1.3|^8",
+                "sebastian/diff": "^3.0 || ^4.0",
+                "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0",
+                "webmozart/glob": "^4.1",
+                "webmozart/path-util": "^2.3"
+            },
+            "provide": {
+                "psalm/psalm": "self.version"
+            },
+            "require-dev": {
+                "amphp/amp": "^2.4.2",
+                "bamarni/composer-bin-plugin": "^1.2",
+                "brianium/paratest": "^4.0.0",
+                "ext-curl": "*",
+                "phpdocumentor/reflection-docblock": "^4.3.4 || ^5",
+                "phpmyadmin/sql-parser": "5.1.0",
+                "phpspec/prophecy": ">=1.9.0",
+                "phpunit/phpunit": "^7.5.16 || ^8.5 || ^9.0",
+                "psalm/plugin-phpunit": "^0.11",
+                "slevomat/coding-standard": "^5.0",
+                "squizlabs/php_codesniffer": "^3.5",
+                "symfony/process": "^4.3",
+                "weirdan/prophecy-shim": "^1.0 || ^2.0"
+            },
+            "suggest": {
+                "ext-igbinary": "^2.0.5"
             },
+            "bin": [
+                "psalm",
+                "psalm-language-server",
+                "psalm-plugin",
+                "psalm-refactor",
+                "psalter"
+            ],
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.18-dev"
-                },
-                "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "dev-master": "3.x-dev",
+                    "dev-2.x": "2.x-dev",
+                    "dev-1.x": "1.x-dev"
                 }
             },
             "autoload": {
-                "psr-4": {
-                    "Symfony\\Polyfill\\Php72\\": ""
-                },
                 "files": [
-                    "bootstrap.php"
-                ]
+                    "src/functions.php",
+                    "src/spl_object_id.php"
+                ],
+                "psr-4": {
+                    "Psalm\\": "src/Psalm/"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -5620,68 +7414,54 @@
             ],
             "authors": [
                 {
-                    "name": "Nicolas Grekas",
-                    "email": "p@tchwork.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
+                    "name": "Matthew Brown"
                 }
             ],
-            "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
-            "homepage": "https://symfony.com",
+            "description": "A static analysis tool for finding errors in PHP applications",
             "keywords": [
-                "compatibility",
-                "polyfill",
-                "portable",
-                "shim"
-            ],
-            "funding": [
-                {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
-                }
+                "code",
+                "inspection",
+                "php"
             ],
-            "time": "2020-07-14T12:35:20+00:00"
+            "support": {
+                "issues": "https://github.com/vimeo/psalm/issues",
+                "source": "https://github.com/vimeo/psalm/tree/3.18.2"
+            },
+            "time": "2020-10-20T13:48:22+00:00"
         },
         {
-            "name": "symfony/stopwatch",
-            "version": "v3.4.43",
+            "name": "webmozart/glob",
+            "version": "4.1.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/stopwatch.git",
-                "reference": "a7a98f40dcc382a332c3729a6d04b298ffbb8f1f"
+                "url": "https://github.com/webmozarts/glob.git",
+                "reference": "3cbf63d4973cf9d780b93d2da8eec7e4a9e63bbe"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/a7a98f40dcc382a332c3729a6d04b298ffbb8f1f",
-                "reference": "a7a98f40dcc382a332c3729a6d04b298ffbb8f1f",
+                "url": "https://api.github.com/repos/webmozarts/glob/zipball/3cbf63d4973cf9d780b93d2da8eec7e4a9e63bbe",
+                "reference": "3cbf63d4973cf9d780b93d2da8eec7e4a9e63bbe",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8"
+                "php": "^5.3.3|^7.0",
+                "webmozart/path-util": "^2.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.6",
+                "sebastian/version": "^1.0.1",
+                "symfony/filesystem": "^2.5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.4-dev"
+                    "dev-master": "4.1-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Symfony\\Component\\Stopwatch\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
+                    "Webmozart\\Glob\\": "src/"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -5689,80 +7469,48 @@
             ],
             "authors": [
                 {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony Stopwatch Component",
-            "homepage": "https://symfony.com",
-            "funding": [
-                {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
                 }
             ],
-            "time": "2020-03-15T09:38:08+00:00"
+            "description": "A PHP implementation of Ant's glob.",
+            "support": {
+                "issues": "https://github.com/webmozarts/glob/issues",
+                "source": "https://github.com/webmozarts/glob/tree/4.1.0"
+            },
+            "time": "2015-12-29T11:14:33+00:00"
         },
         {
-            "name": "vimeo/psalm",
-            "version": "1.1.9",
+            "name": "webmozart/path-util",
+            "version": "2.3.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/vimeo/psalm.git",
-                "reference": "d15cf3b7f50249caf933144c8926c8e69aff3d34"
+                "url": "https://github.com/webmozart/path-util.git",
+                "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/vimeo/psalm/zipball/d15cf3b7f50249caf933144c8926c8e69aff3d34",
-                "reference": "d15cf3b7f50249caf933144c8926c8e69aff3d34",
+                "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
+                "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
                 "shasum": ""
             },
             "require": {
-                "composer/xdebug-handler": "^1.1",
-                "muglug/package-versions-56": "1.2.4",
-                "nikic/php-parser": "^3.1",
-                "openlss/lib-array2xml": "^0.0.10||^0.5.1",
-                "php": "^5.6||^7.0",
-                "php-cs-fixer/diff": "^1.2"
-            },
-            "provide": {
-                "psalm/psalm": "self.version"
+                "php": ">=5.3.3",
+                "webmozart/assert": "~1.0"
             },
             "require-dev": {
-                "bamarni/composer-bin-plugin": "^1.2",
-                "php-coveralls/php-coveralls": "^2.0",
-                "phpunit/phpunit": "^5.7.4",
-                "squizlabs/php_codesniffer": "^3.0"
-            },
-            "suggest": {
-                "ext-igbinary": "^2.0.5"
+                "phpunit/phpunit": "^4.6",
+                "sebastian/version": "^1.0.1"
             },
-            "bin": [
-                "psalm",
-                "psalter"
-            ],
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.x-dev",
-                    "dev-1.x": "1.x-dev"
+                    "dev-master": "2.3-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Psalm\\": "src/Psalm"
+                    "Webmozart\\PathUtil\\": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -5771,25 +7519,28 @@
             ],
             "authors": [
                 {
-                    "name": "Matthew Brown"
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
                 }
             ],
-            "description": "A static analysis tool for finding errors in PHP applications",
-            "keywords": [
-                "code",
-                "inspection",
-                "php"
-            ],
-            "time": "2018-08-14T16:06:16+00:00"
+            "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.",
+            "support": {
+                "issues": "https://github.com/webmozart/path-util/issues",
+                "source": "https://github.com/webmozart/path-util/tree/2.3.0"
+            },
+            "abandoned": "symfony/filesystem",
+            "time": "2015-12-17T08:42:14+00:00"
         }
     ],
     "aliases": [],
     "minimum-stability": "stable",
-    "stability-flags": [],
+    "stability-flags": {
+        "gettext/gettext": 20
+    },
     "prefer-stable": false,
     "prefer-lowest": false,
     "platform": {
-        "php": ">=5.6",
+        "php": ">=7.1|^8",
         "ext-spl": "*",
         "ext-zlib": "*",
         "ext-pcre": "*",
@@ -5803,5 +7554,5 @@
     "platform-dev": {
         "ext-curl": "*"
     },
-    "plugin-api-version": "1.1.0"
+    "plugin-api-version": "2.2.0"
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/config-templates/authsources.php b/vendor/simplesamlphp/simplesamlphp/config-templates/authsources.php
index f2d562163f0e3bce199bbf989a9419f2083dbc83..2e496fa80db4f5863e7631a3567cb9299787aa17 100644
--- a/vendor/simplesamlphp/simplesamlphp/config-templates/authsources.php
+++ b/vendor/simplesamlphp/simplesamlphp/config-templates/authsources.php
@@ -1,6 +1,17 @@
 <?php
 
 $config = [
+    /*
+     * When multiple authentication sources are defined, you can specify one to use by default
+     * in order to authenticate users. In order to do that, you just need to name it "default"
+     * here. That authentication source will be used by default then when a user reaches the
+     * SimpleSAMLphp installation from the web browser, without passing through the API.
+     *
+     * If you already have named your auth source with a different name, you don't need to change
+     * it in order to use it as a default. Just create an alias by the end of this file:
+     *
+     * $config['default'] = &$config['your_auth_source'];
+     */
 
     // This is a authentication source which handles admin authentication.
     'admin' => [
@@ -150,16 +161,16 @@
     */
 
     /*
-    // LinkedIn OAuth Authentication API.
+    // Twitter OAuth Authentication API.
     // Register your application to get an API key here:
-    //  https://www.linkedin.com/secure/developer
-    // Attributes definition:
-    //  https://developer.linkedin.com/docs/fields
-    'linkedin' => [
-        'authlinkedin:LinkedIn',
+    //  http://twitter.com/oauth_clients
+    'twitter' => [
+        'authtwitter:Twitter',
         'key' => 'xxxxxxxxxxxxxxxx',
         'secret' => 'xxxxxxxxxxxxxxxx',
-        'attributes' => 'id,first-name,last-name,headline,summary,specialties,picture-url,email-address',
+        // Forces the user to enter their credentials to ensure the correct users account is authorized.
+        // Details: https://dev.twitter.com/docs/api/1/get/oauth/authenticate
+        'force_login' => false,
     ],
     */
 
diff --git a/vendor/simplesamlphp/simplesamlphp/config-templates/config.php b/vendor/simplesamlphp/simplesamlphp/config-templates/config.php
index 2d6118170f112e4aa523665187f518f8b40520ba..02acd863854158db3aa0c9caf0b9b93adb349140 100644
--- a/vendor/simplesamlphp/simplesamlphp/config-templates/config.php
+++ b/vendor/simplesamlphp/simplesamlphp/config-templates/config.php
@@ -1,7 +1,7 @@
 <?php
-/*
+
+/**
  * The configuration of SimpleSAMLphp
- *
  */
 
 $config = [
@@ -226,7 +226,7 @@
      * alternatively a hashed array where the keys are the actions and their
      * corresponding values are booleans enabling or disabling each particular action.
      *
-     * SimpleSAMLphp provides some pre-defined actiones, though modules could add new
+     * SimpleSAMLphp provides some pre-defined actions, though modules could add new
      * actions here. Refer to the documentation of every module to learn if they
      * allow you to set any more debugging actions.
      *
@@ -459,6 +459,8 @@
      * Which functionality in SimpleSAMLphp do you want to enable. Normally you would enable only
      * one of the functionalities below, but in some cases you could run multiple functionalities.
      * In example when you are setting up a federation bridge.
+     *
+     * Note that shib13-idp has been deprecated and will be removed in SimpleSAMLphp 2.0.
      */
     'enable.saml20-idp' => false,
     'enable.shib13-idp' => false,
@@ -493,6 +495,11 @@
      *
      */
 
+     'module.enable' => [
+         'exampleauth' => false,
+         'core' => true,
+         'saml' => true
+     ],
 
 
     /*************************
@@ -559,7 +566,7 @@
      * through https. If the user can access the service through
      * both http and https, this must be set to FALSE.
      */
-    'session.cookie.secure' => false,
+    'session.cookie.secure' => true,
 
     /*
      * Set the SameSite attribute in the cookie.
@@ -568,10 +575,17 @@
      * the RFC6265bis SameSite cookie attribute. If set to null, no SameSite
      * attribute will be sent.
      *
+     * A value of "None" is required to properly support cross-domain POST
+     * requests which are used by different SAML bindings. Because some older
+     * browsers do not support this value, the canSetSameSiteNone function
+     * can be called to only set it for compatible browsers.
+     *
+     * You must also set the 'session.cookie.secure' value above to true.
+     *
      * Example:
      *  'session.cookie.samesite' => 'None',
      */
-    'session.cookie.samesite' => null,
+    'session.cookie.samesite' => \SimpleSAML\Utils\HTTP::canSetSameSiteNone() ? 'None' : null,
 
     /*
      * Options to override the default settings for php sessions.
@@ -758,7 +772,7 @@
          * ],
          *
          * establishing that if a translation for the "no" language code is
-         * not available, we look for translations in "nb" (Norwegian Bokmål),
+         * not available, we look for translations in "nb",
          * and so on, in that order.
          */
         'priorities' => [
@@ -768,6 +782,8 @@
             'se' => ['nb', 'no', 'nn', 'en'],
             'nr' => ['zu', 'en'],
             'nd' => ['zu', 'en'],
+            'tw' => ['st', 'en'],
+            'nso' => ['st', 'en'],
         ],
     ],
 
@@ -777,7 +793,7 @@
     'language.available' => [
         'en', 'no', 'nn', 'se', 'da', 'de', 'sv', 'fi', 'es', 'ca', 'fr', 'it', 'nl', 'lb',
         'cs', 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt-br', 'tr', 'ja', 'zh', 'zh-tw', 'ru',
-        'et', 'he', 'id', 'sr', 'lv', 'ro', 'eu', 'el', 'af', 'zu', 'xh',
+        'et', 'he', 'id', 'sr', 'lv', 'ro', 'eu', 'el', 'af', 'zu', 'xh', 'st',
     ],
     'language.rtl' => ['ar', 'dv', 'fa', 'ur', 'he'],
     'language.default' => 'en',
@@ -794,10 +810,10 @@
     'language.cookie.name' => 'language',
     'language.cookie.domain' => null,
     'language.cookie.path' => '/',
-    'language.cookie.secure' => false,
+    'language.cookie.secure' => true,
     'language.cookie.httponly' => false,
     'language.cookie.lifetime' => (60 * 60 * 24 * 900),
-    'language.cookie.samesite' => null,
+    'language.cookie.samesite' => \SimpleSAML\Utils\HTTP::canSetSameSiteNone() ? 'None' : null,
 
     /**
      * Custom getLanguage function called from SimpleSAML\Locale\Language::getLanguage().
@@ -977,7 +993,7 @@
             'type'          => 'saml20-idp-SSO',
         ],
 
-        /* When called without parameters, it will fallback to filter attributes ‹the old way›
+        /* When called without parameters, it will fallback to filter attributes 'the old way'
          * by checking the 'attributes' parameter in metadata on IdP hosted and SP remote.
          */
         50 => 'core:AttributeLimit',
@@ -1157,7 +1173,6 @@
     'metadata.sign.privatekey' => null,
     'metadata.sign.privatekey_pass' => null,
     'metadata.sign.certificate' => null,
-    'metadata.sign.algorithm' => null,
 
 
     /****************************
diff --git a/vendor/simplesamlphp/simplesamlphp/dictionaries/attributes.translation.json b/vendor/simplesamlphp/simplesamlphp/dictionaries/attributes.translation.json
index 13db03b4def414e1b8e49aa45ed78c00e2e20be1..e6a9a9d9b0f5dcd7564b9b91635c595a9db88738 100644
--- a/vendor/simplesamlphp/simplesamlphp/dictionaries/attributes.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/dictionaries/attributes.translation.json
@@ -37,6 +37,7 @@
 		"el": "\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1\u002f\u03b5\u03c2",
 		"xh": "Indima",
 		"zu": "Indima",
+		"st": "Kamano",
 		"ca": "Afiliació"
 	},
 	"attribute_title": {
@@ -76,6 +77,7 @@
 		"el": "\u03a4\u03af\u03c4\u03bb\u03bf\u03c2",
 		"xh": "Isibizo",
 		"zu": "Isiqu",
+		"st": "Thaetlele",
 		"ca": "Tractament"
 	},
 	"attribute_uid": {
@@ -116,6 +118,7 @@
 		"el": "\u0391\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7",
 		"xh": "I-ID yomsebenzisi",
 		"zu": "I-ID yomsebenzisi",
+		"st": "ID ya Mosebedisi",
 		"ca": "Identificador d'usuari"
 	},
 	"attribute_sn": {
@@ -156,6 +159,7 @@
 		"el": "\u0395\u03c0\u03ce\u03bd\u03c5\u03bc\u03bf",
 		"zu": "Isibongo",
 		"xh": "Ifani",
+		"st": "Difane",
 		"ca": "Cognoms"
 	},
 	"attribute_givenname": {
@@ -196,6 +200,7 @@
 		"el": "\u038c\u03bd\u03bf\u03bc\u03b1",
 		"xh": "Igama elinikiweyo",
 		"zu": "Igama lokuzalwa",
+		"st": "Lebitso le fanweng",
 		"ca": "Nom"
 	},
 	"attribute_cn": {
@@ -236,6 +241,7 @@
 		"el": "\u039a\u03bf\u03b9\u03bd\u03cc \u03cc\u03bd\u03bf\u03bc\u03b1 (CN)",
 		"zu": "Igama elivamile",
 		"xh": "Igama eliqhelekileyo",
+		"st": "Lebitso le tlwaelehileng",
 		"ca": "Nom comú (CN)"
 	},
 	"attribute_mail": {
@@ -276,6 +282,7 @@
 		"el": "Email",
 		"zu": "Imeyili",
 		"xh": "Iposi",
+		"st": "Poso",
 		"ca": "Adreça de correu electrònic"
 	},
 	"attribute_mobile": {
@@ -316,6 +323,7 @@
 		"el": "\u039a\u03b9\u03bd\u03b7\u03c4\u03cc \u03c4\u03b7\u03bb\u03ad\u03c6\u03c9\u03bd\u03bf",
 		"zu": "Imobhayili",
 		"xh": "Imobhayili",
+		"st": "E tsamayang",
 		"ca": "Telèfon mòbil"
 	},
 	"attribute_preferredlanguage": {
@@ -356,6 +364,7 @@
 		"el": "\u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ce\u03bc\u03b5\u03bd\u03b7 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1",
 		"xh": "Ulwimi olukhethayo",
 		"zu": "Ulimi oluncanyelwayo",
+		"st": "Puo e kgethwang",
 		"ca": "Idioma preferit"
 	},
 	"attribute_noredupersonnin": {
@@ -396,6 +405,7 @@
 		"el": "\u0391\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b1\u03c0\u03cc \u03b4\u03b7\u03bc\u03cc\u03c3\u03b9\u03b1 \u03b1\u03c1\u03c7\u03ae",
 		"xh": "Inombolo yesazisi eyabelwe ngamagunya oluntu",
 		"zu": "Inombolo kamazisi eyabelwe amagunya omphakathi",
+		"st": "Nomoro ya boitsebiso e abilwe ke bolaodi ba puso",
 		"ca": "Número de la Seguretat Social"
 	},
 	"attribute_schachomeorganization": {
@@ -435,6 +445,7 @@
 		"el": "\u038c\u03bd\u03bf\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae\u03c2 (domain) \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c5 \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd",
 		"zu": "Igama lesizinda senhlangano yasekhaya",
 		"xh": "Igama ledomeyini yombutho wekhaya",
+		"st": "Lebitso la domeine ya khampani",
 		"ca": "Identificador únic de l’organització principal"
 	},
 	"attribute_organisationname": {
@@ -475,6 +486,7 @@
 		"el": "\u038c\u03bd\u03bf\u03bc\u03b1 \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd",
 		"xh": "Igama lombutho",
 		"zu": "Igama lenhlangano",
+		"st": "Lebitso la khampani",
 		"ca": "Nom de l'organització"
 	},
 	"attribute_edupersonentitlement": {
@@ -515,6 +527,7 @@
 		"el": "\u0394\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03c3\u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1",
 		"zu": "Ilungelo eliphathelene nesevisi",
 		"xh": "Ilungelo ngokuphathelele inkonzo",
+		"st": "Thuo bakeng sa tshebeletso",
 		"ca": "Drets relatiu al servei"
 	},
 	"attribute_edupersonscopedaffiliation": {
@@ -555,6 +568,7 @@
 		"el": "\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1 \u03b1\u03bd\u03ac \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03ae \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae (administrative domain)",
 		"zu": "Indima enhlanganweni yasekhaya",
 		"xh": "Indima kumbutho wasekhaya",
+		"st": "Kamano khampaning ya habo",
 		"ca": "Afiliació a l’organització principal"
 	},
 	"attribute_edupersontargetedid": {
@@ -594,6 +608,7 @@
 		"el": "\u0391\u03b4\u03b9\u03b1\u03c6\u03b1\u03bd\u03ad\u03c2 \u03b1\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03bc\u03b1\u03ba\u03c1\u03ac\u03c2 \u03b4\u03b9\u03ac\u03c1\u03ba\u03b5\u03b9\u03b1\u03c2",
 		"zu": "Isibizo esingashintshi esiqondene nesevisi",
 		"xh": "Igama elingelolakhe elingatshintshiyo elingqale kwinkonzo",
+		"st": "ID e phehellang ya lebitso la boiqapelo",
 		"ca": "Identificació anònima persistent"
 	},
 	"attribute_pairwise_id": {
@@ -638,13 +653,15 @@
 		"el": "\u0391\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c3\u03c4\u03bf\u03bd \u03bf\u03b9\u03ba\u03b5\u03af\u03bf \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03cc",
 		"xh": "Igama elingundoqo lomntu kwinkampani yekhaya",
 		"zu": "Igama eliyinhloko lomuntu enhlanganweni yasekhaya",
- 		"ca": "Identificador \u00fanic de la persona a l'organitzaci\u00f3 principal"
+		"st": "Lebitso la sehlooho la motho khampaning ya habo",
+		"ca": "Identificador \u00fanic de la persona a l'organitzaci\u00f3 principal"
 	},
 	"attribute_edupersonuniqueid": {
 		"zh-tw": "\u500b\u4eba\u7121\u6cd5\u91cd\u65b0\u8a2d\u7f6e\uff0c\u65bc\u6240\u5c6c\u7d44\u7e54\u7684\u6c38\u4e45\u533f\u540d ID",
 		"el": "\u039c\u03cc\u03bd\u03b9\u03bc\u03bf, \u03b1\u03b4\u03b9\u03b1\u03c6\u03b1\u03bd\u03ad\u03c2 \u03b1\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c3\u03c4\u03bf\u03bd \u03bf\u03b9\u03ba\u03b5\u03af\u03bf \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03cc",
 		"zu": "I-ID yesibizo ephikelelayo, engakwazi ukwabelwa kabusha yomuntu yenhlangano yasekhaya",
 		"xh": "I-ID yomntu enganakuphinda yabelwe, ebhalwe ngegama lobuxoki eqhubekayo kwinkampani yekhaya",
+		"st": "ID ya boiqapelo le phehellang, e sa ajweng botjha ya motho ya khampani ya lapeng",
 		"ca": "Identificació anònima persistent i no reasignable de la persona a l'organització principal"
 	},
 	"attribute_subject_id": {
@@ -657,6 +674,7 @@
 		"af": "ORCID identifiseerder",
 		"zu": "Isihlonzi se-ORCID",
 		"xh": "Isazisi se-ORCID",
+		"st": "Ditsebahatsi tsa mofuputsi tsa ORCID",
 		"ca": "Identificador d'investigador ORCID"
 	},
 	"attribute_o": {
@@ -696,6 +714,7 @@
 		"el": "\u038c\u03bd\u03bf\u03bc\u03b1 \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd",
 		"zu": "Igama lenhlangano",
 		"xh": "Igama lombutho",
+		"st": "Lebitso la khampani",
 		"ca": "Nom de l'organització"
 	},
 	"attribute_dc": {
@@ -735,6 +754,7 @@
 		"el": "\u03a3\u03c5\u03c3\u03c4\u03b1\u03c4\u03b9\u03ba\u03cc \u03a4\u03bf\u03bc\u03ad\u03b1 (DC)",
 		"zu": "Ingxenye yesizinda (I-DC)",
 		"xh": "Ikhomponenti yedomeyin (DC)",
+		"st": "Karolwana ya domeine (DC)",
 		"ca": "Component de domini (DC)"
 	},
 	"attribute_displayname": {
@@ -774,6 +794,7 @@
 		"el": "\u0395\u03bc\u03c6\u03b1\u03bd\u03b9\u03b6\u03cc\u03bc\u03b5\u03bd\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1",
 		"zu": "Igama lesibonisi",
 		"xh": "Igama lomboniso",
+		"st": "Lebitso le bontshwang",
 		"ca": "Nom a mostrar"
 	},
 	"attribute_facsimiletelephonenumber": {
@@ -813,6 +834,7 @@
 		"el": "Fax",
 		"zu": "Inombolo yefeksi",
 		"xh": "Inombolo yefeksi",
+		"st": "Nomoro ya fekse",
 		"ca": "Número de fax"
 	},
 	"attribute_homephone": {
@@ -852,6 +874,7 @@
 		"el": "\u03a4\u03b7\u03bb\u03ad\u03c6\u03c9\u03bd\u03bf \u03bf\u03b9\u03ba\u03af\u03b1\u03c2",
 		"xh": "Umnxeba wasekhaya",
 		"zu": "Ucingo lwasekhaya",
+		"st": "Founu ya lapeng",
 		"ca": "Telèfon fix particular"
 	},
 	"attribute_homepostaladdress": {
@@ -891,6 +914,7 @@
 		"el": "\u03a4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b9\u03ba\u03ae \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03bf\u03b9\u03ba\u03af\u03b1\u03c2",
 		"zu": "Ikheli leposi lasekhaya",
 		"xh": "Idilesi yeposi yasekhaya",
+		"st": "Aterese ya lapeng ya poso",
 		"ca": "Adreça particular"
 	},
 	"attribute_jpegphoto": {
@@ -930,6 +954,7 @@
 		"el": "\u03a6\u03c9\u03c4\u03bf\u03b3\u03c1\u03b1\u03c6\u03af\u03b1 \u03c3\u03b5 \u03bc\u03bf\u03c1\u03c6\u03ae JPEG",
 		"xh": "Ifoto ye-JPEG",
 		"zu": "Isithombe se-JPEG",
+		"st": "Foto ya JPEG",
 		"ca": "Fotografia en JPEG"
 	},
 	"attribute_l": {
@@ -969,6 +994,7 @@
 		"el": "\u03a4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1",
 		"zu": "Indawo",
 		"xh": "Indawo",
+		"st": "Tulo",
 		"ca": "Localitat"
 	},
 	"attribute_labeleduri": {
@@ -1008,6 +1034,7 @@
 		"el": "\u0395\u03c0\u03b9\u03c3\u03b7\u03bc\u03b1\u03c3\u03bc\u03ad\u03bd\u03b1 URI",
 		"xh": "I-URI eneleyibheli",
 		"zu": "I-URI Enelebula",
+		"st": "Ya Leibole ya URI",
 		"ca": "URI etiquetat"
 	},
 	"attribute_ou": {
@@ -1047,6 +1074,7 @@
 		"el": "\u039f\u03c1\u03b3\u03b1\u03bd\u03c9\u03c4\u03b9\u03ba\u03ae \u03bc\u03bf\u03bd\u03ac\u03b4\u03b1",
 		"zu": "Iyunithi yenhlangano",
 		"xh": "Iyunithi yombutho",
+		"st": "Yuniti ya khampani",
 		"ca": "Unitat organitzativa"
 	},
 	"attribute_postaladdress": {
@@ -1086,6 +1114,7 @@
 		"el": "\u03a4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b9\u03ba\u03ae \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7",
 		"xh": "Idilesi yeposi",
 		"zu": "Ikheli leposi",
+		"st": "Aterese ya poso",
 		"ca": "Adreça postal"
 	},
 	"attribute_postalcode": {
@@ -1125,6 +1154,7 @@
 		"el": "\u03a4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b9\u03ba\u03cc\u03c2 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2",
 		"zu": "Ikhodi yeposi",
 		"xh": "Ikhowudi yeposi",
+		"st": "Khoutu ya poso",
 		"ca": "Codi Postal"
 	},
 	"attribute_postofficebox": {
@@ -1164,6 +1194,7 @@
 		"el": "\u03a4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b9\u03ba\u03ae \u03b8\u03c5\u03c1\u03af\u03b4\u03b1",
 		"zu": "Ibhokisi lehhovisi leposi",
 		"xh": "Ibhokisi yaseposini",
+		"st": "Lebokose la poso",
 		"ca": "Apartat de correus"
 	},
 	"attribute_street": {
@@ -1203,6 +1234,7 @@
 		"el": "\u039f\u03b4\u03cc\u03c2",
 		"xh": "Istrato",
 		"zu": "Umgwaqo",
+		"st": "Seterata",
 		"ca": "Carrer"
 	},
 	"attribute_telephonenumber": {
@@ -1242,6 +1274,7 @@
 		"el": "\u03a4\u03b7\u03bb\u03ad\u03c6\u03c9\u03bd\u03bf",
 		"zu": "Inombolo yocingo",
 		"xh": "Inombolo yomnxeba",
+		"st": "Nomoro ya founu",
 		"ca": "Número de telèfon"
 	},
 	"attribute_eduorghomepageuri": {
@@ -1281,6 +1314,7 @@
 		"el": "\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b1\u03c1\u03c7\u03b9\u03ba\u03ae\u03c2 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1\u03c2 \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c5 \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd",
 		"xh": "Ikhasi lekhaya Lenkampani",
 		"zu": "Ikhasi lasekhaya lenhlangano",
+		"st": "Leqephe la lapeng la khampani",
 		"ca": "Pàgina principal de l'organització"
 	},
 	"attribute_eduorglegalname": {
@@ -1320,6 +1354,7 @@
 		"el": "\u0395\u03c0\u03af\u03c3\u03b7\u03bc\u03b7 \u03b5\u03c0\u03c9\u03bd\u03c5\u03bc\u03af\u03b1 \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c5 \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd",
 		"zu": "Igama elisemthethweni lenhlangano",
 		"xh": "Igama elisemthethweni lenkampani",
+		"st": "Lebitso la molao la khampani",
 		"ca": "Nom legal de l'organització"
 	},
 	"attribute_edupersonnickname": {
@@ -1359,6 +1394,7 @@
 		"el": "\u03a8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7",
 		"xh": "Isiteketiso",
 		"zu": "Isidlaliso",
+		"st": "Lebitso la boswaswi",
 		"ca": "Sobrenom"
 	},
 	"attribute_edupersonorgdn": {
@@ -1398,6 +1434,7 @@
 		"el": "\u0394\u03b9\u03b1\u03ba\u03b5\u03ba\u03c1\u03b9\u03bc\u03ad\u03bd\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 (DN) \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c5 \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd",
 		"xh": "Igama elahlukileyo (DN) lenkampani yekhaya yomntu",
 		"zu": "Igama elihloniphekile (I-DN) lenhlangano yasekhaya yomuntu",
+		"st": "Lebitso le kgethehileng (DN) la khampani ya habo motho",
 		"ca": "Nom distingit (DN) de l'organització principal de la persona"
 	},
 	"attribute_edupersonorgunitdn": {
@@ -1437,6 +1474,7 @@
 		"el": "\u0394\u03b9\u03b1\u03ba\u03b5\u03ba\u03c1\u03b9\u03bc\u03ad\u03bd\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 (DN) \u03bf\u03b9\u03ba\u03b5\u03af\u03b1\u03c2 \u03bf\u03c1\u03b3\u03b1\u03bd\u03c9\u03c4\u03b9\u03ba\u03ae\u03c2 \u03bc\u03bf\u03bd\u03ac\u03b4\u03b1\u03c2",
 		"xh": "Igama elahlukileyo (DN) leyunithi yenkampani yekhaya yomntu",
 		"zu": "Igama elihloniphekile (I-DN) leyunithi yenhlangano yasekhaya yomuntu",
+		"st": "Lebitso le kgethehileng (DN) la yuniti ya khampani ya habo motho",
 		"ca": "Nom distingit (DN) de la unitat organitzativa (OU) de l'organització principal de la persona"
 	},
 	"attribute_edupersonprimaryaffiliation": {
@@ -1476,6 +1514,7 @@
 		"el": "\u039a\u03cd\u03c1\u03b9\u03b1 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1",
 		"xh": "Indima eyintloko",
 		"zu": "Indima eyinhloko",
+		"st": "Kamano ya motheo",
 		"ca": "Afiliació primària"
 	},
 	"attribute_noreduorgnin": {
@@ -1515,6 +1554,7 @@
 		"el": "\u0391\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c5 \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd",
 		"zu": "Inombolo yenhlangano",
 		"xh": "Inombolo yenkampani",
+		"st": "Nomoro ya khampani",
 		"ca": "Número de l’organització"
 	},
 	"attribute_noredupersonbirthdate": {
@@ -1554,6 +1594,7 @@
 		"el": "\u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u03b3\u03ad\u03bd\u03bd\u03b7\u03c3\u03b7\u03c2",
 		"zu": "Usuku lokuzalwa",
 		"xh": "Umhla wokuzalwa",
+		"st": "Letsatsi la tswalo",
 		"ca": "Data de naixement"
 	},
 	"attribute_noredupersonlin": {
@@ -1593,6 +1634,7 @@
 		"el": "\u0391\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2",
 		"zu": "Inombolo kamazisi yasendaweni",
 		"xh": "Inombolo yesazisi yasekuhlaleni",
+		"st": "Nomoro ya boitsebiso ya lehae",
 		"ca": "Número d'identitat local"
 	},
 	"attribute_manager": {
@@ -1632,6 +1674,7 @@
 		"el": "\u0394\u03b9\u03b1\u03ba\u03b5\u03ba\u03c1\u03b9\u03bc\u03ad\u03bd\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 (DN) \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae",
 		"xh": "Umanejala",
 		"zu": "Umphathi",
+		"st": "Mookamedi",
 		"ca": "Gestor"
 	},
 	"attribute_userpassword": {
@@ -1670,6 +1713,7 @@
 		"el": "\u039a\u03c1\u03c5\u03c0\u03c4\u03bf\u03b3\u03c1\u03b1\u03c6\u03b7\u03bc\u03ad\u03bd\u03bf\u03c2 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2",
 		"xh": "Iheshi yephaswedi yomsebenzisi",
 		"zu": "Uheshi wephasiwedi yomsebenzisi",
+		"st": "Hesh ya phasewete ya mosebedisi",
 		"ca": "Clau o contrasenya i mètode d'encriptació utilitzat"
 	},
 	"attribute_edupersonprimaryorgunitdn": {
@@ -1706,6 +1750,7 @@
 		"el": "\u0394\u03b9\u03b1\u03ba\u03b5\u03ba\u03c1\u03b9\u03bc\u03ad\u03bd\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 (DN) \u03ba\u03cd\u03c1\u03b9\u03b1\u03c2 \u03bf\u03c1\u03b3\u03b1\u03bd\u03c9\u03c4\u03b9\u03ba\u03ae\u03c2 \u03bc\u03bf\u03bd\u03ac\u03b4\u03b1\u03c2",
 		"xh": "Igama elahlukileyo (DN) leYunithi Yenkampani yokuqala yomntu",
 		"zu": "Igama elihloniphekile (I-DN) Leyunithi Yenhlangano eyinhloko yomuntu",
+		"st": "Lebitso le kgethehileng (DN) la Yuniti ya Khampani ya Motheo ya habo motho",
 		"ca": "Nom distingit (DN) de l'entrada del directori que representa l'identificador"
 	},
 	"attribute_schacuserprivateattribute": {
@@ -1743,6 +1788,7 @@
 		"el": "\u0391\u03c0\u03cc\u03c1\u03c1\u03b7\u03c4\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c9\u03c0\u03b9\u03ba\u03ac \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1",
 		"zu": "Izingxenye zolwazi oluyimfihlo",
 		"xh": "Iimpawu zenkcazelo yangasese",
+		"st": "Dielemente tsa tlhahisoleseding ya poraefete",
 		"ca": "Elements d'informació privada"
 	},
 	"attribute_noredupersonlegalname": {
@@ -1778,6 +1824,7 @@
 		"el": "\u0395\u03c0\u03af\u03c3\u03b7\u03bc\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1",
 		"xh": "Igama elisemthethweni",
 		"zu": "Igama elisemthethweni",
+		"st": "Lebitso la molao",
 		"ca": "Nom legal"
 	},
 	"attribute_edupersonassurance": {
@@ -1810,6 +1857,7 @@
 		"el": "\u0395\u03c0\u03af\u03c0\u03b5\u03b4\u03bf \u03b1\u03be\u03b9\u03bf\u03c0\u03b9\u03c3\u03c4\u03af\u03b1\u03c2 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2",
 		"zu": "Iphrofayela yokuqinisekisa umazisi",
 		"xh": "Iprofayile yokuqinisekisa isazisi",
+		"st": "Profaele ya tiisetso ya boitsebiso",
 		"ca": "Identificador del perfil de garantia"
 	},
 	"attribute_ismemberof": {
@@ -1823,6 +1871,7 @@
 		"el": "\u03a3\u03c5\u03bc\u03bc\u03b5\u03c4\u03bf\u03c7\u03ae \u03c3\u03b5 \u03bf\u03bc\u03ac\u03b4\u03b5\u03c2",
 		"xh": "Ubulungu beqela",
 		"zu": "Ubulungu beqembu",
+		"st": "Botho ba sehlopha",
 		"ca": "Pertinença al grup"
 	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/dictionaries/disco.translation.json b/vendor/simplesamlphp/simplesamlphp/dictionaries/disco.translation.json
index f65d7650de975bce6ff7ba40c4ae24794886a519..9fe0b9a7aa3d16d381331484335f92158aa2c389 100644
--- a/vendor/simplesamlphp/simplesamlphp/dictionaries/disco.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/dictionaries/disco.translation.json
@@ -35,6 +35,7 @@
 		"el": "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c5 \u03c6\u03bf\u03c1\u03ad\u03b1",
 		"xh": "Khetha umboneleli wesazisi wakho",
 		"zu": "Khetha umhlinzeki wakho kamazisi",
+		"st": "Kgetha mofani wa boitsebiso wa hao",
 		"ca": "Seleccioneu el vostre proveïdor d'identitat"
 	},
 	"selectidp_full": {
@@ -73,6 +74,7 @@
 		"el": "\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03bf\u03b9\u03ba\u03b5\u03af\u03bf \u03c6\u03bf\u03c1\u03ad\u03b1 \u03c0\u03bf\u03c5 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03b9 \u03c4\u03b7\u03bd \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03ac \u03c3\u03b1\u03c2",
 		"zu": "Sicela ukhethe umhlinzeki kamazisi lapho ofuna ukuqinisekisa khona:",
 		"xh": "Nceda ukhethe umboneleli wesazisi apho ufuna ukungqinisisa:",
+		"st": "Ka kopo kgetha mofani wa boitsebiso moo o batlang ho netefatsa:",
 		"ca": "Seleccioneu el proveïdor d’identitat on vulgueu autenticar:"
 	},
 	"select": {
@@ -111,6 +113,7 @@
 		"el": "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae",
 		"zu": "Khetha",
 		"xh": "Khetha",
+		"st": "Kgetha",
 		"ca": "Seleccioneu"
 	},
 	"remember": {
@@ -149,6 +152,7 @@
 		"el": "\u039d\u03b1 \u03b8\u03c5\u03bc\u03ac\u03c3\u03b1\u03b9 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03bc\u03bf\u03cd",
 		"zu": "Khumbula ukukhetha kwami",
 		"xh": "Khumbula ukhetho lwam",
+		"st": "Hopola kgetho ya ka",
 		"ca": "Recorda la meva elecció"
 	},
 	"icon_prefered_idp": {
@@ -187,6 +191,7 @@
 		"el": "[\u0391\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b7 \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae]",
 		"xh": "[Ukhetho olukhethwayo]",
 		"zu": "[Ukukhetha okuncanyelwayo]",
+		"st": "[Kgetho e kgethwang]",
 		"ca": "[Opció preferida]"
 	},
 	"previous_auth": {
@@ -224,6 +229,7 @@
 		"el": "\u0391\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b7 \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c5 \u03c6\u03bf\u03c1\u03ad\u03b1:",
 		"zu": "Ngaphambilini ukhethe ukuqinisekisa kokuthi",
 		"xh": "Kwixesha elidlulileyo ukhethe ukungqinisisa ngo-",
+		"st": "O qadile ka ho kgetha netefatso ho",
 		"ca": "Abans heu escollit autenticar-vos a"
 	},
 	"login_at": {
@@ -261,6 +267,7 @@
 		"el": "\u0395\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 \u0040",
 		"zu": "Ngena kokuthi",
 		"xh": "Ungeno ngo-",
+		"st": "Kena ho",
 		"ca": "Inicieu sessió a"
 	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/dictionaries/errors.translation.json b/vendor/simplesamlphp/simplesamlphp/dictionaries/errors.translation.json
index 62377c73f1e9cd0791e9f2a51a46c2d1916925eb..8755e7d3c8df9e3515f922d4beef83de3c1dc4e3 100644
--- a/vendor/simplesamlphp/simplesamlphp/dictionaries/errors.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/dictionaries/errors.translation.json
@@ -36,13 +36,14 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c4\u03bf\u03c5 SimpleSAMLphp",
 		"zu": "Iphutha le-SimpleSAMLphp",
 		"xh": "Impazamo ye-SimpleSAMLphp",
+		"st": "Phoso ya SimpleSAMLphp",
 		"ca": "Error de SimpleSAMLphp"
 	},
 	"report_trackid": {
 		"no": "Hvis vil rapportere denne feilen, send ogs\u00e5 med dette sporingsnummeret. Det gj\u00f8r det enklere for systemadministratorene \u00e5 finne ut hva som gikk galt:",
 		"nn": "Send med sporingsnummeret dersom du vil rapportera feilen. Sporingsnummeret gjer det enklare for systemadministratorane \u00e5 finna ut kva som er problemet:",
 		"sv": "Om du rapporterar felet b\u00f6r du ocks\u00e5 skicka med detta sp\u00e5rnings-ID. Det g\u00f6r det enklare f\u00f6r den som sk\u00f6ter systemet att fels\u00f6ka problemet:",
-		"es": "Por favor, si informa de este error, mantenga el <emph>tracking ID<\/emph> que permite encontrar su sesi&oacute;n en los registros de que dispone el administrador del sistema:",
+		"es": "Por favor, si informa de este error, mantenga el <em>tracking ID<\/em> que permite encontrar su sesi&oacute;n en los registros de que dispone el administrador del sistema:",
 		"fr": "Si vous signalez cette erreur, veuillez aussi signaler l'identifiant de suivi qui permet de trouver votre session dans les logs accessibles \u00e0 l'administrateur syst\u00e8me :",
 		"de": "Falls Sie diesen Fehler melden, teilen Sie bitte ebenfalls diese Tracking ID mit, dadurch ist es dem Administrator m\u00f6glich ihre Sitzung in den Logs zu finden:",
 		"nl": "Wanneer je deze fout rapporteert, geef dan AUB ook de volgende tracking ID door, waarmee het mogelijk is om jouw sessie in de logs terug te vinden:",
@@ -75,6 +76,7 @@
 		"el": "\u0391\u03bd \u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u002c \u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03bb\u03ac\u03b2\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b7\u03bd \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c3\u03b1\u03c2 \u03b1\u03c5\u03c4\u03cc\u03bd \u03c4\u03bf\u03bd \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc \u03c0\u03c1\u03bf\u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03bd\u03b1 \u03b4\u03b9\u03b5\u03c5\u03ba\u03bf\u03bb\u03cd\u03bd\u03b5\u03c4\u03b5 \u03c4\u03b7 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1 \u03b5\u03bd\u03c4\u03bf\u03c0\u03b9\u03c3\u03bc\u03bf\u03cd \u03ba\u03b1\u03b9 \u03b5\u03c0\u03af\u03bb\u03c5\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2:",
 		"zu": "Uma ubika leli phutha, sicela futhi ubike le nombolo yokulandelela eyenza kube nokwenzeka ukuthola iseshini yakho kumalogi atholakalayo kumlawuli wesistimu:",
 		"xh": "Ukuba ngaba uchaza le mpazamo, nceda kananjalo uchaze le nombolo yolandelelo eyenza kube lula ukufumana iseshoni yakho kwiincwadi ezifumaneka kumlawuli wesistim:",
+		"st": "Haeba o tlaleha phoso ena, ka kopo tlaleha hape nomoro ena ya ho sala morao e kgonahatsang hore o fumane seshene ya hao ho di-log ts efumanehang ho sistimi ya motsamaisi:",
 		"ca": "Si informeu d’aquest error, notifiqueu també aquest número de seguiment que permet localitzar la vostra sessió als registres disponibles per a l’administrador del sistema:"
 	},
 	"debuginfo_header": {
@@ -114,6 +116,7 @@
 		"el": "\u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03b5\u03bd\u03c4\u03bf\u03c0\u03b9\u03c3\u03bc\u03bf\u03cd \u03c3\u03c6\u03b1\u03bb\u03bc\u03ac\u03c4\u03c9\u03bd",
 		"xh": "Inkcazelo yokulungisa",
 		"zu": "Ulwazi lokususwa kwephutha",
+		"st": "Tlhahisoleseding ya debug",
 		"ca": "Informació de depuració"
 	},
 	"debuginfo_text": {
@@ -153,6 +156,7 @@
 		"el": "\u039f\u03b9 \u03c0\u03b1\u03c1\u03b1\u03ba\u03ac\u03c4\u03c9 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b4\u03b9\u03b5\u03c5\u03ba\u03bf\u03bb\u03cd\u03bd\u03bf\u03c5\u03bd \u03c4\u03b7 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1 \u03b5\u03bd\u03c4\u03bf\u03c0\u03b9\u03c3\u03bc\u03bf\u03cd \u03ba\u03b1\u03b9 \u03b5\u03c0\u03af\u03bb\u03c5\u03c3\u03b7\u03c2 \u03c3\u03c6\u03b1\u03bb\u03bc\u03ac\u03c4\u03c9\u03bd.",
 		"xh": "Inkcazelo yokulungisa engezantsi isenokuba ibangela umdla kumlawuli / idesika yoncedo:",
 		"zu": "Ulwazi lokususwa kwephutha olungezansi lungase lukhange kumlawuli / ideski losizo:",
+		"st": "Tlhahisoleseding ya debug e ka tlase mona e  ka nna ya kgahla motsamaisi / deske ya thuso:",
 		"ca": "La informació de depuració següent pot ser d’interès per l’administrador \/ centre d'atenció a l'usuari:"
 	},
 	"report_header": {
@@ -192,6 +196,7 @@
 		"el": "\u0391\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03bf\u03c2",
 		"zu": "Amaphutha ombiko",
 		"xh": "Chaza iimpazamo",
+		"st": "Tlaleha diphoso",
 		"ca": "Informeu de l’error"
 	},
 	"report_text": {
@@ -231,6 +236,7 @@
 		"el": "\u03a0\u03c1\u03bf\u03b1\u03b9\u03c1\u03b5\u03c4\u03b9\u03ba\u03ac\u002c \u03b5\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b7\u03bb\u03b5\u03ba\u03c4\u03c1\u03bf\u03bd\u03b9\u03ba\u03bf\u03cd \u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b5\u03af\u03bf\u03c5 \u03c3\u03b1\u03c2 \u03ce\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03af\u03bc\u03b1\u03c3\u03c4\u03b5 \u03c3\u03b5 \u03b8\u03ad\u03c3\u03b7 \u03bd\u03b1 \u03ad\u03c1\u03b8\u03bf\u03c5\u03bc\u03b5 \u03c3\u03b5 \u03b5\u03c0\u03b1\u03c6\u03ae \u03bc\u03b1\u03b6\u03af \u03c3\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03c0\u03b5\u03c1\u03b1\u03b9\u03c4\u03ad\u03c1\u03c9 \u03b5\u03c1\u03c9\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03bf \u03b8\u03ad\u03bc\u03b1 \u03c3\u03b1\u03c2:",
 		"xh": "Unokhetho lokuthumela idilesi yeimeyile yakho, ukuze abalawuli bakwazi ukukuqhagamshela ukuba banemibuzo engakumbi malunga nomba wakho:",
 		"zu": "Faka ngokuzithandela ikheli lakho le-imeyili, ukuze abalawuli bakwazi ukukuthinta ngemibuzo eyengeziwe mayelana nenkinga yakho:",
+		"st": "Ka boikgethelo o ka kenya aterse ya imeile ya hao, bakeng sa batsamaisi hore ba kgone ho ikopanya le wena mabapi le dipotso tse ding ka ditaba tsa hao:",
 		"ca": "Opcionalment, introduïu la vostra adreça de correu electrònic, per a que els administradors puguin contactar amb vosaltres per obtenir més detalls del problema:"
 	},
 	"report_email": {
@@ -271,6 +277,7 @@
 		"el": "Email:",
 		"xh": "Idilesi ye-imeyile:",
 		"zu": "Ikheli le-imeyili:",
+		"st": "Aterese ya imeile:",
 		"ca": "Adreça de correu electrònic:"
 	},
 	"report_explain": {
@@ -310,6 +317,7 @@
 		"el": "\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03b9\u03c2 \u03b5\u03bd\u03ad\u03c1\u03b3\u03b5\u03b9\u03ad\u03c2 \u03c3\u03b1\u03c2 \u03cc\u03c4\u03b1\u03bd \u03c3\u03c5\u03bd\u03ad\u03b2\u03b7 \u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1...",
 		"xh": "Cacisa ukuba wenze ntoni xa bekusenzeka le mpazamo...",
 		"zu": "Chaza ukuthi yini oyenzile ngenkathi kuvela leli phutha...",
+		"st": "Hlalosa seo o se entseng ha phoso ena e ne e hlaha...",
 		"ca": "Expliqueu què heu fet quan es va produir aquest error..."
 	},
 	"report_submit": {
@@ -349,6 +357,7 @@
 		"el": "\u0391\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac\u03c2",
 		"zu": "Thumela umbiko wephutha",
 		"xh": "Thumela ingxelo yempazamo",
+		"st": "Romela tlaleho ya phoso",
 		"ca": "Envia informe d'error"
 	},
 	"howto_header": {
@@ -388,6 +397,7 @@
 		"el": "\u03a0\u03ce\u03c2 \u03bd\u03b1 \u03bb\u03ac\u03b2\u03b5\u03c4\u03b5 \u03b2\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1",
 		"zu": "Indlela yokuthola usizo",
 		"xh": "Indlela yokufumana uncedo",
+		"st": "Ka moo o ka fumanang thuso",
 		"ca": "Com obtenir ajuda"
 	},
 	"howto_text": {
@@ -427,6 +437,7 @@
 		"el": "\u0391\u03c5\u03c4\u03cc \u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c0\u03b9\u03b8\u03b1\u03bd\u03cc\u03c4\u03b1\u03c4\u03b1 \u03bf\u03c6\u03b5\u03af\u03bb\u03b5\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b1 \u03b1\u03c0\u03c1\u03bf\u03c3\u03b4\u03cc\u03ba\u03b7\u03c4\u03b7 \u03c3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03c6\u03bf\u03c1\u03ac \u03ae \u03b5\u03c3\u03c6\u03b1\u03bb\u03bc\u03ad\u03bd\u03b7 \u03c1\u03cd\u03b8\u03bc\u03b9\u03c3\u03b7 \u03c4\u03bf\u03c5 SimpleSAMLphp. \u0395\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae \u03b1\u03c5\u03c4\u03ae\u03c2 \u03c4\u03b7\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1\u03c2 \u03c3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03bb\u03b1\u03bc\u03b2\u03ac\u03bd\u03bf\u03bd\u03c4\u03b1\u03c2 \u03c4\u03bf \u03c0\u03b1\u03c1\u03b1\u03c0\u03ac\u03bd\u03c9 \u03bc\u03ae\u03bd\u03c5\u03bc\u03b1 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03bf\u03c2.",
 		"zu": "Leli phutha kungenzeka ukuthi libangelwa indlela yokuziphatha engalindelwe noma umiso olungafanele lwe-SimpleSAMLphp. Thinta umlawuli wale sevisi yokungena, bese umthumela umlayezo wephutha ongenhla.",
 		"xh": "Le mpazamo kusenokwenzeka ingenxa yendlela yokwenza engalindelekanga okanye ulungiselelo olungachanekanga lwe-SimpleSAMLphp. Qhagamshelana nomlawuli wale nkonzo yokungena, uze umthumele umyalezo wempazamo ongentla.",
+		"st": "Mohlomong phoso ena e ka lebaka la boitshwaro bo itseng bo sa lebellwang kapa tlhophiso e fosahetseng ya SimpleSAMLphp. Ikopanye le motsamaisi wa tshebeletso ena ya ho kena, ebe o romela molaetsa wa phoso ka hodimo mona.",
 		"ca": "Segurament aquest error es deu a un comportament inesperat o a una configuració incorrecta de SimpleSAMLphp. Poseu-vos en contacte amb l’administrador d’aquest servei i envieu-li el missatge d’error anterior."
 	},
 	"title_CREATEREQUEST": {
@@ -466,6 +477,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2",
 		"xh": "Impazamo nokuyila isicelo",
 		"zu": "Iphutha lokwakha isicelo",
+		"st": "Phoso ho thehweng ha kopo",
 		"ca": "S'ha produït un error en crear la sol·licitud"
 	},
 	"descr_CREATEREQUEST": {
@@ -505,6 +517,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03c4\u03bf\u03c5 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2 SAML.",
 		"xh": "Kwenzeke impazamo xa kuzanywa ukuyilwa isicelo se-SAML.",
 		"zu": "Kuvele iphutha ngenkathi izama ukwakha isicelo se-SAML.",
+		"st": "Phoso e hlahile ha o leka ho theha kopo ya SAML.",
 		"ca": "S'ha produït un error en intentar crear la sol·licitud SAML."
 	},
 	"title_DISCOPARAMS": {
@@ -544,6 +557,7 @@
 		"el": "\u0395\u03c3\u03c6\u03b1\u03bb\u03bc\u03ad\u03bd\u03bf \u03b1\u03af\u03c4\u03b7\u03bc\u03b1 \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 \u03b1\u03bd\u03b5\u03cd\u03c1\u03b5\u03c3\u03b7\u03c2 \u03c0\u03b1\u03c1\u03cc\u03c7\u03bf\u03c5 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2",
 		"zu": "Isicelo esingalungile sesevisi yokuthola",
 		"xh": "Isicelo esibi kwinkonzo yofumaniso",
+		"st": "Kopo e mpe bakeng sa tshebeletso ya tshibollo",
 		"ca": "Sol·licitud incorrecta pel servei de descoberta"
 	},
 	"descr_DISCOPARAMS": {
@@ -583,6 +597,7 @@
 		"el": "\u039f\u03b9 \u03c0\u03b1\u03c1\u03ac\u03bc\u03b5\u03c4\u03c1\u03bf\u03b9 \u03c0\u03bf\u03c5 \u03c3\u03c4\u03ac\u03bb\u03b8\u03b7\u03ba\u03b1\u03bd \u03c3\u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 \u03b1\u03bd\u03b5\u03cd\u03c1\u03b5\u03c3\u03b7\u03c2 \u03c0\u03b1\u03c1\u03cc\u03c7\u03bf\u03c5 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03ae\u03c4\u03b1\u03bd \u03b5\u03c3\u03c6\u03b1\u03bb\u03bc\u03ad\u03bd\u03b5\u03c2.",
 		"xh": "Iipharamitha ezithunyelwe kwinkonzo yofumaniso azihambelani neenkcukacha.",
 		"zu": "Amapharamitha athunyelwe kusevisi yokuthola abengavumelani nezici.",
+		"st": "Dipharamitha tse rometsweng tshebeltsong ya tshibollo di ne di se ho latela ditekanyetso.",
 		"ca": "Els paràmetres enviats al servei de descoberta no s'ajusten a les especificacions."
 	},
 	"title_GENERATEAUTHNRESPONSE": {
@@ -622,6 +637,7 @@
 		"el": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7\u03c2 \u03c3\u03c4\u03bf \u03b1\u03af\u03c4\u03b7\u03bc\u03b1 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2",
 		"zu": "Ayikwazanga ukwakha impendulo yokuqinisekisa",
 		"xh": "Ayikwazanga ukuyila impendulo yongqinisiso",
+		"st": "Ha e a kgona ho theha karabelo ya ntefatso",
 		"ca": "No s’ha pogut crear la resposta d’autenticació"
 	},
 	"descr_GENERATEAUTHNRESPONSE": {
@@ -661,6 +677,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c0\u03ac\u03c1\u03bf\u03c7\u03bf \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2.",
 		"zu": "Ngenkathi lo mhlinzeki kamazisi ezama ukwakha impendulo yokuqinisekisa, kuvele iphutha.",
 		"xh": "Xa lo mboneleli wesazisi ezama ukuyila impendulo yongqinisiso, kwenzeke impazamo.",
+		"st": "Ha mofani enwa wa boitsebiso a leka ho theha karabelo ya netefatso, phoso e bile teng.",
 		"ca": "Quan el proveïdor d’identitat ha intentat crear una resposta d’autenticació, s’ha produït un error."
 	},
 	"title_LDAPERROR": {
@@ -700,6 +717,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 LDAP",
 		"xh": "Impazamo ye-LDAP",
 		"zu": "Iphutha le-LDAP",
+		"st": "Phoso ya LDAP",
 		"ca": "Error LDAP"
 	},
 	"descr_LDAPERROR": {
@@ -739,6 +757,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1 \u03bc\u03b5 \u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 \u03ba\u03b1\u03c4\u03b1\u03bb\u03cc\u03b3\u03bf\u03c5 \u03c7\u03c1\u03b7\u03c3\u03c4\u03ce\u03bd (LDAP).",
 		"xh": "I-LDAP ngumvimba wengcombolo yomsebenzisi, yaye xa uzame ukungena, kufuneka siqhagamshele uvimba wengcombolo we-LDAP. Kwenzeke impazamo xa besiyizama.",
 		"zu": "I-LDAP iyidathabheyisi yomsebenzisi, futhi lapho uzama ukungena, sidinga ukuthinta idathabheyisi ye-LDAP. Kuvele iphutha ngesikhathi siyizama ngalesi sikhathi.",
+		"st": "LDAP ke dathabeise ya mosebedisi, mme ha o leka ho kena, re hloka ho ikopanya le dathabeise ya LDAP. Phoso e hlahile ha re e leka lekgelong lena.",
 		"ca": "LDAP és la base de dades d'usuaris i, quan intenteu iniciar la sessió, necessitem connectar amb una base de dades LDAP. S'ha produït un error quan hem provat d'accedir-hi."
 	},
 	"title_LOGOUTREQUEST": {
@@ -778,6 +797,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1 \u03b1\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2",
 		"xh": "Impazamo iprosesa iSicelo Sokuphuma",
 		"zu": "Iphutha lokucubungula Isicelo Sokuphuma",
+		"st": "Phoso ho sebetseng Kopo ya Ho Tswa",
 		"ca": "S'ha produït un error en processar la sol·licitud de desconnexió"
 	},
 	"descr_LOGOUTREQUEST": {
@@ -817,6 +837,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03b1\u03c3\u03c4\u03ae\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c4\u03bf\u03c5 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2 \u03b1\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2.",
 		"zu": "Kuvele iphutha ngenkathi izama ukucubungula Isicelo Sokuphuma.",
 		"xh": "Kwenzeke impazamo ngoxa kuproseswa isiCelo Sokuphuma.",
+		"st": "Phoso e hlahile ha e leka ho sebetsa Kopo ya Ho Tswa.",
 		"ca": "S'ha produït un error en intentar processar la sol·licitud de desconnexió."
 	},
 	"title_METADATA": {
@@ -856,6 +877,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03bc\u03b5\u03c4\u03b1\u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd",
 		"zu": "Iphutha lokulayisha imethadatha",
 		"xh": "Impazamo ilayisha imetadata",
+		"st": "Phoso ya ho louta metadata",
 		"ca": "S'ha produït un error en carregar les metadades"
 	},
 	"descr_METADATA": {
@@ -895,6 +917,7 @@
 		"el": "\u03a5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03c3\u03c4\u03b9\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 SimpleSAMLphp. \u0395\u03ac\u03bd \u03b5\u03af\u03c3\u03c4\u03b5 \u03bf \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c2 \u03c4\u03b7\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1\u03c2 \u03b1\u03c5\u03c4\u03ae\u03c2, \u03b2\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03c4\u03b1 \u03bc\u03b5\u03c4\u03b1\u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03ad\u03c7\u03bf\u03c5\u03bd \u03c1\u03c5\u03b8\u03bc\u03b9\u03c3\u03c4\u03b5\u03af \u03c3\u03c9\u03c3\u03c4\u03ac.",
 		"xh": "Kukho ulungiselelo olungachanekanga oluthile lofakelo lwakho lwe-SimpleSAMLphp. Ukuba ngaba ungumlawuli wale nkonzo, ufanele uqinisekise ulungiselelo lwakho  lweempawu-ngcaciso zefayile lusetwe ngokuchanekileyo.",
 		"zu": "Kukhona umiso olungafanele kukufaka kwakho kwe-SimpleSAMLphp. Uma ungumlawuli wale sevisi, kufanele wenze isiqiniseko sokuthi umiso lwakho lwemethadatha lumiswe ngendlela efanele.",
+		"st": "Ho na le tlhophiso e fosahetseng ya kenyo ya ho instola SimpleSAMLphp ya hao. Haeba o motsamaisi wa tshebeletso ena, o tlameha ho etsa bonnete ba hore tlhophiso ya metadata ya hao e setilwe ka nepo.",
 		"ca": "Hi ha alguna configuració incorrecta a la vostra instal·lació de SimpleSAMLphp. Si sou l’administrador d’aquest servei, heu d’assegurar-vos que la configuració de les vostres metadades s’ha realitzat correctament."
 	},
 	"title_NOACCESS": {
@@ -934,6 +957,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7",
 		"zu": "Akukho ukufinyelela",
 		"xh": "Akukho fikelelo",
+		"st": "Ha ho phihlello",
 		"ca": "Sense accès"
 	},
 	"descr_NOACCESS": {
@@ -973,6 +997,7 @@
 		"el": "\u0391\u03c5\u03c4\u03cc \u03c4\u03bf \u03c4\u03b5\u03bb\u03b9\u03ba\u03cc \u03c3\u03b7\u03bc\u03b5\u03af\u03bf \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 (endpoint) \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03bf. \u0395\u03ac\u03bd \u03b5\u03af\u03c3\u03c4\u03b5 \u03bf \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c2 \u03c4\u03b7\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1\u03c2, \u03b5\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03b9\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 SimpleSAMLphp.",
 		"xh": "Le ndawo yokuphela ayenziwanga yasebenza. Jonga ukhetho lokwenza isebenze kulungiselelo lwakho lwe-SimpleSAMLphp.",
 		"zu": "Lesi siphetho asivunyelwe. Hlola izinketho zokuvumela kumiso lwakho lwe-SimpleSAMLphp.",
+		"st": "Ntlha ya bofelo ha e a bulelwa. Hlahloba dikgetho tse tlhophisong ya hao ya SimpleSAMLphp.",
 		"ca": "Aquest punt final no està habilitat. Comproveu les opcions d’habilitació en la configuració de SimpleSAMLphp."
 	},
 	"title_NORELAYSTATE": {
@@ -1012,6 +1037,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c0\u03b1\u03c1\u03b1\u03bc\u03ad\u03c4\u03c1\u03bf\u03c5 'RelayState'",
 		"zu": "Ayikho I-RelayState",
 		"xh": "Akukho RelayState",
+		"st": "Ha ho RelayState",
 		"ca": "Sense RelayState"
 	},
 	"descr_NORELAYSTATE": {
@@ -1051,6 +1077,7 @@
 		"el": "\u0397 \u03c0\u03b1\u03c1\u03ac\u03bc\u03b5\u03c4\u03c1\u03bf\u03c2 'RelayState' \u03c4\u03bf\u03c5 \u03c0\u03c1\u03c9\u03c4\u03bf\u03ba\u03cc\u03bb\u03bb\u03bf\u03c5 SAML \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03ae \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b7 \u03bc\u03b5 \u03b1\u03c0\u03bf\u03c4\u03ad\u03bb\u03b5\u03c3\u03bc\u03b1 \u03bd\u03b1 \u03bc\u03b7\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03bc\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf\u03bd \u03c0\u03cc\u03c1\u03bf \u03c4\u03bf\u03c5 \u03c0\u03b1\u03c1\u03cc\u03c7\u03bf\u03c5 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03b9\u03ce\u03bd0.",
 		"xh": "Umqalisi wesi sicelo akanikelanga ngepharamitha ye-RelayState apho kufanele kuyiwe khona.",
 		"zu": "Umqalisi walesi sicelo akazange ahlinzeke ngepharamitha ye-RelayState ebonisa ukuthi kufanele uye kuphi ngokulandelayo.",
+		"st": "Moqadi wa kopo ena ha a fana pharamitha ya RelayState e bontshang hore ho uwe kae ho tloha mona.",
 		"ca": "L’iniciador d’aquesta sol·licitud no ha proporcionat un paràmetre de RelayState que indiqui on seguirà."
 	},
 	"title_PROCESSASSERTION": {
@@ -1090,6 +1117,7 @@
 		"el": "\u0395\u03c3\u03c6\u03b1\u03bb\u03bc\u03ad\u03bd\u03b7 \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c0\u03ac\u03c1\u03bf\u03c7\u03bf \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2",
 		"xh": "Impazamo iprosesa impendulo esuka kuMboneleli Wesazisi",
 		"zu": "Iphutha lokucubungula impendulo esuka Kumhlinzeki Kamazisi",
+		"st": "Phoso ho sebetseng karabelo ho tswa ho Mofani wa Boitsebiso",
 		"ca": "S'ha produït un error en processar la resposta del proveïdor d’identitat"
 	},
 	"descr_PROCESSASSERTION": {
@@ -1129,6 +1157,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c4\u03b7\u03c2 \u03b1\u03c0\u03ac\u03bd\u03c4\u03b7\u03c3\u03b7\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c0\u03ac\u03c1\u03bf\u03c7\u03bf \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2.",
 		"zu": "Asizange samukele impendulo ethunyelwe ukusuka Kumhlinzeki Kamazisi.",
 		"xh": "Asiyamkelanga impendulo ethunyelwe ukusuka kuMboneleli Wesazisi.",
+		"st": "Ha re a amohela karabelo ho tswa ho Mofani wa Boitsebiso.",
 		"ca": "La resposta enviada pel proveïdor d’identitat no ha estat acceptada."
 	},
 	"title_PROCESSAUTHNREQUEST": {
@@ -1168,6 +1197,7 @@
 		"el": "\u0395\u03c3\u03c6\u03b1\u03bb\u03bc\u03ad\u03bd\u03bf \u03b1\u03af\u03c4\u03b7\u03bc\u03b1 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c0\u03ac\u03c1\u03bf\u03c7\u03bf \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03b9\u03ce\u03bd",
 		"xh": "Impazamo iprosesa isicelo esisuka kuMboneleli Wenkonzo",
 		"zu": "Iphutha lokucubungula isicelo esisuka Kumhlinzeki Wesevisi",
+		"st": "Phoso ho sebetseng kopo ho tswa ho Mofani wa Tshebeletso",
 		"ca": "S'ha produït un error en processar la sol·licitud del proveïdor de serveis"
 	},
 	"descr_PROCESSAUTHNREQUEST": {
@@ -1207,6 +1237,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c4\u03bf\u03c5 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 \u03c0\u03bf\u03c5 \u03ad\u03bb\u03b1\u03b2\u03b5 \u03bf \u03c0\u03ac\u03c1\u03bf\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c0\u03ac\u03c1\u03bf\u03c7\u03bf \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03b9\u03ce\u03bd.",
 		"zu": "Lo Mhlinzeki Kamazisi uthole Isicelo Sokuqinisekisa ukusuka Kumhlinzeki Wesevisi, kodw,a kuvele iphutha ngenkathi ezama ukucubungula isicelo.",
 		"xh": "Lo Mboneleli Wesazisi ufumene Isicelo Songqinisiso esisuka kuMboneleli Wenkonzo, kodwa kwenzeke impazamo xa kuzanywa ukuprosesa isicelo.",
+		"st": "Mofani enwa wa Boitsebiso o fumane Kopo ya Netefatso ho tswa ho Mofani wa Tshebeletso, empa ho bile le phoso ha ho leka ho fihlellwa kopo.",
 		"ca": "Aquest proveïdor d’identitat ha rebut una sol·licitud d’autenticació d’un proveïdor de serveis, però s’ha produït un error en intentar processar la sol·licitud."
 	},
 	"title_SLOSERVICEPARAMS": {
@@ -1246,6 +1277,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03c0\u03b1\u03c6\u03ae SingleLogoutService",
 		"zu": "Awukho umlayezo we-SAML onikeziwe",
 		"xh": "Akukho myalezo we-SAML unikelweyo",
+		"st": "Ha ho molaetsa wa SAML o fanweng",
 		"ca": "No s’ha proporcionat cap missatge SAML"
 	},
 	"descr_SLOSERVICEPARAMS": {
@@ -1285,6 +1317,7 @@
 		"el": "\u039a\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03ae \u03c3\u03b1\u03c2 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03c0\u03b1\u03c6\u03ae SingleLogoutService \u03c0\u03b1\u03c1\u03b1\u03bb\u03b5\u03af\u03c8\u03b1\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03bb\u03ac\u03b2\u03b5\u03c4\u03b5 \u03bc\u03ae\u03bd\u03c5\u03bc\u03b1 LogoutRequest \u03ae LogoutResponse \u03c4\u03bf\u03c5 \u03c0\u03c1\u03c9\u03c4\u03bf\u03ba\u03cc\u03bb\u03bb\u03bf\u03c5 SAML. \u03a3\u03b7\u03bc\u03b5\u03b9\u03ce\u03c3\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c4\u03b5\u03bb\u03b9\u03ba\u03cc \u03c3\u03b7\u03bc\u03b5\u03af\u03bf (endpoint) \u03b4\u03b5\u03bd \u03c0\u03c1\u03bf\u03bf\u03c1\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03ac\u03bc\u03b5\u03c3\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b2\u03ac\u03c3\u03b9\u03bc\u03bf.",
 		"zu": "Ufinyelele ukusebenzisana kwe-SingleLogoutService, kodwa awuzange uhlinzeke nge-SAML LogoutRequest noma i-LogoutResponse. Sicela uphawule ukuthi isiphetho asihloselwe ukufinyelelwa ngokuqondile.",
 		"xh": "Ufikelele i-intafeyisi ye-SingleLogoutService, kodwa awukhange unikele i-SAML LogoutRequest okanye i-LogoutResponse. Nceda uqaphele ukuba le ndawo yokuphela ayilungiselelwanga ukuba ifikelelwe ngokuthe ngqo.",
+		"st": "O fihletse tshebeletsano ya SingleLogoutService, empa ha o a fana ka SAML LogoutRequest kapa LogoutResponse. Ka kopo lemoha hore ntlha ena ya bofelo ha e a rerelwa ho fihlellwa ka kotloloho.",
 		"ca": "Heu accedit a la interfície de SingleLogoutService, però no heu proporcionat un missatge SAML de LogoutRequest ni LogoutResponse. Tingueu en compte que en aquest punt no s'hi pot accedir directament."
 	},
 	"title_ACSPARAMS": {
@@ -1324,6 +1357,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03c0\u03b1\u03c6\u03ae AssertionConsumerService",
 		"zu": "Ayikho impendulo ye-SAML enikeziwe",
 		"xh": "Akukho mpendulo ye-SAML inikelweyo",
+		"st": "Ha ho karabelo ya SAML e fanweng",
 		"ca": "No s’ha proporcionat cap resposta de SAML"
 	},
 	"descr_ACSPARAMS": {
@@ -1363,30 +1397,35 @@
 		"el": "\u039a\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03ae \u03c3\u03b1\u03c2 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03c0\u03b1\u03c6\u03ae AssertionConsumerService  \u03c0\u03b1\u03c1\u03b1\u03bb\u03b5\u03af\u03c8\u03b1\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03bb\u03ac\u03b2\u03b5\u03c4\u03b5 \u03b1\u03c0\u03ac\u03bd\u03c4\u03b7\u03c3\u03b7 \u03c3\u03b5 \u03b1\u03af\u03c4\u03b7\u03bc\u03b1 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 \u03c0\u03c1\u03c9\u03c4\u03bf\u03ba\u03cc\u03bb\u03bb\u03bf\u03c5 SAML. \u03a3\u03b7\u03bc\u03b5\u03b9\u03ce\u03c3\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c4\u03b5\u03bb\u03b9\u03ba\u03cc \u03c3\u03b7\u03bc\u03b5\u03af\u03bf (endpoint) \u03b4\u03b5\u03bd \u03c0\u03c1\u03bf\u03bf\u03c1\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03ac\u03bc\u03b5\u03c3\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b2\u03ac\u03c3\u03b9\u03bc\u03bf.",
 		"zu": "Ufinyelele ukusebenzisana Kwesevisi Yomthengi Yesimemezelo, kodwa awuzange uhlinzeke Ngempendulo Yokuqinisekisa ye-SAML. Sicela uphawule ukuthi isiphetho asihloselwe ukufinyelelwa ngokuqondile.",
 		"xh": "Ufikelele i-intafeyisi ye-Assertion Consumer Service, kodwa awukhange unikele iMpendulo Yongqinisiso ye-SAML. Nceda uqaphele ukuba le ndawo yokuphela ayilungiselelwanga ukuba ifikelelwe ngokuthe ngqo.",
+		"st": "O fihletse kopano ya Tiiso ya Tshebeletso ya Bareki, empa ha o a fana ka Karabelo ya Netefatso ya SAML. Ka kopo lemoha hore ntlha ena ya bofelo ha e a rerelwa ho fihlellwa ka kotloloho.",
 		"ca": "Heu accedit a la interfície Assertion Consumer Service però no heu proporcionat una resposta d’autenticació SAML. Tingueu en compte que en aquest punt no s'hi pot accedir directament."
 	},
 	"title_SSOPARAMS": {
 		"zh-tw": "\u672a\u63d0\u4f9b SAML \u8acb\u6c42",
 		"zu": "Asikho isicelo se-SAML esinikeziwe",
 		"xh": "Akukho sicelo se-SAML sinikelweyo",
+		"st": "Ha ho kopo ya SAML e fanweng",
 		"ca": "No s’ha proporcionat cap sol·licitud SAML"
 	},
 	"descr_SSOPARAMS": {
 		"zh-tw": "\u60a8\u9023\u7d50\u55ae\u4e00\u7c3d\u5165\u670d\u52d9\u4ecb\u9762\uff0c\u4f46\u672a\u63d0\u4f9b\u4e00\u500b SAML \u9a57\u8b49\u8acb\u6c42\u3002\u8acb\u6ce8\u610f\uff0c\u8a72\u7aef\u9ede\u4e26\u975e\u76f4\u63a5\u9023\u7dda\u3002",
 		"xh": "Ufikelele i-intafeyisi ye-Single Sign On Service, kodwa awukhange unikele iMpendulo Yongqinisiso ye-SAML. Nceda uqaphele ukuba le ndawo yokuphela ayilungiselelwanga ukuba ifikelelwe ngokuthe ngqo.",
 		"zu": "Ufinyelele ukusebenzisana Kwesevisi Yokubhalisa Okukodwa, kodwa awuzange uhlinzeke Ngempendulo Yokuqinisekisa ye-SAML. Sicela uphawule ukuthi isiphetho asihloselwe ukufinyelelwa ngokuqondile.",
+		"st": "O fihletse tshebeletsano ya Tshaeno ya Hang, empa ha o a fan aka Kopo ya Netefatso ya SAML. Ka kopo lemoha hore ntlha ena ya bofelo ha e a rerelwa ho fihlellwa ka kotloloho.",
 		"ca": "Heu accedit a la interfície del servei d’inici de sessió únic, però no heu proporcionat una sol·licitud d’autenticació SAML. Tingueu en compte que en aquest punt no s'hi pot accedir directament."
 	},
 	"title_ARSPARAMS": {
 		"zh-tw": "\u672a\u63d0\u4f9b SAML \u8a0a\u606f",
 		"zu": "Awukho umlayezo we-SAML onikeziwe",
 		"xh": "Akukho myalezo we-SAML unikelweyo",
+		"st": "Ha ho molaetsa wa SAML o fanweng",
 		"ca": "No s’ha proporcionat cap missatge SAML"
 	},
 	"descr_ARSPARAMS": {
 		"zh-tw": "\u60a8\u9023\u7d50\u4eba\u5de5\u8655\u7406\u670d\u52d9\u4ecb\u9762\uff0c\u4f46\u672a\u63d0\u4f9b SAML \u4eba\u5de5\u8655\u7406\u670d\u52d9\u8a0a\u606f\u3002\u8acb\u6ce8\u610f\uff0c\u8a72\u7aef\u9ede\u4e26\u975e\u76f4\u63a5\u9023\u7dda\u3002",
 		"xh": "Ufikelele i-intafeyisi ye-Artifact Resolution Service, kodwa awukhange unikrele umyalezo we-SAML ArtifactResolve. Nceda uqaphele ukuba le ndawo yokuphela ayilungiselelwanga ukuba ifikelelwe ngokuthe ngqo.",
 		"zu": "Ufinyelele ukusebenzisana Kwesevisi Yokucaciswa Kobuciko, kodwa awuzange uhlinzeke umlayezo we-SAML ArtifactResolve. Sicela uphawule ukuthi isiphetho asihloselwe ukufinyelelwa ngokuqondile.",
+		"st": "O fihletse kopano ya Tshebeletso ya Tlhakiso ya Athifekte, empa ha o a fana ka molaetsa wa SAML ArtifactResolve. Ka kopo lemoha hore ntlha ena ya bofelo ha e a rerelwa ho fihlellwa ka kotloloho.",
 		"ca": "Heu accedit a la interfície del servei de resolució Artifact, però no heu proporcionat un missatge d’ArtifactResolve de SAML. Tingueu en compte que en aquest punt no s'hi pot accedir directament."
 
 	},
@@ -1427,6 +1466,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 CAS",
 		"xh": "Impazamo ye-CAS",
 		"zu": "Iphutha Le-CAS",
+		"st": "Phoso ya CAS",
 		"ca": "Error CAS"
 	},
 	"descr_CASERROR": {
@@ -1466,6 +1506,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03c4\u03ae CAS.",
 		"zu": "Iphutha ngenkathi kuxhunyanwa neseva ye-CAS.",
 		"xh": "Impazamo xa kunxibelelwana neseva ye-CAS.",
+		"st": "Phoso e bile teng ka seva ya CAS.",
 		"ca": "S'ha produït un error al intentar connectar amb el servidor CAS."
 	},
 	"title_CONFIG": {
@@ -1505,6 +1546,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03c9\u03bd",
 		"zu": "Iphutha lomiso",
 		"xh": "Impazamo yolungiselelo",
+		"st": "Phoso ya Netefatso",
 		"ca": "Error de configuració"
 	},
 	"descr_CONFIG": {
@@ -1544,6 +1586,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03c9\u03bd \u03c4\u03bf\u03c5 SimpleSAMLphp. \u0395\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae \u03c4\u03b7\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1\u03c2.",
 		"xh": "I-SimpleSAMLphp ibonakala ingalungiselelwanga kakuhle.",
 		"zu": "I-SimpleSAMLphp ibonakala ingamisiwe ngendlela efanele.",
+		"st": "SimpleSAMLphp e bonahala e hlophisitswe hampe.",
 		"ca": "SimpleSAMLphp sembla estar mal configurat."
 	},
 	"title_NOTSET": {
@@ -1583,6 +1626,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
 		"xh": "Iphaswedi ayisetwanga",
 		"zu": "Iphasiwedi ayisethiwe",
+		"st": "Phasewete ha e a setwa",
 		"ca": "No s'ha definit la contrasenya"
 	},
 	"descr_NOTSET": {
@@ -1622,6 +1666,7 @@
 		"el": "\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b1\u03b9 \u03b7 \u03c0\u03c1\u03bf\u03ba\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c4\u03b9\u03bc\u03ae \u03c4\u03bf\u03c5 \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03c4\u03b5\u03af\u03c4\u03b5 \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03c9\u03bd.",
 		"xh": "Iphaswedi ekulungiselelo (auth.adminpassword) ayitshintshwanga ukusuka kwixabiso lesiseko. Nceda uhlele ifayile yolungiselelo.",
 		"zu": "Iphasiwedi kumiso (auth.adminpassword) ayishintshiwe kunani elizenzakalelayo. Sicela uhlele ifayela lomiso.",
+		"st": "Phasewete ya tlhophiso (auth.adminpassword) ha e a fetolwa ho tswa palong ya tlwaelo. Ka kopo edita faele ya tlhophiso.",
 		"ca": "La contrasenya de la configuració (auth.adminpassword) no s'ha canviat del valor predeterminat. Editeu el fitxer de configuració."
 	},
 	"title_NOTVALIDCERT": {
@@ -1661,6 +1706,7 @@
 		"el": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03cc",
 		"xh": "Isatifikethi esingasebenziyo",
 		"zu": "Isitifiketi esingalungile",
+		"st": "Setifikeiti se sa tshwaneleheng",
 		"ca": "Certificat no vàlid"
 	},
 	"descr_NOTVALIDCERT": {
@@ -1700,6 +1746,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03bb\u03cc\u03b3\u03c9 \u03bc\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c5 \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03bf\u03cd.",
 		"zu": "Awuzange wethule isitifiketi esilungile.",
 		"xh": "Awukhange uzise isatifikethi esisebenzayo.",
+		"st": "Ha o a fana ka setifikeiti se nepahetseng.",
 		"ca": "No heu presentat un certificat vàlid."
 	},
 	"errorreport_header": {
@@ -1738,6 +1785,7 @@
 		"el": "\u0397 \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c3\u03c4\u03ac\u03bb\u03b8\u03b7\u03ba\u03b5",
 		"zu": "Umbiko wephutha uthunyelwe",
 		"xh": "Ingxelo yempazamo ithunyelwe",
+		"st": "Tlaleho ya phoso e rometswe",
 		"ca": "S'ha enviat un informe d'error"
 	},
 	"errorreport_text": {
@@ -1776,6 +1824,7 @@
 		"el": "\u0397 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03c4\u03b7\u03c2 \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac\u03c2 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c3\u03c4\u03bf\u03c5\u03c2 \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ad\u03c2 \u03bf\u03bb\u03bf\u03ba\u03bb\u03b7\u03c1\u03ce\u03b8\u03b7\u03ba\u03b5.",
 		"xh": "Ingxelo yempazamo ithunyelwe kubalawuli.",
 		"zu": "Umbiko wephutha uthunyelwe kubalawuli.",
+		"st": "Tlaleho ya phoso e rometswe ho batsamaisi.",
 		"ca": "L’informe d’errors s’ha enviat als administradors."
 	},
 	"title_LOGOUTINFOLOST": {
@@ -1814,6 +1863,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03b1\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2",
 		"zu": "Ulwazi lokuphuma lulahlekile",
 		"xh": "Inkcazelo yokuphuma ilahlekile",
+		"st": "Tlhahisoleseding ya ho tswa e lahlehile",
 		"ca": "S'ha perdut la informació del tancament de sessió"
 	},
 	"descr_LOGOUTINFOLOST": {
@@ -1852,6 +1902,7 @@
 		"el": "\u039f\u03b9 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03b7\u03bd \u03b1\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03ad\u03c7\u03bf\u03c5\u03bd \u03c7\u03b1\u03b8\u03b5\u03af. \u0398\u03b1 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03c0\u03b9\u03c3\u03c4\u03c1\u03ad\u03c8\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03bf\u03c0\u03bf\u03af\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03ae\u03c3\u03b5\u03c4\u03b5 \u03b5\u03ba \u03bd\u03ad\u03bf\u03c5. \u0391\u03c5\u03c4\u03cc \u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03b1\u03c3\u03c4\u03b5\u03af \u03b1\u03bd \u03b7 \u03b9\u03c3\u03c7\u03cd\u03c2 \u03c4\u03c9\u03bd \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03b9\u03ce\u03bd \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03b7\u03bd \u03b1\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03ad\u03c7\u03b5\u03b9 \u03bb\u03ae\u03be\u03b5\u03b9. \u039f\u03b9 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03b1\u03c5\u03c4\u03ad\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03b5\u03c4\u03b1\u03b9 \u03b3\u03b9\u03b1 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03c7\u03c1\u03bf\u03bd\u03b9\u03ba\u03cc \u03b4\u03b9\u03ac\u03c3\u03c4\u03b7\u03bc\u03b1 - \u03c3\u03c5\u03bd\u03ae\u03b8\u03c9\u03c2 \u03bc\u03b5\u03c1\u03b9\u03ba\u03ce\u03bd \u03c9\u03c1\u03ce\u03bd. \u0391\u03c5\u03c4\u03cc \u03c3\u03c5\u03bd\u03ae\u03b8\u03c9\u03c2 \u03b5\u03c0\u03b1\u03c1\u03ba\u03b5\u03af \u03b3\u03b9\u03b1 \u03bc\u03b9\u03b1 \u03ba\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ae \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b1\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2, \u03c3\u03c5\u03bd\u03b5\u03c0\u03ce\u03c2 \u03c3\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b5\u03c1\u03af\u03c0\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c5\u03c0\u03bf\u03b4\u03b5\u03b9\u03ba\u03bd\u03cd\u03b5\u03b9 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf \u03ac\u03bb\u03bb\u03bf \u03b8\u03ad\u03bc\u03b1 \u03bc\u03b5 \u03c4\u03b9\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2. \u0395\u03ac\u03bd \u03c4\u03bf \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03c0\u03b1\u03c1\u03b1\u03bc\u03ad\u03bd\u03b5\u03b9, \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c0\u03ac\u03c1\u03bf\u03c7\u03bf \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03b9\u03ce\u03bd.",
 		"zu": "Ulwazi olumayelana nomsebenzi wokuphuma wamanje lulahlekile. Kufanele ubuyele kusevisi obuzama ukuphuma kuyo futhi uzame ukuphuma futhi. Leli phutha lingabangelwa ukuphelelwa isikhathi kolwazi lokuphuma. Ulwazi lokuphuma lugcinwa isikhathi esilinganiselwe - ngokuvamile amahora ambalwa. Lokhu kude kunanoma yimuphi umsebenzi wokuphuma ovamile, ngakho leli phutha lingase libonise elinye iphutha ngomiso. Uma inkinga iphikelela, thinta umhlinzeki wakho wesevisi.",
 		"xh": "Inkcazelo malunga nomsebenzi wokuphuma wangoku ilahlekile. Ufanele ubuyele kwinkonzo ubuzama ukuphuma kuyo uzame ukuphuma kwakhona. Le mpazamo inokubangelwa kukuphelelwa kwenkcazelo yokuphuma. Inkcazelo yokuphuma igcinwa ixesha elithile - ngokuqhelekileyo iiyure eziliqela. Oku kuthatha ixesha elide kunawo nawuphi na umsebenzi wokuphuma ofanele ulithathe, ngoko le mpazamo isenokubonisa enye impazamo ngolungiselelo. Ukuba ingxaki iyaqhubeka, qhagamshela umboneleli wenkonzo wakho.",
+		"st": "Tlhahisoleseding e mabapi le tshebetos ya ho tswa ya hajwale e lahlehile. O tlameha ho kgutlela tshebeletsong eo o neng o leka ho tswa ho yona le ho leka ho tswa hape. Phoso ena e ka bakwa ke phelo nako ya tlhahisoleseding ya ho tswa. Tlhahisoleseding ya ho tswa e bolokwa nako e lekantsweng - ka tlwaelo ke palo ya dihora. Sena se setelele ho feta nako eo tshebetso efe kapa efe ya tlwaelo ya ho tswa e tlamehang ho e nka, ka hona phoso ena e ka nna ya bontsha phoso e nngwe ka tlhophiso esele. Haeba bothata bo phehella, ikopanye le mofani wa tshebeletso wa hao.",
 		"ca": "S'ha perdut la informació sobre el tancament de sessió actual. Heu de tornar al servei del qual esteu intentant desconnectar i provar de sortir de nou. Aquest error pot ser causat per l’expiració de la informació del tancament de sessió. La informació de tancament de sessió s’emmagatzema per un període limitat de temps, normalment un nombre d'hores. Això és més llarg del que hauria de tenir qualsevol operació de tancament de sessió normal, de manera que aquest error pot indicar algun altre error amb la configuració. Si el problema continua, poseu-vos en contacte amb el vostre proveïdor de serveis."
 	},
 	"title_UNHANDLEDEXCEPTION": {
@@ -1868,7 +1919,7 @@
 		"hu": "Kezeletlen kiv\u00e9tel",
 		"pt-br": "Exce\u00e7\u00e3o n\u00e3o tratada",
 		"pt": "Excep\u00e7\u00e3o n\u00e3o tratada",
-		"cs": "Neo\u010dek\u00e1van\u00e1 vyj\u00edmka",
+		"cs": "Neo\u010dek\u00e1van\u00e1 v\u00fdjimka",
 		"tr": "Beklenmeyen durum",
 		"lt": "Ne\u017einoma klaida",
 		"it": "Eccezione non gestita",
@@ -1890,6 +1941,7 @@
 		"el": "\u0391\u03bd\u03b5\u03c0\u03af\u03bb\u03c5\u03c4\u03b7 \u03b5\u03be\u03b1\u03af\u03c1\u03b5\u03c3\u03b7",
 		"xh": "Isinxaxhi esingasingathwanga",
 		"zu": "Okuhlukile okungasingathiwe",
+		"st": "Mokgelo o sa rarollwang",
 		"ca": "Excepció no controlada"
 	},
 	"descr_UNHANDLEDEXCEPTION": {
@@ -1906,7 +1958,7 @@
 		"hu": "Kezeletlen kiv\u00e9tel (exception) keletkezett.",
 		"pt-br": "Uma exce\u00e7\u00e3o n\u00e3o tratada foi descartada.",
 		"pt": "Foi despoletada um excep\u00e7\u00e3o que n\u00e3o foi tratada.",
-		"cs": "Neo\u010dek\u00e1van\u00e1 vyj\u00edmka vznikla.",
+		"cs": "Vyskytla se neo\u010dek\u00e1van\u00e1 v\u00fdjimka.",
 		"tr": "Bir beklenmeyen durum g\u00f6nderildi.",
 		"lt": "Ne\u017einoma klaida.",
 		"it": "E' stata generata un'eccezione che non \u00e8 stata gestita.",
@@ -1928,6 +1980,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03b1\u03bd\u03b5\u03c0\u03af\u03bb\u03c5\u03c4\u03b7 \u03b5\u03be\u03b1\u03af\u03c1\u03b5\u03c3\u03b7",
 		"xh": "Isinxaxhi esingasingathwanga silahliwe.",
 		"zu": "Okuhlukile okungasingathiwe kulahliwe.",
+		"st": "Kgeloho e sa rarollwang e lahlilwe.",
 		"ca": "S'ha enviat una excepció no controlada."
 	},
 	"title_NOTFOUND": {
@@ -1966,6 +2019,7 @@
 		"el": "\u0397 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5",
 		"xh": "Ikhasi alifunyenwanga",
 		"zu": "Ikhasi alitholakali",
+		"st": "Leqephe ha le a fumanwa",
 		"ca": "Pàgina no trobada"
 	},
 	"descr_NOTFOUND": {
@@ -2004,6 +2058,7 @@
 		"el": "\u0397 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03c0\u03bf\u03c5 \u03b6\u03b7\u03c4\u03ae\u03c3\u03b1\u03c4\u03b5 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 %URL% \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5.",
 		"zu": "Ikhasi elinikeziwe alitholakalanga. I-URL ibithi: %URL%",
 		"xh": "Ikhasi elinikelweyo alifunyenwanga. I-URL ngu: %URL%",
+		"st": "Leqephe le fanweng ha le a fumanwa. URL e bile: %URL%",
 		"ca": "No s’ha trobat la pàgina indicada. L’URL és: %URL%"
 	},
 	"title_NOTFOUNDREASON": {
@@ -2042,6 +2097,7 @@
 		"el": "\u0397 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5",
 		"xh": "Ikhasi alifunyenwanga",
 		"zu": "Ikhasi alitholakali",
+		"st": "Leqephe ha le a fumanwa",
 		"ca": "Pàgina no trobada"
 	},
 	"descr_NOTFOUNDREASON": {
@@ -2080,6 +2136,7 @@
 		"el": "\u0397 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03c0\u03bf\u03c5 \u03b6\u03b7\u03c4\u03ae\u03c3\u03b1\u03c4\u03b5 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 %URL% \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5: %REASON%",
 		"zu": "Ikhasi elinikeziwe alitholakalanga. Isizathu besithi: %REASON%  I-URL ibithi: %URL%",
 		"xh": "Ikhasi elinikelweyo alifunyenwanga. Isizathu sesi: %REASON%  I-URL ngu: %URL%",
+		"st": "Leqephe le fanweng ha le a fumanwa. Lebaka e bile: %LEBAKA%  URL e bile: %URL%",
 		"ca": "No s’ha trobat la pàgina indicada. El motiu és: %REASON%. L’URL és: %URL%"
 	},
 	"title_BADREQUEST": {
@@ -2118,6 +2175,7 @@
 		"el": "\u0395\u03c3\u03c6\u03b1\u03bb\u03bc\u03ad\u03bd\u03bf \u03b1\u03af\u03c4\u03b7\u03bc\u03b1",
 		"zu": "Kutholwe umlayezo ongalungile",
 		"xh": "Kufunyenwe isicelo esibi",
+		"st": "Kopo e mpe e amohetswe",
 		"ca": "S'ha rebut una petició incorrecta"
 	},
 	"descr_BADREQUEST": {
@@ -2155,6 +2213,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c4\u03bf\u03c5 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2: %REASON%",
 		"zu": "Kukhona iphutha kusicelo saleli khasi. Isizathu besithi: %REASON%",
 		"xh": "Kukho impazamo kwisicelo kweli khasi. Isizathu sesi: %REASON%",
+		"st": "Ho na le phoso kopong e leqepheng lena. Lebaka e bile: %REASON%",
 		"ca": "Hi ha un error en la sol·licitud d’aquesta pàgina. El motiu és: %REASON%"
 	},
 	"title_WRONGUSERPASS": {
@@ -2193,6 +2252,7 @@
 		"el": "\u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ae \u03bf \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03bb\u03ac\u03b8\u03bf\u03c2",
 		"zu": "Igama lomsebenzisi elingalungile noma iphasiwedi",
 		"xh": "Igama lomsebenzisi okanye iphaswedi engachanekanga",
+		"st": "Lebitso la mosebedisi kapa phasewete e fosahetseng",
 		"ca": "Nom d'usuari o contrasenya incorrecta"
 	},
 	"descr_WRONGUSERPASS": {
@@ -2230,6 +2290,7 @@
 		"el": "\u039f \u03c3\u03c5\u03bd\u03b4\u03c5\u03b1\u03c3\u03bc\u03cc\u03c2 \u03bf\u03bd\u03cc\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ba\u03b1\u03b9 \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03c9\u03c3\u03c4\u03cc\u03c2. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03b7\u03bd \u03bf\u03c1\u03b8\u03cc\u03c4\u03b7\u03c4\u03b1 \u03c4\u03c9\u03bd \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03c9\u03bd \u03c3\u03b1\u03c2 \u03ba\u03b1\u03b9 \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03ae\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac.",
 		"zu": "Kungenzeka ukuthi akekho umsebenzisi onegama lomsebenzisi otholiwe, noma iphasiwedi oyinikezile ayilungile. Sicela uhlole igama lomsebenzisi bese uzame futhi.",
 		"xh": "Kusenokwenzeka akukho msebenzisi unegama lomsebenzisi elinikelweyo ofunyenweyo, okanye iphaswedi oyinikeleyo ayichanekanga. Nceda ujonge igama lomsebenzisi uzame kwakhona.",
+		"st": "Ekaba mosebedisi wa lebitso la mosebedisi le fanweng ha a fumanwe, kapa phasewete eo o e fananeng e fosahetse. Ka kopo hlahloba lebitso la mosebedisi la hao, ebe o leka hape.",
 		"ca": "No s’ha pogut trobar cap usuari amb el nom d’usuari donat, o la contrasenya no és correcta. Comproveu el nom d’usuari i torneu-ho a provar."
 	},
 	"title_RESPONSESTATUSNOSUCCESS": {
@@ -2268,6 +2329,7 @@
 		"el": "\u039b\u03ae\u03c8\u03b7 \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03cd \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03bf\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c0\u03ac\u03c1\u03bf\u03c7\u03bf \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2",
 		"zu": "Iphutha litholwe ukusuka Kumhlinzeki Kamazisi",
 		"xh": "Impazamo efunyenwe kuMboneleli Wesazisi",
+		"st": "Phoso e amohetswe ho tswa ho Mofani wa Boitsebiso",
 		"ca": "S'ha rebut un error del proveïdor d’identitats"
 	},
 	"descr_RESPONSESTATUSNOSUCCESS": {
@@ -2306,6 +2368,7 @@
 		"el": "\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 \u03c0\u03bf\u03c5 \u03c0\u03b5\u03c1\u03b9\u03ad\u03c7\u03b5\u03b9 \u03b7 \u03b1\u03c0\u03ac\u03bd\u03c4\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03c0\u03b1\u03c1\u03cc\u03c7\u03bf\u03c5 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03c5\u03c0\u03bf\u03b4\u03b5\u03b9\u03ba\u03bd\u03cd\u03b5\u03b9 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1.",
 		"xh": "Umboneleli Wesazisi uphendule ngempazamo. (Ikhowudi yobume kwiMpendulo ye-SAML ayiphumelelanga)",
 		"zu": "Umhlinzeki Womazisi uphendule ngephutha. (Ikhodi yesimo Sempendulo ye-SAML ayizange iphumelele)",
+		"st": "Mofani wa Boitsebiso o arabetse ka phoso. (Khoutu ya boemo Karabelong ya SAML ha e a atleha)",
 		"ca": "El proveïdor d’identitat ha respost amb un error (el codi d'estat de la resposta SAML no ha estat exitós)."
 	},
 	"title_NOCERT": {
@@ -2342,6 +2405,7 @@
 		"el": "\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03cc",
 		"xh": "Akukho satifikethi",
 		"zu": "Asikho isitifiketi",
+		"st": "Ha ho setifikeiti",
 		"ca": "Sense certificat"
 	},
 	"descr_NOCERT": {
@@ -2377,6 +2441,7 @@
 		"el": "\u0397 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5: \u03a4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03b9\u03c3\u03c4\u03bf\u03cd \u03c0\u03bf\u03c5 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b5 \u03b4\u03b5\u03bd \u03ad\u03c3\u03c4\u03b5\u03b9\u03bb\u03b5 \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03cc.",
 		"zu": "Ukuqinisekisa kuhlulekile: isiphequluli sakho asizange sithumele noma yisiphi isitifiketi",
 		"xh": "Ungqinisiso lusilele: ibhrawuza yakho ayithumelanga nasiphi na isatifikethi",
+		"st": "Netefatso e hlolehile: sebadi sa hao ha se a romela setifikeiti sa letho",
 		"ca": "Ha fallat l’autenticació: el navegador no ha enviat cap certificat"
 	},
 	"title_INVALIDCERT": {
@@ -2413,6 +2478,7 @@
 		"el": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03cc",
 		"xh": "Isatifikethi esingasebenziyo",
 		"zu": "Isifiketi esingalungile",
+		"st": "Setifikeiti se sa nepahalang",
 		"ca": "Certificat no vàlid"
 	},
 	"descr_INVALIDCERT": {
@@ -2448,6 +2514,7 @@
 		"el": "\u0397 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5: \u03a4\u03bf \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03cc \u03c0\u03bf\u03c5 \u03ad\u03c3\u03c4\u03b5\u03b9\u03bb\u03b5 \u03c4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03b9\u03c3\u03c4\u03bf\u03cd \u03c0\u03bf\u03c5 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b5 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03ae \u03b4\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03ae \u03c4\u03bf\u03c5.",
 		"xh": "Ungqinisiso lusilele: isatifikethi esithunyelwe yibhrawuza yakho asisebenzi okanye asikwazi ukufundwa",
 		"zu": "Ukuqinisekisa kuhlulekile: isitifiketi esithunyelwe isiphequluli sakho asivumelekile noma asikwazi ukufundwa",
+		"st": "Netefatso e hlolehile: setifikeiti seo sebadi sa hao se se rometseng ha se a nepahala kapa ha se balehe",
 		"ca": "Ha fallat l’autenticació: el certificat que el navegador ha enviat no és vàlid o no es pot llegir"
 	},
 	"title_UNKNOWNCERT": {
@@ -2484,6 +2551,7 @@
 		"el": "\u0386\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03cc",
 		"zu": "Isitifiketi esingaziwa",
 		"xh": "Isatifikethi esingaziwayo",
+		"st": "Setifikeiti se sa tsejweng",
 		"ca": "Certificat desconegut"
 	},
 	"descr_UNKNOWNCERT": {
@@ -2519,6 +2587,7 @@
 		"el": "\u0397 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5: \u03a4\u03bf \u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03cc \u03c0\u03bf\u03c5 \u03ad\u03c3\u03c4\u03b5\u03b9\u03bb\u03b5 \u03c4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03b9\u03c3\u03c4\u03bf\u03cd \u03c0\u03bf\u03c5 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b5 \u03b4\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03bd\u03b1 \u03b1\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03b9\u03c3\u03c4\u03b5\u03af.",
 		"zu": "Ukuqinisekisa kuhlulekile: isitifiketi esithunyelwe isiphequluli sakho asaziwa",
 		"xh": "Ungqinisiso lusilele: isatifikerthi esithunyelwe yibhrawuza yakho asaziwa",
+		"st": "Netefatso e hlolehile: setifikeiti se rometsweng ke sebadi sa hao ha se tsejwe",
 		"ca": "Ha fallat l’autenticació: el certificat que el navegador ha enviat és desconegut"
 	},
 	"title_USERABORTED": {
@@ -2554,6 +2623,7 @@
 		"el": "\u0397 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03bc\u03b1\u03c4\u03b1\u03b9\u03ce\u03b8\u03b7\u03ba\u03b5",
 		"zu": "Ukuqinisekisa kuyekisiwe",
 		"xh": "Ungqinisiso luyekiwe",
+		"st": "Netefatso e kgaoditswe",
 		"ca": "S'ha avortat l’autenticació"
 	},
 	"descr_USERABORTED": {
@@ -2589,6 +2659,7 @@
 		"el": "\u0397 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03bc\u03b1\u03c4\u03b1\u03b9\u03ce\u03b8\u03b7\u03ba\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7.",
 		"zu": "Ukuqinisekisa kuyekiswe umsebenzisi",
 		"xh": "Ungqinisiso luyekiswe ngumsebenzisi",
+		"st": "Netefatso e kgaoditswe ke mosebedisi",
 		"ca": "L’usuari ha cancel·lat l’autenticació"
 	},
 	"title_NOSTATE": {
@@ -2624,6 +2695,7 @@
 		"el": "\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03b9\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2",
 		"xh": "Inkcazelo yobume ilahlekile",
 		"zu": "Ulwazi lwesifunda lulahlekile",
+		"st": "Tlhahisoleseding ya provense e lahlehile",
 		"ca": "Informació d'estat perduda"
 	},
 	"descr_NOSTATE": {
@@ -2659,6 +2731,7 @@
 		"el": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03bd\u03b1 \u03b5\u03be\u03c5\u03c0\u03b7\u03c1\u03b5\u03c4\u03b7\u03b8\u03b5\u03af \u03c4\u03bf \u03b1\u03af\u03c4\u03b7\u03bc\u03ac \u03c3\u03b1\u03c2 \u03ba\u03b1\u03b8\u03ce\u03c2 \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03ae \u03c4\u03bf\u03c5",
 		"xh": "Inkcazelo yobume ilahlekile, yaye akukho ndlela yokuqalisa isicelo",
 		"zu": "Ulwazi lwesifunda lulahlekile, futhi ayikho indlela yokuqala kabusha isicelo",
+		"st": "Tlhahisoleeding ya porofensi e lahlehile, mmeha ho tsela ya ho qala kopo botjha",
 		"ca": "Infomració d'estat perduda, i no hi ha cap manera de reiniciar la sol·licitud"
 	},
 	"title_METADATANOTFOUND": {
@@ -2694,6 +2767,7 @@
 		"el": "\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03bc\u03b5\u03c4\u03b1\u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1",
 		"zu": "Imethadatha ayitholakalanga",
 		"xh": "Imetadata ayifunyenwanga",
+		"st": "Metadata ha e a fumanwa",
 		"ca": "Metadades no trobades"
 	},
 	"descr_METADATANOTFOUND": {
@@ -2729,6 +2803,7 @@
 		"el": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03bd\u03b1 \u03b2\u03c1\u03b5\u03b8\u03bf\u03cd\u03bd \u03bc\u03b5\u03c4\u03b1\u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03bf\u03bd\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1 %ENTITYID%",
 		"xh": "Ayikwazi ukufumana iimpawu-ngcaciso zefayile ze-%ENTITYID%",
 		"zu": "Ayikwazi ukuthola imethadatha yokuthi %ENTITYID%",
+		"st": "Ha e kgone ho fumana metadata bakeng sa %ID YA SETHEO%",
 		"ca": "No es poden localitzar les metadades per a %ENTITYID%"
 	},
 	"title_AUTHSOURCEERROR": {
@@ -2764,6 +2839,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03bc\u03b5 \u03c4\u03b7\u03bd \u03c0\u03b7\u03b3\u03ae \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2",
 		"zu": "Iphutha lomthombo wokuqinisekisa",
 		"xh": "Impazamo yomthombo wongqinisiso",
+		"st": "Phoso ya netefatso ya mohlodi",
 		"ca": "Error en l’autenticació d'origen"
 	},
 	"descr_AUTHSOURCEERROR": {
@@ -2799,6 +2875,7 @@
 		"el": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1 \u03bc\u03b5 \u03c4\u03b7\u03bd \u03c0\u03b7\u03b3\u03ae \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 %AUTHSOURCE%: %REASON%",
 		"zu": "Iphutha lokuqinisekisa kumthombo othi %AUTHSOURCE%. Isizathu besithi: %REASON%",
 		"xh": "Impazamo yongqinisiso kumthombo %AUTHSOURCE%. Isizathu sesi: %REASON%",
+		"st": "Phoso ya tiiso mohloding %AUTHSOURCE%. Lebaka e bile: %REASON%",
 		"ca": "Error en l’autenticació d'origen %AUTHSOURCE%. El motiu és: %REASON%"
 	},
 	"title_MEMCACHEDOWN": {
@@ -2806,6 +2883,7 @@
 		"el": "\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b1\u03bd\u03ac\u03ba\u03c4\u03b7\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c3\u03c5\u03bd\u03b5\u03b4\u03c1\u03af\u03b1\u03c2",
 		"xh": "Ayikwazi ukubuyisela ingcombolo yeseshoni",
 		"zu": "Ayikwazi ukubuyisela idatha yeseshini",
+		"st": "Ha e a kgona ho fumana datha ya seshene",
 		"ca": "No es poden recuperar les dades de la sessió"
 	},
 	"descr_MEMCACHEDOWN": {
@@ -2813,6 +2891,7 @@
 		"el": "\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b1\u03bd\u03ac\u03ba\u03c4\u03b7\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c3\u03c5\u03bd\u03b5\u03b4\u03c1\u03af\u03b1\u03c2 \u03bb\u03cc\u03b3\u03c9 \u03c4\u03b5\u03c7\u03bd\u03b9\u03ba\u03ce\u03bd \u03b4\u03c5\u03c3\u03ba\u03bf\u03bb\u03b9\u03ce\u03bd. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac \u03b1\u03c1\u03b3\u03cc\u03c4\u03b5\u03c1\u03b1",
 		"zu": "Idatha yeseshini yakho ayikwazi ukubuyiswa njengamanje ngenxa yezinkinga zobuchwepheshe. Sicela uzame futhi emizuzwini embalwa.",
 		"xh": "Ingcombolo yeseshoni yakho ayikwazi ukubuyiselwa okwangoku ngenxa yeengxaki zobugcisa. Nceda uzame kwakhona kwimizuzu embalwa.",
+		"st": "Datha ya seshene ya hao ha e kgone ho fumanwa hona jwale ka lebaka la mathata a sethekeniki. Ka kopo leka hape kamora metsotso e mmalwa.",
 		"ca": "Les vostres dades de sessió no es poden recuperar ara mateix a causa de dificultats tècniques. Torneu-ho a provar d'aquí a uns minuts."
 	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/dictionaries/general.translation.json b/vendor/simplesamlphp/simplesamlphp/dictionaries/general.translation.json
index e8cb0c1a1cf284320e865ccd4e21b8069ddac0aa..f5e2503718841c0761f614bf4c718b89f6c62b52 100644
--- a/vendor/simplesamlphp/simplesamlphp/dictionaries/general.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/dictionaries/general.translation.json
@@ -36,6 +36,7 @@
     "el": "\u039d\u03b1\u03af",
     "zu": "Yebo",
     "xh": "Ewe",
+    "st": "E",
     "ca": "Sí"
   },
   "no": {
@@ -75,6 +76,7 @@
     "el": "\u038c\u03c7\u03b9",
     "xh": "Hayi",
     "zu": "Cha",
+    "st": "Tjhe",
     "ca": "No"
   },
   "remember": {
@@ -114,6 +116,7 @@
     "el": "\u039d\u03b1 \u03b8\u03c5\u03bc\u03ac\u03c3\u03b1\u03b9 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03bc\u03bf\u03c5",
     "zu": "Khumbula",
     "xh": "Khumbula",
+    "st": "Hopola",
     "ca": "Recorda"
   },
   "yes_continue": {
@@ -153,6 +156,7 @@
     "el": "\u0391\u03c0\u03bf\u03b4\u03bf\u03c7\u03ae",
     "xh": "Ewe, qhubeka",
     "zu": "Yebo, qhubeka",
+    "st": "E, tswela pele",
     "ca": "Sí, continua"
   },
   "no_cancel": {
@@ -192,6 +196,7 @@
     "el": "\u0391\u03c0\u03cc\u03c1\u03c1\u03b9\u03c8\u03b7",
     "xh": "Hayi, rhoxisa",
     "zu": "Cha, khansela",
+    "st": "Tjhe, hlakola",
     "ca": "No, cancel·la"
   },
   "service_provider": {
@@ -231,6 +236,7 @@
     "el": "\u03a0\u03ac\u03c1\u03bf\u03c7\u03bf\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1\u03c2",
     "xh": "Umboneleli Wenkonzo",
     "zu": "Umhlinzeki Wesevisi",
+    "st": "Mofani wa Tshebeletso",
     "ca": "Proveïdor de servei"
   }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/dictionaries/login.translation.json b/vendor/simplesamlphp/simplesamlphp/dictionaries/login.translation.json
index 59cf9c861e984b485ad678242858783cb02caa1b..186e4671a3e478838dcd928eaa64583fc460e7eb 100644
--- a/vendor/simplesamlphp/simplesamlphp/dictionaries/login.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/dictionaries/login.translation.json
@@ -36,6 +36,7 @@
 		"el": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1",
 		"zu": "Iphutha",
 		"xh": "Impazamo",
+		"st": "Phoso",
 		"ca": "Error"
 	},
 	"user_pass_header": {
@@ -75,6 +76,7 @@
 		"af": "Voer jou gebruikersnaam en wagwoord in",
 		"el": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ba\u03b1\u03b9 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
 		"zu": "Faka igama lakho lomsebenzisi nephasiwedi",
+		"st": "Kenya lebitso la mosebedisi le phasewete",
 		"ca": "Introduïu el vostre nom d’usuari i contrasenya"
 	},
 	"user_pass_text": {
@@ -114,6 +116,7 @@
 		"el": "\u039c\u03b9\u03b1 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03b6\u03b7\u03c4\u03ae\u03c3\u03b5\u03b9 \u03c4\u03b7\u03bd \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03ae \u03c3\u03b1\u03c2. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03ae\u03c2 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03b7\u03bd \u03c0\u03b1\u03c1\u03b1\u03ba\u03ac\u03c4\u03c9 \u03c6\u03cc\u03c1\u03bc\u03b1.",
 		"zu": "Isevisi icele ukuthi uziqinisekise. Sicela ufake igama lakho lomsebenzisi nephasiwedi ngohlobo olungezansi.",
 		"xh": "Inkonzo icele ukuba uzingqinisise. Nceda ungenise igama lomsebenzisi nephaswedi yakho kwifomu ngezantsi.",
+		"st": "Tshebeletso  e kopile hore o inetefatse. Ka kopo kenya lebitso la mosebedisi le phasewete ya hao foromong e ka tlase mona.",
 		"ca": "Un servei us ha demanat autenticar-vos. Introduïu el vostre nom d’usuari i contrasenya en el formulari següent."
 	},
 	"login_button": {
@@ -154,6 +157,7 @@
 		"af": "Meld aan",
 		"el": "\u0395\u03af\u03c3\u03bf\u03b4\u03bf\u03c2",
 		"zu": "Ngena",
+		"st": "Ho kena",
 		"ca": "Inicia la sessió"
 	},
 	"processing": {
@@ -162,6 +166,7 @@
 		"zh-tw": "\u8655\u7406\u4e2d...",
 		"zu": "Iyacubungula...",
 		"xh": "Iyaprosesa...",
+		"st": "E a sebetsa...",
 		"ca": "Processant.."
 	},
 	"username": {
@@ -202,6 +207,7 @@
 		"af": "Gebruikersnaam",
 		"el": "\u038c\u03bd\u03bf\u03bc\u03b1 \u03a7\u03c1\u03ae\u03c3\u03c4\u03b7",
 		"zu": "Igama lomsebenzisi",
+		"st": "Lebitso la mosebedisi",
 		"ca": "Nom d'usuari"
 	},
 	"organization": {
@@ -242,6 +248,7 @@
 		"af": "Organisasie",
 		"el": "\u039f\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03cc\u03c2",
 		"zu": "Inhlangano",
+		"st": "Khampani",
 		"ca": "Organització"
 	},
 	"password": {
@@ -282,6 +289,7 @@
 		"af": "Wagwoord",
 		"el": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2",
 		"zu": "Iphasiwedi",
+		"st": "Phasewete",
 		"ca": "Contrasenya"
 	},
 	"help_header": {
@@ -321,6 +329,7 @@
 		"el": "\u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1! \u0394\u03b5 \u03b8\u03c5\u03bc\u03ac\u03bc\u03b1\u03b9 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03bc\u03bf\u03c5.",
 		"zu": "Siza! Angiyikhumbuli iphasiwedi yami.",
 		"xh": "Ncedani! Andiyikhumbuli iphaswedi yam.",
+		"st": "Thuso! Ha ke hopole phasewete ya ka.",
 		"ca": "Ajuda! No recordo la meva contrasenya."
 	},
 	"help_text": {
@@ -360,6 +369,7 @@
 		"el": "\u039b\u03c5\u03c0\u03bf\u03cd\u03bc\u03b1\u03c3\u03c4\u03b5. \u03a7\u03c9\u03c1\u03af\u03c2 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c3\u03b1\u03c2, \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03b8\u03b5\u03af\u03c4\u03b5 \u03ce\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03c0\u03bf\u03ba\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1. \u03a3\u03c5\u03bc\u03b2\u03bf\u03c5\u03bb\u03b5\u03c5\u03c4\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 \u03b1\u03c1\u03c9\u03b3\u03ae\u03c2 \u03c7\u03c1\u03b7\u03c3\u03c4\u03ce\u03bd \u0028\u0068\u0065\u006c\u0070 \u0064\u0065\u0073\u006b\u0029 \u03c4\u03bf\u03c5 \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd \u03c3\u03b1\u03c2.",
 		"xh": "Ngaphandle kwegama lomsebenzisi nephaswedi yakho awukwazi ukuzingqinisisa ukuze ufumane ufikelelo kwinkonzo. Kusenokuba ukho umntu onokukunceda. Qhagamshelana nedesika yoncedo kumbutho wakho!",
 		"zu": "Ngaphandle kwegama lakho lomsebenzisi nephasiwedi awukwazi ukuziqinisekisa ukuze ufinyelele isevisi. Kungase kube khona ozokusiza. Thinta ideski losizo enhlanganweni yakho!",
+		"st": "Ntle le lebitso l ahao la mosebedisi le phasewete o ke ke wa inetefatsa bakeng sa phihlello ho tshebeletso. Ho ka nna ha ba le motho ya ka o thusang. Ikopanye le ba deske ya thuso khampaning ya heno!",
 		"ca": "Sense el vostre nom d'usuari i contrasenya, no podeu autenticar-vos per accedir al servei. Pot ser que algú us pugui ajudar. Poseu-vos en contacte amb el centre d'atenció a l'usuari"
 	},
 	"error_nopassword": {
@@ -399,6 +409,7 @@
 		"el": "\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b4\u03b5\u03bd \u03b5\u03c3\u03c4\u03ac\u03bb\u03b7. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce, \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03ae\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac.",
 		"zu": "Uthumele okuthile ekhasini lokungena, kodwa ngasizathu simbe iphasiwedi ayizange ithunyelwe. Sicela uzame futhi.",
 		"xh": "Uthumele into kwikhasi lokungena, kodwa ngesizathu esithile iphaswedi ayithunyelwanga. Nceda uzame kwakhona.",
+		"st": "o Rometse se seng leqepheng la ho kena, empa ka lebaka le sa tsejweng phaewete ha e a romelwa. Ka kopo leka hape.",
 		"ca": "Heu enviat alguna cosa a la pàgina d’inici de sessió, però per alguna raó la contrasenya no s’ha enviat. Torneu-ho a provar."
 	},
 	"error_wrongpassword": {
@@ -439,6 +450,7 @@
 		"af": "Verkeerde gebruikersnaam of wagwoord.",
 		"el": "\u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ae \u03bf \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03bb\u03ac\u03b8\u03bf\u03c2.",
 		"zu": "Igama lomsebenzisi noma iphasiwedi engalungile.",
+		"st": "Lebitso la mosebedisi kapa phasewete e fosahetse.",
 		"ca": "Nom d'usuari o contrasenya incorrecta."
 	},
 	"contact_info": {
@@ -477,6 +489,7 @@
 		"el": "\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1\u03c2:",
 		"zu": "Ulwazi lokuxhumana:",
 		"xh": "Inkcazelo yoqhagamshelwano:",
+		"st": "Tlhahisoleseding ya boikopanyo:",
 		"ca": "Informació de contacte:"
 	},
 	"select_home_org": {
@@ -515,6 +528,7 @@
 		"el": "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c5 \u03c6\u03bf\u03c1\u03ad\u03b1",
 		"xh": "Khetha umbutho wakho wekhaya",
 		"zu": "Khetha inhlangano yakho yasekhaya",
+		"st": "Kgetha khampani ya lehae ya hao",
 		"ca": "Trieu la vostra organització principal"
 	},
 	"change_home_org_title": {
@@ -553,6 +567,7 @@
 		"el": "\u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c5 \u03c6\u03bf\u03c1\u03ad\u03b1",
 		"xh": "Tshintsha umbutho wakho wekhaya",
 		"zu": "Shintsha inhlangano yakho yasekhaya",
+		"st": "Fetola khampani ya lehae ya heno",
 		"ca": "Canvieu la vostra organització principal"
 	},
 	"change_home_org_text": {
@@ -591,6 +606,7 @@
 		"el": "\u0395\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf\u03c2 \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c2 \u03c6\u03bf\u03c1\u03ad\u03b1\u03c2: <b>%HOMEORG%<\/b>.",
 		"zu": "Ukhethe okuthi <b>%HOMEORG%</b> njengenhlangano yakho yasekhaya. Uma lokhu kungalungile ungase ukhethe enye.",
 		"xh": "Uye wakhetha u-<b>%HOMEORG%</b> njengombutho wakho wekhaya. Ukuba oku akuchanekanga usenokukhetha omnye.",
+		"st": "O kgethile <b>%HOMEORG%</b> jwalo ka khampani ya lehae ya heno. Haeba sena se fosahetse o ka kgetha e nngwe hape.",
 		"ca": "Heu triat <b>%HOMEORG%<\/b> com la vostra organització principal. Si això no és correcte, podeu triar-ne una altra."
 	},
 	"change_home_org_button": {
@@ -629,6 +645,7 @@
 		"el": "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03bf\u03b9\u03ba\u03b5\u03af\u03bf\u03c5 \u03c6\u03bf\u03c1\u03ad\u03b1",
 		"xh": "Khetha umbutho wekhaya",
 		"zu": "Khetha inhlangano yasekhaya",
+		"st": "Kgetha khampani ya lehae",
 		"ca": "Escull la teva organització principal"
 	},
 	"help_desk_link": {
@@ -667,6 +684,7 @@
 		"el": "\u03a3\u03b5\u03bb\u03af\u03b4\u03b1 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1\u03c2 \u03b1\u03c1\u03c9\u03b3\u03ae\u03c2 \u03c7\u03c1\u03b7\u03c3\u03c4\u03ce\u03bd",
 		"zu": "Ikhasi lasekhaya ledeski losizo",
 		"xh": "Ikhasi lekhaya ledesika yoncedo",
+		"st": "Leqephe la lapeng la ba deske ya thuso",
 		"ca": "Pàgina d'inici del centre d'atenció a l'usuari"
 	},
 	"help_desk_email": {
@@ -705,6 +723,7 @@
 		"el": "\u0391\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u0065\u006d\u0061\u0069\u006c \u03c3\u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 \u03b1\u03c1\u03c9\u03b3\u03ae\u03c2 \u03c7\u03c1\u03b7\u03c3\u03c4\u03ce\u03bd",
 		"xh": "Thumela i-imeyile kwidesika yoncedo",
 		"zu": "Thumela i-imeyili edeskini losizo",
+		"st": "Romela imeile ho ba deske ya thuso",
 		"ca": "Envia un correu electrònic el centre d'atenció a l'usuari"
 	},
 	"next": {
@@ -743,11 +762,12 @@
 		"af": "Volgende",
 		"el": "\u0395\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf",
 		"zu": "Okulandelayo",
+		"st": "E latelang",
 		"ca": "Següent"
 	},
 	"remember_username": {
 		"es": "Recordar mi nombre de usuario",
-        "de": "Nutzername merken",
+		"de": "Nutzername merken",
 		"hu": "Eml\u00e9kezzen a felhaszn\u00e1l\u00f3nevemre",
 		"ru": "\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043c\u043e\u0451 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
 		"zh-tw": "\u8a18\u4f4f\u6211\u7684\u4f7f\u7528\u8005\u540d\u7a31",
@@ -758,12 +778,13 @@
 		"el": "\u039d\u03b1 \u03b8\u03c5\u03bc\u03ac\u03c3\u03b1\u03b9 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7",
 		"zu": "Khumbula igama lami lomsebenzisi",
 		"xh": "Khumbula igama lomsebenzisi lam",
+		"st": "Hopola lebitso la ka la mosebedisi",
 		"sl": "Zapomni si moje uporabniško ime",
 		"ca": "Recorda el meu nom d’usuari"
 	},
 	"remember_me": {
 		"es": "Recordarme",
-        "de": "Angemeldet bleiben",
+		"de": "Angemeldet bleiben",
 		"hu": "Eml\u00e9kezzen r\u00e1m",
 		"ru": "\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043c\u0435\u043d\u044f",
 		"zh-tw": "\u8a18\u4f4f\u6211",
@@ -775,9 +796,10 @@
 		"xh": "Ndikhumbule",
 		"zu": "Ngikhumbule",
 		"sl": "Zapomni si me",
+		"st": "Nkgopole",
 		"ca": "Recorda'm"
 	},
 	"remember_organization": {
 		"ca": "Recorda la meva organització principal"
-    }
+	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/dictionaries/logout.definition.json b/vendor/simplesamlphp/simplesamlphp/dictionaries/logout.definition.json
index 2453ff2ff9a8f1d3995aea73e7d70a07060dd7a1..791db6be1b2d2dd9531b18e3999d3b61e69c47d8 100644
--- a/vendor/simplesamlphp/simplesamlphp/dictionaries/logout.definition.json
+++ b/vendor/simplesamlphp/simplesamlphp/dictionaries/logout.definition.json
@@ -42,7 +42,7 @@
 		"en": "No, only %SP%"
 	},
 	"incapablesps": {
-		"en": "One or more of the services you are logged into <i>do not support logout<\/i>. To ensure that all your sessions are closed, you are encouraged to <i>close your webbrowser<\/i>."
+		"en": "One or more of the services you are logged into <i>do not support logout<\/i>. To ensure that all your sessions are closed, you are encouraged to <i>close your web browser<\/i>."
 	},
 	"no": {
 		"en": "No"
@@ -51,6 +51,6 @@
 		"en": "Logging out of the following services:"
 	},
 	"failedsps": {
-		"en": "Unable to log out of one or more services. To ensure that all your sessions are closed, you are encouraged to <i>close your webbrowser<\/i>."
+		"en": "Unable to log out of one or more services. To ensure that all your sessions are closed, you are encouraged to <i>close your web browser<\/i>."
 	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/dictionaries/logout.translation.json b/vendor/simplesamlphp/simplesamlphp/dictionaries/logout.translation.json
index 9f25790e6c4db509f8e64a3bed51a90fa53f6f0b..0de84f7e3d4bbce454b0519c98e65817e375e579 100644
--- a/vendor/simplesamlphp/simplesamlphp/dictionaries/logout.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/dictionaries/logout.translation.json
@@ -35,6 +35,7 @@
 		"el": "\u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03c2/\u03b7",
 		"xh": "Uphumile",
 		"zu": "Uphume ngemvume",
+		"st": "O ntshitswe",
 		"ca": "Desconnectat"
 	},
 	"logged_out_text": {
@@ -73,6 +74,7 @@
 		"el": "\u0388\u03c7\u03b5\u03c4\u03b5 \u03b1\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af.",
 		"zu": "Usuphumile.",
 		"xh": "Uphumile.",
+		"st": "O ntshitswe.",
 		"ca": "Us heu desconnectat."
 	},
 	"default_link_text": {
@@ -111,6 +113,7 @@
 		"el": "\u0395\u03c0\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae \u03c3\u03c4\u03b7\u03bd \u03b1\u03c1\u03c7\u03b9\u03ba\u03ae \u03c3\u03b5\u03bb\u03af\u03b4\u03b1",
 		"xh": "Buyela emva kwikhasi lofakelo le-SimpleSAMLphp",
 		"zu": "Buyela emuva ekhasini lokufaka le-SimpleSAMLphp",
+		"st": "Kgutlela leqepheng la ho instola la SimpleSAMLphp",
 		"ca": "Torneu a la pàgina d’instal·lació de SimpleSAMLphp"
 	},
 	"hold": {
@@ -149,6 +152,7 @@
 		"el": "\u03a3\u03b5 \u03b1\u03bd\u03b1\u03bc\u03bf\u03bd\u03ae",
 		"xh": "Ibanjiwe",
 		"zu": "Imisiwe",
+		"st": "Tshwarisitswe",
 		"ca": "En espera"
 	},
 	"completed": {
@@ -187,6 +191,7 @@
 		"el": "\u039f\u03bb\u03bf\u03ba\u03bb\u03b7\u03c1\u03ce\u03b8\u03b7\u03ba\u03b5",
 		"xh": "Igqityiwe",
 		"zu": "Kuqedile",
+		"st": "E phethilwe",
 		"ca": "Completat"
 	},
 	"progress": {
@@ -225,6 +230,7 @@
 		"el": "\u0393\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03b1\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7...",
 		"zu": "Iyaphuma...",
 		"xh": "Iyaphuma...",
+		"st": "E a tswa...",
 		"ca": "Tancant la sessió..."
 	},
 	"failed": {
@@ -263,6 +269,7 @@
 		"el": "\u0397 \u03b1\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5",
 		"xh": "Ukuphuma kusilele",
 		"zu": "Ukuphuma kuhlulekile",
+		"st": "Ho tswa ho hlolehile",
 		"ca": "Ha fallat el tancament de sessió"
 	},
 	"return": {
@@ -301,6 +308,7 @@
 		"el": "\u0395\u03c0\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae \u03c3\u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1",
 		"xh": "Buyela kwinkonzo",
 		"zu": "Buyela kusevisi",
+		"st": "E kgutlela tshebeletsong",
 		"ca": "Tornar al servei"
 	},
 	"success": {
@@ -339,6 +347,7 @@
 		"el": "\u0388\u03c7\u03b5\u03c4\u03b5 \u03b1\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af \u03bc\u03b5 \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1 \u03b1\u03c0\u03cc \u03cc\u03bb\u03b5\u03c2 \u03c4\u03b9\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b5\u03c2 \u03c0\u03bf\u03c5 \u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03bf\u03bd\u03c4\u03b1\u03b9 \u03c0\u03b1\u03c1\u03b1\u03c0\u03ac\u03bd\u03c9.",
 		"xh": "Uphume ngokuyimpumelelo kuzo zonke iinkonzo ezidweliswe ngasentla.",
 		"zu": "Uphume ngempumelelo kuwo wonke amasevisi abhalwe ngenhla.",
+		"st": "O tswile ka katleho ditshebeletsong tsohle tse thathamisitsweng ka hodimo mona.",
 		"ca": "Heu sortit correctament de tots els serveis esmentats anteriorment."
 	},
 	"loggedoutfrom": {
@@ -377,6 +386,7 @@
 		"el": "\u0388\u03c7\u03b5\u03c4\u03b5 \u03b1\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af \u03bc\u03b5 \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 %SP%.",
 		"xh": "Ngoku uphume ngokuyimpumelelo kwi-%SP%.",
 		"zu": "Usuphume ngempumelelo kokuthi %SP%.",
+		"st": "Jwale o ntshitswe ka katleho ho %SP%.",
 		"ca": "S’ha tancat la sessió amb èxit de %SP%."
 	},
 	"also_from": {
@@ -415,6 +425,7 @@
 		"el": "\u0395\u03af\u03c3\u03c4\u03b5 \u03b5\u03c0\u03af\u03c3\u03b7\u03c2 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03c2 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03ad\u03c2 \u03c4\u03b9\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b5\u03c2:",
 		"zu": "Ungenile futhi kulawa masevisi:",
 		"xh": "Kananjalo ungene kwezi nkonzo:",
+		"st": "Hape o kene ditshebeletsong tsena:",
 		"ca": "També heu iniciat la sessió en aquests serveis:"
 	},
 	"logout_all_question": {
@@ -453,6 +464,7 @@
 		"el": "\u0395\u03c0\u03b9\u03b8\u03c5\u03bc\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03cc\u03bb\u03b5\u03c2 \u03c4\u03b9\u03c2 \u03c0\u03b1\u03c1\u03b1\u03c0\u03ac\u03bd\u03c9 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b5\u03c2\u003b",
 		"xh": "Ngaba ufuna ukuphuma kuzo zonke iinkonzo ezingasentla?",
 		"zu": "Ingabe ufuna ukuphuma kuwo wonke amasevisi angenhla?",
+		"st": "Na o batla ho tswa ditshebeletsong tsohle tse ka hodimo moo?",
 		"ca": "Voleu sortir de tots els serveis següents?"
 	},
 	"logout_all": {
@@ -491,6 +503,7 @@
 		"el": "\u039d\u03b1\u03b9, \u03cc\u03bb\u03b5\u03c2 \u03c4\u03b9\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b5\u03c2",
 		"zu": "Yebo, wonke amasevisi",
 		"xh": "Ewe, zonke iinkonzo",
+		"st": "E, ditshebeletso tsohle",
 		"ca": "Sí, tots els serveis"
 	},
 	"logout_only": {
@@ -529,6 +542,7 @@
 		"el": "\u038c\u03c7\u03b9, \u03bc\u03cc\u03bd\u03bf \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 %SP%",
 		"zu": "Cha, ku-%SP% kuphela",
 		"xh": "Hayi, kuphela %SP%",
+		"st": "Tjhe, %SP% feela",
 		"ca": "No, només %SP%"
 	},
 	"incapablesps": {
@@ -567,6 +581,7 @@
 		"el": "\u039c\u03af\u03b1 \u03ae \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b5\u03c2 \u03bc\u03b5 \u03c4\u03b9\u03c2 \u03bf\u03c0\u03bf\u03af\u03b5\u03c2 \u03b5\u03af\u03c3\u03c4\u03b5 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03c2\u002f\u03b7 \u03b4\u03b5\u03bd \u03c5\u03c0\u03bf\u03c3\u03c4\u03b7\u03c1\u03af\u03b6\u03bf\u03c5\u03bd \u03b1\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u002e \u0393\u03b9\u03b1 \u03c4\u03bf \u03ba\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03c3\u03c5\u03bd\u03b5\u03b4\u03c1\u03b9\u03ce\u03bd \u03c3\u03b1\u03c2 (sessions), \u03c3\u03b1\u03c2 \u03c3\u03c5\u03bd\u03b9\u03c3\u03c4\u03bf\u03cd\u03bc\u03b5 \u03bd\u03b1 <i>\u03ba\u03bb\u03b5\u03af\u03c3\u03b5\u03c4\u03b5<\/i> \u03c4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03bb\u03bf\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 (web browser).",
 		"zu": "Isevisi eyodwa noma ngaphezulu ongene kuyo <i>ayikusekeli ukuphuma</i>. Ukuze wenze isiqiniseko sokuthi wonke amaseshini akho avaliwe, ukhuthazwa ukuthi <i>uvale isiphequluli sakho sewebhu</i>.",
 		"xh": "Inkonzo enye okanye ezingakumbi ongeneyo kuzo <i>azikuxhasi ukuphuma</i>. Ukuqinisekisa zonke iiseshoni zakho zivaliwe, ukhuthazwa <i>uvale ibhrawuza yewebhu</i>.",
+		"st": "E le nngwe kapa ho feta ya ditshebeletso tseo o keneng ho tsona <i>ha e tshehetse ho tswa</i>. Ho netefatsa hore diseshene tsohle tsa hao di kwetswe, o kgothaletswa ho <i>kwala sebadi sa webo sa hao</i>.",
 		"ca": "Un o més dels serveis que heu accedit a <i>no admeten tancar la sessió<\/i>. Per assegurar-vos que totes les vostres sessions estan tancades, us animem a <i>tancar el vostre navegador web<\/i>."
 	},
 	"no": {
@@ -605,6 +620,7 @@
 		"el": "\u038c\u03c7\u03b9",
 		"xh": "Hayi",
 		"zu": "Cha",
+		"st": "Tjhe",
 		"ca": "No"
 	},
 	"logging_out_from": {
@@ -642,6 +658,7 @@
 		"el": "Γίνεται αποσύνδεση από τις ακόλουθες υπηρεσίες:",
 		"zu": "Iyaphuma kumasevisi alandelayo:",
 		"xh": "Iphuma kwezi nkonzo zilandelayo:",
+		"st": "E tswa ditshebeletsong tse latelang:",
 		"ca": "Sortida dels serveis següents:"
 	},
 	"failedsps": {
@@ -678,6 +695,7 @@
 		"el": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b1\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b1\u03c0\u03cc \u03bc\u03af\u03b1 \u03ae \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b5\u03c2\u002e \u0393\u03b9\u03b1 \u03c4\u03bf \u03ba\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03c3\u03c5\u03bd\u03b5\u03b4\u03c1\u03b9\u03ce\u03bd \u03c3\u03b1\u03c2 (sessions), \u03c3\u03b1\u03c2 \u03c3\u03c5\u03bd\u03b9\u03c3\u03c4\u03bf\u03cd\u03bc\u03b5 \u03bd\u03b1 <i>\u03ba\u03bb\u03b5\u03af\u03c3\u03b5\u03c4\u03b5<\/i> \u03c4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03bb\u03bf\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 (web browser).",
 		"xh": "Awukwazi ukuphuma kwinkonzo enye okanye ezingakumbi. Ukuqinisekisa zonke iiseshoni zakho zivaliwe, ukhuthazwa <i>uvale ibhrawuza yewebhu</i>.",
 		"zu": "Ayikwazi ukuphuma kusevisi eyodwa noma ngaphezulu. Ukuze wenze isiqiniseko sokuthi wonke amaseshini akho avaliwe, ukhuthazwa ukuthi <i>uvale isiphequluli sakho sewebhu</i>.",
+		"st": "Ha e kgone ho tswa tshebeletsong e le nngwe kapa ho feta. Ho netefatsa hore diseshene tsohle tsa hao di kwetswe, o kgothaletswa ho <i>kwala sebadi sa webo sa hao</i>.",
 		"ca": "No es pot tancar la sessió d'un o més serveis. Per assegurar-vos que totes les vostres sessions estan tancades, us animem a <i>tancar el vostre navegador web<\/i>."
 	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/dictionaries/status.translation.json b/vendor/simplesamlphp/simplesamlphp/dictionaries/status.translation.json
index 7b558557edbd077bb3a74792b73ae93e474b7212..e50fcc8926ab5d203ff1670f5680dead67e4049e 100644
--- a/vendor/simplesamlphp/simplesamlphp/dictionaries/status.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/dictionaries/status.translation.json
@@ -34,6 +34,7 @@
 		"el": "\u0394\u03bf\u03ba\u03b9\u03bc\u03b1\u03c3\u03c4\u03b9\u03ba\u03cc\u03c2 \u03a0\u03b1\u03c1\u03bf\u03c7\u03ad\u03b1\u03c2 \u03a5\u03c0\u03b7\u03c1\u03b5\u03c3\u03b9\u03ce\u03bd SAML 2.0",
 		"zu": "Isampula Ledemo Ye-SAML 2.0 SP",
 		"xh": "Umzekelo weDemo we-SAML 2.0 SP",
+		"st": "Mohlala wa Pontsho wa SAML 2.0 SP",
 		"ca": "Exemple de demostració SAML 2.0 SP"
 	},
 	"header_shib": {
@@ -71,6 +72,7 @@
 		"el": "\u0394\u03bf\u03ba\u03b9\u03bc\u03b1\u03c3\u03c4\u03b9\u03ba\u03cc\u03c2 \u03a0\u03b1\u03c1\u03bf\u03c7\u03ad\u03b1\u03c2 \u03a5\u03c0\u03b7\u03c1\u03b5\u03c3\u03b9\u03ce\u03bd Shibboleth",
 		"xh": "Idemo ye-Shibboleth",
 		"zu": "Idemo ye-Shibboleth",
+		"st": "Pontsho ya Shibboleth",
 		"ca": "Exemple de demostració Shibboleth"
 	},
 	"header_diagnostics": {
@@ -108,6 +110,7 @@
 		"el": "\u0394\u03b9\u03b1\u03b3\u03bd\u03c9\u03c3\u03c4\u03b9\u03ba\u03ac SimpleSAMLphp",
 		"zu": "Ukuhlonzwa Kwe-SimpleSAMLphp",
 		"xh": "Uhlalutyo lwe-SimpleSAMLphp",
+		"st": "Dimanollo tsa SimpleSAMLphp",
 		"ca": "Diagnòstic SimpleSAMLphp"
 	},
 	"some_error_occurred": {
@@ -145,6 +148,7 @@
 		"el": "\u03a3\u03c5\u03bd\u03ad\u03b2\u03b7 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1",
 		"zu": "Kuvele iphutha elithile",
 		"xh": "Kwenzeke impazamo ethile",
+		"st": "Ho na le phoso e etsahetseng",
 		"ca": "S'ha produït un error"
 	},
 	"intro": {
@@ -182,6 +186,7 @@
 		"el": "\u03a7\u03b1\u03af\u03c1\u03b5\u03c4\u03b5, \u03b1\u03c5\u03c4\u03ae \u03b5\u03af\u03bd\u03b1\u03b9 \u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 SimpleSAMLphp. \u0395\u03b4\u03ce \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b5\u03af\u03c4\u03b5 \u03b1\u03bd \u03b7 \u03c3\u03c5\u03bd\u03b5\u03b4\u03c1\u03af\u03b1 \u03c3\u03b1\u03c2 \u0028\u0073\u0065\u0073\u0073\u0069\u006f\u006e\u0029 \u03ad\u03c7\u03b5\u03b9 \u03bb\u03ae\u03be\u03b5\u03b9\u002c \u03c4\u03bf \u03c7\u03c1\u03bf\u03bd\u03b9\u03ba\u03cc \u03b4\u03b9\u03ac\u03c3\u03c4\u03b7\u03bc\u03b1 \u03c0\u03bf\u03c5 \u03b4\u03b9\u03b1\u03c1\u03ba\u03b5\u03af \u03ad\u03c9\u03c2 \u03cc\u03c4\u03bf\u03c5 \u03bb\u03ae\u03be\u03b5\u03b9\u002c \u03ba\u03b1\u03b8\u03ce\u03c2 \u03ba\u03b1\u03b9 \u03cc\u03bb\u03b5\u03c2 \u03c4\u03b9\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03c0\u03bf\u03c5 \u03c3\u03c5\u03bd\u03b4\u03ad\u03bf\u03bd\u03c4\u03b1\u03b9 \u03bc\u03b5 \u03c4\u03b7 \u03c3\u03c5\u03bd\u03b5\u03b4\u03c1\u03af\u03b1 \u03c3\u03b1\u03c2.",
 		"zu": "Sawubona, leli ikhasi lesimo se-SimpleSAMLphp. Lapha ungakwazi ukubona ukuthi iseshini yakho iphelelwe isikhathi yini, ukuthi ihlala isikhathi eside kangakanani ngaphambi kokuthi iphelelwe isikhathi kanye nazo zonke izici ezihambisana neseshini yakho.",
 		"xh": "Molo, eli likhasi lobume be-SimpleSAMLphp. Apha ungabona ukuba ngaba iseshoni yakho iphelelwe lixesha, iza kuhlala ixesha elide kangakanani ngaphambi kokuba iphelelwe nazo zonke iimpawu ezincanyathiselweyo kwiseshoni yakho.",
+		"st": "Dumela, lena ke leqephe la boemo la SimpleSAMLphp. Mona o ka bona hore na seshene ya hao e feletswe ke nako na, hore e nka nako e kae hore e fellwe ke nako le makgabane ohle a hoketsweng sesheneng ya hao.",
 		"ca": "Hola, aquesta és la pàgina d'estat de SimpleSAMLphp. Aquí podeu veure si la vostra sessió ha caducat, quant de temps dura fins que finalitza el temps i tots els atributs que s'adjunten a la vostra sessió."
 	},
 	"validfor": {
@@ -219,6 +224,7 @@
 		"el": "\u0391\u03c0\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5\u03bd %SECONDS% \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03c4\u03b7 \u03bb\u03ae\u03be\u03b7 \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bd\u03b5\u03b4\u03c1\u03af\u03b1\u03c2 \u03c3\u03b1\u03c2.",
 		"xh": "Iseshoni yakho iza kusebenza kangangemizuzu e-%SECONDS% ukususela ngoku.",
 		"zu": "Iseshini yakho isebenza imizuzwana engu-%SECONDS% ukusuka manje.",
+		"st": "Seshene ya hao e na le matla feela bakeng sa metsotswana e %SECONDS% ho tloha hona jwale.",
 		"ca": "La vostra sessió és vàlida durant %SECONDS% segons des d’ara."
 	},
 	"sessionsize": {
@@ -256,6 +262,7 @@
 		"el": "\u039c\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u03c3\u03c5\u03bd\u03b5\u03b4\u03c1\u03af\u03b1\u03c2: %SIZE%",
 		"xh": "Ubukhulu beseshoni: %SIZE%",
 		"zu": "Usayizi weseshini: %SIZE%",
+		"st": "Saese ya seshene: %SIZE%",
 		"ca": "Mida de la sessió: %SIZE%"
 	},
 	"attributes_header": {
@@ -293,6 +300,7 @@
 		"el": "\u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2",
 		"zu": "Izici zakho",
 		"xh": "Iimpawu zakho",
+		"st": "Makgabane a hao",
 		"ca": "Els teus atributs"
 	},
 	"logout": {
@@ -330,6 +338,7 @@
 		"el": "\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7",
 		"xh": "Phuma",
 		"zu": "Phuma",
+		"st": "Ho tswa",
 		"ca": "Tancar sessió"
 	},
 	"subject_header": {
@@ -341,6 +350,7 @@
 		"el": "\u03a5\u03c0\u03bf\u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03bf (subject) SAML",
 		"zu": "Isihloko Se-SAML",
 		"xh": "Umbandela we-SAML",
+		"st": "Taba ya SAML",
 		"ca": "Assumpte SAML"
 	},
 	"subject_notset": {
@@ -352,6 +362,7 @@
 		"el": "\u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03bf\u03c1\u03b9\u03c3\u03c4\u03b5\u03af",
 		"xh": "ayikasetwa",
 		"zu": "akusethiwe",
+		"st": "ha e a setwa",
 		"ca": "no establert"
 	},
 	"subject_format": {
@@ -363,16 +374,19 @@
 		"el": "\u039c\u03bf\u03c1\u03c6\u03ae (format)",
 		"zu": "Ifomethi",
 		"xh": "Ufomatho",
+		"st": "Fomata",
 		"ca": "Format"
 	},
 	"authData_header": {
 		"xh": "Ungqinisiso lweNgcombolo",
 		"zu": "I-AuthData",
+		"st": "AuthData",
 		"ca": "AuthData"
 	},
 	"authData_summary": {
 		"xh": "Cofa ukuze ubone uNgqinisiso lweNgcombolo",
 		"zu": "Qhafaza ukuze ubuke i-AuthData",
+		"st": "Tlelika ho sheba AuthData",
 		"ca": "Feu clic per veure AuthData"
 	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/conf.py b/vendor/simplesamlphp/simplesamlphp/docs/conf.py
new file mode 100644
index 0000000000000000000000000000000000000000..4c1a98986540e9689d769d9d014e41fa1eaf6082
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/docs/conf.py
@@ -0,0 +1,7 @@
+import sphinx_rtd_theme
+
+extensions = [
+    'sphinx_rtd_theme',
+]
+
+html_theme = "sphinx_rtd_theme"
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/index.md b/vendor/simplesamlphp/simplesamlphp/docs/index.md
index 995e952477213e1183ccd2932e58c22a0d071a4c..a8328d31d6283d62c5bc10d961bfca2df67bdd03 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/index.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/index.md
@@ -1,33 +1,23 @@
 SimpleSAMLphp Documentation
 ===========================
 
- * [Installing SimpleSAMLphp](simplesamlphp-install)
-    * [Upgrade notes for version 1.18](simplesamlphp-upgrade-notes-1.18)
-    * [Upgrade notes for version 1.17](simplesamlphp-upgrade-notes-1.17)
-    * [Upgrade notes for version 1.16](simplesamlphp-upgrade-notes-1.16)
-    * [Upgrade notes for version 1.15](simplesamlphp-upgrade-notes-1.15)
-    * [Upgrade notes for version 1.14](simplesamlphp-upgrade-notes-1.14)
-    * [Upgrade notes for version 1.13](simplesamlphp-upgrade-notes-1.13)
-    * [Upgrade notes for version 1.12](simplesamlphp-upgrade-notes-1.12)
-    * [Upgrade notes for version 1.11](simplesamlphp-upgrade-notes-1.11)
-    * [Upgrade notes for version 1.10](simplesamlphp-upgrade-notes-1.10)
-    * [Upgrade notes for version 1.9](simplesamlphp-upgrade-notes-1.9)
-    * [Upgrade notes for version 1.8](simplesamlphp-upgrade-notes-1.8)
-    * [Upgrade notes for version 1.7](simplesamlphp-upgrade-notes-1.7)
-    * [Upgrade notes for version 1.6](simplesamlphp-upgrade-notes-1.6)
-    * [Upgrade notes for version 1.5](simplesamlphp-upgrade-notes-1.5)
-    * [Installation from the repository](simplesamlphp-install-repo)
-    * [Changelog](simplesamlphp-changelog)
- * [Using SimpleSAMLphp as a SAML Service Provider](simplesamlphp-sp)
+ * Installation and upgrading
+  * [Installing SimpleSAMLphp](simplesamlphp-install)
+  * [Upgrade notes](simplesamlphp-upgrade-notes)
+  * [Installation from the repository](simplesamlphp-install-repo)
+  * [Changelog](simplesamlphp-changelog)
+ * Using SimpleSAMLphp as a SAML Service Provider
+  * [Service Provider Quickstart](simplesamlphp-sp)
   * [Hosted SP Configuration Reference](./saml:sp)
   * [IdP remote reference](simplesamlphp-reference-idp-remote)
   * [Configuring HTTP-Artifact](./simplesamlphp-artifact-sp)
   * [Using scoping](./simplesamlphp-scoping)
   * [Holder-of-Key profile](simplesamlphp-hok-sp)
- * [Identity Provider QuickStart](simplesamlphp-idp)
+ * Using SimpleSAMLphp as a SAML Identity Provider
+  * [Identity Provider QuickStart](simplesamlphp-idp)
   * [IdP hosted reference](simplesamlphp-reference-idp-hosted)
   * [SP remote reference](simplesamlphp-reference-sp-remote)
-  * [Use case: Setting up an IdP for G Suite (Google Apps)](simplesamlphp-googleapps)
+  * [Use case: Setting up an IdP for Google Workspace (G Suite / Google Apps)](simplesamlphp-googleapps)
   * [Configuring HTTP-Artifact](./simplesamlphp-artifact-idp)
   * [Identity Provider Advanced Topics](simplesamlphp-idp-more)
   * [Holder-of-Key profile](simplesamlphp-hok-idp)
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-changelog.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-changelog.md
index d44838b8152ed2c9e131545c8505ed533365bcc2..c5ee7d4caaac80a68dc51a3e9e5afe01c287f78c 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-changelog.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-changelog.md
@@ -6,6 +6,153 @@ SimpleSAMLphp changelog
 This document lists the changes between versions of SimpleSAMLphp.
 See the upgrade notes for specific information about upgrading.
 
+## Version 1.19.6
+
+Released 1-7-2022
+
+  * Fix several translations (#1572, #1573, #1577, #1578, #1603)
+  * Fix HTTP status code for error pages (#1585)
+  * \SimpleSAML\Utils\HTTP::getFirstPathElement() was marked deprecated
+  * Bumped twig and minimist dependencies due to known vulnerabilities (CVE-2022-23614 and CVE-2021-44906)
+  * Minor fixes to the old UI (#1632)
+  * Fix several translations (#1572, #1573, #1577, #1578)
+
+### saml2 library
+  * A mis-use of a constant was fixed (#249) that caused an error with HTTP-Artifact binding.
+
+### metarefresh
+  * Added regex-template config keyword to apply a template to entityIDs matching a pattern. (v0.10)
+
+## Version 1.19.5
+
+Released 24-01-2021
+
+  * Fix composer-file to prevent warnings
+  * Fix database persistence (#1555)
+  * Dropped dependency on jquery-ui and selectize
+
+### adfs
+  * Bump the module version to the 1.0.x branch;  the 0.9 branch only works with versions before 1.19
+
+### saml2 library
+  * Fix an issue with PHP 7.x support that was introduced in 1.19.4 (#1559)
+
+## Version 1.19.4
+
+Released 13-12-2021
+
+### core
+  * Fix translations for included templates (i.e. metadata not found error)
+
+### ldap
+  * Added the possibility to escape the additional search filters that were introduced in 1.19.2
+
+### saml2 library
+  * The library has been quick-fixed to support PHP 8.1 (#1545)
+
+### metarefresh
+  * Reverted an unintended update of the module. The v1,0-branch is intended for use with SSP 2.0 (dev-master) only
+
+## Version 1.19.3
+
+Released 2021-10-28
+
+  * Fixed a wrong variable name introduced in v1.19.2 (#1480) that rendered the PHP session handler useless.
+
+## Version 1.19.2
+
+Released 2021-10-27
+
+  * Restored PHP 8.0 compatibility (#1461), also on the saml2 library (v4.2.3)
+  * Revert #1435; should not have ended up in a bugfix release. If you need the authproc-filters, please install the
+    simplesamlphp-module-subjectidattrs module.
+  * Fixed a bug in the logger that would break encoded urls in the message
+  * Return a proper HTTP/405 code when incorrect method is used (#1400)
+  * Fixed the 'rememberenabled' config setting of the built-in IdP discovery.
+  * Fixed a bug where code from external modules would run even though the module is explicitly enabled (#1463)
+  * Fix unsolicited response with no RelayState (#1473)
+  * Fix statistics being logged despite a configured loglevel that excludes statistics.
+  * Fixed an issue with the PHP session handler (#1480, #1350, #1478) causing superfluous log messages.
+  * Fixed the MetaDataStorageHandlerPdo for MySQL backends (#1392)
+  * Use getVersion instead of getStats to determine whether a memcache-server is up (#1528)
+
+### adfs
+  * Fixed several issues that rendered the old UI useless for this module (v0.9.8)
+
+### admin
+  * Fix warning in FederationController (#1475)
+  * Fix displayed metadata for hosted entities differing from actual metadata.
+
+### consent
+  * Add possibility to set the sameSite flag on cookies set by this module (v0.9.7)
+
+### discopower
+  * Fixed a dependency issue that caused the module to not install under some PHP-versions (v0.10.0)
+
+### ldap
+  * Added search-filters to AttributeAddUserGroups and made the return-attribute configurable (v0.9.11)
+
+### negotiate
+  * Fixed a regression that rendered the new UI useless for this module (v0.9.11)
+
+### sqlauth
+  * Fixed a bug that rendered the module useless due to missing use-statements.
+
+## Version 1.19.1
+
+Released 2021-04-29
+
+  * Added authproc-filters for generating the subject-id and pairwise-id (#1435)
+  * Restore support for custom error messages (#1326)
+  * Fixed a bug in the Artifact Resolution Service (#1428)
+  * Fixed compatibility with Composer pre 1.8.5 (Debian 10) (#1427)
+  * Updated npm dependencies up to April 23, 2021
+  * Fixed a bug where it was impossible to set WantAssertionsSigned=true on SP-metadata (#1433)
+  * Make inResponseTo available in state array (#1447)
+
+### admin
+  * Fixed a bug in the metadata-coverter where the coverted metadata would contain newline-characters
+
+### authorize
+  * Fix a bug in the Twig-template that causes an exception in Twig strict vars mode
+
+### memcacheMonitor
+  * Fix a bug in the Twig-template that causes an exception on newer Twig-versions
+
+### negotiate
+  * Fix a bug that was breaking the module when using the old UI
+
+### oauth
+  * Fixed a namespace bug that was breaking the module
+
+### statistics
+  * Fix a bug in the Twig-template that causes an exception on newer Twig-versions
+
+### sqlauth
+  * Fix a security bug where in rare cases the database user credentials would be printed in exception messages
+
+## Version 1.19.0
+
+Released 2021-01-21
+
+  * This version will be the last of the 1.x branch and will provide a migration path to our new
+    templating system, routing system and translation system.
+  * SAML 1 / Shib 1.3 support is now marked deprecated and will be removed in SimpleSAMLphp 2.0.
+  * Raised minimum PHP version to 7.1
+  * Dropped support for Symfony 3.x
+  * Update the SAML2 library dependency to 4.1.9
+  * Fix a bug where SSP wouldn't write to the tmp-directory if it didn't own it, but could write to it (#1314)
+  * Fixed several bugs in saml:NameIDAttribute (#1245)
+  * Fix artifact resolution (#1343)
+  * Allow additional audiences to be specified (#1345)
+  * Allow configurable ProviderName (#1348)
+  * Support saml:Extensions in saml:SP authsources (#1349)
+  * The `attributename`-setting in the core:TargetedID authproc-filter has been deprecated in
+    favour of the `identifyingAttribute`-setting.
+  * Filter multiauth authentication sources from SP using AuthnContextClassRef (#1362)
+  * Allow easy enabling of SameSite = 'None' (#1382)
+  * Do not accept the hashed admin password for authentication (#1418)
+
 ## Version 1.18.8
 
 Released 2020-09-02
@@ -130,9 +277,9 @@ Released 2019-11-26
 
 Released 2019-11-26
 
-  * Fixed an issue that prevented custom themes from working (#1240).
-  * Fixed an issue with translations in the discovery service (#1244).
-  * Fixed an issue with schema validation.
+   * Fixed an issue that prevented custom themes from working (#1240).
+   * Fixed an issue with translations in the discovery service (#1244).
+   * Fixed an issue with schema validation.
 
 ## Version 1.18.0
 
@@ -149,10 +296,10 @@ Released 2019-11-19
   * Allow use of stream wrappers (e.g. s3://) in paths.
   * Improved 'update or insert' handling for different SQL drivers.
   * The default algorithm within the TimeLimitedToken class has been bumped from SHA-1 to SHA-256
-    as announced by deprecation notice in 1.15.
+    as announced by deprecation notice in 1.15-RC1.
   * Most modules have been externalized. They will not be included in our future releases by default,
-    but will be easily installable using composer. For now, they are still included in the package.
-  * Minor fixes to code, CSS and documentation.
+    but will be easily installable using Composer. For now, they are still included in the package.
+  * Many minor fixes to code, css, documentation
 
 ### metarefresh
   * The algorithm to compute the fingerprint of the certificate that signed
@@ -160,11 +307,23 @@ Released 2019-11-19
     configuration option.
 
 ### saml
-  * Make the id of the generated signed metadata change only when metadata content changes.
+  * Make the id of the generated signed metadata only change when metadata content changes.
   * New SP metadata configuration options `AssertionConsumerService` and `SingleLogoutServiceLocation`
     to allow overriding the default URL paths.
   * Added support for per-IDP configurable `AuthnContextClassRef`/`AuthnContextComparison`.
 
+## Version 1.17.8
+
+Released 2019-11-20
+
+  * Resolved a security issue that exposed host information to unauthenticated users. See
+    [SSPSA 201911-02](https://simplesamlphp.org/security/201911-02).
+
+### consentAdmin
+
+  * Fixed an issue with CSS and Javascript not loading for the module in the new user
+    interface.
+
 ## Version 1.17.7
 
 Released 2019-11-06
@@ -196,7 +355,7 @@ Released 2019-08-02
 Released 2019-07-11
 
   * Fix an issue introduced in 1.17.3 with `enable.http_post`.
-
+  
 ## Version 1.17.3
 
 Released 2019-07-10
@@ -659,7 +818,7 @@ Released 2017-04-27
   * Resolved a security issue with unauthenticated encryption in the SimpleSAML\Utils\Crypto class. See [SSPSA 201704-01](https://simplesamlphp.org/security/201704-01).
   * Added requirement for the Multibyte String PHP extension and the corresponding checks.
   * Set a default name for SimpleSAMLphp sessions in the configuration template for the PHP session handler.
-
+  
 ## Version 1.14.12
 
 Released 2017-03-30
@@ -1050,7 +1209,7 @@ Released 2013-06-05.
   * Workaround for SSL SNI extension not being correctly set.
   * New language cookie and parameter config options.
   * Add 'module.enable' configuration option for enabling/disabling modules.
-  * Check for existence of memcache extension.
+  * Check for existence of memcache extension. 
   * Initial support for limiting redirects to trusted hosts.
   * Demo example now shows both friendly and canonical name of the attributes.
   * Other minor fixes for bugs and typos.
@@ -1842,8 +2001,8 @@ Updates to `config.php`. Please check for updates in your local modified configu
   * Documentation update. New authencation source API now default and documented.
   * New authentication source (new API):
     * LDAP
-    * LDAPMulti
-	* YubiKey authentication source. (Separate module)
+    * LDAPMulti  
+	* YubiKey authentication source. (Separate module)  
 	* Facebook authentication source. (Separate module)
   * New Authentication Processing Filter:
     * AttributeAlter
@@ -1866,7 +2025,7 @@ Updates to `config.php`. Please check for updates in your local modified configu
   * New module: Aggregator: Aggregates metadata. Used in Kalmar Union.
   * New module: Metarefresh, download, parses and consumes metadata.
   * New module: SanityCheck. Checks if things looks good and reports bad configuration etc.
-  * New module: Cron. Will perform tasks regularly.
+  * New module: Cron. Will perform tasks regularly. 
   * Module: SAML2.0. SAML 2.0 SP implemented as an module. Yet not documented how to use, but all SAML 2.0 SP functionality may be moved out to this module for better modularization.
   * New module: statistics. Parses STAT log files, and aggregates based on a generic rule system. Output is stored in aggregated text files, and a frontend is included to present statistics with tables and graphs. Used sanitycheck and cron.
   * Added support for IdP initiated SSO.
@@ -1892,7 +2051,7 @@ Updates to `config.php`. Please check for updates in your local modified configu
   * Added notes about how to aggregate and consume metadata. Just a start.
   * Large improvements to Configuration class, and config helper functions.
   * STAT logging is moved into separate authenticaion processing filter.
-  * Fix for NoPassive responses to Google Apps with alternative NameIDFormats.
+  * Fix for NoPassive responses to Google Apps with alternative NameIDFormats.  
   * LDAP module allows to search multiple searchbases.
   * All documentation is converted from docbook to markdown format.
   * Added headers to not allow google to index pages.
@@ -1906,7 +2065,7 @@ Updates to `config.php`. Please check for updates in your local modified configu
   * Improved UI on default theme
   * Fix for session duration in the Conditions element in the Assertion (SAML 2.0).
   * Updated with new Feide IdP metadata in metadata-templates
-
+  
 
 
 ## Version 1.3
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-googleapps.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-googleapps.md
index 30cab47945824061a94ef5e6b0cab755f8e6f6aa..a72d20292c02341dfeb828c55947713117082913 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-googleapps.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-googleapps.md
@@ -1,4 +1,4 @@
-Setting up a SimpleSAMLphp SAML 2.0 IdP to use with Google Apps / G Suite for Education
+Setting up a SimpleSAMLphp SAML 2.0 IdP to use with Google Workspace (G Suite / Google Apps) for Education
 ============================================
 
 <!-- 
@@ -22,11 +22,12 @@ This document is part of the SimpleSAMLphp documentation suite.
 
 ## Introduction
 
-This article assumes that you have already read the SimpleSAMLphp installation manual, and installed a version of SimpleSAMLphp at your
-server.
-
-In this example we will setup this server as an IdP for Google Apps for Education:
+This article describes how to configure a Google Workspace (formerly G Suite, formerly Google Apps)
+instance as a service provider to use with a SimpleSAMLphp identity provider.
+This article assumes that you have already read the SimpleSAMLphp installation manual, and installed
+a version of SimpleSAMLphp at your server.
 
+In this example we will setup this server as an IdP for Google Workspace:
 	dev2.andreas.feide.no
 
 
@@ -42,7 +43,7 @@ Edit `config.php`, and enable the SAML 2.0 IdP:
 You must generate a certificate for your IdP.
 Here is an example of an openssl command to generate a new key and a self signed certificate to use for signing SAML messages:
 
-    openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out googleappsidp.crt -keyout googleappsidp.pem
+    openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out googleworkspaceidp.crt -keyout googleworkspaceidp.pem
 
 The certificate above will be valid for 10 years.
 
@@ -89,11 +90,15 @@ After you have successfuly tested that everything is working with the simple `ex
 Configuring the authentication source
 -------------------------------------
 
-The `exampleauth:UserPass` authentication source is part of the `exampleauth` module. This module isn't enabled by default, so you will have to enable it. This is done by creating a file named `enable` in `modules/exampleauth/`.
-
-On unix, this can be done by running (from the SimpleSAMLphp installation directory):
+The `exampleauth:UserPass` authentication module is part of the `exampleauth` module. This module isn't enabled by default, so you will have to enable it. In
+`config.php`, search for the `module.enable` key and set `exampleauth` to true:
 
-    touch modules/exampleauth/enable
+```
+    'module.enable' => [
+         'exampleauth' => true,
+         …
+    ],
+```
 
 The next step is to create an authentication source with this module. An authentication source is an authentication module with a specific configuration. Each authentication source has a name, which is used to refer to this specific configuration in the IdP configuration. Configuration for authentication sources can be found in `config/authsources.php`.
 
@@ -119,7 +124,7 @@ This configuration creates two users - `student` and `employee`, with the passwo
 
 ## Configuring metadata for an SAML 2.0 IdP
 
-If you want to setup a SAML 2.0 IdP for Google Apps, you need to configure two metadata files: `saml20-idp-hosted.php` and `saml20-sp-remote.php`.
+If you want to setup a SAML 2.0 IdP for Google Workspace, you need to configure two metadata files: `saml20-idp-hosted.php` and `saml20-sp-remote.php`.
 
 
 ### Configuring SAML 2.0 IdP Hosted metadata
@@ -133,7 +138,7 @@ This is the configuration of the IdP itself. Here is some example config:
 		'host'				=>	'__DEFAULT__',
 		
 		// X.509 key and certificate. Relative to the cert directory.
-		'privatekey'   => 'googleappsidp.pem',
+		'privatekey'   => 'googleworkspaceidp.pem',
 		'certificate'  => 'googleappsidp.crt',
 		
 		'auth' => 'example-userpass',
@@ -144,12 +149,12 @@ This is the configuration of the IdP itself. Here is some example config:
 
 ### Configuring SAML 2.0 SP Remote metadata
 
-In the `saml20-sp-remote.php` file we will configure an entry for G Suite (Google Apps) for Education. There is already an entry for G Suite in the template, but we will change the domain name:
+In the `saml20-sp-remote.php` file we will configure an entry for Google Workspace for Education. There is already an entry for Google Workspace in the template, but we will change the domain name:
 
       /*
-       * This example shows an example config that works with G Suite (Google Apps) for education.
+       * This example shows an example config that works with Google Workspace (G Suite / Google Apps) for education.
        * What is important is that you have an attribute in your IdP that maps to the local part of the email address
-       * at G Suite. E.g. if your google account is foo.com, and you have a user with email john@foo.com, then you
+       * at Google Workspace. E.g. if your google account is foo.com, and you have a user with email john@foo.com, then you
        * must set the simplesaml.nameidattribute to be the name of an attribute that for this user has the value of 'john'.
        */
       $metadata['https://www.google.com/a/g.feide.no'] => [
@@ -159,7 +164,7 @@ In the `saml20-sp-remote.php` file we will configure an entry for G Suite (Googl
         'simplesaml.attributes'      => false
       ];
 
-You must also map some attributes received from the authentication module into email field sent to Google Apps. In this example, the  `uid` attribute is set.  When you later configure the IdP to connect to a LDAP directory or some other authentication source, make sure that the `uid` attribute is set properly, or you can configure another attribute to use here. The `uid` attribute contains the local part of the user name.
+You must also map some attributes received from the authentication module into email field sent to Google Workspace. In this example, the  `uid` attribute is set.  When you later configure the IdP to connect to a LDAP directory or some other authentication source, make sure that the `uid` attribute is set properly, or you can configure another attribute to use here. The `uid` attribute contains the local part of the user name.
 
 For an e-mail address `student@g.feide.no`, the `uid` should be set to `student`.
 
@@ -168,9 +173,9 @@ You should modify the `AssertionConsumerService` to include your G Suite domain
 For an explanation of the parameters, see the
 [SimpleSAMLphp Identity Provider QuickStart](simplesamlphp-idp).
 
-## Configure G Suite for education
+## Configure Google Workspace
 
-Start by logging in to our G SUite for education account panel.
+Start by logging in to our Google Workspace for education account panel.
 Then select "Advanced tools":
 
 **Figure&nbsp;1.&nbsp;We go to advanced tools**
@@ -182,7 +187,7 @@ Then select "Set up single sign-on (SSO)":
 **Figure&nbsp;2.&nbsp;We go to setup SSO**
 
 ![We go to setup SSO](resources/simplesamlphp-googleapps/googleapps-sso.png)
-Upload a certificate, such as the googleappsidp.crt created above:
+Upload a certificate, such as the googleworkspaceidp.crt created above:
 
 **Figure&nbsp;3.&nbsp;Uploading certificate**
 
@@ -210,7 +215,7 @@ again, using the host name of your IdP server.
 The Sign-out page or change password URL can be static pages on your server.
 
 The network mask determines which IP addresses will be asked for SSO login.
-IP addresses not matching this mask will be presented with the normal G Suite login page.
+IP addresses not matching this mask will be presented with the normal Google Workspace login page.
 It is normally best to leave this field empty to enable authentication for all URLs.
 
 **Figure&nbsp;4.&nbsp;Fill out the remaining fields**
@@ -219,7 +224,7 @@ It is normally best to leave this field empty to enable authentication for all U
 
 ### Add a user in G Suite that is known to the IdP
 
-Before we can test login, a new user must be defined in G Suite. This user must have a mail field matching the email prefix mapped from the attribute as described above in the metadata section.
+Before we can test login, a new user must be defined in Google Workspace. This user must have a mail field matching the email prefix mapped from the attribute as described above in the metadata section.
 
 ## Test to login to G Suite for education
 
@@ -227,7 +232,7 @@ Go to the URL of your mail account for this domain, the URL is similar to the fo
 
 	http://mail.google.com/a/yourgoogleappsdomain.com
 
-replacing the last part with your own G Suite domain name.
+replacing the last part with your own Google Workspace domain name.
 
 ## Security Considerations
 
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-idp.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-idp.md
index 48547ba31f59f64586b43bedc58008fb2be035a3..43f96752a04bc9fd349078370ffd24da8a4f0ea8 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-idp.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-idp.md
@@ -75,7 +75,7 @@ The next step is to configure the way users authenticate on your IdP. Various mo
 [`authtwitter:Twitter`](./authtwitter:oauthtwitter)
 : Authenticate with your Twitter account using the Twitter OAuth API.
 
-[`papi:PAPI`](https://github.com/rediris-es/simplesamlphp-module-papi/blog/master/README.md)
+[`papi:PAPI`](https://github.com/rediris-es/simplesamlphp-module-papi/blob/master/README.md)
 : Authenticate by means of the PAPI protocol.
 
 In this guide, we will use the `exampleauth:UserPass` authentication module. This module does not have any dependencies, and is therefore simple to set up.
@@ -84,12 +84,15 @@ In this guide, we will use the `exampleauth:UserPass` authentication module. Thi
 Configuring the authentication module
 -------------------------------------
 
-The `exampleauth:UserPass` authentication module is part of the `exampleauth` module. This module isn't enabled by default, so you will have to enable it. This is done by creating a file named `enable` in `modules/exampleauth/`.
+The `exampleauth:UserPass` authentication module is part of the `exampleauth` module. This module isn't enabled by default, so you will have to enable it. In
+`config.php`, search for the `module.enable` key and set `exampleauth` to true:
 
-On unix, this can be done by running (from the SimpleSAMLphp
-installation directory):
-
-    touch modules/exampleauth/enable
+```
+    'module.enable' => [
+         'exampleauth' => true,
+         …
+    ],
+```
 
 The next step is to create an authentication source with this module. An authentication source is an authentication module with a specific configuration. Each authentication source has a name, which is used to refer to this specific configuration in the IdP configuration. Configuration for authentication sources can be found in `config/authsources.php`.
 
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-install-repo.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-install-repo.md
index 0de258dcd6035fa6c826365f2abbf06bbf0e14d0..8c4548b6ba3f2cf8b0da551e2c1981a3a03c8d47 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-install-repo.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-install-repo.md
@@ -3,6 +3,12 @@ Installing SimpleSAMLphp from the repository
 
 These are some notes about running SimpleSAMLphp from the repository.
 
+Prerequisites
+-------------
+
+ * NodeJS version >= 10.0.
+
+
 Installing from git
 -------------------
 
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-install.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-install.md
index 0334ba41528cdf8228830cd997d15c04fe0d8e36..c4265deeb40ec1e25c19b50e00f5f752caaff9d8 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-install.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-install.md
@@ -27,7 +27,7 @@ Prerequisites
 -------------
 
  * A web server capable of executing PHP scripts.
- * PHP version >= 5.6.0.
+ * PHP version >= 7.1.0.
  * Support for the following PHP extensions:
    * Always required: `date`, `dom`, `hash`, `libxml`, `openssl`, `pcre`, `SPL`, `zlib`, `json`, `mbstring`
    * When automatically checking for latest versions, and used by some modules: `cURL`
@@ -60,6 +60,10 @@ Go to the directory where you want to install SimpleSAMLphp and extract the arch
 
 ## Upgrading from a previous version of SimpleSAMLphp
 
+Before starting the upgrade, review the relevant
+[upgrade notes](simplesamlphp-upgrade-notes) for any relevant
+changes.
+
 Extract the new version:
 
 ```
@@ -77,6 +81,9 @@ keep reading for other alternatives):
     cp -rv ../simplesamlphp/metadata metadata
 ```
 
+If you have installed any [third-party modules](https://simplesamlphp.org/modules) or [customised the theme](simplesamlphp-theming.md), 
+you should check whether your third-party modules need upgrading and then copy or replace those directories too.
+
 Replace the old version with the new version:
 
 ```
@@ -103,7 +110,10 @@ startup indicating how and what you need to update. You should look through the
 directory after the upgrade to see whether recommended defaults have been changed.
 
 
-### Alternative location for configuration files
+Configuration
+-------------
+
+### Location of configuration files
 
 By default, SimpleSAMLphp looks for its configuration in the `config` directory in the root of its own directory. This
 has some drawbacks, like making it harder to update SimpleSAMLphp or to install it as a composer dependency, or to 
@@ -204,8 +214,12 @@ look like this:
             location ~ ^(?<prefix>/simplesaml)(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
                 include          fastcgi_params;
                 fastcgi_pass     $fastcgi_pass;
-                fastcgi_param    SCRIPT_FILENAME $document_root$fastcgi_script_name;
-                fastcgi_param    SCRIPT_NAME /simplesaml$phpfile;
+                fastcgi_param SCRIPT_FILENAME $document_root$phpfile;
+
+                # Must be prepended with the baseurlpath
+                fastcgi_param SCRIPT_NAME /simplesaml$phpfile;
+
+                fastcgi_param PATH_INFO $pathinfo if_not_empty;
             }
         }
     }
@@ -356,6 +370,15 @@ At the bottom of the installation page there are some green lights. SimpleSAMLph
 required and recommended prerequisites are met. If any of the lights are red, you may have to install some PHP 
 extensions or external PHP packages (e.g. you need the PHP LDAP extension to use the LDAP authentication module).
 
+## Building assets
+
+Run the following commands to build the default theme.
+
+```
+npm install
+npm run build
+```
+
 ## Next steps
 
 You have now successfully installed SimpleSAMLphp, and the next steps depend on whether you want to setup a Service
@@ -369,7 +392,7 @@ in a separate document.
  - [Using SimpleSAMLphp as an Identity Provider (IdP)](simplesamlphp-idp)
    + [Hosted IdP reference](simplesamlphp-reference-idp-hosted)
    + [Remote SP reference](simplesamlphp-reference-sp-remote)
-   + [Setting up an IdP for G Suite (Google Apps)](simplesamlphp-googleapps)
+   + [Setting up an IdP for Google Workspace (G Suite / Google Apps)](simplesamlphp-googleapps)
    + [Advanced Topics](simplesamlphp-idp-more)
  - [Automated Metadata Management](https://github.com/simplesamlphp/simplesamlphp-module-metarefresh/blob/master/docs/simplesamlphp-automated_metadata.md)
  - [Maintenance and configuration](simplesamlphp-maintenance)
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-nostate.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-nostate.md
index 208d9d5773c9ee89449585758d8c6370087fedf3..4f113a198c59c7fabdee39536c7ff253cd8f6927 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-nostate.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-nostate.md
@@ -34,7 +34,7 @@ There are several ways that this can happen, but most of them have to do
 with session storage. Here we will outline some generic alternatives, and
 possible solutions.
 
-#### The domain name changed during authentication
+### The domain name changed during authentication
 
 The domain name the IdP sends the response to is configured in the metadata of
 the IdP. This means that it may not match up with the domain name the user
@@ -66,7 +66,7 @@ application uses the same domain when it sets the cookie. How that is done
 depends on your application. (See the section about mismatch between
 application PHP session settings and SimpleSAMLphp session settings.)
 
-#### Hopping between http and https
+### Hopping between http and https
 
 If a cookie is set during a HTTPS session, it is not available when the same
 URL is later accessed over http. If your site is available over both http and
@@ -74,7 +74,7 @@ https, check that you're using https consistently throughout the configuration.
 The best and most secure is to make your complete site available on https only,
 and redirect any http requests to https.
 
-#### Mismatch between PHP session settings for the application and SimpleSAMLphp
+### Mismatch between PHP session settings for the application and SimpleSAMLphp
 
 If both the application you are trying to add SAML 2.0 support to and
 SimpleSAMLphp uses PHP session for session storage, and they don't agree on all
@@ -101,7 +101,20 @@ What those settings should be set to depends on the application. The simplest
 way to determine it may be to look for calls to `session_set_cookie_params` in
 the application, and look at what parameters it uses.
 
-#### A generic problem saving sessions
+### Browsers with SameSite=Lax as default
+
+Some browsers, notably Chrome, will default the cookie SameSite attribute to "Lax" if it
+is not set. Specifically in the context of SAML this means that cookies will not be sent
+when a POST request is performed between websites, which is typical for the SAML WebSSO
+flow. The lack of cookies will cause SimpleSAMLphp's session to be lost when receiving an
+assertion via the HTTP-POST binding.
+
+To resolve this, you can set the `session.cookie.samesite` attribute in `config.php`
+to `None`. Starting with SimpleSAMLphp 1.19, the config template contains a way to
+set this dynamically based on the user's browser support for this attribute.
+You also need to enable the `session.cookie.secure` setting.
+
+### A generic problem saving sessions
 
 Sometimes the problem is caused by SimpleSAMLphp being unable to load and/or save
 sessions. This can be caused by the session settings being incorrect, or by a
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-idp-hosted.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-idp-hosted.md
index 3a6b47934b868487996c680f56b6ff66b96d0ffd..03acd590f45b55210dcd07c95d8f05e5cb744dec 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-idp-hosted.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-idp-hosted.md
@@ -399,6 +399,8 @@ messages from that SP.
 Shibboleth 1.3 options
 ----------------------
 
+Note that Shibboleth 1.3 support is deprecated and will be removed in the next major release of SimpleSAMLphp.
+
 The following options for Shibboleth 1.3 IdP's are avaiblable:
 
 `scopedattributes`
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-idp-remote.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-idp-remote.md
index 95b4eda3e9d0b049267cf551a5d9b04f32986a60..eccba78c1471f7a3e626a2476d13231d22d688f6 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-idp-remote.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-idp-remote.md
@@ -226,8 +226,17 @@ There are two modes of encryption supported by SimpleSAMLphp. One is symmetric e
 :   Note that this option overrides the option with the same name in the SP configuration.
 
 `sharedkey`
-:   Symmetric key which should be used for decryption. This should be a 128-bit key. If this option is not specified, public key encryption will be used instead.
+:   Symmetric key which should be used for decryption. This should be a 128-bit, 192-bit or 256-bit key based on the algorithm used. If this option is not specified, public key encryption will be used instead.
 
+`sharedkey_algorithm`
+:   Algorithm which should be used for decryption. Possible values are:
+
+    * http://www.w3.org/2001/04/xmlenc#aes128-cbc
+    * http://www.w3.org/2001/04/xmlenc#aes192-cbc
+    * http://www.w3.org/2001/04/xmlenc#aes256-cbc
+    * http://www.w3.org/2009/xmlenc11#aes128-gcm
+    * http://www.w3.org/2009/xmlenc11#aes192-gcm
+    * http://www.w3.org/2009/xmlenc11#aes256-gcm
 
 ### Fields for signing and validating messages
 
@@ -248,6 +257,8 @@ SimpleSAMLphp only signs authentication responses by default. Signing of authent
 Shibboleth 1.3 options
 ----------------------
 
+Note that Shibboleth 1.3 support is deprecated and will be removed in the next major release of SimpleSAMLphp.
+
 `caFile`
 :   Alternative to specifying a certificate. Allows you to specify a file with root certificates, and responses from the service be validated against these certificates. Note that SimpleSAMLphp doesn't support chains with any itermediate certificates between the root and the certificate used to sign the response. Support for PKIX in SimpleSAMLphp is experimental, and we encourage users to not rely on PKIX for validation of signatures; for background information review [the SAML 2.0 Metadata Interoperability Profile](http://docs.oasis-open.org/security/saml/Post2.0/sstc-metadata-iop-cd-01.pdf).
 
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-sp-remote.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-sp-remote.md
index 423df7b37f76366b4aa64cae63ba016b75b509e8..c24914512c052f8c98c51d78f00587aa8923332b 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-sp-remote.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-reference-sp-remote.md
@@ -168,6 +168,9 @@ The following SAML 2.0 options are available:
 
 :   (This option was previously named `AttributeNameFormat`.)
 
+`audience`
+:   An array of additional entities to be added to the AudienceRestriction. By default the only audience is the SP's entityID. 
+
 `certData`
 :   The base64 encoded certificate for this SP. This is an alternative to storing the certificate in a file on disk and specifying the filename in the `certificate`-option.
 
@@ -333,9 +336,18 @@ of the SP.
 
 `sharedkey`
 :   Symmetric key which should be used for encryption. This should be a
-    128-bit key. If this option is not specified, public key encryption
-    will be used instead.
+    128-bit, 192-bit or 256-bit key based on the algorithm used.
+    If this option is not specified, public key encryption will be used instead.
 
+`sharedkey_algorithm`
+:   Algorithm which should be used for encryption. Possible values are:
+
+    * http://www.w3.org/2001/04/xmlenc#aes128-cbc
+    * http://www.w3.org/2001/04/xmlenc#aes192-cbc
+    * http://www.w3.org/2001/04/xmlenc#aes256-cbc
+    * http://www.w3.org/2009/xmlenc11#aes128-gcm
+    * http://www.w3.org/2009/xmlenc11#aes192-gcm
+    * http://www.w3.org/2009/xmlenc11#aes256-gcm
 
 ### Fields for signing and validating messages
 
@@ -383,6 +395,8 @@ idp is in the intersection the discoveryservice will go directly to the idp.
 Shibboleth 1.3 options
 ----------------------
 
+Note that Shibboleth 1.3 support is deprecated and will be removed in the next major release of SimpleSAMLphp.
+
 The following options for Shibboleth 1.3 SP's are avaiblable:
 
 `audience`
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-sp-api.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-sp-api.md
index ad049224065d7f198f5a047126dc5d34f7882816..e5b722b05655863e660e8a5695e2072e97789ff7 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-sp-api.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-sp-api.md
@@ -15,7 +15,7 @@ Some SimpleSAMLphp calls replace the current active PHP session. If you previous
     $auth = new \SimpleSAML\Auth\Simple('default-sp');
     $auth->isAuthenticated(); // Replaces our session with the SimpleSAMLphp one
     // $_SESSION['key'] = 'value'; // This would save to the SimpleSAMLphp session which isn't what we want
-    \SimpleSAML\Session::getSessionFromRequest()->cleanup(); // Reverts to our PHP session
+    SimpleSAML_Session::getSessionFromRequest()->cleanup(); // Reverts to our PHP session
     // Save to our session
     $_SESSION['key'] = 'value';
 
@@ -47,7 +47,7 @@ Check whether the user is authenticated with this authentication source.
 ### Example
 
     if (!$auth->isAuthenticated()) {
-        \SimpleSAML\Session::getSessionFromRequest()->cleanup();
+        SimpleSAML_Session::getSessionFromRequest()->cleanup();
         /* Show login link. */
         print('<a href="/login">Login</a>');
     }
@@ -70,7 +70,7 @@ See the documentation for the `login`-function for a description of the paramete
 ### Example 1
 
     $auth->requireAuth();
-    \SimpleSAML\Session::getSessionFromRequest()->cleanup();
+    SimpleSAML_Session::getSessionFromRequest()->cleanup();
     print("Hello, authenticated user!");
 
 ### Example 2
@@ -83,7 +83,7 @@ See the documentation for the `login`-function for a description of the paramete
         'ReturnTo' => 'https://sp.example.org/',
         'KeepPost' => FALSE,
     ]);
-    \SimpleSAML\Session::getSessionFromRequest()->cleanup();
+    SimpleSAML_Session::getSessionFromRequest()->cleanup();
     print("Hello, authenticated user!");
 
 
@@ -127,7 +127,7 @@ The [`saml:SP`](./saml:sp) authentication source also defines some parameters.
         'isPassive' => TRUE,
         'ErrorURL' => 'https://.../error_handler.php',
     ]);
-    \SimpleSAML\Session::getSessionFromRequest()->cleanup();
+    SimpleSAML_Session::getSessionFromRequest()->cleanup();
 
 `logout`
 --------
@@ -159,7 +159,7 @@ This function never returns.
 Logout, and redirect to the specified URL.
 
     $auth->logout('https://sp.example.org/logged_out.php');
-    \SimpleSAML\Session::getSessionFromRequest()->cleanup();
+    SimpleSAML_Session::getSessionFromRequest()->cleanup();
 
 ### Example 2
 
@@ -170,7 +170,7 @@ Same as the previous, but check the result of the logout operation afterwards.
         'ReturnStateParam' => 'LogoutState',
         'ReturnStateStage' => 'MyLogoutState',
     ]);
-    \SimpleSAML\Session::getSessionFromRequest()->cleanup();
+    SimpleSAML_Session::getSessionFromRequest()->cleanup();
 
 And in logged_out.php:
 
@@ -226,7 +226,8 @@ See the [`saml:SP`](./saml:sp) reference for information about available SAML au
 ### Example
 
     $idp = $auth->getAuthData('saml:sp:IdP');
-    print('You are logged in from: ' . htmlspecialchars($idp));
+    $nameID = $auth->getAuthData('saml:sp:NameID')->getValue();
+    printf('You are %s, logged in from %s', htmlspecialchars($nameID), htmlspecialchars($idp));
 
 
 `getLoginURL`
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-sp.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-sp.md
index 365289f49eae4104c30cb06cd23d44df496d194a..c144ce20f8b8235007937be9eb82155bdb940197 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-sp.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-sp.md
@@ -119,8 +119,7 @@ SimpleSAMLphp metadata converter* tool available also in the *Federation* tab of
 parsed metadata and paste it with a text editor into the `metadata/saml20-idp-remote.php` file in your SimpleSAMLphp
 directory.
 
-If you intend to add your SP to a federation, the procedure for managing trust in federations differ, but the common part is
-that you would need to provide the *SAML 2.0 metadata of your SP*, and register that with the federation administration.
+If you intend to add your SP to a federation, the procedure for managing trust in federations will differ, but the common part is that you would need to provide the *SAML 2.0 metadata of your SP*, and register that with the federation administration.
 You will probably be required too to consume the federation metadata periodically. Read more about
 [automated metadata management](https://github.com/simplesamlphp/simplesamlphp-module-metarefresh/blob/master/docs/simplesamlphp-automated_metadata.md) to learn more about that. 
 
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-theming.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-theming.md
index 89ea7a572b9ebb1bde08b52876562898ca44913a..987ee0f8a072a1149ca2fa5cc3dee951455f9080 100644
--- a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-theming.md
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-theming.md
@@ -50,7 +50,7 @@ The first thing you need to do is having a SimpleSAMLphp module to place your th
 Then within this module, you can create a new theme named `fancytheme`.
 
 	cd modules/mymodule
-	mkdir -p themes/fancytheme
+	mkdir -p themes/fancytheme/default/includes
 
 Now, configure SimpleSAMLphp to use your new theme in `config.php`:
 
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.19.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.19.md
new file mode 100644
index 0000000000000000000000000000000000000000..b2cecfb796a55f6f9973d1615b97fe4069398250
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.19.md
@@ -0,0 +1,13 @@
+Upgrade notes for SimpleSAMLphp 1.19
+====================================
+
+The minimum PHP version required is now PHP 7.1.
+
+SAML 1 / Shib 1.3 support is now deprecated and will start logging notices
+when used. It will be removed in SimpleSAMLphp 2.0.
+
+SimpleSAMLphp 1.19 will automatically try to determine whether to set the sameSite-flag on cookies.
+Some browser require to set the Secure-flag as well for sameSite to work. Therefore, the default for
+the `session.cookie.secure` setting has been changed to TRUE. This will be the right setting for most
+setups anyway, however if you really need to use insecure cookies, you have to manually set it to false and
+figure out a value for `session.cookie.samesite` that works for your environment.
diff --git a/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-upgrade-notes.md b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-upgrade-notes.md
new file mode 100644
index 0000000000000000000000000000000000000000..b56fb780e5ccd6238ac73f899884ad0bff34d32e
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/docs/simplesamlphp-upgrade-notes.md
@@ -0,0 +1,25 @@
+SimpeSAMLphp Upgrade Notes
+==========================
+
+See the following pages for important information for users upgrading
+from older versions of SimpleSAMLphp:
+
+* [Upgrade notes for version 1.19](simplesamlphp-upgrade-notes-1.19)
+* [Upgrade notes for version 1.18](simplesamlphp-upgrade-notes-1.18)
+* [Upgrade notes for version 1.17](simplesamlphp-upgrade-notes-1.17)
+* [Upgrade notes for version 1.16](simplesamlphp-upgrade-notes-1.16)
+* [Upgrade notes for version 1.15](simplesamlphp-upgrade-notes-1.15)
+* [Upgrade notes for version 1.14](simplesamlphp-upgrade-notes-1.14)
+* [Upgrade notes for version 1.13](simplesamlphp-upgrade-notes-1.13)
+* [Upgrade notes for version 1.12](simplesamlphp-upgrade-notes-1.12)
+* [Upgrade notes for version 1.11](simplesamlphp-upgrade-notes-1.11)
+* [Upgrade notes for version 1.10](simplesamlphp-upgrade-notes-1.10)
+* [Upgrade notes for version 1.9](simplesamlphp-upgrade-notes-1.9)
+* [Upgrade notes for version 1.8](simplesamlphp-upgrade-notes-1.8)
+* [Upgrade notes for version 1.7](simplesamlphp-upgrade-notes-1.7)
+* [Upgrade notes for version 1.6](simplesamlphp-upgrade-notes-1.6)
+
+A detailed list of changes in each release can be found in the
+[Changelog](simplesamlphp-changelog).
+
+
diff --git a/vendor/simplesamlphp/simplesamlphp/extra/simplesamlphp.spec b/vendor/simplesamlphp/simplesamlphp/extra/simplesamlphp.spec
index 7aa4203581381c86221ca98f55ded528c8a02812..b969d7d0e1d60e641827bf8231a49b4e73f3ed54 100644
--- a/vendor/simplesamlphp/simplesamlphp/extra/simplesamlphp.spec
+++ b/vendor/simplesamlphp/simplesamlphp/extra/simplesamlphp.spec
@@ -1,6 +1,6 @@
 %define name      simplesamlphp
 %define summary   SAML IDP/SP written in PHP
-%define version   1.18.8
+%define version   1.19.6
 %define release   1
 %define license   LGPL 2.1
 %define group     Networking/WWW
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/AuthenticationFactory.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/AuthenticationFactory.php
index 25dc18307d22f0494d4bf7b527e88aafab6eb34e..e0569d2934a1d1e16bbe00cca644d0261224d891 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/AuthenticationFactory.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/AuthenticationFactory.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Auth;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/DefaultAuth.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/DefaultAuth.php
index 4a2a5da54915ac3a7bf70b006ac1eaca17cece4e..968d37d89dd36f82a2f78c1ec1531cf7cc172a1e 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/DefaultAuth.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/DefaultAuth.php
@@ -1,7 +1,10 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Auth;
 
+use Exception;
 use SimpleSAML\Module\saml\Auth\Source\SP;
 use SimpleSAML\Session;
 use SimpleSAML\Utils;
@@ -155,11 +158,11 @@ public static function handleUnsolicitedAuth($authId, array $state, $redirectTo)
      * @return Source The authentication source.
      * @throws \Exception If the $id does not correspond with an authentication source.
      */
-    private static function getAuthSource($id)
+    private static function getAuthSource($id): Source
     {
         $as = Source::getById($id);
         if ($as === null) {
-            throw new \Exception('Invalid authentication source: ' . $id);
+            throw new Exception('Invalid authentication source: ' . $id);
         }
         return $as;
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/LDAP.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/LDAP.php
index f8bb3de4c15326f1a5e4d46c841ba5c0a08d7fcb..c505561aa8e091c906f08966600e937a1b605fbb 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/LDAP.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/LDAP.php
@@ -1,8 +1,10 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Auth;
 
-\SimpleSAML\Logger::warning("The class \SimpleSAML\Auth\LDAP has been moved to the ldap module, please use \SimpleSAML\Module\saml\Auth\Ldap instead.");
+\SimpleSAML\Logger::warning("The class \SimpleSAML\Auth\LDAP has been moved to the ldap module, please use \SimpleSAML\Module\ldap\Auth\Ldap instead.");
 
 /**
  * @deprecated To be removed in 2.0
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/ProcessingChain.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/ProcessingChain.php
index d160928a8fbbdb440c49b15316d277c12f8444d8..4b3e9066d9a543417233130ea93ee7bb0f1e2e15 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/ProcessingChain.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/ProcessingChain.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Auth;
 
 use SimpleSAML\Configuration;
@@ -24,20 +26,20 @@ class ProcessingChain
     /**
      * The list of remaining filters which should be applied to the state.
      */
-    const FILTERS_INDEX = '\SimpleSAML\Auth\ProcessingChain.filters';
+    public const FILTERS_INDEX = '\SimpleSAML\Auth\ProcessingChain.filters';
 
 
     /**
      * The stage we use for completed requests.
      */
-    const COMPLETED_STAGE = '\SimpleSAML\Auth\ProcessingChain.completed';
+    public const COMPLETED_STAGE = '\SimpleSAML\Auth\ProcessingChain.completed';
 
 
     /**
      * The request parameter we will use to pass the state identifier when we redirect after
      * having completed processing of the state.
      */
-    const AUTHPARAM = 'AuthProcId';
+    public const AUTHPARAM = 'AuthProcId';
 
 
     /**
@@ -93,11 +95,8 @@ public function __construct($idpMetadata, $spMetadata, $mode = 'idp')
      * @param array $src  Source filters. May be unsorted.
      * @return void
      */
-    private static function addFilters(&$target, $src)
+    private static function addFilters(array &$target, array $src): void
     {
-        assert(is_array($target));
-        assert(is_array($src));
-
         foreach ($src as $filter) {
             $fp = $filter->priority;
 
@@ -120,10 +119,8 @@ private static function addFilters(&$target, $src)
      * @param array $filterSrc  Array with filter configuration.
      * @return array  Array of ProcessingFilter objects.
      */
-    private static function parseFilterList($filterSrc)
+    private static function parseFilterList(array $filterSrc): array
     {
-        assert(is_array($filterSrc));
-
         $parsedFilters = [];
 
         foreach ($filterSrc as $priority => $filter) {
@@ -151,10 +148,8 @@ private static function parseFilterList($filterSrc)
      *                           definition.)
      * @return \SimpleSAML\Auth\ProcessingFilter  The parsed filter.
      */
-    private static function parseFilter($config, $priority)
+    private static function parseFilter(array $config, int $priority): ProcessingFilter
     {
-        assert(is_array($config));
-
         if (!array_key_exists('class', $config)) {
             throw new \Exception('Authentication processing filter without name given.');
         }
@@ -346,9 +341,8 @@ public static function fetchProcessedState($id)
      * @param array &$state
      * @return void
      */
-    private static function addUserID(&$state)
+    private static function addUserID(array &$state): void
     {
-        assert(is_array($state));
         assert(array_key_exists('Attributes', $state));
 
         if (isset($state['Destination']['userid.attribute'])) {
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/ProcessingFilter.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/ProcessingFilter.php
index baeb5834b68dc81dd8c2f3e1f35cbde829a40663..964e63e1a7884b8800b47427e12428ec9f661780 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/ProcessingFilter.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/ProcessingFilter.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Auth;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/Simple.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/Simple.php
index 5ad7ca2cac063ba32ef1bad7f1fb9e62261c4dd3..2be23efc9705c580e84ac0b4caf46d88e48db32c 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/Simple.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/Simple.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Auth;
 
 use SimpleSAML\Configuration;
@@ -389,6 +391,7 @@ protected function getProcessedURL($url = null)
             $port = '';
         }
 
+        /** @psalm-var \SimpleSAML\Configuration $this->app_config */
         $base = trim($this->app_config->getString(
             'baseURL',
             $scheme . '://' . $host . $port
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/Source.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/Source.php
index 36b7e28c6dae3c7efba60b531e9c3efabaa4bed1..b818ccc9d2c8b06c54202fd20937853c17dcee65 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/Source.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/Source.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Auth;
 
 use SimpleSAML\Configuration;
@@ -307,11 +309,8 @@ public static function completeLogout(&$state)
      * @return \SimpleSAML\Auth\Source The parsed authentication source.
      * @throws \Exception If the authentication source is invalid.
      */
-    private static function parseAuthSource($authId, $config)
+    private static function parseAuthSource(string $authId, array $config): Source
     {
-        assert(is_string($authId));
-        assert(is_array($config));
-
         self::validateSource($config, $authId);
 
         $id = $config[0];
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/SourceFactory.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/SourceFactory.php
index 9f5fdfafbeccf28ad2c37c1e18cb30844fea8055..1b3077655014e61a30dbe44880be8f165fd460f6 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/SourceFactory.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/SourceFactory.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Auth;
 
 interface SourceFactory
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/State.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/State.php
index ac915cbd3161194b72a70e8067e7c843703a2897..1da1b61ad7f9a5cb61f259e0729d575ca350d324 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/State.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/State.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Auth;
 
 use SimpleSAML\Configuration;
@@ -42,50 +44,50 @@ class State
     /**
      * The index in the state array which contains the identifier.
      */
-    const ID = '\SimpleSAML\Auth\State.id';
+    public const ID = '\SimpleSAML\Auth\State.id';
 
 
     /**
      * The index in the cloned state array which contains the identifier of the
      * original state.
      */
-    const CLONE_ORIGINAL_ID = '\SimpleSAML\Auth\State.cloneOriginalId';
+    public const CLONE_ORIGINAL_ID = '\SimpleSAML\Auth\State.cloneOriginalId';
 
 
     /**
      * The index in the state array which contains the current stage.
      */
-    const STAGE = '\SimpleSAML\Auth\State.stage';
+    public const STAGE = '\SimpleSAML\Auth\State.stage';
 
 
     /**
      * The index in the state array which contains the restart URL.
      */
-    const RESTART = '\SimpleSAML\Auth\State.restartURL';
+    public const RESTART = '\SimpleSAML\Auth\State.restartURL';
 
 
     /**
      * The index in the state array which contains the exception handler URL.
      */
-    const EXCEPTION_HANDLER_URL = '\SimpleSAML\Auth\State.exceptionURL';
+    public const EXCEPTION_HANDLER_URL = '\SimpleSAML\Auth\State.exceptionURL';
 
 
     /**
      * The index in the state array which contains the exception handler function.
      */
-    const EXCEPTION_HANDLER_FUNC = '\SimpleSAML\Auth\State.exceptionFunc';
+    public const EXCEPTION_HANDLER_FUNC = '\SimpleSAML\Auth\State.exceptionFunc';
 
 
     /**
      * The index in the state array which contains the exception data.
      */
-    const EXCEPTION_DATA = '\SimpleSAML\Auth\State.exceptionData';
+    public const EXCEPTION_DATA = '\SimpleSAML\Auth\State.exceptionData';
 
 
     /**
      * The stage of a state with an exception.
      */
-    const EXCEPTION_STAGE = '\SimpleSAML\Auth\State.exceptionStage';
+    public const EXCEPTION_STAGE = '\SimpleSAML\Auth\State.exceptionStage';
 
 
     /**
@@ -93,7 +95,7 @@ class State
      * Note that this does not contain a "." since it's used in the
      * _REQUEST superglobal that does not allow dots.
      */
-    const EXCEPTION_PARAM = '\SimpleSAML\Auth\State_exceptionId';
+    public const EXCEPTION_PARAM = '\SimpleSAML\Auth\State_exceptionId';
 
 
     /**
@@ -177,7 +179,7 @@ public static function getStateId(&$state, $rawId = false)
      *
      * @return integer  State timeout.
      */
-    private static function getStateTimeout()
+    private static function getStateTimeout(): int
     {
         if (self::$stateTimeout === null) {
             $globalConfig = Configuration::getInstance();
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/TimeLimitedToken.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/TimeLimitedToken.php
index ac5846dec9eb9c308086cd8d5406db8dc4312c6a..03ce150b97db77f33d8cb1f677dd812562c1aeeb 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/TimeLimitedToken.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Auth/TimeLimitedToken.php
@@ -1,9 +1,13 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Auth;
 
 use SimpleSAML\Utils;
 
+error_reporting(E_ALL ^ E_DEPRECATED);
+
 /**
  * A class that generates and verifies time-limited tokens.
  *
@@ -84,7 +88,7 @@ public function addVerificationData($data)
      *
      * @return string The token for the given time and offset.
      */
-    private function calculateTokenValue($offset, $time = null)
+    private function calculateTokenValue(int $offset, int $time = null): string
     {
         if ($time === null) {
             $time = time();
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/Artifact.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/Artifact.php
index 09703ec99d15dc3dd0dddfc1645d1de38858f555..cc37699003620c0c4f675d4e92ac07bc2128f493 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/Artifact.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/Artifact.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 /**
  * Implementation of the Shibboleth 1.3 Artifact binding.
  *
@@ -24,7 +26,7 @@ class Artifact
      *
      * @return array  The artifacts.
      */
-    private static function getArtifacts()
+    private static function getArtifacts(): array
     {
         assert(array_key_exists('QUERY_STRING', $_SERVER));
 
@@ -53,7 +55,7 @@ private static function getArtifacts()
      * @param array $artifacts  The artifacts we will request.
      * @return string  The request, as an XML string.
      */
-    private static function buildRequest(array $artifacts)
+    private static function buildRequest(array $artifacts): string
     {
         $msg = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">'.
             '<SOAP-ENV:Body>'.
@@ -82,10 +84,8 @@ private static function buildRequest(array $artifacts)
      * @return string The <saml1p:Response> element, as a string.
      * @throws Error\Exception
      */
-    private static function extractResponse($soapResponse)
+    private static function extractResponse(string $soapResponse): string
     {
-        assert(is_string($soapResponse));
-
         try {
             $doc = DOMDocumentFactory::fromString($soapResponse);
         } catch (\Exception $e) {
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php
index d7c38700a9e96abb1824a7d4c726a7fcd87b6434..594c079d3d1117e6b8e4206d4a46d03e94eebf06 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php
@@ -1,5 +1,6 @@
 <?php
 
+declare(strict_types=1);
 
 /**
  * Implementation of the Shibboleth 1.3 HTTP-POST binding.
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Command/RouterDebugCommand.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Command/RouterDebugCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..2fba9f6a348aabc52d0faddea8be4f7464672263
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Command/RouterDebugCommand.php
@@ -0,0 +1,94 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SimpleSAML\Command;
+
+use Closure;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\Table;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Routing\RouterInterface;
+
+class RouterDebugCommand extends Command
+{
+    /**
+     * @var string
+     */
+    protected static $defaultName = 'debug:router';
+
+    /**
+     * @var RouterInterface
+     */
+    private $router;
+
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(RouterInterface $router)
+    {
+        parent::__construct();
+        $this->router = $router;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     * @return void
+     */
+    protected function configure()
+    {
+        $this
+            ->setDescription('Displays current routes for a module')
+            ->setHelp(
+                <<<'EOF'
+The <info>%command.name%</info> displays the configured routes for a module:
+
+  <info>php %command.full_name%</info>
+EOF
+            )
+        ;
+    }
+
+
+    /**
+     * {@inheritdoc}
+     * @psalm-suppress InvalidReturnType
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $io = new SymfonyStyle($input, $output);
+        $routes = $this->router->getRouteCollection();
+
+        $tableHeaders = array('Name', 'Method', 'Scheme', 'Host', 'Path', 'Controller');
+
+        $tableRows = array();
+        foreach ($routes->all() as $name => $route) {
+            $row = [
+                $name,
+                $route->getMethods() ? implode('|', $route->getMethods()) : 'ANY',
+                $route->getSchemes() ? implode('|', $route->getSchemes()) : 'ANY',
+                '' !== $route->getHost() ? $route->getHost() : 'ANY',
+                $route->getPath(),
+            ];
+
+            $controller = $route->getDefault('_controller');
+            if ($controller instanceof Closure) {
+                $controller = 'Closure';
+            } elseif (is_object($controller)) {
+                $controller = get_class($controller);
+            }
+            $row[] = $controller;
+
+            $tableRows[] = $row;
+        }
+
+        $table = new Table($io);
+        $table->setHeaders($tableHeaders)->setRows($tableRows);
+        $table->setStyle('compact');
+        $table->render();
+    }
+}
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Configuration.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Configuration.php
index cbcebcf01ed774b5321647325be88630e50a336b..a0c4b0fe2a372c41f3ccb3f591653a436a1ecab9 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Configuration.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Configuration.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 use SAML2\Constants;
@@ -14,6 +16,11 @@
  */
 class Configuration implements Utils\ClearableState
 {
+    /**
+     * The release version of this package
+     */
+    public const VERSION = '1.19.6';
+
     /**
      * A default value which means that the given option is required.
      *
@@ -109,11 +116,8 @@ public function __construct($config, $location)
      *
      * @throws \Exception If the configuration file is invalid or missing.
      */
-    private static function loadFromFile($filename, $required)
+    private static function loadFromFile(string $filename, bool $required): Configuration
     {
-        assert(is_string($filename));
-        assert(is_bool($required));
-
         if (array_key_exists($filename, self::$loadedConfigs)) {
             return self::$loadedConfigs[$filename];
         }
@@ -426,7 +430,7 @@ public function copyFromBase($instancename, $filename)
      */
     public function getVersion()
     {
-        return '1.18.8';
+        return self::VERSION;
     }
 
 
@@ -912,7 +916,8 @@ public function getArray($name, $default = self::REQUIRED_OPTION)
      *                       required if this parameter isn't given. The default value can be any value, including
      *                       null.
      *
-     * @return array The option with the given name, or $default if the option isn't found and $default is specified.
+     * @return array|mixed The option with the given name, or $default
+     * if the option isn't found and $default is specified.
      */
     public function getArrayize($name, $default = self::REQUIRED_OPTION)
     {
@@ -1095,10 +1100,8 @@ public function toArray()
      *
      * @throws \Exception If the default binding is missing for this endpoint type.
      */
-    private function getDefaultBinding($endpointType)
+    private function getDefaultBinding(string $endpointType): string
     {
-        assert(is_string($endpointType));
-
         $set = $this->getString('metadata-set');
         switch ($set . ':' . $endpointType) {
             case 'saml20-idp-remote:SingleSignOnService':
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Console/Application.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Console/Application.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4e5fb8c4ca06a8d0de3c18eaff38208f62f86cf
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Console/Application.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SimpleSAML\Console;
+
+use SimpleSAML\Kernel;
+use Symfony\Bundle\FrameworkBundle\Console\Application as BaseApplication;
+use Symfony\Component\Console\Input\InputOption;
+
+class Application extends BaseApplication
+{
+    /**
+     * @param \SimpleSAML\Kernel $kernel
+     */
+    public function __construct(Kernel $kernel)
+    {
+        parent::__construct($kernel);
+
+        $inputDefinition = $this->getDefinition();
+        $inputDefinition->addOption(
+            new InputOption('--module', '-m', InputOption::VALUE_REQUIRED, 'The module name', $kernel->getModule())
+        );
+    }
+}
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Database.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Database.php
index 59b108f2e05a4fab75cc43a7e0e6e8c407ccd304..9feb2d6f2d9967c9916046ef7c8eac0e1355114d 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Database.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Database.php
@@ -1,9 +1,13 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
+use Exception;
 use PDO;
 use PDOException;
+use PDOStatement;
 
 /**
  * This file implements functions to read and write to a group of database servers.
@@ -76,11 +80,11 @@ public static function getInstance($altConfig = null)
      *
      * @param \SimpleSAML\Configuration $config Instance of the \SimpleSAML\Configuration class
      */
-    private function __construct($config)
+    private function __construct(Configuration $config)
     {
         $driverOptions = $config->getArray('database.driver_options', []);
         if ($config->getBoolean('database.persistent', true)) {
-            $driverOptions = [PDO::ATTR_PERSISTENT => true];
+            $driverOptions[PDO::ATTR_PERSISTENT] = true;
         }
 
         // connect to the master
@@ -116,7 +120,7 @@ private function __construct($config)
      *
      * @return string $instanceId
      */
-    private static function generateInstanceId($config)
+    private static function generateInstanceId(Configuration $config): string
     {
         $assembledConfig = [
             'master' => [
@@ -124,7 +128,7 @@ private static function generateInstanceId($config)
                 'database.username'   => $config->getString('database.username', null),
                 'database.password'   => $config->getString('database.password', null),
                 'database.prefix'     => $config->getString('database.prefix', ''),
-                'database.persistent' => $config->getBoolean('database.persistent', false),
+                'database.persistent' => $config->getBoolean('database.persistent', true),
             ],
             'slaves' => $config->getArray('database.slaves', []),
         ];
@@ -137,14 +141,14 @@ private static function generateInstanceId($config)
      * This function connects to a database.
      *
      * @param string $dsn Database connection string
-     * @param string $username SQL user
-     * @param string $password SQL password
+     * @param string|null $username SQL user
+     * @param string|null $password SQL password
      * @param array  $options PDO options
      *
      * @throws \Exception If an error happens while trying to connect to the database.
      * @return \PDO object
      */
-    private function connect($dsn, $username, $password, $options)
+    private function connect(string $dsn, string $username = null, string $password = null, array $options): PDO
     {
         try {
             $db = new PDO($dsn, $username, $password, $options);
@@ -152,7 +156,7 @@ private function connect($dsn, $username, $password, $options)
 
             return $db;
         } catch (PDOException $e) {
-            throw new \Exception("Database error: " . $e->getMessage());
+            throw new Exception("Database error: " . $e->getMessage());
         }
     }
 
@@ -163,7 +167,7 @@ private function connect($dsn, $username, $password, $options)
      *
      * @return \PDO object
      */
-    private function getSlave()
+    private function getSlave(): PDO
     {
         if (count($this->dbSlaves) > 0) {
             $slaveId = rand(0, count($this->dbSlaves) - 1);
@@ -197,12 +201,8 @@ public function applyPrefix($table)
      * @throws \Exception If an error happens while trying to execute the query.
      * @return \PDOStatement object
      */
-    private function query($db, $stmt, $params)
+    private function query(PDO $db, string $stmt, array $params): PDOStatement
     {
-        assert(is_object($db));
-        assert(is_string($stmt));
-        assert(is_array($params));
-
         try {
             $query = $db->prepare($stmt);
 
@@ -219,7 +219,7 @@ private function query($db, $stmt, $params)
             return $query;
         } catch (PDOException $e) {
             $this->lastError = $db->errorInfo();
-            throw new \Exception("Database error: " . $e->getMessage());
+            throw new Exception("Database error: " . $e->getMessage());
         }
     }
 
@@ -233,16 +233,13 @@ private function query($db, $stmt, $params)
      * @throws \Exception If an error happens while trying to execute the query.
      * @return int The number of rows affected.
      */
-    private function exec($db, $stmt)
+    private function exec(PDO $db, string $stmt): int
     {
-        assert(is_object($db));
-        assert(is_string($stmt));
-
         try {
             return $db->exec($stmt);
         } catch (PDOException $e) {
             $this->lastError = $db->errorInfo();
-            throw new \Exception("Database error: " . $e->getMessage());
+            throw new Exception("Database error: " . $e->getMessage());
         }
     }
 
@@ -260,8 +257,7 @@ public function write($stmt, $params = [])
         $db = $this->dbMaster;
 
         if (is_array($params)) {
-            $obj = $this->query($db, $stmt, $params);
-            return ($obj === false) ? $obj : $obj->rowCount();
+            return $this->query($db, $stmt, $params)->rowCount();
         } else {
             return $this->exec($db, $stmt);
         }
@@ -293,4 +289,15 @@ public function getLastError()
     {
         return $this->lastError;
     }
+
+
+    /**
+     * Return the name of the PDO-driver
+     *
+     * @return string
+     */
+    public function getDriver(): string
+    {
+        return $this->dbMaster->getAttribute(PDO::ATTR_DRIVER_NAME);
+    }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Assertion.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Assertion.php
index 4a26240afa30d47ef0d012893210b3aba2056ee7..41fd4f44c0867c0d5dabc0cbef94a46f4148fb0d 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Assertion.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Assertion.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
@@ -59,7 +61,12 @@ public static function installHandler()
     {
 
         assert_options(ASSERT_WARNING, 0);
-        assert_options(ASSERT_QUIET_EVAL, 0);
+        if (version_compare(PHP_VERSION, '8.0.0', '<')) {
+            assert_options(ASSERT_QUIET_EVAL, 0);
+        } else {
+            ini_set('assert.exception', '0');
+            ini_set('assert.warning', '1');
+        }
         assert_options(ASSERT_CALLBACK, [Assertion::class, 'onAssertion']);
     }
 
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/AuthSource.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/AuthSource.php
index 3f53115eca3b9d7a8f6ce88b9cfecf312d127dcf..0321e424c79ed137e621895cab422fe5b01692b4 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/AuthSource.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/AuthSource.php
@@ -1,7 +1,11 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
+use Throwable;
+
 /**
  * Baseclass for auth source exceptions.
  *
@@ -30,9 +34,9 @@ class AuthSource extends Error
      *
      * @param string $authsource  Authsource module name from where this error was thrown.
      * @param string $reason  Description of the error.
-     * @param \Exception|null $cause
+     * @param \Throwable|null $cause
      */
-    public function __construct($authsource, $reason, $cause = null)
+    public function __construct(string $authsource, string $reason, Throwable $cause = null)
     {
         assert(is_string($authsource));
         assert(is_string($reason));
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/BadRequest.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/BadRequest.php
index 418f184b4ff8b89748cf42efb3202a07c075e778..d45c2ba442ec79ea30aa1058fe6bf0422db582fe 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/BadRequest.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/BadRequest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/BadUserInput.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/BadUserInput.php
index 5f94dcc0493fc0a17a88cb4a17d9aabed17921f8..427bf85a951fcb271f73f5d01f1c9d5006fa99d2 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/BadUserInput.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/BadUserInput.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/CannotSetCookie.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/CannotSetCookie.php
index 70287404f9f7d9fb48a2d2e0e7718020b09f910a..3c4faa810bc19b9a3e91b986e378e5d09dd562b3 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/CannotSetCookie.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/CannotSetCookie.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
@@ -16,7 +18,7 @@ class CannotSetCookie extends Exception
      *
      * @var int
      */
-    const UNKNOWN = 0;
+    public const UNKNOWN = 0;
 
     /**
      * The exception was due to the HTTP headers being already sent, and therefore we cannot send additional headers to
@@ -24,12 +26,12 @@ class CannotSetCookie extends Exception
      *
      * @var int
      */
-    const HEADERS_SENT = 1;
+    public const HEADERS_SENT = 1;
 
     /**
      * The exception was due to trying to set a secure cookie over an insecure channel.
      *
      * @var int
      */
-    const SECURE_COOKIE = 2;
+    public const SECURE_COOKIE = 2;
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ConfigurationError.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ConfigurationError.php
index 044771574a2e50502f2c98860ac6d7d1beb08de4..1cd98b09e5d6fad7a50c169bb1db0255ad43a505 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ConfigurationError.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ConfigurationError.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/CriticalConfigurationError.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/CriticalConfigurationError.php
index f078ee69579b3cf2108abc15025c72fcc28bc67b..169656b1d999503726e612669ebf6c0a9f0418dd 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/CriticalConfigurationError.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/CriticalConfigurationError.php
@@ -1,10 +1,13 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 use SimpleSAML\Configuration;
 use SimpleSAML\Logger;
 use SimpleSAML\Utils;
+use Throwable;
 
 /**
  * This exception represents a configuration error that we cannot recover from.
@@ -64,11 +67,11 @@ public function __construct($reason = null, $file = null, $config = null)
 
 
     /**
-     * @param \Exception $exception
+     * @param \Throwable $exception
      *
-     * @return CriticalConfigurationError
+     * @return \SimpleSAML\Error\Exception
      */
-    public static function fromException(\Exception $exception)
+    public static function fromException(Throwable $exception): Exception
     {
         $reason = null;
         $file = null;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Error.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Error.php
index 1a83f9580657c76b14b3e5a988a526cb8960d42d..db5d3f1ed97724d4d591582b45a960c57a73ca78 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Error.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Error.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 use SimpleSAML\Configuration;
@@ -7,6 +9,7 @@
 use SimpleSAML\Session;
 use SimpleSAML\Utils;
 use SimpleSAML\XHTML\Template;
+use Throwable;
 
 /**
  * Class that wraps SimpleSAMLphp errors in exceptions.
@@ -72,11 +75,11 @@ class Error extends Exception
      * The error can either be given as a string, or as an array. If it is an array, the first element in the array
      * (with index 0), is the error code, while the other elements are replacements for the error text.
      *
-     * @param mixed     $errorCode One of the error codes defined in the errors dictionary.
-     * @param \Exception $cause The exception which caused this fatal error (if any). Optional.
-     * @param int|null  $httpCode The HTTP response code to use. Optional.
+     * @param mixed      $errorCode One of the error codes defined in the errors dictionary.
+     * @param \Throwable $cause The exception which caused this fatal error (if any). Optional.
+     * @param int|null   $httpCode The HTTP response code to use. Optional.
      */
-    public function __construct($errorCode, \Exception $cause = null, $httpCode = null)
+    public function __construct($errorCode, Throwable $cause = null, ?int $httpCode = null)
     {
         assert(is_string($errorCode) || is_array($errorCode));
 
@@ -219,8 +222,6 @@ protected function saveError()
      */
     public function show()
     {
-        $this->setHTTPCode();
-
         // log the error message
         $this->logError();
 
@@ -262,14 +263,13 @@ public function show()
         $show_function = $config->getArray('errors.show_function', null);
         if (isset($show_function)) {
             assert(is_callable($show_function));
+            $this->setHTTPCode();
             call_user_func($show_function, $config, $data);
             assert(false);
         } else {
             $t = new Template($config, 'error.php', 'errors');
-            $translator = $t->getTranslator();
+            $t->setStatusCode($this->httpCode);
             $t->data = array_merge($t->data, $data);
-            $t->data['dictTitleTranslated'] = $translator->t($t->data['dictTitle']);
-            $t->data['dictDescrTranslated'] = $translator->t($t->data['dictDescr'], $t->data['parameters']);
             $t->show();
         }
 
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ErrorCodes.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ErrorCodes.php
index 75e7f1b8567e211d91fd000d297de7ed50a96b04..cae1250a7d669530375797f44ddeb9c812e2841b 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ErrorCodes.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ErrorCodes.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 use SimpleSAML\Locale\Translate;
@@ -10,7 +12,6 @@
  * @author Hanne Moa, UNINETT AS. <hanne.moa@uninett.no>
  * @package SimpleSAMLphp
  */
-
 class ErrorCodes
 {
     /**
@@ -22,7 +23,7 @@ final public static function defaultGetAllErrorCodeTitles()
     {
         return [
             'ACSPARAMS' => Translate::noop('{errors:title_ACSPARAMS}'),
-            'ARSPARAMS' => Translate::noop('{errors:title_ARSPARAMS}'),
+            'ARSPARAMS' => Translate::noop('No SAML message provided'),
             'AUTHSOURCEERROR' => Translate::noop('{errors:title_AUTHSOURCEERROR}'),
             'BADREQUEST' => Translate::noop('{errors:title_BADREQUEST}'),
             'CASERROR' => Translate::noop('{errors:title_CASERROR}'),
@@ -34,7 +35,7 @@ final public static function defaultGetAllErrorCodeTitles()
             'LDAPERROR' => Translate::noop('{errors:title_LDAPERROR}'),
             'LOGOUTINFOLOST' => Translate::noop('{errors:title_LOGOUTINFOLOST}'),
             'LOGOUTREQUEST' => Translate::noop('{errors:title_LOGOUTREQUEST}'),
-            'MEMCACHEDOWN' => Translate::noop('{errors:title_MEMCACHEDOWN}'),
+            'MEMCACHEDOWN' => Translate::noop('Cannot retrieve session data'),
             'METADATA' => Translate::noop('{errors:title_METADATA}'),
             'METADATANOTFOUND' => Translate::noop('{errors:title_METADATANOTFOUND}'),
             'NOACCESS' => Translate::noop('{errors:title_NOACCESS}'),
@@ -49,7 +50,7 @@ final public static function defaultGetAllErrorCodeTitles()
             'PROCESSAUTHNREQUEST' => Translate::noop('{errors:title_PROCESSAUTHNREQUEST}'),
             'RESPONSESTATUSNOSUCCESS' => Translate::noop('{errors:title_RESPONSESTATUSNOSUCCESS}'),
             'SLOSERVICEPARAMS' => Translate::noop('{errors:title_SLOSERVICEPARAMS}'),
-            'SSOPARAMS' => Translate::noop('{errors:title_SSOPARAMS}'),
+            'SSOPARAMS' => Translate::noop('No SAML request provided'),
             'UNHANDLEDEXCEPTION' => Translate::noop('{errors:title_UNHANDLEDEXCEPTION}'),
             'UNKNOWNCERT' => Translate::noop('{errors:title_UNKNOWNCERT}'),
             'USERABORTED' => Translate::noop('{errors:title_USERABORTED}'),
@@ -80,7 +81,10 @@ final public static function defaultGetAllErrorCodeDescriptions()
     {
         return [
             'ACSPARAMS' => Translate::noop('{errors:descr_ACSPARAMS}'),
-            'ARSPARAMS' => Translate::noop('{errors:descr_ARSPARAMS}'),
+            'ARSPARAMS' => Translate::noop("" .
+                "You accessed the Artifact Resolution Service interface, but did not " .
+                "provide a SAML ArtifactResolve message. Please note that this endpoint is" .
+                " not intended to be accessed directly."),
             'AUTHSOURCEERROR' => Translate::noop('{errors:descr_AUTHSOURCEERROR}'),
             'BADREQUEST' => Translate::noop('{errors:descr_BADREQUEST}'),
             'CASERROR' => Translate::noop('{errors:descr_CASERROR}'),
@@ -107,7 +111,10 @@ final public static function defaultGetAllErrorCodeDescriptions()
             'PROCESSAUTHNREQUEST' => Translate::noop('{errors:descr_PROCESSAUTHNREQUEST}'),
             'RESPONSESTATUSNOSUCCESS' => Translate::noop('{errors:descr_RESPONSESTATUSNOSUCCESS}'),
             'SLOSERVICEPARAMS' => Translate::noop('{errors:descr_SLOSERVICEPARAMS}'),
-            'SSOPARAMS' => Translate::noop('{errors:descr_SSOPARAMS}'),
+            'SSOPARAMS' => Translate::noop("" .
+                "You accessed the Single Sign On Service interface, but did not provide a " .
+                "SAML Authentication Request. Please note that this endpoint is not " .
+                "intended to be accessed directly."),
             'UNHANDLEDEXCEPTION' => Translate::noop('{errors:descr_UNHANDLEDEXCEPTION}'),
             'UNKNOWNCERT' => Translate::noop('{errors:descr_UNKNOWNCERT}'),
             'USERABORTED' => Translate::noop('{errors:descr_USERABORTED}'),
@@ -153,8 +160,12 @@ public static function getAllErrorCodeMessages()
      */
     public static function getErrorCodeTitle($errorCode)
     {
-        $errorCodeTitles = self::getAllErrorCodeTitles();
-        return $errorCodeTitles[$errorCode];
+        if (array_key_exists($errorCode, self::getAllErrorCodeTitles())) {
+            $errorCodeTitles = self::getAllErrorCodeTitles();
+            return $errorCodeTitles[$errorCode];
+        } else {
+            return Translate::addTagPrefix($errorCode, 'title_');
+        }
     }
 
 
@@ -167,8 +178,12 @@ public static function getErrorCodeTitle($errorCode)
      */
     public static function getErrorCodeDescription($errorCode)
     {
-        $errorCodeDescriptions = self::getAllErrorCodeDescriptions();
-        return $errorCodeDescriptions[$errorCode];
+        if (array_key_exists($errorCode, self::getAllErrorCodeTitles())) {
+            $errorCodeDescriptions = self::getAllErrorCodeDescriptions();
+            return $errorCodeDescriptions[$errorCode];
+        } else {
+            return Translate::addTagPrefix($errorCode, 'descr_');
+        }
     }
 
 
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Exception.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Exception.php
index 4133e513c4307d667319bedc5a99ecc0461c19e4..9af638d9efa94c34aef98d89cda3a3f2fc12327e 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Exception.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/Exception.php
@@ -1,9 +1,12 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 use SimpleSAML\Configuration;
 use SimpleSAML\Logger;
+use Throwable;
 
 /**
  * Base class for SimpleSAMLphp Exceptions
@@ -22,7 +25,7 @@ class Exception extends \Exception
      * We need to save the backtrace, since we cannot rely on
      * serializing the Exception::trace-variable.
      *
-     * @var array
+     * @var array<int, string>
      */
     private $backtrace = [];
 
@@ -30,7 +33,7 @@ class Exception extends \Exception
     /**
      * The cause of this exception.
      *
-     * @var Exception|null
+     * @var \SimpleSAML\Error\Exception|null
      */
     private $cause = null;
 
@@ -43,9 +46,9 @@ class Exception extends \Exception
      *
      * @param string         $message Exception message
      * @param int            $code Error code
-     * @param \Exception|null $cause The cause of this exception.
+     * @param \Throwable|null $cause The cause of this exception.
      */
-    public function __construct($message, $code = 0, \Exception $cause = null)
+    public function __construct(string $message, int $code = 0, Throwable $cause = null)
     {
         assert(is_string($message));
         assert(is_int($code));
@@ -63,11 +66,11 @@ public function __construct($message, $code = 0, \Exception $cause = null)
     /**
      * Convert any exception into a \SimpleSAML\Error\Exception.
      *
-     * @param \Exception $e The exception.
+     * @param \Throwable $e The exception.
      *
-     * @return Exception The new exception.
+     * @return \SimpleSAML\Error\Exception The new exception.
      */
-    public static function fromException(\Exception $e)
+    public static function fromException(Throwable $e): Exception
     {
         if ($e instanceof Exception) {
             return $e;
@@ -79,10 +82,10 @@ public static function fromException(\Exception $e)
     /**
      * Load the backtrace from the given exception.
      *
-     * @param \Exception $exception The exception we should fetch the backtrace from.
+     * @param \Throwable $exception The exception we should fetch the backtrace from.
      * @return void
      */
-    protected function initBacktrace(\Exception $exception)
+    protected function initBacktrace(Throwable $exception): void
     {
         $this->backtrace = [];
 
@@ -122,9 +125,9 @@ public function getBacktrace()
     /**
      * Retrieve the cause of this exception.
      *
-     * @return Exception|null The cause of this exception.
+     * @return \Throwable|null The cause of this exception.
      */
-    public function getCause()
+    public function getCause(): ?Throwable
     {
         return $this->cause;
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/InvalidCredential.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/InvalidCredential.php
index 98d3b85d7b993e0ea9d1e0816dd3778c56548f54..35b991ef00c7e548e61c8e04d2c4adbf21186783 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/InvalidCredential.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/InvalidCredential.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/MetadataNotFound.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/MetadataNotFound.php
index 47636bc215e7029b885a330342cd31561cc56076..9eabf67af9837c6bfce51218653948b18d7e7dbd 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/MetadataNotFound.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/MetadataNotFound.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NoPassive.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NoPassive.php
index 43b42cf46b1110e3e4787adfdf5b36aa1e6668b0..5687adffd47abc0211f492a38d498192e440947d 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NoPassive.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NoPassive.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NoState.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NoState.php
index d0281beb01eb4d6bc0c2a8dcbb4255d042947adf..599bd1cb2d3f7e1a410b5dff9c8421d83247ea51 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NoState.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NoState.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NotFound.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NotFound.php
index ed556a38cf985333612a614384c72d70cc961554..0a5f72e0fa91ef18201f40de4330c0e14b500c4e 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NotFound.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/NotFound.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 use SimpleSAML\Utils;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ProxyCountExceeded.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ProxyCountExceeded.php
index 6b325f3b61a59d4d5ae6bd064e65ae46e13ab48c..a92844f2ee691b95c7610ca7720142962f4d8896 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ProxyCountExceeded.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/ProxyCountExceeded.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UnserializableException.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UnserializableException.php
index 6ac5b39fff3fd5ab76cfe2babe80c25bd81a158e..5c7d21206e884900c903362fe20a5a4ed35eaff5 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UnserializableException.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UnserializableException.php
@@ -1,7 +1,12 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
+use PDOException;
+use Throwable;
+
 /**
  * Class for saving normal exceptions for serialization.
  *
@@ -28,17 +33,17 @@ class UnserializableException extends Exception
     /**
      * Create a serializable exception representing an unserializable exception.
      *
-     * @param \Exception $original  The original exception.
+     * @param \Throwable $original  The original exception.
      */
-    public function __construct(\Exception $original)
+    public function __construct(Throwable $original)
     {
 
         $this->class = get_class($original);
         $msg = $original->getMessage();
         $code = $original->getCode();
 
-        if ($original instanceof \PDOException) {
-            // PDOException uses a string as the code. Filter it out here.
+        if (!is_int($code)) {
+            // PDOException and possibly others use a string for the code. Filter it out here.
             $code = -1;
         }
 
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/User.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/User.php
index b2da0e47e1a644ba4df559616cc44d8b8829acc7..4f90141b41f1c9026655cb21e6e3d0d1d1987e37 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/User.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/User.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserAborted.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserAborted.php
index 7be00d20ee67a3ba621b8122b749ea11e2028c0f..e4926f636993f443555cca656b849f6bfb9763dd 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserAborted.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserAborted.php
@@ -1,7 +1,11 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
+use Throwable;
+
 /**
  * Exception indicating user aborting the authentication process.
  *
@@ -13,9 +17,9 @@ class UserAborted extends Error
     /**
      * Create the error
      *
-     * @param \Exception|null $cause  The exception that caused this error.
+     * @param \Throwable|null $cause  The exception that caused this error.
      */
-    public function __construct(\Exception $cause = null)
+    public function __construct(Throwable $cause = null)
     {
         parent::__construct('USERABORTED', $cause);
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserNotFound.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserNotFound.php
index 14e55078644b47719645733fff5b70e0b2a749cb..a381beed271a5bc00873f7c8f19fa9948fb53580 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserNotFound.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Error/UserNotFound.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Error;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/Router.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/Router.php
deleted file mode 100644
index 48d0155e0d485510550361e3f10da8696d37e341..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/Router.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-
-namespace SimpleSAML\HTTP;
-
-use SimpleSAML\Configuration;
-use SimpleSAML\Module\ControllerResolver;
-use SimpleSAML\Session;
-use Symfony\Component\EventDispatcher\EventDispatcher;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\RequestStack;
-use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
-use Symfony\Component\HttpKernel\HttpKernel;
-use Symfony\Component\Routing\RequestContext;
-
-/**
- * Class that routes requests to responses.
- *
- * @package SimpleSAML
- */
-class Router
-{
-    /** @var \Symfony\Component\HttpKernel\Controller\ArgumentResolver */
-    protected $arguments;
-
-    /** @var \SimpleSAML\Configuration|null */
-    protected $config = null;
-
-    /** @var \Symfony\Component\Routing\RequestContext */
-    protected $context;
-
-    /** @var \Symfony\Component\EventDispatcher\EventDispatcher */
-    protected $dispatcher;
-
-    /** @var \Symfony\Component\HttpFoundation\Request|null */
-    protected $request = null;
-
-    /** @var \SimpleSAML\Module\ControllerResolver */
-    protected $resolver;
-
-    /** @var \SimpleSAML\Session|null */
-    protected $session = null;
-
-    /** @var \Symfony\Component\HttpFoundation\RequestStack|null */
-    protected $stack = null;
-
-
-    /**
-     * Router constructor.
-     *
-     * @param string $module
-     */
-    public function __construct($module)
-    {
-        $this->arguments = new ArgumentResolver();
-        $this->context = new RequestContext();
-        $this->resolver = new ControllerResolver($module);
-        $this->dispatcher = new EventDispatcher();
-    }
-
-
-    /**
-     * Process a given request.
-     *
-     * If no specific arguments are given, the default instances will be used (configuration, session, etc).
-     *
-     * @param \Symfony\Component\HttpFoundation\Request|null $request
-     *     The request to process. Defaults to the current one.
-     *
-     * @return \Symfony\Component\HttpFoundation\Response A response suitable for the given request.
-     *
-     * @throws \Exception If an error occurs.
-     */
-    public function process(Request $request = null)
-    {
-        if ($this->config === null) {
-            $this->setConfiguration(Configuration::getInstance());
-        }
-        if ($this->session === null) {
-            $this->setSession(Session::getSessionFromRequest());
-        }
-
-        if ($request === null) {
-            $this->request = Request::createFromGlobals();
-        } else {
-            $this->request = $request;
-        }
-
-        $stack = new RequestStack();
-        $stack->push($this->request);
-        $this->context->fromRequest($this->request);
-        $kernel = new HttpKernel($this->dispatcher, $this->resolver, $stack, $this->resolver);
-        return $kernel->handle($this->request);
-    }
-
-
-    /**
-     * Send a given response to the browser.
-     *
-     * @param \Symfony\Component\HttpFoundation\Response $response The response to send.
-     * @return void
-     */
-    public function send(Response $response)
-    {
-        if ($this->request === null) {
-            throw new \Exception("No request found to respond to");
-        }
-        $response->prepare($this->request);
-        $response->send();
-    }
-
-
-    /**
-     * Set the configuration to use by the controller.
-     *
-     * @param \SimpleSAML\Configuration $config
-     * @return void
-     */
-    public function setConfiguration(Configuration $config)
-    {
-        $this->config = $config;
-        $this->resolver->setConfiguration($config);
-    }
-
-
-    /**
-     * Set the session to use by the controller.
-     *
-     * @param \SimpleSAML\Session $session
-     * @return void
-     */
-    public function setSession(Session $session)
-    {
-        $this->session = $session;
-        $this->resolver->setSession($session);
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/RunnableResponse.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/RunnableResponse.php
index e019bd15d577e9e32b3169915c4e24a3141e761c..7ed7aad471a2266e710c39a6c4d7db9be7c2c178 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/RunnableResponse.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/HTTP/RunnableResponse.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\HTTP;
 
 use Symfony\Component\HttpFoundation\Response;
@@ -61,7 +63,9 @@ public function getArguments()
     /**
      * "Send" this response by actually running the callable.
      *
-     * @return self
+     * @return $this
+     *
+     * Note: No return-type possible due to upstream limitations
      */
     public function sendContent()
     {
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP.php
index e11926a78f02a77f1991617f55ba781eb27e2c0e..e25858dfb87ed27b4d5b41d67c2ae804a46f036e 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 use SAML2\Constants as SAML2;
@@ -64,10 +66,8 @@ class IdP
      *
      * @throws \SimpleSAML\Error\Exception If the IdP is disabled or no such auth source was found.
      */
-    private function __construct($id)
+    private function __construct(string $id)
     {
-        assert(is_string($id));
-
         $this->id = $id;
         $this->associationGroup = $id;
 
@@ -348,7 +348,7 @@ public static function postAuth(array $state)
      * @throws \SimpleSAML\Module\saml\Error\NoPassive If we were asked to do passive authentication.
      * @return void
      */
-    private function authenticate(array &$state)
+    private function authenticate(array &$state): void
     {
         if (isset($state['isPassive']) && (bool) $state['isPassive']) {
             throw new NoPassive(SAML2::STATUS_RESPONDER, 'Passive authentication not supported.');
@@ -371,7 +371,7 @@ private function authenticate(array &$state)
      * @throws \Exception If there is no auth source defined for this IdP.
      * @return void
      */
-    private function reauthenticate(array &$state)
+    private function reauthenticate(array &$state): void
     {
         $sourceImpl = $this->authSource->getAuthSource();
         $sourceImpl->reauthenticate($state);
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/IFrameLogoutHandler.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/IFrameLogoutHandler.php
index 2597fdbabf62e99cbdf7277c90c69efc6d8fef9e..c315cc82f27625fc9007d7b9b8226d98f95bf705 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/IFrameLogoutHandler.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/IFrameLogoutHandler.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\IdP;
 
 use SimpleSAML\Auth;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/LogoutHandlerInterface.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/LogoutHandlerInterface.php
index fe52c00415a614b63e8d90ed32f526ebf2bffee2..c072456c9b3ccebc5551161e7a3b7a904f05eb14 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/LogoutHandlerInterface.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/LogoutHandlerInterface.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\IdP;
 
 use SimpleSAML\Error;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/TraditionalLogoutHandler.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/TraditionalLogoutHandler.php
index 9c18499364c707af8c95ad31a0e99e84e3327495..da51e0013936391cbfb8d5eae628b8fcc2fa83fc 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/TraditionalLogoutHandler.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/IdP/TraditionalLogoutHandler.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\IdP;
 
 use SimpleSAML\Auth;
@@ -43,7 +45,7 @@ public function __construct(IdP $idp)
      * @param array &$state The logout state.
      * @return void
      */
-    private function logoutNextSP(array &$state)
+    private function logoutNextSP(array &$state): void
     {
         $association = array_pop($state['core:LogoutTraditional:Remaining']);
         if ($association === null) {
@@ -109,6 +111,7 @@ public function onResponse($assocId, $relayState, Error\Exception $error = null)
             throw new Error\Exception('RelayState lost during logout.');
         }
 
+        /** @psalm-var array $state */
         $state = Auth\State::loadState($relayState, 'core:LogoutTraditional');
 
         if ($error === null) {
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Kernel.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Kernel.php
new file mode 100644
index 0000000000000000000000000000000000000000..e2d72098519bd4b57c1f76bcd3c74f4a17022051
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Kernel.php
@@ -0,0 +1,177 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SimpleSAML;
+
+use SimpleSAML\Utils\System;
+use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
+use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
+use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Loader\DirectoryLoader;
+use Symfony\Component\HttpKernel\Kernel as BaseKernel;
+use Symfony\Component\Routing\RouteCollectionBuilder;
+
+/**
+ * A class to create the container and handle a given request.
+ */
+class Kernel extends BaseKernel
+{
+    use MicroKernelTrait;
+
+    public const CONFIG_EXTS = '.{php,xml,yaml,yml}';
+
+    /**
+     * @var string
+     */
+    private $module;
+
+
+    /**
+     * @param string $module
+     */
+    public function __construct($module)
+    {
+        $this->module = $module;
+
+        $env = getenv('APP_ENV') ?: (getenv('SYMFONY_ENV') ?: 'prod');
+
+        parent::__construct($env, false);
+    }
+
+
+    /**
+     * @return string
+     */
+    public function getCacheDir()
+    {
+        $configuration = Configuration::getInstance();
+        $cachePath = $configuration->getString('tempdir') . '/cache/' . $this->module;
+
+        if (System::isAbsolutePath($cachePath)) {
+            return $cachePath;
+        }
+
+        return $configuration->getBaseDir() . '/' . $cachePath;
+    }
+
+
+    /**
+     * @return string
+     */
+    public function getLogDir()
+    {
+        $configuration = Configuration::getInstance();
+        $loggingPath = $configuration->getString('loggingdir');
+
+        if (System::isAbsolutePath($loggingPath)) {
+            return $loggingPath;
+        }
+
+        return $configuration->getBaseDir() . '/' . $loggingPath;
+    }
+
+
+    /**
+     * {@inheritdoc}
+     */
+    public function registerBundles()
+    {
+        return [
+            new FrameworkBundle(),
+        ];
+    }
+
+
+    /**
+     * Get the module loaded in this kernel.
+     *
+     * @return string
+     */
+    public function getModule()
+    {
+        return $this->module;
+    }
+
+
+    /**
+     * Configures the container.
+     *
+     * @param ContainerBuilder $container
+     * @param LoaderInterface $loader
+     * @return void
+     */
+    protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
+    {
+        $configuration = Configuration::getInstance();
+        $baseDir = $configuration->getBaseDir();
+        $loader->load($baseDir . '/routing/services/*' . self::CONFIG_EXTS, 'glob');
+        $confDir = Module::getModuleDir($this->module) . '/routing/services';
+        if (is_dir($confDir)) {
+            $loader->load($confDir . '/**/*' . self::CONFIG_EXTS, 'glob');
+        }
+
+        $c->loadFromExtension('framework', [
+            'secret' => Configuration::getInstance()->getString('secretsalt'),
+        ]);
+
+        $this->registerModuleControllers($c);
+    }
+
+
+    /**
+     * Import routes.
+     *
+     * @param RouteCollectionBuilder $routes
+     * @return void
+     */
+    protected function configureRoutes(RouteCollectionBuilder $routes)
+    {
+        $configuration = Configuration::getInstance();
+        $baseDir = $configuration->getBaseDir();
+        $routes->import($baseDir . '/routing/routes/*' . self::CONFIG_EXTS, '/', 'glob');
+        $confDir = Module::getModuleDir($this->module) . '/routing/routes';
+        if (is_dir($confDir)) {
+            $routes->import($confDir . '/**/*' . self::CONFIG_EXTS, $this->module, 'glob');
+        } else {
+            // Remain backwards compatible by checking for routers in the old location (1.18 style)
+            $confDir = Module::getModuleDir($this->module);
+            $routes->import($confDir . '/routes' . self::CONFIG_EXTS, $this->module, 'glob');
+        }
+    }
+
+
+    /**
+     * @param ContainerBuilder $container
+     * @return void
+     */
+    private function registerModuleControllers(ContainerBuilder $container): void
+    {
+        try {
+            $definition = new Definition();
+            $definition->setAutowired(true);
+            $definition->setPublic(true);
+
+            $controllerDir = Module::getModuleDir($this->module) . '/lib/Controller';
+
+            if (!is_dir($controllerDir)) {
+                return;
+            }
+
+            $loader = new DirectoryLoader(
+                $container,
+                new FileLocator($controllerDir . '/')
+            );
+            $loader->registerClasses(
+                $definition,
+                'SimpleSAML\\Module\\' . $this->module . '\\Controller\\',
+                $controllerDir . '/*'
+            );
+        } catch (FileLocatorFileNotFoundException $e) {
+        }
+    }
+}
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Language.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Language.php
index 7dd64dc07e3ff2546a3bc0e77e1f119032a206e9..2225c03cd3c1f741dcb631eba8fad0c04fc5f2c8 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Language.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Language.php
@@ -8,6 +8,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Locale;
 
 use SimpleSAML\Configuration;
@@ -122,6 +124,7 @@ class Language
         'af'    => 'Afrikaans', // Afrikaans
         'zu'    => 'IsiZulu', // Zulu
         'xh'    => 'isiXhosa', // Xhosa
+        'st'    => 'Sesotho', // Sesotho
     ];
 
     /**
@@ -162,7 +165,7 @@ public function __construct(Configuration $configuration)
      *
      * @return array The set of languages both in 'language.available' and self::$language_names.
      */
-    private function getInstalledLanguages()
+    private function getInstalledLanguages(): array
     {
         $configuredAvailableLanguages = $this->configuration->getArray('language.available', ['en']);
         $availableLanguages = [];
@@ -287,7 +290,7 @@ public function getLanguageParameterName()
      * @return string|null The preferred language based on the Accept-Language HTTP header,
      * or null if none of the languages in the header is available.
      */
-    private function getHTTPLanguage()
+    private function getHTTPLanguage(): ?string
     {
         $languageScore = Utils\HTTP::getAcceptLanguage();
 
@@ -420,7 +423,7 @@ public static function setLanguageCookie($language)
         $name = $config->getString('language.cookie.name', 'language');
         $params = [
             'lifetime' => ($config->getInteger('language.cookie.lifetime', 60 * 60 * 24 * 900)),
-            'domain'   => ($config->getString('language.cookie.domain', null)),
+            'domain'   => strval($config->getString('language.cookie.domain', null)),
             'path'     => ($config->getString('language.cookie.path', '/')),
             'secure'   => ($config->getBoolean('language.cookie.secure', false)),
             'httponly' => ($config->getBoolean('language.cookie.httponly', false)),
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Localization.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Localization.php
index 7e73ca7805dc0aeb2fd1d1aad05c0c5af964fd64..9b5d4383b0f0f69afaa9cc46da7bd791f22b0e2a 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Localization.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Localization.php
@@ -7,6 +7,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Locale;
 
 use Gettext\Translations;
@@ -28,21 +30,21 @@ class Localization
      *
      * @var string
      */
-    const DEFAULT_DOMAIN = 'messages';
+    public const DEFAULT_DOMAIN = 'messages';
 
     /**
      * Old internationalization backend included in SimpleSAMLphp.
      *
      * @var string
      */
-    const SSP_I18N_BACKEND = 'SimpleSAMLphp';
+    public const SSP_I18N_BACKEND = 'SimpleSAMLphp';
 
     /**
      * An internationalization backend implemented purely in PHP.
      *
      * @var string
      */
-    const GETTEXT_I18N_BACKEND = 'gettext/gettext';
+    public const GETTEXT_I18N_BACKEND = 'gettext/gettext';
 
     /**
      * The default locale directory
@@ -219,7 +221,7 @@ public function getLangPath($domain = self::DEFAULT_DOMAIN)
      * Setup the translator
      * @return void
      */
-    private function setupTranslator()
+    private function setupTranslator(): void
     {
         $this->translator = new Translator();
         $this->translator->register();
@@ -238,7 +240,7 @@ private function setupTranslator()
      *
      * @throws \Exception If something is wrong with the locale file for the domain and activated language
      */
-    private function loadGettextGettextFromPO($domain = self::DEFAULT_DOMAIN, $catchException = true)
+    private function loadGettextGettextFromPO(string $domain = self::DEFAULT_DOMAIN, bool $catchException = true): void
     {
         try {
             $langPath = $this->getLangPath($domain);
@@ -284,7 +286,7 @@ public function isI18NBackendDefault()
      * Set up L18N if configured or fallback to old system
      * @return void
      */
-    private function setupL10N()
+    private function setupL10N(): void
     {
         if ($this->i18nBackend === self::SSP_I18N_BACKEND) {
             Logger::debug("Localization: using old system");
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Translate.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Translate.php
index 0d0475edfe74bdb1ed9fb61eefffc86b64bd0698..93d49596a80b5ad12fdefd91598f2e976d3befb1 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Translate.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Locale/Translate.php
@@ -8,6 +8,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Locale;
 
 use Gettext\BaseTranslator;
@@ -56,7 +58,7 @@ class Translate
      * Constructor
      *
      * @param \SimpleSAML\Configuration $configuration Configuration object
-     * @param string|null               $defaultDictionary The default dictionary where tags will come from.
+     * @param string|null $defaultDictionary The default dictionary where tags will come from.
      */
     public function __construct(Configuration $configuration, $defaultDictionary = null)
     {
@@ -97,10 +99,8 @@ public function getLanguage()
      *
      * @return array An associative array with the dictionary.
      */
-    private function getDictionary($name)
+    private function getDictionary(string $name): array
     {
-        assert(is_string($name));
-
         if (!array_key_exists($name, $this->dictionaries)) {
             $sepPos = strpos($name, ':');
             if ($sepPos !== false) {
@@ -230,7 +230,7 @@ public function getAttributeTranslation($name)
     /**
      * Mark a string for translation without translating it.
      *
-     * @param string  $tag A tag name to mark for translation.
+     * @param string $tag A tag name to mark for translation.
      *
      * @return string The tag, unchanged.
      */
@@ -261,7 +261,7 @@ public static function noop($tag)
      * @param bool $striptags
      * @deprecated Not used in twig, gettext
      *
-     * @return string|null  The translated tag, or a placeholder value if the tag wasn't found.
+     * @return string  The translated tag, or a placeholder value if the tag wasn't found.
      */
     public function t(
         $tag,
@@ -282,26 +282,6 @@ public function t(
                 ' identical to the $tag in 2.0.'
             );
         }
-        if (!is_array($replacements)) {
-            // TODO: remove this entire if for 2.0
-
-            // old style call to t(...). Print warning to log
-            Logger::warning(
-                'Deprecated use of SimpleSAML\Locale\Translate::t(...) at ' . $where .
-                '. Please update the code to use the new style of parameters.'
-            );
-
-            // for backwards compatibility
-            /** @psalm-suppress PossiblyInvalidArgument */
-            if (!$replacements && ($this->getTag($tag) === null)) {
-                Logger::warning(
-                    'Code which uses $fallbackdefault === FALSE should be updated to use the getTag() method instead.'
-                );
-                return null;
-            }
-
-            $replacements = $oldreplacements;
-        }
 
         if (is_array($tag)) {
             $tagData = $tag;
@@ -339,7 +319,7 @@ public function t(
      *
      * @return string The string that should be used, or the tag name if $fallbacktag is set to false.
      */
-    private function getStringNotTranslated($tag, $fallbacktag)
+    private function getStringNotTranslated(string $tag, bool $fallbacktag): string
     {
         if ($fallbacktag) {
             return 'not translated (' . $tag . ')';
@@ -376,7 +356,7 @@ public function includeInlineTranslation($tag, $translation)
     /**
      * Include a language file from the dictionaries directory.
      *
-     * @param string                         $file File name of dictionary to include
+     * @param string $file File name of dictionary to include
      * @param \SimpleSAML\Configuration|null $otherConfig Optionally provide a different configuration object than the
      * one provided in the constructor to be used to find the directory of the dictionary. This allows to combine
      * dictionaries inside the SimpleSAMLphp main code distribution together with external dictionaries. Defaults to
@@ -404,7 +384,7 @@ public function includeLanguageFile($file, $otherConfig = null)
      *
      * @return array An array holding all the translations in the file.
      */
-    private function readDictionaryJSON($filename)
+    private function readDictionaryJSON(string $filename): array
     {
         $definitionFile = $filename . '.definition.json';
         assert(file_exists($definitionFile));
@@ -436,7 +416,7 @@ private function readDictionaryJSON($filename)
      *
      * @return array An array holding all the translations in the file.
      */
-    private function readDictionaryPHP($filename)
+    private function readDictionaryPHP(string $filename): array
     {
         $phpFile = $filename . '.php';
         assert(file_exists($phpFile));
@@ -457,10 +437,8 @@ private function readDictionaryPHP($filename)
      *
      * @return array An array holding all the translations in the file.
      */
-    private function readDictionaryFile($filename)
+    private function readDictionaryFile(string $filename): array
     {
-        assert(is_string($filename));
-
         Logger::debug('Translate: Reading dictionary [' . $filename . ']');
 
         $jsonFile = $filename . '.definition.json';
@@ -490,7 +468,7 @@ public static function translateSingularGettext($original)
     {
         $text = BaseTranslator::$current->gettext($original);
 
-        if (func_num_args() === 1) {
+        if (func_num_args() === 1 || $original === null) {
             return $text;
         }
 
@@ -548,6 +526,7 @@ public static function translateFromArray($context, $translations)
 
         // we don't have a translation for the current language, load alternative priorities
         $sspcfg = Configuration::getInstance();
+        /** @psalm-var \SimpleSAML\Configuration $langcfg */
         $langcfg = $sspcfg->getConfigItem('language');
         $priorities = $langcfg->getArray('priorities', []);
 
@@ -562,4 +541,21 @@ public static function translateFromArray($context, $translations)
         // nothing we can use, return null so that we can set a default
         return null;
     }
+
+    /**
+     * Prefix tag
+     *
+     * @param string $tag Translation tag
+     * @param string $prefix Prefix to be added
+     *
+     * @return string Prefixed tag
+     */
+    public static function addTagPrefix(string $tag, string $prefix): string
+    {
+        $tagPos = strrpos($tag, ':');
+        // if tag contains ':' target actual tag
+        $tagPos = ($tagPos === false) ? 0 : $tagPos + 1;
+        // add prefix at $tagPos
+        return substr_replace($tag, $prefix, $tagPos, 0);
+    }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger.php
index 69d38ca699cf22a10964c26a980c604102a005e9..048cf165d4122a02ebe1d7fc7cae211edb1fd709 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 use SimpleSAML\Logger\ErrorLogLoggingHandler;
@@ -71,7 +73,7 @@ class Logger
      *
      * @var string
      */
-    const NO_TRACKID = '_NOTRACKIDYET_';
+    public const NO_TRACKID = '_NOTRACKIDYET_';
 
     /**
      * This variable holds the track ID we have retrieved from the session class. It can also be NULL, in which case
@@ -126,28 +128,28 @@ class Logger
     private static $shuttingDown = false;
 
     /** @var int */
-    const EMERG = 0;
+    public const EMERG = 0;
 
     /** @var int */
-    const ALERT = 1;
+    public const ALERT = 1;
 
     /** @var int */
-    const CRIT = 2;
+    public const CRIT = 2;
 
     /** @var int */
-    const ERR = 3;
+    public const ERR = 3;
 
     /** @var int */
-    const WARNING = 4;
+    public const WARNING = 4;
 
     /** @var int */
-    const NOTICE = 5;
+    public const NOTICE = 5;
 
     /** @var int */
-    const INFO = 6;
+    public const INFO = 6;
 
     /** @var int */
-    const DEBUG = 7;
+    public const DEBUG = 7;
 
 
     /**
@@ -255,7 +257,7 @@ public static function debug($string)
      */
     public static function stats($string)
     {
-        self::log(self::NOTICE, $string, true);
+        self::log(self::NOTICE, $string, self::$logLevel >= self::NOTICE);
     }
 
 
@@ -389,7 +391,7 @@ public static function popErrorMask()
      * @param boolean $stats Whether this is a stats message or a regular one.
      * @return void
      */
-    private static function defer($level, $message, $stats)
+    private static function defer(int $level, string $message, bool $stats): void
     {
         // save the message for later
         self::$earlyLog[] = ['level' => $level, 'string' => $message, 'statsLog' => $stats];
@@ -407,7 +409,7 @@ private static function defer($level, $message, $stats)
      * @return void
      * @throws \Exception
      */
-    private static function createLoggingHandler($handler = null)
+    private static function createLoggingHandler(string $handler = null): void
     {
         self::$initializing = true;
 
@@ -466,7 +468,7 @@ private static function createLoggingHandler($handler = null)
      * @param bool $statsLog
      * @return void
      */
-    private static function log($level, $string, $statsLog = false)
+    private static function log(int $level, string $string, bool $statsLog = false): void
     {
         if (self::$initializing) {
             // some error occurred while initializing logging
@@ -487,17 +489,17 @@ private static function log($level, $string, $statsLog = false)
         }
 
         if (self::$captureLog) {
-            $ts = microtime(true);
-            $msecs = (int) (($ts - (int) $ts) * 1000);
-            $ts = gmdate('H:i:s', $ts) . sprintf('.%03d', $msecs) . 'Z';
+            $sample = microtime(false);
+            list($msecs, $mtime) = explode(' ', $sample);
+
+            $time = intval($mtime);
+            $usec = substr($msecs, 2, 3);
+
+            $ts = gmdate('H:i:s', $time) . '.' . $usec . 'Z';
             self::$capturedLog[] = $ts . ' ' . $string;
         }
 
         if (self::$logLevel >= $level || $statsLog) {
-            if (is_array($string)) {
-                $string = implode(",", $string);
-            }
-
             $formats = ['%trackid', '%msg', '%srcip', '%stat'];
             $replacements = [self::$trackid, $string, $_SERVER['REMOTE_ADDR']];
 
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/ErrorLogLoggingHandler.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/ErrorLogLoggingHandler.php
index 07bfea093e2e7ec3bac7e7ac2e780008c7a5a7a5..83bae04a2a873942ad50cf9b435d6c3f1aa6cde7 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/ErrorLogLoggingHandler.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/ErrorLogLoggingHandler.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Logger;
 
 use SimpleSAML\Configuration;
@@ -46,7 +48,8 @@ class ErrorLogLoggingHandler implements LoggingHandlerInterface
      */
     public function __construct(Configuration $config)
     {
-        $this->processname = $config->getString('logging.processname', 'SimpleSAMLphp');
+        // Remove any non-printable characters before storing
+        $this->processname = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $config->getString('logging.processname', 'SimpleSAMLphp'));
     }
 
 
@@ -80,7 +83,6 @@ public function log($level, $string)
         $formats = ['%process', '%level'];
         $replacements = [$this->processname, $levelName];
         $string = str_replace($formats, $replacements, $string);
-        $string = preg_replace('/%\w+(\{[^\}]+\})?/', '', $string);
         $string = trim($string);
 
         error_log($string);
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/FileLoggingHandler.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/FileLoggingHandler.php
index b7d041a03d016fb452dde193bfb28e0fbebe89f0..c07ec21feea0c3e568fc88857287c0805c9067d8 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/FileLoggingHandler.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/FileLoggingHandler.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Logger;
 
 use SimpleSAML\Configuration;
@@ -55,7 +57,9 @@ public function __construct(Configuration $config)
         // get the metadata handler option from the configuration
         $this->logFile = $config->getPathValue('loggingdir', 'log/') .
             $config->getString('logging.logfile', 'simplesamlphp.log');
-        $this->processname = $config->getString('logging.processname', 'SimpleSAMLphp');
+
+        // Remove any non-printable characters before storing
+        $this->processname = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $config->getString('logging.processname', 'SimpleSAMLphp'));
 
         if (@file_exists($this->logFile)) {
             if (!@is_writeable($this->logFile)) {
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerInterface.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerInterface.php
index 3d00324e5e21b1e649f81e9eeffc6cd8d284f54a..3681c26248fc3e9b07b2b36ec62da9483d1e9bf7 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerInterface.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerInterface.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Logger;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/StandardErrorLoggingHandler.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/StandardErrorLoggingHandler.php
index ecc028bf0e0e301a13bb5f149100501c1d76403b..9a803d1f29a4a37d1eda16445a0cdca742dd6dad 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/StandardErrorLoggingHandler.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/StandardErrorLoggingHandler.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Logger;
 
 use SimpleSAML\Configuration;
@@ -21,7 +23,8 @@ class StandardErrorLoggingHandler extends FileLoggingHandler
      */
     public function __construct(Configuration $config)
     {
-        $this->processname = $config->getString('logging.processname', 'SimpleSAMLphp');
+        // Remove any non-printable characters before storing
+        $this->processname = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $config->getString('logging.processname', 'SimpleSAMLphp'));
         $this->logFile = 'php://stderr';
     }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/SyslogLoggingHandler.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/SyslogLoggingHandler.php
index a5cfa6bc0692809b46792163b52afcc8270a82ca..ac52801aa5e787d86165d27d2bf1d10040d819f4 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/SyslogLoggingHandler.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Logger/SyslogLoggingHandler.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Logger;
 
 use SimpleSAML\Configuration;
@@ -29,7 +31,8 @@ public function __construct(Configuration $config)
     {
         $facility = $config->getInteger('logging.facility', defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : LOG_USER);
 
-        $processname = $config->getString('logging.processname', 'SimpleSAMLphp');
+        // Remove any non-printable characters before storing
+        $processname = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $config->getString('logging.processname', 'SimpleSAMLphp'));
 
         // Setting facility to LOG_USER (only valid in Windows), enable log level rewrite on windows systems
         if (Utils\System::getOS() === Utils\System::WINDOWS) {
@@ -74,8 +77,7 @@ public function log($level, $string)
         $formats = ['%process', '%level'];
         $replacements = ['', $level];
         $string = str_replace($formats, $replacements, $string);
-        $string = preg_replace('/%\w+(\{[^\}]+\})?/', '', $string);
-        $string = trim($string);
+        $string = preg_replace('/^%date(\{[^\}]+\})?\s*/', '', $string);
 
         syslog($level, $string);
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Memcache.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Memcache.php
index 98337e63a0f657dce450dff03d754dec64e95f1c..96d6a2af6e373f22c9b6ea90e5a9df14aa43d26a 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Memcache.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Memcache.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 use SimpleSAML\Utils;
@@ -62,7 +64,7 @@ public static function get($key)
             if ($serializedInfo === false) {
                 // either the server is down, or we don't have the value stored on that server
                 $mustUpdate = true;
-                $up = $server->getStats();
+                $up = $server->getVersion();
                 if ($up !== false) {
                     $allDown = false;
                 }
@@ -218,7 +220,7 @@ public static function delete($key)
      *
      * @throws \Exception If any configuration option for the server is invalid.
      */
-    private static function addMemcacheServer($memcache, $server)
+    private static function addMemcacheServer($memcache, array $server): void
     {
         // the hostname option is required
         if (!array_key_exists('hostname', $server)) {
@@ -309,7 +311,7 @@ private static function addMemcacheServer($memcache, $server)
      *
      * @throws \Exception If the servers configuration is invalid.
      */
-    private static function loadMemcacheServerGroup(array $group, $index = null)
+    private static function loadMemcacheServerGroup(array $group, string $index = null)
     {
         if (class_exists(\Memcached::class)) {
             if (is_string($index)) {
@@ -379,7 +381,7 @@ private static function loadMemcacheServerGroup(array $group, $index = null)
      *
      * @throws \Exception If the servers configuration is invalid.
      */
-    private static function getMemcacheServers()
+    private static function getMemcacheServers(): array
     {
         // check if we have loaded the servers already
         if (self::$serverGroups != null) {
@@ -434,7 +436,7 @@ private static function getMemcacheServers()
      *
      * @throws \Exception If the option 'memcache_store.expires' has a negative value.
      */
-    private static function getExpireTime()
+    private static function getExpireTime(): int
     {
         // get the configuration instance
         $config = Configuration::getInstance();
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php
index 5e77a43bbbfcf2e1a63244314040b91b5d90f1b5..98548235911f63fb266a46dfb9ff32ed8e8f0bcb 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Metadata;
 
 use SAML2\Constants;
@@ -287,6 +289,7 @@ public function getMetaDataForEntities(array $entityIds, $set)
                     }
                 }
                 // We found the entity id so remove it from the list that needs resolving
+                /** @psalm-suppress PossiblyInvalidArrayOffset */
                 unset($entityIds[array_search($key, $entityIds)]);
             }
             $result = array_merge($srcList, $result);
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php
index 9f15a11f3ac27eab5a61242fc5a377096337ee36..e5d2c18c1195fd3d4832899a7d3d0c997095bc71 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Metadata;
 
 use SimpleSAML\Configuration;
@@ -75,7 +77,7 @@ protected function __construct($config)
      *     or null if we are unable to load metadata from the given file.
      * @throws \Exception If the metadata set cannot be loaded.
      */
-    private function load($set)
+    private function load(string $set): ?array
     {
         $metadatasetfile = $this->directory . $set . '.php';
 
@@ -83,6 +85,7 @@ private function load($set)
             return null;
         }
 
+        /** @psalm-var mixed $metadata   We cannot be sure what the include below will do with this var */
         $metadata = [];
 
         include($metadatasetfile);
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php
index c6f6c3aed44185f3d7d75ea1906af669f7883abf..bee87c05bbc0738fc9352d7bc1661e0c744722b1 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Metadata;
 
 use SimpleSAML\Database;
@@ -79,10 +81,8 @@ public function __construct($config)
      * @throws \Exception If a database error occurs.
      * @throws \SimpleSAML\Error\Exception If the metadata can be retrieved from the database, but cannot be decoded.
      */
-    private function load($set)
+    private function load(string $set): ?array
     {
-        assert(is_string($set));
-
         $tableName = $this->getTableName($set);
 
         if (!in_array($set, $this->supportedSets, true)) {
@@ -145,15 +145,15 @@ public function getMetadataSet($set)
     /**
      * Retrieve a metadata entry.
      *
-     * @param string $entityId The entityId we are looking up.
+     * @param string $index The entityId we are looking up.
      * @param string $set The set we are looking for metadata in.
      *
      * @return array|null An associative array with metadata for the given entity, or NULL if we are unable to
      *         locate the entity.
      */
-    public function getMetaData($entityId, $set)
+    public function getMetaData($index, $set)
     {
-        assert(is_string($entityId));
+        assert(is_string($index));
         assert(is_string($set));
 
         // validate the metadata set is valid
@@ -162,8 +162,8 @@ public function getMetaData($entityId, $set)
         }
 
         // support caching
-        if (isset($this->cachedMetadata[$entityId][$set])) {
-            return $this->cachedMetadata[$entityId][$set];
+        if (isset($this->cachedMetadata[$index][$set])) {
+            return $this->cachedMetadata[$index][$set];
         }
 
         $tableName = $this->getTableName($set);
@@ -176,13 +176,13 @@ public function getMetaData($entityId, $set)
             $stmt = $this->db->read(
                 "SELECT entity_id, entity_data FROM {$tableName} "
                 . "WHERE (entity_id LIKE :dynamicId OR entity_id = :entityId)",
-                ['dynamicId' => '__DYNAMIC%', 'entityId' => $entityId]
+                ['dynamicId' => '__DYNAMIC%', 'entityId' => $index]
             );
         } else {
             // other metadata types should be able to match on entity id
             $stmt = $this->db->read(
                 "SELECT entity_id, entity_data FROM {$tableName} WHERE entity_id = :entityId",
-                ['entityId' => $entityId]
+                ['entityId' => $index]
             );
         }
 
@@ -204,10 +204,10 @@ public function getMetaData($entityId, $set)
             }
 
             // update the entity id to either the key (if not dynamic or generate the dynamic hosted url)
-            $metadataSet[$d['entity_id']] = $this->updateEntityID($set, $entityId, $data);
+            $metadataSet[$d['entity_id']] = $this->updateEntityID($set, $index, $data);
         }
 
-        $indexLookup = $this->lookupIndexFromEntityId($entityId, $metadataSet);
+        $indexLookup = $this->lookupIndexFromEntityId($index, $metadataSet);
         if (isset($indexLookup) && array_key_exists($indexLookup, $metadataSet)) {
             $this->cachedMetadata[$indexLookup][$set] = $metadataSet[$indexLookup];
             return $this->cachedMetadata[$indexLookup][$set];
@@ -275,10 +275,8 @@ public function addEntry($index, $set, $entityData)
      *
      * @return string Replaced table name
      */
-    private function getTableName($table)
+    private function getTableName(string $table): string
     {
-        assert(is_string($table));
-
         return $this->db->applyPrefix(str_replace("-", "_", $this->tablePrefix . $table));
     }
 
@@ -292,18 +290,28 @@ public function initDatabase()
     {
         $stmt = 0;
         $fine = true;
+        $driver = $this->db->getDriver();
+
+        $text = 'TEXT';
+        if ($driver === 'mysql') {
+            $text = 'MEDIUMTEXT';
+        }
+
         foreach ($this->supportedSets as $set) {
             $tableName = $this->getTableName($set);
-            $rows = $this->db->write(
-                "CREATE TABLE IF NOT EXISTS $tableName (entity_id VARCHAR(255) PRIMARY KEY NOT NULL, entity_data " .
-                "TEXT NOT NULL)"
-            );
+            $rows = $this->db->write(sprintf(
+                "CREATE TABLE IF NOT EXISTS $tableName (entity_id VARCHAR(255) PRIMARY KEY NOT NULL, "
+                    . "entity_data %s NOT NULL)",
+                $text
+            ));
+
             if ($rows === false) {
                 $fine = false;
             } else {
                 $stmt += $rows;
             }
         }
+
         if (!$fine) {
             return false;
         }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php
index 85c2440d152e4014c1b892c2e8f14c33783f841f..af80ea187c8dc76ef3b19119c9b3a7f6a88b2786 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Metadata;
 
 use SimpleSAML\Configuration;
@@ -19,7 +21,7 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource
      *
      * @var string
      */
-    const EXTENSION = '.serialized';
+    public const EXTENSION = '.serialized';
 
 
     /**
@@ -62,11 +64,8 @@ public function __construct($config)
      *
      * @return string The path to the metadata file.
      */
-    private function getMetadataPath($entityId, $set)
+    private function getMetadataPath(string $entityId, string $set): string
     {
-        assert(is_string($entityId));
-        assert(is_string($set));
-
         return $this->directory . '/' . rawurlencode($set) . '/' . rawurlencode($entityId) . self::EXTENSION;
     }
 
@@ -169,18 +168,18 @@ public function getMetadataSet($set)
     /**
      * Retrieve a metadata entry.
      *
-     * @param string $entityId The entityId we are looking up.
+     * @param string $index The entityId we are looking up.
      * @param string $set The set we are looking for metadata in.
      *
      * @return array|null An associative array with metadata for the given entity, or NULL if we are unable to
      *         locate the entity.
      */
-    public function getMetaData($entityId, $set)
+    public function getMetaData($index, $set)
     {
-        assert(is_string($entityId));
+        assert(is_string($index));
         assert(is_string($set));
 
-        $filePath = $this->getMetadataPath($entityId, $set);
+        $filePath = $this->getMetadataPath($index, $set);
 
         if (!file_exists($filePath)) {
             return null;
@@ -203,7 +202,7 @@ public function getMetaData($entityId, $set)
         }
 
         if (!array_key_exists('entityid', $data)) {
-            $data['entityid'] = $entityId;
+            $data['entityid'] = $index;
         }
 
         return $data;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php
index 913397412fad3626c8bc8f4b05177b3d75563e5d..d1ae78c84b7511a583c6b0ee7ab49c473193aecc 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Metadata;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageSource.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageSource.php
index 5ba3fd19ffba28a9a71c49f8c5d9c2ffba7254c6..9117f800057e3c52d86511a35c0f418a06075589 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageSource.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageSource.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Metadata;
 
 use SimpleSAML\Error;
@@ -183,7 +185,7 @@ public function getPreferredEntityIdFromCIDRhint($set, $ip, $type = 'entityid')
 
         foreach ($metadataSet as $index => $entry) {
             $cidrHints = [];
-            
+
             // support hint.cidr for idp discovery
             if (array_key_exists('hint.cidr', $entry) && is_array($entry['hint.cidr'])) {
                 $cidrHints = $entry['hint.cidr'];
@@ -298,7 +300,6 @@ protected function getMetaDataForEntitiesIndividually(array $entityIds, $set)
     protected function lookupIndexFromEntityId($entityId, array $metadataSet)
     {
         assert(is_string($entityId));
-        assert(is_array($metadataSet));
 
         // check for hostname
         $currentHost = Utils\HTTP::getSelfHost(); // sp.example.org
@@ -324,10 +325,8 @@ protected function lookupIndexFromEntityId($entityId, array $metadataSet)
      * @throws \Exception
      * @return string
      */
-    private function getDynamicHostedUrl($set)
+    private function getDynamicHostedUrl(string $set): string
     {
-        assert(is_string($set));
-
         // get the configuration
         $baseUrl = Utils\HTTP::getBaseURL();
 
@@ -362,7 +361,6 @@ protected function updateEntityID($metadataSet, $entityId, array $metadataEntry)
     {
         assert(is_string($metadataSet));
         assert(is_string($entityId));
-        assert(is_array($metadataEntry));
 
         $modifiedMetadataEntry = $metadataEntry;
 
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/SAMLBuilder.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/SAMLBuilder.php
index 0752591bebfa117a5f34a071082e58966696e0e7..f038854a25f1ee50ce7476d8809da177352ebfb9 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/SAMLBuilder.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/SAMLBuilder.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Metadata;
 
 use SAML2\Constants;
@@ -86,7 +88,7 @@ public function __construct($entityId, $maxCache = null, $maxDuration = null)
      * @param array $metadata
      * @return void
      */
-    private function setExpiration($metadata)
+    private function setExpiration(array $metadata): void
     {
         if (array_key_exists('expire', $metadata)) {
             if ($metadata['expire'] - time() < $this->maxDuration) {
@@ -153,6 +155,11 @@ public function addSecurityTokenServiceType($metadata)
 
         $metadata = Configuration::loadFromArray($metadata, $metadata['entityid']);
         $defaultEndpoint = $metadata->getDefaultEndpoint('SingleSignOnService');
+
+        /**
+         * @psalm-var \SAML2\XML\md\RoleDescriptor $e
+         * @psalm-suppress UndefinedClass
+         */
         $e = new SecurityTokenServiceType();
         $e->setLocation($defaultEndpoint['Location']);
 
@@ -169,7 +176,7 @@ public function addSecurityTokenServiceType($metadata)
      * @param \SAML2\XML\md\RoleDescriptor $e Reference to the element where the Extensions element should be included.
      * @return void
      */
-    private function addExtensions(Configuration $metadata, RoleDescriptor $e)
+    private function addExtensions(Configuration $metadata, RoleDescriptor $e): void
     {
         if ($metadata->hasValue('tags')) {
             $a = new Attribute();
@@ -363,10 +370,8 @@ public function addOrganizationInfo(array $metadata)
      * @return array An array of endpoint objects,
      *     either \SAML2\XML\md\EndpointType or \SAML2\XML\md\IndexedEndpointType.
      */
-    private static function createEndpoints(array $endpoints, $indexed)
+    private static function createEndpoints(array $endpoints, bool $indexed): array
     {
-        assert(is_bool($indexed));
-
         $ret = [];
 
         foreach ($endpoints as &$ep) {
@@ -423,7 +428,7 @@ private static function createEndpoints(array $endpoints, $indexed)
     private function addAttributeConsumingService(
         SPSSODescriptor $spDesc,
         Configuration $metadata
-    ) {
+    ): void {
         $attributes = $metadata->getArray('attributes', []);
         $name = $metadata->getLocalizedString('name', null);
 
@@ -695,7 +700,6 @@ public function addMetadataIdP11($metadata)
      */
     public function addAttributeAuthority(array $metadata)
     {
-        assert(is_array($metadata));
         assert(isset($metadata['entityid']));
         assert(isset($metadata['metadata-set']));
 
@@ -791,10 +795,9 @@ public function addContact($type, $details)
      * @param string                      $x509data The certificate data.
      * @return void
      */
-    private function addX509KeyDescriptor(RoleDescriptor $rd, $use, $x509data)
+    private function addX509KeyDescriptor(RoleDescriptor $rd, string $use, string $x509data): void
     {
         assert(in_array($use, ['encryption', 'signing'], true));
-        assert(is_string($x509data));
 
         $keyDescriptor = \SAML2\Utils::createKeyDescriptor($x509data);
         $keyDescriptor->setUse($use);
@@ -811,7 +814,7 @@ private function addX509KeyDescriptor(RoleDescriptor $rd, $use, $x509data)
      * @param \SimpleSAML\Configuration    $metadata The metadata of the entity.
      * @return void
      */
-    private function addCertificate(RoleDescriptor $rd, Configuration $metadata)
+    private function addCertificate(RoleDescriptor $rd, Configuration $metadata): void
     {
         $keys = $metadata->getPublicKeys();
         foreach ($keys as $key) {
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/SAMLParser.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/SAMLParser.php
index 2c8fb8fb9debf002256cd3e58930faf26f4cbdc7..2608312af6e0d4b926ac4f7ffb8f14a3a6e7860d 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/SAMLParser.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/SAMLParser.php
@@ -1,12 +1,16 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Metadata;
 
 use DOMDocument;
+use DOMElement;
 use RobRichards\XMLSecLibs\XMLSecurityDSig;
 use RobRichards\XMLSecLibs\XMLSecurityKey;
 use SAML2\Constants;
 use SAML2\DOMDocumentFactory;
+use SAML2\SignedElementHelper;
 use SAML2\XML\Chunk;
 use SAML2\XML\ds\X509Certificate;
 use SAML2\XML\ds\X509Data;
@@ -183,12 +187,10 @@ class SAMLParser
      */
     private function __construct(
         EntityDescriptor $entityElement,
-        $maxExpireTime,
+        int $maxExpireTime = null,
         array $validators = [],
         array $parentExtensions = []
     ) {
-        assert($maxExpireTime === null || is_int($maxExpireTime));
-
         $this->spDescriptors = [];
         $this->idpDescriptors = [];
 
@@ -372,7 +374,7 @@ public static function parseDescriptorsString($string)
      *     be the entity id.
      * @throws \Exception if the document is empty or the root is an unexpected node.
      */
-    public static function parseDescriptorsElement(\DOMElement $element = null)
+    public static function parseDescriptorsElement(DOMElement $element = null)
     {
         if ($element === null) {
             throw new \Exception('Document was empty.');
@@ -398,13 +400,11 @@ public static function parseDescriptorsElement(\DOMElement $element = null)
      * @return SAMLParser[] Array of SAMLParser instances.
      */
     private static function processDescriptorsElement(
-        $element,
-        $maxExpireTime = null,
+        SignedElementHelper $element,
+        int $maxExpireTime = null,
         array $validators = [],
         array $parentExtensions = []
-    ) {
-        assert($maxExpireTime === null || is_int($maxExpireTime));
-
+    ): array {
         if ($element instanceof EntityDescriptor) {
             $ret = new SAMLParser($element, $maxExpireTime, $validators, $parentExtensions);
             $ret = [$ret->getEntityId() => $ret];
@@ -440,7 +440,7 @@ private static function processDescriptorsElement(
      * @return int|null The unix timestamp for when the element should expire. Will be NULL if no
      *             limit is set for the element.
      */
-    private static function getExpireTime($element, $maxExpireTime)
+    private static function getExpireTime($element, int $maxExpireTime = null): ?int
     {
         // validUntil may be null
         $expire = $element->getValidUntil();
@@ -467,7 +467,7 @@ public function getEntityId()
     /**
      * @return array
      */
-    private function getMetadataCommon()
+    private function getMetadataCommon(): array
     {
         $ret = [];
         $ret['entityid'] = $this->entityId;
@@ -501,7 +501,7 @@ private function getMetadataCommon()
      * @param array $roleDescriptor The parsed role descriptor.
      * @return void
      */
-    private function addExtensions(array &$metadata, array $roleDescriptor)
+    private function addExtensions(array &$metadata, array $roleDescriptor): void
     {
         assert(array_key_exists('scope', $roleDescriptor));
         assert(array_key_exists('tags', $roleDescriptor));
@@ -865,10 +865,8 @@ public function getAttributeAuthorities()
      *
      * @return array An associative array with metadata we have extracted from this element.
      */
-    private static function parseRoleDescriptorType(RoleDescriptor $element, $expireTime)
+    private static function parseRoleDescriptorType(RoleDescriptor $element, int $expireTime = null): array
     {
-        assert($expireTime === null || is_int($expireTime));
-
         $ret = [];
 
         $expireTime = self::getExpireTime($element, $expireTime);
@@ -916,10 +914,8 @@ private static function parseRoleDescriptorType(RoleDescriptor $element, $expire
      *
      * @return array An associative array with metadata we have extracted from this element.
      */
-    private static function parseSSODescriptor(SSODescriptorType $element, $expireTime)
+    private static function parseSSODescriptor(SSODescriptorType $element, int $expireTime = null): array
     {
-        assert($expireTime === null || is_int($expireTime));
-
         $sd = self::parseRoleDescriptorType($element, $expireTime);
 
         // find all SingleLogoutService elements
@@ -944,10 +940,8 @@ private static function parseSSODescriptor(SSODescriptorType $element, $expireTi
      *                             NULL if unknown.
      * @return void
      */
-    private function processSPSSODescriptor(SPSSODescriptor $element, $expireTime)
+    private function processSPSSODescriptor(SPSSODescriptor $element, int $expireTime = null): void
     {
-        assert($expireTime === null || is_int($expireTime));
-
         $sp = self::parseSSODescriptor($element, $expireTime);
 
         // find all AssertionConsumerService elements
@@ -981,10 +975,8 @@ private function processSPSSODescriptor(SPSSODescriptor $element, $expireTime)
      *                             NULL if unknown.
      * @return void
      */
-    private function processIDPSSODescriptor(IDPSSODescriptor $element, $expireTime)
+    private function processIDPSSODescriptor(IDPSSODescriptor $element, int $expireTime = null): void
     {
-        assert($expireTime === null || is_int($expireTime));
-
         $idp = self::parseSSODescriptor($element, $expireTime);
 
         // find all SingleSignOnService elements
@@ -1011,7 +1003,7 @@ private function processIDPSSODescriptor(IDPSSODescriptor $element, $expireTime)
     private function processAttributeAuthorityDescriptor(
         AttributeAuthorityDescriptor $element,
         $expireTime
-    ) {
+    ): void {
         assert($expireTime === null || is_int($expireTime));
 
         $aad = self::parseRoleDescriptorType($element, $expireTime);
@@ -1035,7 +1027,7 @@ private function processAttributeAuthorityDescriptor(
      *
      * @return array An associative array with the extensions parsed.
      */
-    private static function processExtensions($element, $parentExtensions = [])
+    private static function processExtensions($element, array $parentExtensions = []): array
     {
         $ret = [
             'scope'            => [],
@@ -1086,6 +1078,7 @@ private static function processExtensions($element, $parentExtensions = [])
                         // only saml:Attribute are currently supported here. The specifications also allows
                         // saml:Assertions, which more complex processing
                         if ($attr instanceof Attribute) {
+                            /** @psalm-var string|null $attrName   Remove for SSP 2.0 */
                             $attrName = $attr->getName();
                             $attrNameFormat = $attr->getNameFormat();
                             $attrValue = $attr->getAttributeValue();
@@ -1097,7 +1090,7 @@ private static function processExtensions($element, $parentExtensions = [])
                             // attribute names that is not URI is prefixed as this: '{nameformat}name'
                             $name = $attrName;
                             if ($attrNameFormat === null) {
-                                $name = '{' . Constants::NAMEFORMAT_UNSPECIFIED . '}' . $attr->getName();
+                                $name = '{' . Constants::NAMEFORMAT_UNSPECIFIED . '}' . $attrName;
                             } elseif ($attrNameFormat !== Constants::NAMEFORMAT_URI) {
                                 $name = '{' . $attrNameFormat . '}' . $attrName;
                             }
@@ -1123,6 +1116,7 @@ private static function processExtensions($element, $parentExtensions = [])
 
                     foreach ($e->getKeywords() as $uiItem) {
                         $keywords = $uiItem->getKeywords();
+                        /** @psalm-var string|null $language */
                         $language = $uiItem->getLanguage();
                         if (($keywords === []) || ($language === null)) {
                             continue;
@@ -1130,6 +1124,7 @@ private static function processExtensions($element, $parentExtensions = [])
                         $ret['UIInfo']['Keywords'][$language] = $keywords;
                     }
                     foreach ($e->getLogo() as $uiItem) {
+                        /** @psalm-suppress TypeDoesNotContainNull  Remove in SSP 2.0 */
                         if (
                             !($uiItem instanceof Logo)
                             || ($uiItem->getUrl() === null)
@@ -1169,7 +1164,7 @@ private static function processExtensions($element, $parentExtensions = [])
 
                 $name = $attribute->getAttribute('Name');
                 $values = array_map(
-                    ['\SimpleSAML\Utils\XML', 'getDOMText'],
+                    '\SimpleSAML\Utils\XML::getDOMText',
                     Utils\XML::getDOMChildren($attribute, 'AttributeValue', '@saml2')
                 );
 
@@ -1192,7 +1187,7 @@ private static function processExtensions($element, $parentExtensions = [])
      * @param \SAML2\XML\md\Organization $element The Organization element.
      * @return void
      */
-    private function processOrganization(Organization $element)
+    private function processOrganization(Organization $element): void
     {
         $this->organizationName = $element->getOrganizationName();
         $this->organizationDisplayName = $element->getOrganizationDisplayName();
@@ -1206,7 +1201,7 @@ private function processOrganization(Organization $element)
      * @param \SAML2\XML\md\ContactPerson $element The ContactPerson element.
      * @return void
      */
-    private function processContactPerson(ContactPerson $element)
+    private function processContactPerson(ContactPerson $element): void
     {
         $contactPerson = [];
         if ($element->getContactType() !== '') {
@@ -1240,10 +1235,8 @@ private function processContactPerson(ContactPerson $element)
      * @param array $sp The array with the SP's metadata.
      * @return void
      */
-    private static function parseAttributeConsumerService(AttributeConsumingService $element, &$sp)
+    private static function parseAttributeConsumerService(AttributeConsumingService $element, array &$sp): void
     {
-        assert(is_array($sp));
-
         $sp['name'] = $element->getServiceName();
         $sp['description'] = $element->getServiceDescription();
 
@@ -1299,7 +1292,7 @@ private static function parseAttributeConsumerService(AttributeConsumingService
      *
      * @return array An associative array with the data we have extracted from the element.
      */
-    private static function parseGenericEndpoint(EndpointType $element)
+    private static function parseGenericEndpoint(EndpointType $element): array
     {
         $ep = [];
 
@@ -1329,9 +1322,9 @@ private static function parseGenericEndpoint(EndpointType $element)
      *
      * @return array Array of parsed endpoints.
      */
-    private static function extractEndpoints(array $endpoints)
+    private static function extractEndpoints(array $endpoints): array
     {
-        return array_map(['self', 'parseGenericEndpoint'], $endpoints);
+        return array_map('self::parseGenericEndpoint', $endpoints);
     }
 
 
@@ -1349,7 +1342,7 @@ private static function extractEndpoints(array $endpoints)
      *
      * @return array|null An associative array describing the key, or null if this is an unsupported key.
      */
-    private static function parseKeyDescriptor(KeyDescriptor $kd)
+    private static function parseKeyDescriptor(KeyDescriptor $kd): ?array
     {
         $r = [];
 
@@ -1366,6 +1359,7 @@ private static function parseKeyDescriptor(KeyDescriptor $kd)
 
         $keyInfo = $kd->getKeyInfo();
 
+        /** @psalm-suppress PossiblyNullReference  This will be fixed in saml2 5.0 */
         foreach ($keyInfo->getInfo() as $i) {
             if ($i instanceof X509Data) {
                 foreach ($i->getData() as $d) {
@@ -1389,10 +1383,8 @@ private static function parseKeyDescriptor(KeyDescriptor $kd)
      *
      * @return array with SP descriptors which supports one of the given protocols.
      */
-    private function getSPDescriptors($protocols)
+    private function getSPDescriptors(array $protocols): array
     {
-        assert(is_array($protocols));
-
         $ret = [];
 
         foreach ($this->spDescriptors as $spd) {
@@ -1413,10 +1405,8 @@ private function getSPDescriptors($protocols)
      *
      * @return array with IdP descriptors which supports one of the given protocols.
      */
-    private function getIdPDescriptors($protocols)
+    private function getIdPDescriptors(array $protocols): array
     {
-        assert(is_array($protocols));
-
         $ret = [];
 
         foreach ($this->idpDescriptors as $idpd) {
@@ -1441,10 +1431,8 @@ private function getIdPDescriptors($protocols)
      * @return \SAML2\XML\md\EntityDescriptor The \DOMEntity which represents the EntityDescriptor.
      * @throws \Exception If the document is empty or the first element is not an EntityDescriptor element.
      */
-    private static function findEntityDescriptor($doc)
+    private static function findEntityDescriptor(DOMDocument $doc): EntityDescriptor
     {
-        assert($doc instanceof DOMDocument);
-
         // find the EntityDescriptor DOMElement. This should be the first (and only) child of the DOMDocument
         $ed = $doc->documentElement;
 
@@ -1500,7 +1488,7 @@ public function validateSignature($certificates)
      * @throws \UnexpectedValueException
      * @return string
      */
-    private function computeFingerprint($algorithm, $data)
+    private function computeFingerprint(string $algorithm, string $data): string
     {
         switch ($algorithm) {
             case XMLSecurityDSig::SHA1:
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Signer.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Signer.php
index 7a80bdd139df7abec27e8417c8b377394821a7de..b0441fbc45364247a7d6c3d4cbaed9ec91c627c4 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Signer.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Signer.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Metadata;
 
 use RobRichards\XMLSecLibs\XMLSecurityKey;
@@ -30,7 +32,7 @@ class Signer
      * @return array An associative array with the keys 'privatekey', 'certificate', and optionally 'privatekey_pass'.
      * @throws \Exception If the key and certificate used to sign is unknown.
      */
-    private static function findKeyCert($config, $entityMetadata, $type)
+    private static function findKeyCert(Configuration $config, array $entityMetadata, string $type): array
     {
         // first we look for metadata.privatekey and metadata.certificate in the metadata
         if (
@@ -130,7 +132,7 @@ private static function findKeyCert($config, $entityMetadata, $type)
      * @return boolean True if metadata signing is enabled, false otherwise.
      * @throws \Exception If the value of the 'metadata.sign.enable' option is not a boolean.
      */
-    private static function isMetadataSigningEnabled($config, $entityMetadata, $type)
+    private static function isMetadataSigningEnabled(Configuration $config, array $entityMetadata, string $type): bool
     {
         // first check the metadata for the entity
         if (array_key_exists('metadata.sign.enable', $entityMetadata)) {
@@ -166,8 +168,11 @@ private static function isMetadataSigningEnabled($config, $entityMetadata, $type
      *
      * @throws \SimpleSAML\Error\CriticalConfigurationError
      */
-    private static function getMetadataSigningAlgorithm($config, $entityMetadata, $type)
-    {
+    private static function getMetadataSigningAlgorithm(
+        Configuration $config,
+        array $entityMetadata,
+        string $type
+    ): array {
         // configure the algorithm to use
         if (array_key_exists('metadata.sign.algorithm', $entityMetadata)) {
             if (!is_string($entityMetadata['metadata.sign.algorithm'])) {
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Sources/MDQ.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Sources/MDQ.php
index 3b8431a14d82712f36d987048da20bc909e97aa1..833ae7608eafb3bd20fec06c09d21d888de46549 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Sources/MDQ.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Metadata/Sources/MDQ.php
@@ -1,7 +1,10 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Metadata\Sources;
 
+use Exception;
 use RobRichards\XMLSecLibs\XMLSecurityDSig;
 use SimpleSAML\Configuration;
 use SimpleSAML\Error;
@@ -77,7 +80,7 @@ protected function __construct($config)
         assert(is_array($config));
 
         if (!array_key_exists('server', $config)) {
-            throw new \Exception(__CLASS__ . ": the 'server' configuration option is not set.");
+            throw new Exception(__CLASS__ . ": the 'server' configuration option is not set.");
         } else {
             $this->server = $config['server'];
         }
@@ -130,11 +133,8 @@ public function getMetadataSet($set)
      *
      * @return string  The full path to the cache file.
      */
-    private function getCacheFilename($set, $entityId)
+    private function getCacheFilename(string $set, string $entityId): string
     {
-        assert(is_string($set));
-        assert(is_string($entityId));
-
         if ($this->cacheDir === null) {
             throw new Error\ConfigurationError("Missing cache directory configuration.");
         }
@@ -154,11 +154,8 @@ private function getCacheFilename($set, $entityId)
      *                     if the entity could not be found.
      * @throws \Exception If an error occurs while loading metadata from cache.
      */
-    private function getFromCache($set, $entityId)
+    private function getFromCache(string $set, string $entityId): ?array
     {
-        assert(is_string($set));
-        assert(is_string($entityId));
-
         if (empty($this->cacheDir)) {
             return null;
         }
@@ -168,7 +165,7 @@ private function getFromCache($set, $entityId)
             return null;
         }
         if (!is_readable($cachefilename)) {
-            throw new \Exception(__CLASS__ . ': could not read cache file for entity [' . $cachefilename . ']');
+            throw new Exception(__CLASS__ . ': could not read cache file for entity [' . $cachefilename . ']');
         }
         Logger::debug(__CLASS__ . ': reading cache [' . $entityId . '] => [' . $cachefilename . ']');
 
@@ -186,18 +183,18 @@ private function getFromCache($set, $entityId)
         if (empty($rawData)) {
             /** @var array $error */
             $error = error_get_last();
-            throw new \Exception(
+            throw new Exception(
                 __CLASS__ . ': error reading metadata from cache file "' . $cachefilename . '": ' . $error['message']
             );
         }
 
         $data = unserialize($rawData);
         if ($data === false) {
-            throw new \Exception(__CLASS__ . ': error unserializing cached data from file "' . $cachefilename . '".');
+            throw new Exception(__CLASS__ . ': error unserializing cached data from file "' . $cachefilename . '".');
         }
 
         if (!is_array($data)) {
-            throw new \Exception(__CLASS__ . ': Cached metadata from "' . $cachefilename . '" wasn\'t an array.');
+            throw new Exception(__CLASS__ . ': Cached metadata from "' . $cachefilename . '" wasn\'t an array.');
         }
 
         return $data;
@@ -214,12 +211,8 @@ private function getFromCache($set, $entityId)
      * @throws \Exception If metadata cannot be written to cache.
      * @return void
      */
-    private function writeToCache($set, $entityId, $data)
+    private function writeToCache(string $set, string $entityId, array $data): void
     {
-        assert(is_string($set));
-        assert(is_string($entityId));
-        assert(is_array($data));
-
         if (empty($this->cacheDir)) {
             return;
         }
@@ -242,10 +235,8 @@ private function writeToCache($set, $entityId, $data)
      * @return array|NULL  The associative array with the metadata, or NULL if no metadata for
      *                     the given set was found.
      */
-    private static function getParsedSet(SAMLParser $entity, $set)
+    private static function getParsedSet(SAMLParser $entity, string $set): ?array
     {
-        assert(is_string($set));
-
         switch ($set) {
             case 'saml20-idp-remote':
                 return $entity->getMetadata20IdP();
@@ -256,9 +247,7 @@ private static function getParsedSet(SAMLParser $entity, $set)
             case 'shib13-sp-remote':
                 return $entity->getMetadata1xSP();
             case 'attributeauthority-remote':
-                $ret = $entity->getAttributeAuthorities();
-                return $ret[0];
-
+                return $entity->getAttributeAuthorities();
             default:
                 Logger::warning(__CLASS__ . ': unknown metadata set: \'' . $set . '\'.');
         }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module.php
index 6f685c9fe0dfe555a2667df1d06788c1dd9d0273..ae72be30756172742c38bee44bdd00608037bdc3 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module.php
@@ -1,8 +1,10 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
-use SimpleSAML\HTTP\Router;
+use SimpleSAML\Kernel;
 use SimpleSAML\Utils;
 use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException;
 use Symfony\Component\HttpFoundation\BinaryFileResponse;
@@ -143,14 +145,12 @@ public static function process(Request $request = null)
 
         $modEnd = strpos($url, '/', 1);
         if ($modEnd === false) {
-            // the path must always be on the form /module/
-            throw new Error\NotFound('The URL must at least contain a module name followed by a slash.');
-        }
-
-        $module = substr($url, 1, $modEnd - 1);
-        $url = substr($url, $modEnd + 1);
-        if ($url === false) {
+            $modEnd = strlen($url);
+            $module = substr($url, 1);
             $url = '';
+        } else {
+            $module = substr($url, 1, $modEnd - 1);
+            $url = substr($url, $modEnd + 1);
         }
 
         if (!self::isModuleEnabled($module)) {
@@ -169,10 +169,13 @@ public static function process(Request $request = null)
 
         $config = Configuration::getInstance();
 
-        // rebuild REQUEST_URI and SCRIPT_NAME just in case we need to. This is needed for server aliases and rewrites
+        // rebuild REQUEST_URI and SCRIPT_NAME just in case we need to.
+        // This is needed for server aliases and rewrites
         $translated_uri = $config->getBasePath() . 'module.php/' . $module . '/' . $url;
         $request->server->set('REQUEST_URI', $translated_uri);
         $request->server->set('SCRIPT_NAME', $config->getBasePath() . 'module.php');
+        // strip any NULL files (form file fields with nothing selected)
+        // because initialize() will throw an error on them
         $request_files = array_filter(
             $request->files->all(),
             function ($val) {
@@ -190,9 +193,12 @@ function ($val) {
         );
 
         if ($config->getBoolean('usenewui', false) === true) {
-            $router = new Router($module);
             try {
-                return $router->process($request);
+                $kernel = new Kernel($module);
+                $response = $kernel->handle($request);
+                $kernel->terminate($request, $response);
+
+                return $response;
             } catch (FileLocatorFileNotFoundException $e) {
                 // no routes configured for this module, fall back to the old system
             } catch (NotFoundHttpException $e) {
@@ -285,14 +291,16 @@ function ($val) {
             }
         }
 
+        /** @psalm-var \SimpleSAML\Configuration $assetConfig */
         $assetConfig = $config->getConfigItem('assets');
+        /** @psalm-var \SimpleSAML\Configuration $cacheConfig */
         $cacheConfig = $assetConfig->getConfigItem('caching');
         $response = new BinaryFileResponse($path);
         $response->setCache([
             // "public" allows response caching even if the request was authenticated,
             // which is exactly what we want for static resources
             'public' => true,
-            'max_age' => (string)$cacheConfig->getInteger('max_age', 86400)
+            'max_age' => strval($cacheConfig->getInteger('max_age', 86400))
         ]);
         $response->setAutoLastModified();
         if ($cacheConfig->getBoolean('etag', false)) {
@@ -311,7 +319,7 @@ function ($val) {
      * @param array $mod_config
      * @return bool
      */
-    private static function isModuleEnabledWithConf($module, $mod_config)
+    private static function isModuleEnabledWithConf(string $module, array $mod_config): bool
     {
         if (isset(self::$module_info[$module]['enabled'])) {
             return self::$module_info[$module]['enabled'];
@@ -428,6 +436,12 @@ public static function resolveClass($id, $type, $subclass = null)
             if (!class_exists($className)) {
                 throw new \Exception("Could not resolve '$id': no class named '$className'.");
             }
+        } elseif (!in_array($tmp[0], self::getModules())) {
+            // Module not installed
+            throw new \Exception('No module named \'' . $tmp[0]. '\' has been installed.');
+        } elseif (!self::isModuleEnabled($tmp[0])) {
+            // Module installed, but not enabled
+            throw new \Exception('The module \'' . $tmp[0]. '\' is not enabled.');
         } else {
             // should be a module
             // make sure empty types are handled correctly
@@ -545,7 +559,10 @@ public static function callHooks($hook, &$data = null)
                 self::$module_info[$module]['hooks'] = self::getModuleHooks($module);
             }
 
-            if (!isset(self::$module_info[$module]['hooks'][$hook])) {
+            if (
+                !isset(self::$module_info[$module]['hooks'][$hook])
+                || empty(self::$module_info[$module]['hooks'][$hook])
+            ) {
                 continue;
             }
 
@@ -561,6 +578,22 @@ public static function callHooks($hook, &$data = null)
     }
 
 
+    /**
+     * Handle a valid request for a module that lacks a trailing slash.
+     *
+     * This method add the trailing slash and redirects to the resulting URL.
+     *
+     * @param Request $request The request to process by this controller method.
+     *
+     * @return RedirectResponse A redirection to the URI specified in the request, but with a trailing slash.
+     */
+    public static function addTrailingSlash(Request $request)
+    {
+        // Must be of form /{module} - append a slash
+        return new RedirectResponse($request->getRequestUri() . '/', 308);
+    }
+
+
     /**
      * Handle a valid request that ends with a trailing slash.
      *
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module/ControllerResolver.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module/ControllerResolver.php
deleted file mode 100644
index 3e06745b1ed3a0e5ec5ac491be9ee3abbb6a5b30..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Module/ControllerResolver.php
+++ /dev/null
@@ -1,196 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module;
-
-use SimpleSAML\Auth\AuthenticationFactory;
-use SimpleSAML\Configuration;
-use SimpleSAML\Error\Exception;
-use SimpleSAML\Module;
-use SimpleSAML\Session;
-use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException;
-use Symfony\Component\Config\FileLocator;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Reference;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
-use Symfony\Component\HttpKernel\Controller\ControllerResolver as SymfonyControllerResolver;
-use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
-use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
-use Symfony\Component\Routing\Exception\ResourceNotFoundException;
-use Symfony\Component\Routing\Loader\YamlFileLoader;
-use Symfony\Component\Routing\Matcher\UrlMatcher;
-use Symfony\Component\Routing\RequestContext;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\Routing\RouteCollection;
-
-/**
- * A class to resolve module controllers based on a given request.
- *
- * This class allows us to find a controller (a callable) that's configured for a given URL.
- *
- * @package SimpleSAML
- */
-class ControllerResolver extends SymfonyControllerResolver implements ArgumentResolverInterface
-{
-    /** @var ArgumentMetadataFactory */
-    protected $argFactory;
-
-    /** @var ContainerBuilder */
-    protected $container;
-
-    /** @var string */
-    protected $module;
-
-    /** @var array */
-    protected $params = [];
-
-    /** @var RouteCollection|null */
-    protected $routes;
-
-
-    /**
-     * Build a module controller resolver.
-     *
-     * @param string $module The name of the module.
-     */
-    public function __construct($module)
-    {
-        parent::__construct();
-        $this->module = $module;
-
-        $loader = new YamlFileLoader(
-            new FileLocator(Module::getModuleDir($this->module))
-        );
-
-        $this->argFactory = new ArgumentMetadataFactory();
-        $this->container = new ContainerBuilder();
-        $this->container->autowire(AuthenticationFactory::class, AuthenticationFactory::class);
-
-        try {
-            $this->routes = $loader->load('routes.yaml');
-            $redirect = new Route(
-                '/{url}',
-                ['_controller' => '\SimpleSAML\Module::removeTrailingSlash'],
-                ['url' => '.*/$']
-            );
-            $this->routes->add('trailing-slash', $redirect);
-            $this->routes->addPrefix('/' . $this->module);
-        } catch (FileLocatorFileNotFoundException $e) {
-        }
-    }
-
-
-    /**
-     * Get the controller associated with a given URL, based on a request.
-     *
-     * This method searches for a 'routes.yaml' file in the root of the module, defining valid routes for the module
-     * and mapping them given controllers. It's input is a Request object with the request that we want to serve.
-     *
-     * @param Request $request The request we need to find a controller for.
-     *
-     * @return callable|false A controller (as a callable) that can handle the request, or false if we cannot find
-     * one suitable for the given request.
-     */
-    public function getController(Request $request)
-    {
-        if ($this->routes === null) {
-            return false;
-        }
-        $ctxt = new RequestContext();
-        $ctxt->fromRequest($request);
-
-        try {
-            $matcher = new UrlMatcher($this->routes, $ctxt);
-            $this->params = $matcher->match($ctxt->getPathInfo());
-            list($class, $method) = explode('::', $this->params['_controller']);
-            $this->container->register($class, $class)->setAutowired(true)->setPublic(true);
-            $this->container->compile();
-            return [$this->container->get($class), $method];
-        } catch (ResourceNotFoundException $e) {
-            // no route defined matching this request
-        }
-        return false;
-    }
-
-
-    /**
-     * Get the arguments that should be passed to a controller from a given request.
-     *
-     * When the signature of the controller includes arguments with type Request, the given request will be passed to
-     * those. Otherwise, they'll be matched by name. If no value is available for a given argument, the method will
-     * try to set a default value or null, if possible.
-     *
-     * @param Request $request The request that holds all the information needed by the controller.
-     * @param callable $controller A controller for the given request.
-     *
-     * @return array An array of arguments that should be passed to the controller, in order.
-     *
-     * @throws \SimpleSAML\Error\Exception If we don't find anything suitable for an argument in the controller's
-     * signature.
-     */
-    public function getArguments(Request $request, $controller)
-    {
-        $args = [];
-        $metadata = $this->argFactory->createArgumentMetadata($controller);
-
-        /** @var ArgumentMetadata $argMeta */
-        foreach ($metadata as $argMeta) {
-            if ($argMeta->getType() === Request::class) {
-                // add request argument
-                $args[] = $request;
-                continue;
-            }
-
-            $argName = $argMeta->getName();
-            if (array_key_exists($argName, $this->params)) {
-                // add argument by name
-                $args[] = $this->params[$argName];
-                continue;
-            }
-
-            // URL does not contain value for this argument
-            if ($argMeta->hasDefaultValue()) {
-                // it has a default value
-                $args[] = $argMeta->getDefaultValue();
-            }
-
-            // no default value
-            if ($argMeta->isNullable()) {
-                $args[] = null;
-            }
-
-            throw new Exception('Missing value for argument ' . $argName . '. This is probably a bug.');
-        }
-
-        return $args;
-    }
-
-
-    /**
-     * Set the configuration to use by the controllers.
-     *
-     * @param \SimpleSAML\Configuration $config
-     * @return void
-     */
-    public function setConfiguration(Configuration $config)
-    {
-        $this->container->set(Configuration::class, $config);
-        $this->container->register(Configuration::class)->setSynthetic(true)->setAutowired(true);
-    }
-
-
-    /**
-     * Set the session to use by the controllers.
-     *
-     * @param \SimpleSAML\Session $session
-     * @return void
-     */
-    public function setSession(Session $session)
-    {
-        $this->container->set(Session::class, $session);
-        $this->container->register(Session::class)
-            ->setSynthetic(true)
-            ->setAutowired(true)
-            ->addMethodCall('setConfiguration', [new Reference(Configuration::class)]);
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Session.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Session.php
index 8b54ae5f298d69b1f184762728de4e4ba3bddffe..2ee30698c72ea68c02e5850e6e4883db957f7d59 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Session.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Session.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 use SAML2\XML\saml\AttributeValue;
@@ -30,7 +32,7 @@ class Session implements \Serializable, Utils\ClearableState
      * This is a timeout value for setData, which indicates that the data
      * should never be deleted, i.e. lasts the whole session lifetime.
      */
-    const DATA_TIMEOUT_SESSION_END = 'sessionEndTimeout';
+    public const DATA_TIMEOUT_SESSION_END = 'sessionEndTimeout';
 
     /**
      * The list of loaded session objects.
@@ -45,8 +47,10 @@ class Session implements \Serializable, Utils\ClearableState
      * This variable holds the instance of the session - Singleton approach.
      *
      * Warning: do not set the instance manually, call Session::load() instead.
+     *
+     * @var \SimpleSAML\Session|null
      */
-    private static $instance;
+    private static $instance = null;
 
     /**
      * The global configuration.
@@ -145,7 +149,7 @@ class Session implements \Serializable, Utils\ClearableState
      *
      * @param boolean $transient Whether to create a transient session or not.
      */
-    private function __construct($transient = false)
+    private function __construct(bool $transient = false)
     {
         $this->setConfiguration(Configuration::getInstance());
 
@@ -174,9 +178,8 @@ private function __construct($transient = false)
             $this->markDirty();
 
             // initialize data for session check function if defined
-            $checkFunction = self::$config->getArray('session.check_function', null);
-            if (isset($checkFunction)) {
-                assert(is_callable($checkFunction));
+            $checkFunction = self::$config->getValue('session.check_function', null);
+            if (is_callable($checkFunction)) {
                 call_user_func($checkFunction, $this, true);
             }
         }
@@ -194,17 +197,28 @@ public function setConfiguration(Configuration $config)
         self::$config = $config;
     }
 
-
     /**
      * Serialize this session object.
      *
      * This method will be invoked by any calls to serialize().
      *
      * @return string The serialized representation of this session object.
+     * @deprecated This method will be removed in SSP 2.0.
+     */
+    public function serialize() {
+        return serialize($this->__serialize());
+    }
+
+    /**
+     * Serialize this session object.
+     *
+     * This method will be invoked by any calls to serialize().
+     *
+     * @return array The serialized representation of this session object.
      */
-    public function serialize()
+    public function __serialize()
     {
-        return serialize(get_object_vars($this));
+        return get_object_vars($this);
     }
 
     /**
@@ -214,14 +228,25 @@ public function serialize()
      * be serializable in its original form (e.g.: DOM objects).
      *
      * @param string $serialized The serialized representation of a session that we want to restore.
+     * @deprecated This method will be removed in SSP 2.0.
      */
     public function unserialize($serialized)
     {
-        $session = unserialize($serialized);
-        if (is_array($session)) {
-            foreach ($session as $k => $v) {
-                $this->$k = $v;
-            }
+        $this->__unserialize(unserialize($serialized));
+    }
+
+    /**
+     * Unserialize a session object and load it..
+     *
+     * This method will be invoked by any calls to unserialize(), allowing us to restore any data that might not
+     * be serializable in its original form (e.g.: DOM objects).
+     *
+     * @param array $session The session that we want to restore.
+     */
+    public function __unserialize($session)
+    {
+        foreach ($session as $k => $v) {
+            $this->$k = $v;
         }
         self::$config = Configuration::getInstance();
 
@@ -235,7 +260,7 @@ public function unserialize($serialized)
                 foreach ($values as $idx => $value) {
                     // this should be originally a DOMNodeList
                     /* @var \SAML2\XML\saml\AttributeValue $value */
-                    $this->authData[$authority]['Attributes'][$attribute][$idx] = $value->element->childNodes;
+                    $this->authData[$authority]['Attributes'][$attribute][$idx] = $value->getElement()->childNodes;
                 }
             }
         }
@@ -256,6 +281,7 @@ public static function getSessionFromRequest()
 
         // check if we have stored a session stored with the session handler
         try {
+            /** @var \SimpleSAML\Session|null $session  Help Scrutinizer with the correct type */
             $session = self::getSession();
         } catch (\Exception $e) {
             /*
@@ -318,8 +344,8 @@ public static function getSessionFromRequest()
      *
      * @param string|null $sessionId The session we should get, or null to get the current session.
      *
-     * @return Session|null The session that is stored in the session handler, or null if the session wasn't
-     * found.
+     * @return \SimpleSAML\Session|null The session that is stored in the session handler,
+     *   or null if the session wasn't found.
      */
     public static function getSession($sessionId = null)
     {
@@ -367,9 +393,8 @@ public static function getSession($sessionId = null)
             }
 
             // run session check function if defined
-            $checkFunction = $globalConfig->getArray('session.check_function', null);
-            if (isset($checkFunction)) {
-                assert(is_callable($checkFunction));
+            $checkFunction = $globalConfig->getValue('session.check_function', null);
+            if (is_callable($checkFunction)) {
                 $check = call_user_func($checkFunction, $session);
                 if ($check !== true) {
                     Logger::warning('Session did not pass check function.');
@@ -390,10 +415,10 @@ public static function getSession($sessionId = null)
      *
      * Warning: never set self::$instance yourself, call this method instead.
      *
-     * @param Session $session The session to load.
-     * @return Session The session we just loaded, just for convenience.
+     * @param \SimpleSAML\Session $session The session to load.
+     * @return \SimpleSAML\Session The session we just loaded, just for convenience.
      */
-    private static function load(Session $session)
+    private static function load(Session $session): Session
     {
         Logger::setTrackId($session->getTrackID());
         self::$instance = $session;
@@ -636,8 +661,11 @@ public function doLogin($authority, array $data = null)
                     continue;
                 }
 
+                /** @psalm-var \DOMNode $node   We made sure value has at least 1 item in the check above */
+                $node = $value->item(0);
+
                 // create an AttributeValue object and save it to 'RawAttributes', using same attribute name and index
-                $attrval = new AttributeValue($value->item(0)->parentNode);
+                $attrval = new AttributeValue($node->parentNode);
                 $data['RawAttributes'][$attribute][$idx] = $attrval;
             }
         }
@@ -711,9 +739,8 @@ public function doLogout($authority)
      *
      * @throws \Exception If the handler is not a valid function or method.
      */
-    private function callLogoutHandlers($authority)
+    private function callLogoutHandlers(string $authority): void
     {
-        assert(is_string($authority));
         assert(isset($this->authData[$authority]));
 
         if (empty($this->authData[$authority]['LogoutHandlers'])) {
@@ -928,7 +955,7 @@ public function setData($type, $id, $data, $timeout = null)
      *
      * @return void
      */
-    private function expireData()
+    private function expireData(): void
     {
         $ct = time();
 
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandler.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandler.php
index 91fc08b26df9f640200665288d395aa25a870a8a..efe0104a2717abda79e039168adfa772f72028de 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandler.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandler.php
@@ -12,6 +12,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 abstract class SessionHandler
@@ -131,7 +133,7 @@ abstract public function setCookie($sessionName, $sessionID, array $cookieParams
      *
      * @throws \Exception If we cannot instantiate the session handler.
      */
-    private static function createSessionHandler()
+    private static function createSessionHandler(): void
     {
         $store = Store::getInstance();
         if ($store === false) {
@@ -156,7 +158,7 @@ public function getCookieParams()
         return [
             'lifetime' => $config->getInteger('session.cookie.lifetime', 0),
             'path'     => $config->getString('session.cookie.path', '/'),
-            'domain'   => $config->getString('session.cookie.domain', null),
+            'domain'   => strval($config->getString('session.cookie.domain', null)),
             'secure'   => $config->getBoolean('session.cookie.secure', false),
             'samesite' => $config->getString('session.cookie.samesite', null),
             'httponly' => true,
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerCookie.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerCookie.php
index 556105f2e830f2d6986cf8514e934cc113b60bf8..76cbecbec479b2fb69363a431c0a8a0f2729c7b3 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerCookie.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerCookie.php
@@ -11,6 +11,8 @@
  * @abstract
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 use SimpleSAML\Utils;
@@ -75,7 +77,7 @@ public function getCookieSessionId()
             }
 
             // check if we have a valid session id
-            if (!self::isValidSessionID($this->session_id)) {
+            if (!is_null($this->session_id) && !self::isValidSessionID($this->session_id)) {
                 // invalid, disregard this session
                 return null;
             }
@@ -101,7 +103,7 @@ public function getSessionCookieName()
      *
      * @return string A random session id.
      */
-    private static function createSessionID()
+    private static function createSessionID(): string
     {
         return bin2hex(openssl_random_pseudo_bytes(16));
     }
@@ -115,11 +117,8 @@ private static function createSessionID()
      *
      * @return boolean True if this session ID is valid, false otherwise.
      */
-    private static function isValidSessionID($session_id)
+    private static function isValidSessionID(string $session_id): bool
     {
-        if (!is_string($session_id)) {
-            return false;
-        }
 
         if (strlen($session_id) != 32) {
             return false;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerPHP.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerPHP.php
index c8c5a9fbbd2c45f6e7399077609a225d021b2c25..a3c2ff1779de0fd4a6d34d23981d6295a4674c5d 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerPHP.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerPHP.php
@@ -9,6 +9,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 use SimpleSAML\Error;
@@ -78,7 +80,7 @@ protected function __construct()
 
         if (!headers_sent()) {
             if (version_compare(PHP_VERSION, '7.3.0', '>=')) {
-                /** @psalm-suppress InvalidArgument  This annotation may be removed in Psalm >=3.0.15 */
+                /** @psalm-suppress InvalidArgument */
                 session_set_cookie_params([
                     'lifetime' => $params['lifetime'],
                     'path' => $params['path'],
@@ -91,7 +93,7 @@ protected function __construct()
                 session_set_cookie_params(
                     $params['lifetime'],
                     $params['path'],
-                    is_null($params['domain']) ? '' : $params['domain'],
+                    $params['domain'] ?? '',
                     $params['secure'],
                     $params['httponly']
                 );
@@ -158,20 +160,18 @@ public function restorePrevious()
      */
     public function newSessionId()
     {
-        $sessionId = false;
-        if (function_exists('session_create_id') && version_compare(PHP_VERSION, '7.2', '<')) {
+        if ($this->hasSessionCookie()) {
+            session_regenerate_id(false);
+            $sessionId = session_id();
+        } else {
             // generate new (secure) session id
-            $sid_length = (int) ini_get('session.sid_length');
-            $sid_bits_per_char = (int) ini_get('session.sid_bits_per_character');
+            $sid_length = intval(ini_get('session.sid_length'));
+            $sid_bits_per_char = intval(ini_get('session.sid_bits_per_character'));
 
             if (($sid_length * $sid_bits_per_char) < 128) {
                 Logger::warning("Unsafe defaults used for sessionId generation!");
             }
 
-            /**
-             * This annotation may be removed as soon as we start using vimeo/psalm 3.x
-             * @psalm-suppress TooFewArguments
-             */
             $sessionId = session_create_id();
         }
 
@@ -181,9 +181,11 @@ public function newSessionId()
         }
 
         Session::createSession($sessionId);
+
         return $sessionId;
     }
 
+
     /**
      * Retrieve the session ID saved in the session cookie, if there's one.
      *
@@ -194,7 +196,8 @@ public function newSessionId()
     public function getCookieSessionId()
     {
         if (!$this->hasSessionCookie()) {
-            return null; // there's no session cookie, can't return ID
+            // there's no session cookie, can't return ID
+            return null;
         }
 
         if (version_compare(PHP_VERSION, '7.2', 'ge') && headers_sent()) {
@@ -373,13 +376,13 @@ public function setCookie($sessionName, $sessionID, array $cookieParams = null)
         }
 
         if (version_compare(PHP_VERSION, '7.3.0', '>=')) {
-            /** @psalm-suppress InvalidArgument  This annotation may be removed in Psalm >=3.0.15 */
+            /** @psalm-suppress InvalidArgument */
             session_set_cookie_params($cookieParams);
         } else {
             session_set_cookie_params(
                 $cookieParams['lifetime'],
                 $cookieParams['path'],
-                is_null($cookieParams['domain']) ? '' : $cookieParams['domain'],
+                $cookieParams['domain'] ?? '',
                 $cookieParams['secure'],
                 $cookieParams['httponly']
             );
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerStore.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerStore.php
index 7406a5be6efee13bb8381bc6f51699ec63637fc0..1169fab11035e1bfdffac47d1a09c312e2ce1ff7 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerStore.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/SessionHandlerStore.php
@@ -6,6 +6,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 class SessionHandlerStore extends SessionHandlerCookie
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Stats.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Stats.php
index 25ff214ac09394780488485936aa0deb1da83e41..98e9f89f23ab54a77f3d27123986ad0015e509ff 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Stats.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Stats.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 /**
@@ -35,7 +37,7 @@ class Stats
      *
      * @return mixed A new instance of the configured class.
      */
-    private static function createOutput(\SimpleSAML\Configuration $config)
+    private static function createOutput(Configuration $config)
     {
         $cls = $config->getString('class');
         $cls = Module::resolveClass($cls, 'Stats\Output', '\SimpleSAML\Stats\Output');
@@ -50,9 +52,8 @@ private static function createOutput(\SimpleSAML\Configuration $config)
      *
      * @return void
      */
-    private static function initOutputs()
+    private static function initOutputs(): void
     {
-
         $config = Configuration::getInstance();
         $outputCfgs = $config->getConfigList('statistics.out');
 
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Stats/Output.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Stats/Output.php
index 0790f6ac5033b09f7054b6cfa6644dd06e26142d..7ac5a71ec741a5fc3a38350e5fcaa11bc043ee5c 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Stats/Output.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Stats/Output.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Stats;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store.php
index 50d5b3162200812474a28dab988d95389658fb8c..6721272916e8dadb722dcad50700a0b8aa60558f 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store.php
@@ -1,7 +1,10 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
+use Exception;
 use SimpleSAML\Error;
 
 /**
@@ -55,7 +58,7 @@ public static function getInstance()
                 // datastore from module
                 try {
                     $className = Module::resolveClass($storeType, 'Store', '\SimpleSAML\Store');
-                } catch (\Exception $e) {
+                } catch (Exception $e) {
                     $c = $config->toArray();
                     $c['store.type'] = 'phpsession';
                     throw new Error\CriticalConfigurationError(
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/Memcache.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/Memcache.php
index 2a8da49a79f39c3b08e43b10202f3348f7fd44ad..e674ae0fdb746b1b415b0e2ae01d53fce8d29e4e 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/Memcache.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/Memcache.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Store;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/Redis.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/Redis.php
index 51c07cd77aab23574343504f66b77ff0bbf62bae..acf766e35db88cdbcafd170e70ce9c99d8c23fba 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/Redis.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/Redis.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Store;
 
 use Predis\Client;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/SQL.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/SQL.php
index 0fc6c7991e7c6885cf12e35de29134aab9c2df2f..ae21bf1953f466b6776b26fe13fa47da95437375 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/SQL.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Store/SQL.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Store;
 
 use PDO;
@@ -81,7 +83,7 @@ public function __construct()
      * Initialize the table-version table.
      * @return void
      */
-    private function initTableVersionTable()
+    private function initTableVersionTable(): void
     {
         $this->tableVersions = [];
 
@@ -105,7 +107,7 @@ private function initTableVersionTable()
      * Initialize key-value table.
      * @return void
      */
-    private function initKVTable()
+    private function initKVTable(): void
     {
         $current_version = $this->getTableVersion('kvstore');
 
@@ -286,7 +288,7 @@ public function insertOrUpdate($table, array $keys, array $data)
      * Clean the key-value table of expired entries.
      * @return void
      */
-    private function cleanKVStore()
+    private function cleanKVStore(): void
     {
         Logger::debug('store.sql: Cleaning key-value store.');
 
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utilities.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utilities.php
index 3ea08caa743099613951ffc15b783f7b99893527..e395084bb4ea680b5d11b171767ee7e0a7627def 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utilities.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utilities.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML;
 
 use SimpleSAML\Error\Error;
@@ -233,12 +235,8 @@ public static function ipCIDRcheck($cidr, $ip = null)
      * @param array $parameters
      * @return void
      */
-    private static function doRedirect($url, $parameters = [])
+    private static function doRedirect(string $url, array $parameters = []): void
     {
-        assert(is_string($url));
-        assert(!empty($url));
-        assert(is_array($parameters));
-
         if (!empty($parameters)) {
             $url = self::addURLparameter($url, $parameters);
         }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Arrays.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Arrays.php
index b38d0ca5c7726c7b561e632f720f6453b9cb051f..7c081d40f7b58967d59ed5568c1e243d6ada01f9 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Arrays.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Arrays.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Attributes.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Attributes.php
index 09e346ab6ebda4af279ed0b977477b5a04815340..6cc0fbb6a35f0b1096fbe63f0c233ee4c91a41ad 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Attributes.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Attributes.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 use SimpleSAML\Error;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Auth.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Auth.php
index 48cfcb16fcbf48de33b1d98e6d52713bf541f191..5aac8756a62cd0c33664a08903b1555044ad311f 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Auth.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Auth.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 use SimpleSAML\Auth as Authentication;
@@ -15,7 +17,7 @@
 class Auth
 {
     /**
-     * Retrieve a admin login URL.
+     * Retrieve an admin login URL.
      *
      * @param string|NULL $returnTo The URL the user should arrive on after admin authentication. Defaults to null.
      *
@@ -37,7 +39,7 @@ public static function getAdminLoginURL($returnTo = null)
 
 
     /**
-     * Retrieve a admin logout URL.
+     * Retrieve an admin logout URL.
      *
      * @param string|NULL $returnTo The URL the user should arrive on after admin authentication. Defaults to null.
      *
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/ClearableState.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/ClearableState.php
index b28554c6cf718c504183ada662d88495bdadca37..5c90ccfc5245b5cfcc083e2ce672c11f8de4e9b7 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/ClearableState.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/ClearableState.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Config.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Config.php
index 01f5f50c1d4a1bb36309cf974947f5fd524cb637..0fddcbf2ed0c073bfff14dd8417f7149f454b821 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Config.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Config.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 use SimpleSAML\Configuration;
@@ -71,11 +73,11 @@ public static function getConfigDir()
         $configDir = dirname(dirname(dirname(__DIR__))) . '/config';
         /** @var string|false $configDirEnv */
         $configDirEnv = getenv('SIMPLESAMLPHP_CONFIG_DIR');
-        
+
         if ($configDirEnv === false) {
             $configDirEnv = getenv('REDIRECT_SIMPLESAMLPHP_CONFIG_DIR');
         }
-        
+
         if ($configDirEnv !== false) {
             if (!is_dir($configDirEnv)) {
                 throw new \InvalidArgumentException(
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Config/Metadata.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Config/Metadata.php
index eedb4f79fc0bf8f2ddc3a7112fe1e20718e93ee9..d4306e3fbc2669643af30bbba78da54888d30e31 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Config/Metadata.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Config/Metadata.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils\Config;
 
 use SAML2\Constants;
@@ -300,10 +302,10 @@ public static function getDefaultEndpoint(array $endpoints, array $bindings = nu
      */
     public static function isHiddenFromDiscovery(array $metadata)
     {
-        Logger::maskErrors(E_ALL);
-        $hidden = in_array(self::$HIDE_FROM_DISCOVERY, $metadata['EntityAttributes'][self::$ENTITY_CATEGORY], true);
-        Logger::popErrorMask();
-        return $hidden === true;
+        if (!isset($metadata['EntityAttributes'][self::$ENTITY_CATEGORY])) {
+            return false;
+        }
+        return in_array(self::$HIDE_FROM_DISCOVERY, $metadata['EntityAttributes'][self::$ENTITY_CATEGORY], true);
     }
 
 
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Crypto.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Crypto.php
index a3f5b23727607d44c735d375adc23dcdc9186701..3b711f6e6c6e1e531e921293dd1486635e1663a3 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Crypto.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Crypto.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 use SimpleSAML\Configuration;
@@ -25,13 +27,8 @@ class Crypto
      *
      * @see \SimpleSAML\Utils\Crypto::aesDecrypt()
      */
-    private static function aesDecryptInternal($ciphertext, $secret)
+    private static function aesDecryptInternal(string $ciphertext, string $secret): string
     {
-        if (!is_string($ciphertext)) {
-            throw new \InvalidArgumentException(
-                'Input parameter "$ciphertext" must be a string with more than 48 characters.'
-            );
-        }
         /** @var int $len */
         $len = mb_strlen($ciphertext, '8bit');
         if ($len < 48) {
@@ -99,12 +96,8 @@ public static function aesDecrypt($ciphertext)
      *
      * @see \SimpleSAML\Utils\Crypto::aesEncrypt()
      */
-    private static function aesEncryptInternal($data, $secret)
+    private static function aesEncryptInternal(string $data, string $secret): string
     {
-        if (!is_string($data)) {
-            throw new \InvalidArgumentException('Input parameter "$data" must be a string.');
-        }
-
         if (!function_exists("openssl_encrypt")) {
             throw new Error\Exception('The openssl PHP module is not loaded.');
         }
@@ -436,6 +429,12 @@ public static function pwValid($hash, $password)
             throw new \InvalidArgumentException('Invalid input parameters.');
         }
 
+        // Prior to PHP 7.4 password_get_info() would set the algo to 0 instead of NULL when it's not detected
+        $info = password_get_info($password);
+        if ($info['algo'] !== null && $info['algo'] !== 0) {
+            throw new Error\Exception("Cannot use a hash value for authentication.");
+        }
+
         if (password_verify($password, $hash)) {
             return true;
         }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/EMail.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/EMail.php
index a4f532224727c30caa027e08f4814ccf9e0a763d..43e34897a563a54dfed47e3f5c17a6c240412d2c 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/EMail.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/EMail.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 use PHPMailer\PHPMailer\PHPMailer;
@@ -71,7 +73,7 @@ public static function getDefaultMailAddress()
         return $address;
     }
 
-    
+
     /**
      * Set the data that should be embedded in the e-mail body
      *
@@ -158,8 +160,6 @@ public function send($plainTextOnly = false)
     public function setTransportMethod($transportMethod, array $transportOptions = [])
     {
         assert(is_string($transportMethod));
-        assert(is_array($transportOptions));
-
 
         switch (strtolower($transportMethod)) {
             // smtp transport method
@@ -231,8 +231,6 @@ public function setTransportMethod($transportMethod, array $transportOptions = [
      */
     public static function initFromConfig(EMail $EMail)
     {
-        assert($EMail instanceof EMail);
-
         $config = Configuration::getInstance();
         $EMail->setTransportMethod(
             $config->getString('mail.transport.method', 'mail'),
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/HTTP.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/HTTP.php
index 016f09e0e0c8eaaf7f411343496af1a76a1d601d..f6d7f1410e554667de638ea06ad6f222bf40a2bb 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/HTTP.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/HTTP.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 use SimpleSAML\Configuration;
@@ -16,6 +18,51 @@
  */
 class HTTP
 {
+    /**
+     * Determine if the user agent can support cookies being sent with SameSite equal to "None".
+     * Browsers with out support may drop the cookie and or treat is a stricter setting
+     * Browsers with support may have additional requirements on setting it on non-secure websites.
+     *
+     * Based on the Azure teams experience rolling out support and Chromium's advice
+     * https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/
+     * https://www.chromium.org/updates/same-site/incompatible-clients
+     * @return bool true if user agent supports a None value for SameSite.
+     */
+    public static function canSetSameSiteNone(): bool
+    {
+        $useragent = $_SERVER['HTTP_USER_AGENT'] ?? null;
+        if (!$useragent) {
+            return true;
+        }
+        // All iOS 12 based browsers have no support
+        if (strpos($useragent, "CPU iPhone OS 12") !== false || strpos($useragent, "iPad; CPU OS 12") !== false) {
+            return false;
+        }
+
+        // Safari Mac OS X 10.14 has no support
+        // - Safari on Mac OS X.
+        if (strpos($useragent, "Macintosh; Intel Mac OS X 10_14") !== false) {
+            // regular safari
+            if (strpos($useragent, "Version/") !== false && strpos($useragent, "Safari") !== false) {
+                return false;
+            } elseif (preg_match('|AppleWebKit/[\.\d]+ \(KHTML, like Gecko\)$|', $useragent)) {
+                return false;
+            }
+        }
+
+        // Chrome based UCBrowser may have support (>= 12.13.2) even though its chrome version is old
+        $matches = [];
+        if (preg_match('|UCBrowser/(\d+\.\d+\.\d+)[\.\d]*|', $useragent, $matches)) {
+            return version_compare($matches[1], '12.13.2', '>=');
+        }
+
+        // Chrome 50-69 may have broken SameSite=None and don't require it to be set
+        if (strpos($useragent, "Chrome/5") !== false || strpos($useragent, "Chrome/6") !== false) {
+            return false;
+        }
+        return true;
+    }
+
     /**
      * Obtain a URL where we can redirect to securely post a form with the given data to a specific destination.
      *
@@ -27,7 +74,7 @@ class HTTP
      *
      * @author Jaime Perez, UNINETT AS <jaime.perez@uninett.no>
      */
-    private static function getSecurePOSTRedirectURL($destination, $data)
+    private static function getSecurePOSTRedirectURL(string $destination, array $data): string
     {
         $session = Session::getSessionFromRequest();
         $id = self::savePOSTData($session, $destination, $data);
@@ -56,7 +103,7 @@ private static function getSecurePOSTRedirectURL($destination, $data)
      *
      * @author Olav Morken, UNINETT AS <olav.morken@uninett.no>
      */
-    private static function getServerHost()
+    private static function getServerHost(): string
     {
         if (array_key_exists('HTTP_HOST', $_SERVER)) {
             $current = $_SERVER['HTTP_HOST'];
@@ -171,9 +218,9 @@ public static function isValidURL($url)
      * @author Mads Freek Petersen
      * @author Jaime Perez, UNINETT AS <jaime.perez@uninett.no>
      */
-    private static function redirect($url, $parameters = [])
+    private static function redirect(string $url, array $parameters = []): void
     {
-        if (!is_string($url) || empty($url) || !is_array($parameters)) {
+        if (empty($url)) {
             throw new \InvalidArgumentException('Invalid input parameters.');
         }
         if (!self::isValidURL($url)) {
@@ -246,7 +293,7 @@ private static function redirect($url, $parameters = [])
      * @author Andjelko Horvat
      * @author Jaime Perez, UNINETT AS <jaime.perez@uninett.no>
      */
-    private static function savePOSTData(Session $session, $destination, $data)
+    private static function savePOSTData(Session $session, string $destination, array $data): string
     {
         // generate a random ID to avoid replay attacks
         $id = Random::generateID();
@@ -685,6 +732,7 @@ public static function getBaseURL()
      *
      * @return string The first element of the URL path, with an optional, leading slash.
      *
+     * @deprecated This method will be removed in SimpleSAMLphp 2.0
      * @author Andreas Solberg, UNINETT AS <andreas.solberg@uninett.no>
      */
     public static function getFirstPathElement($leadingSlash = true)
@@ -816,7 +864,7 @@ public static function getSelfURL()
         // convert that relative path to an HTTP query
         $url_path = str_replace(DIRECTORY_SEPARATOR, '/', $rel_path);
         // find where the relative path starts in the current request URI
-        $uri_pos = (!empty($url_path)) ? strpos($_SERVER['REQUEST_URI'], $url_path) : false;
+        $uri_pos = (!empty($url_path)) ? strpos($_SERVER['REQUEST_URI'] ?? '', $url_path) : false;
 
         if ($cur_path == $rel_path || $uri_pos === false) {
             /*
@@ -1165,7 +1213,7 @@ public static function setCookie($name, $value, $params = null, $throw = true)
             'lifetime' => 0,
             'expire'   => null,
             'path'     => '/',
-            'domain'   => null,
+            'domain'   => '',
             'secure'   => false,
             'httponly' => true,
             'raw'      => false,
@@ -1204,7 +1252,7 @@ public static function setCookie($name, $value, $params = null, $throw = true)
         if (version_compare(PHP_VERSION, '7.3.0', '>=')) {
             /* use the new options array for PHP >= 7.3 */
             if ($params['raw']) {
-                /** @psalm-suppress InvalidArgument  Remove when Psalm >= 3.4.10 */
+                /** @psalm-suppress InvalidArgument */
                 $success = @setrawcookie(
                     $name,
                     $value,
@@ -1218,7 +1266,7 @@ public static function setCookie($name, $value, $params = null, $throw = true)
                     ]
                 );
             } else {
-                /** @psalm-suppress InvalidArgument  Remove when Psalm >= 3.4.10 */
+                /** @psalm-suppress InvalidArgument */
                 $success = @setcookie(
                     $name,
                     $value,
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/HttpAdapter.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/HttpAdapter.php
index b2e90b475a153a297c4cbba2627bae002fcd7fd8..8065da898514401ba2e20c44255308c0c3f98f6e 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/HttpAdapter.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/HttpAdapter.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Net.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Net.php
index 351a7cf6e03f5b8bd5b6daa9736addd5046b19c7..8fe77816130f860f4fa725cec01d1fd870825fbb 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Net.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Net.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 /**
@@ -73,8 +75,8 @@ public static function ipCIDRcheck($cidr, $ip = null)
 
             $ip_mask = ~((1 << (32 - $iteration_mask)) - 1);
 
-            $ip_net_mask = $ip_net[$i] & $ip_mask;
-            $ip_ip_mask = $ip_ip[$i] & $ip_mask;
+            $ip_net_mask = intval($ip_net[$i]) & $ip_mask;
+            $ip_ip_mask = intval($ip_ip[$i]) & $ip_mask;
 
             if ($ip_ip_mask != $ip_net_mask) {
                 return false;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Random.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Random.php
index 7072d76f09f4058869ed41542f545d4d5f0674d7..495428d408d0c16aebbabfa2a379783808ea7b41 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Random.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Random.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 /**
@@ -12,7 +14,7 @@ class Random
     /**
      * The fixed length of random identifiers.
      */
-    const ID_LENGTH = 43;
+    public const ID_LENGTH = 43;
 
     /**
      * Generate a random identifier, ID_LENGTH bytes long.
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/System.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/System.php
index 26b0e992f0afc6fcd9d03559571bfc04e850d21b..6997fd04d0b501f59d56ce0f7ebd801018f034d3 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/System.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/System.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 use SimpleSAML\Configuration;
@@ -13,14 +15,14 @@
 
 class System
 {
-    const WINDOWS = 1;
-    const LINUX = 2;
-    const OSX = 3;
-    const HPUX = 4;
-    const UNIX = 5;
-    const BSD = 6;
-    const IRIX = 7;
-    const SUNOS = 8;
+    public const WINDOWS = 1;
+    public const LINUX = 2;
+    public const OSX = 3;
+    public const HPUX = 4;
+    public const UNIX = 5;
+    public const BSD = 6;
+    public const IRIX = 7;
+    public const SUNOS = 8;
 
 
     /**
@@ -64,12 +66,13 @@ public static function getOS()
      * This function retrieves the path to a directory where temporary files can be saved.
      *
      * @return string Path to a temporary directory, without a trailing directory separator.
-     * @throws Error\Exception If the temporary directory cannot be created or it exists and does not belong
-     * to the current user.
+     * @throws Error\Exception If the temporary directory cannot be created or it exists and cannot be written
+     * to by the current user.
      *
      * @author Andreas Solberg, UNINETT AS <andreas.solberg@uninett.no>
      * @author Olav Morken, UNINETT AS <olav.morken@uninett.no>
      * @author Jaime Perez, UNINETT AS <jaime.perez@uninett.no>
+     * @author Aaron St. Clair, ECRS AS <astclair@ecrs.com>
      */
     public static function getTempDir()
     {
@@ -83,6 +86,10 @@ public static function getTempDir()
             DIRECTORY_SEPARATOR
         );
 
+        /**
+         * If the temporary directory does not exist then attempt to create it. If the temporary directory
+         * already exists then verify the current user can write to it. Otherwise, throw an error.
+         */
         if (!is_dir($tempDir)) {
             if (!mkdir($tempDir, 0700, true)) {
                 $error = error_get_last();
@@ -91,14 +98,12 @@ public static function getTempDir()
                     (is_array($error) ? $error['message'] : 'no error available')
                 );
             }
-        } elseif (function_exists('posix_getuid')) {
-            // check that the owner of the temp directory is the current user
-            $stat = lstat($tempDir);
-            if ($stat['uid'] !== posix_getuid()) {
-                throw new Error\Exception(
-                    'Temporary directory "' . $tempDir . '" does not belong to the current user.'
-                );
-            }
+        } elseif (!is_writable($tempDir)) {
+            throw new Error\Exception(
+                'Temporary directory "' . $tempDir .
+                '" cannot be written to by the current user' .
+                (function_exists('posix_getuid') ? ' "' .  posix_getuid() . '"' : '')
+            );
         }
 
         return $tempDir;
@@ -233,6 +238,20 @@ public static function writeFile($filename, $data, $mode = 0600)
         }
     }
 
+
+    /**
+     * Check if the supplied path is an absolute path.
+     *
+     * @param string $path
+     *
+     * @return bool
+     */
+    public static function isAbsolutePath(string $path): bool
+    {
+        return (0 === strpos($path, '/') || self::pathContainsDriveLetter($path));
+    }
+
+
     /**
      * Check if the supplied path contains a Windows-style drive letter.
      *
@@ -240,7 +259,7 @@ public static function writeFile($filename, $data, $mode = 0600)
      *
      * @return bool
      */
-    private static function pathContainsDriveLetter($path)
+    private static function pathContainsDriveLetter(string $path): bool
     {
         $letterAsciiValue = ord(strtoupper(substr($path, 0, 1)));
         return substr($path, 1, 1) === ':'
@@ -252,7 +271,7 @@ private static function pathContainsDriveLetter($path)
      * @param string $path
      * @return bool
      */
-    private static function pathContainsStreamWrapper($path)
+    private static function pathContainsStreamWrapper(string $path): bool
     {
         return preg_match('/^[\w\d]*:\/{2}/', $path) === 1;
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Time.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Time.php
index 1889423680507cfa8eed82e8323cfd74cf1b5f98..efb77faccc9676cff942db73ee3035b33cc0a153 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Time.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/Time.php
@@ -6,6 +6,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/XML.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/XML.php
index 28c203cd3cf083b04258aa07338b10b1b6733ef3..5f48210fdfd3601b7474d9abf2195698f38bbcaa 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/XML.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/Utils/XML.php
@@ -6,6 +6,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Utils;
 
 use DOMComment;
@@ -57,12 +59,10 @@ public static function checkSAMLMessage($message, $type)
         $enabled = Configuration::getInstance()->getBoolean('debug.validatexml', false);
 
         if (
-            !(in_array('validatexml', $debug, true) // implicitly enabled
-            || (array_key_exists('validatexml', $debug)
-            && $debug['validatexml'] === true)
-            // explicitly enabled
-            // TODO: deprecate this option and remove it in 2.0
-            || $enabled) // old 'debug.validatexml' configuration option
+            !(
+                in_array('validatexml', $debug, true)
+                || (array_key_exists('validatexml', $debug) && ($debug['validatexml'] === true))
+            )
         ) {
             // XML validation is disabled
             return;
@@ -443,14 +443,20 @@ public static function isValid($xml, $schema)
             }
         }
 
-        if ($res) {
+        if ($res === true) {
             $config = Configuration::getInstance();
             /** @var string $schemaPath */
             $schemaPath = $config->resolvePath('schemas');
             $schemaFile = $schemaPath . '/' . $schema;
 
             libxml_set_external_entity_loader(
-                function ($public, $system, $context) {
+                /**
+                 * @param string|null $public
+                 * @param string $system
+                 * @param array $context
+                 * @return string|null
+                 */
+                function (string $public = null, string $system, array $context) {
                     if (filter_var($system, FILTER_VALIDATE_URL) === $system) {
                         return null;
                     }
@@ -458,6 +464,7 @@ function ($public, $system, $context) {
                 }
             );
 
+            /** @psalm-suppress PossiblyUndefinedVariable */
             $res = $dom->schemaValidate($schemaFile);
             if ($res) {
                 Errors::end();
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/IdPDisco.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/IdPDisco.php
index fade6be03e77a07fce4a72bf566d3b00265254fd..c31bb580e7971d55d1db8462ed818c6f69480279 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/IdPDisco.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/IdPDisco.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\XHTML;
 
 use SimpleSAML\Configuration;
@@ -606,7 +608,7 @@ public function handleRequest()
             foreach ($tryLanguages as $lang) {
                 if ($name = $this->getEntityDisplayName($data, $lang)) {
                     $newlist[$entityid]['name'] = $name;
-                    break 1;
+                    continue;
                 }
             }
             if (empty($newlist[$entityid]['name'])) {
@@ -615,7 +617,7 @@ public function handleRequest()
             foreach ($tryLanguages as $lang) {
                 if (!empty($data['description'][$lang])) {
                     $newlist[$entityid]['description'] = $data['description'][$lang];
-                    break 1;
+                    continue;
                 }
             }
             if (!empty($data['icon'])) {
@@ -642,6 +644,7 @@ function (array $idpentry1, array $idpentry2) {
         $t->data['entityID'] = $this->spEntityId;
         $t->data['urlpattern'] = htmlspecialchars(Utils\HTTP::getSelfURLNoQuery());
         $t->data['rememberenabled'] = $this->config->getBoolean('idpdisco.enableremember', false);
+        $t->data['rememberchecked'] = $this->config->getBoolean('idpdisco.rememberchecked', false);
         $t->show();
     }
 
@@ -651,7 +654,7 @@ function (array $idpentry1, array $idpentry2) {
      * @param string $language
      * @return string|null
      */
-    private function getEntityDisplayName(array $idpData, $language)
+    private function getEntityDisplayName(array $idpData, string $language): ?string
     {
         if (isset($idpData['UIInfo']['DisplayName'][$language])) {
             return $idpData['UIInfo']['DisplayName'][$language];
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/Template.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/Template.php
index 25371a9245eb6637ea54a369a07f015ca5cf1ce9..f4076cc44b3f3107c967534b7b50ea0da10e4b4e 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/Template.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/Template.php
@@ -7,6 +7,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML\XHTML;
 
 use SimpleSAML\Configuration;
@@ -23,6 +25,10 @@
 use Twig\TwigFilter;
 use Twig\TwigFunction;
 
+/**
+ * The content-property is set upstream, but this is not recognized by Psalm
+ * @psalm-suppress PropertyNotSetInConstructor
+ */
 class Template extends Response
 {
     /**
@@ -213,7 +219,7 @@ public function getTemplateName()
      * @param string $templateName The template name to normalize.
      * @return string The filename we need to look for.
      */
-    private function normalizeTemplateName($templateName)
+    private function normalizeTemplateName(string $templateName): string
     {
         if (strripos($templateName, '.twig')) {
             return $templateName;
@@ -240,7 +246,7 @@ private function normalizeTemplateName($templateName)
      * @return TemplateLoader The twig template loader or false if the template does not exist.
      * @throws \Twig\Error\LoaderError In case a failure occurs.
      */
-    private function setupTwigTemplatepaths()
+    private function setupTwigTemplatepaths(): TemplateLoader
     {
         $filename = $this->normalizeTemplateName($this->template);
 
@@ -282,7 +288,7 @@ private function setupTwigTemplatepaths()
      * @return \Twig\Environment
      * @throws \Exception if the template does not exist
      */
-    private function setupTwig()
+    private function setupTwig(): \Twig\Environment
     {
         $auto_reload = $this->configuration->getBoolean('template.auto_reload', true);
         $cache = $this->configuration->getString('template.cache', false);
@@ -305,14 +311,16 @@ private function setupTwig()
 
         // set up translation
         $options = [
-            'cache' => $cache,
             'auto_reload' => $auto_reload,
+            'cache' => $cache,
+            'strict_variables' => true,
             'translation_function' => [Translate::class, 'translateSingularGettext'],
             'translation_function_plural' => [Translate::class, 'translatePluralGettext'],
         ];
 
         $twig = new Twig_Environment($loader, $options);
         $twig->addExtension(new Twig_Extensions_Extension_I18n());
+        $twig->addExtension(new \Twig\Extensions\DateExtension());
 
         $twig->addFunction(new TwigFunction('moduleURL', [Module::class, 'getModuleURL']));
 
@@ -358,7 +366,7 @@ private function setupTwig()
      *
      * @return array An array of module => templatedir lookups.
      */
-    private function findThemeTemplateDirs()
+    private function findThemeTemplateDirs(): array
     {
         if (!isset($this->theme['module'])) {
             // no module involved
@@ -398,7 +406,7 @@ private function findThemeTemplateDirs()
      *
      * @throws \InvalidArgumentException If the module is not enabled or it has no templates directory.
      */
-    private function getModuleTemplateDir($module)
+    private function getModuleTemplateDir(string $module): string
     {
         if (!Module::isModuleEnabled($module)) {
             throw new \InvalidArgumentException('The module \'' . $module . '\' is not enabled.');
@@ -437,7 +445,7 @@ public function addTemplatesFromModule($module)
      *
      * @return array|null The array containing information of all available languages.
      */
-    private function generateLanguageBar()
+    private function generateLanguageBar(): ?array
     {
         $languages = $this->translator->getLanguage()->getLanguageList();
         ksort($languages);
@@ -469,7 +477,7 @@ private function generateLanguageBar()
      * Set some default context
      * @return void
      */
-    private function twigDefaultContext()
+    private function twigDefaultContext(): void
     {
         // show language bar by default
         if (!isset($this->data['hideLanguageBar'])) {
@@ -512,15 +520,21 @@ protected function getContents()
         if ($this->controller) {
             $this->controller->display($this->data);
         }
-        return $this->twig->render($this->twig_template, $this->data);
+        try {
+            return $this->twig->render($this->twig_template, $this->data);
+        } catch (\Twig\Error\RuntimeError $e) {
+            throw new \SimpleSAML\Error\Exception(substr($e->getMessage(), 0, -1) . ' in ' . $this->template, 0, $e);
+        }
     }
 
 
     /**
      * Send this template as a response.
      *
-     * @return Response This response.
+     * @return $this This response.
      * @throws \Exception if the template cannot be found.
+     *
+     * Note: No return type possible due to upstream limitations
      */
     public function send()
     {
@@ -555,7 +569,7 @@ public function show()
      *
      * @return array An array with the name of the module and template
      */
-    private function findModuleAndTemplateName($template)
+    private function findModuleAndTemplateName(string $template): array
     {
         $tmp = explode(':', $template, 2);
         return (count($tmp) === 2) ? [$tmp[0], $tmp[1]] : [null, $tmp[0]];
@@ -578,9 +592,8 @@ private function findModuleAndTemplateName($template)
      *
      * @throws \Exception If the template file couldn't be found.
      */
-    private function findTemplatePath($template, $throw_exception = true)
+    private function findTemplatePath(string $template, bool $throw_exception = true): ?string
     {
-        assert(is_string($template));
         $extensions = ['.tpl.php', '.php'];
 
         list($templateModule, $templateName) = $this->findModuleAndTemplateName($template);
@@ -750,7 +763,7 @@ public static function setLanguageCookie($language)
      *
      * @return array
      */
-    private function getLanguageList()
+    private function getLanguageList(): array
     {
         return $this->translator->getLanguage()->getLanguageList();
     }
@@ -791,7 +804,7 @@ public function getTranslation($translations)
      * @param string $file
      * @return void
      */
-    private function includeAtTemplateBase($file)
+    private function includeAtTemplateBase(string $file): void
     {
         $data = $this->data;
 
@@ -837,7 +850,7 @@ public function includeLanguageFile($file, $otherConfig = null)
      *
      * @return bool
      */
-    private function isLanguageRTL()
+    private function isLanguageRTL(): bool
     {
         return $this->translator->getLanguage()->isLanguageRTL();
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/TemplateControllerInterface.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/TemplateControllerInterface.php
index bead9a1c69c6209b27b5805115c9d57e2c6a56ae..68e1a07f99da6ae7ebb1b8afb08bd060d96acbda 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/TemplateControllerInterface.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/TemplateControllerInterface.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\XHTML;
 
 use Twig\Environment;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/TemplateLoader.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/TemplateLoader.php
index 8fcb45ed85d02f146a7efbd48929c5eeec9e9571..4b6034b9593f74f8ac09c9928a5f883ddb82ba23 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/TemplateLoader.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XHTML/TemplateLoader.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\XHTML;
 
 use SimpleSAML\Module;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Errors.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Errors.php
index 40af03a1cc03d3ac9e69b59a76d3daf9455d86f3..c4622e48163b7816ad6446f21e19a54e23ef1f28 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Errors.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Errors.php
@@ -10,6 +10,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML\XML;
 
 use LibXMLError;
@@ -32,7 +34,7 @@ class Errors
      *
      * @return void
      */
-    private static function addErrors()
+    private static function addErrors(): void
     {
         $currentErrors = libxml_get_errors();
         libxml_clear_errors();
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Parser.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Parser.php
index 073faa93ee297f1e7b73701e8c4aec4829a702fc..21623a44be98119fc51966035dea51d14b6c56fe 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Parser.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Parser.php
@@ -7,6 +7,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML\XML;
 
 class Parser
@@ -24,7 +26,7 @@ public function __construct($xml)
         $this->simplexml->registerXPathNamespace('saml2meta', 'urn:oasis:names:tc:SAML:2.0:metadata');
         $this->simplexml->registerXPathNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
     }
-    
+
 
     /**
      * @param \SimpleXMLElement $element
@@ -38,7 +40,7 @@ public static function fromSimpleXMLElement(\SimpleXMLElement $element)
         foreach ($namespaces as $prefix => $ns) {
             $element[(($prefix === '') ? 'xmlns' : 'xmlns:' . $prefix)] = $ns;
         }
-        
+
         /* Create a new parser with the xml document where the namespace definitions
          * are added.
          */
@@ -48,7 +50,7 @@ public static function fromSimpleXMLElement(\SimpleXMLElement $element)
         }
         return new Parser($xml);
     }
-    
+
 
     /**
      * @param string $xpath
@@ -65,7 +67,7 @@ public function getValueDefault($xpath, $defvalue)
             return $defvalue;
         }
     }
-    
+
 
     /**
      * @param string $xpath
@@ -87,7 +89,7 @@ public function getValue($xpath, $required = false)
         }
         return (string) $result[0];
     }
-    
+
 
     /**
      * @param array $xpath
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnRequest.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnRequest.php
index 899e195574e16778ba3d1683702ab75c781f0b95..1286a8257ce999257e86aab30e18f0795f14235e 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnRequest.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnRequest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 /**
  * The Shibboleth 1.3 Authentication Request. Not part of SAML 1.1,
  * but an extension using query paramters no XML.
@@ -30,7 +32,7 @@ public function setRelayState($relayState)
     {
         $this->relayState = $relayState;
     }
-    
+
 
     /**
      * @return string|null
@@ -39,7 +41,7 @@ public function getRelayState()
     {
         return $this->relayState;
     }
-    
+
 
     /**
      * @param string|null $issuer
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnResponse.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnResponse.php
index f50045d8f6f5a0f678ba63f8f035c49a15f504d3..baab8ab1c9365ae28439b099757aacefedf5fb5f 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnResponse.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnResponse.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 /**
  * A Shibboleth 1.3 authentication response.
  *
@@ -12,6 +14,7 @@
 
 use DOMDocument;
 use DOMNode;
+use DOMNodeList;
 use DOMXpath;
 use SAML2\DOMDocumentFactory;
 use SimpleSAML\Configuration;
@@ -160,7 +163,7 @@ public function validate()
      * @param \DOMElement|\SimpleXMLElement $node Node to be validated.
      * @return bool TRUE if the node is validated or FALSE if not.
      */
-    private function isNodeValidated($node)
+    private function isNodeValidated($node): bool
     {
         if ($this->messageValidated) {
             // This message was validated externally
@@ -190,9 +193,8 @@ private function isNodeValidated($node)
      *                        then the query will be relative to the root of the response.
      * @return \DOMNodeList
      */
-    private function doXPathQuery($query, $node = null)
+    private function doXPathQuery(string $query, DOMNode $node = null): DOMNodeList
     {
-        assert(is_string($query));
         assert($this->dom instanceof DOMDocument);
 
         if ($node === null) {
@@ -227,12 +229,12 @@ public function getSessionIndex()
         return null;
     }
 
-    
+
     /**
      * @throws \Exception
      * @return array
      */
-    public function getAttributes()
+    public function getAttributes(): array
     {
         $metadata = MetaDataStorageHandler::getMetadataHandler();
         $md = $metadata->getMetaData($this->getIssuer(), 'shib13-idp-remote');
@@ -252,7 +254,7 @@ public function getAttributes()
             }
 
             $conditions = $this->doXPathQuery('shib:Conditions', $assertion);
-            if ($conditions && $conditions->length > 0) {
+            if ($conditions->length > 0) {
                 $condition = $conditions->item(0);
 
                 $start = $condition->getAttribute('NotBefore');
@@ -307,7 +309,7 @@ public function getAttributes()
         return $attributes;
     }
 
-    
+
     /**
      * @throws \Exception
      * @return string
@@ -367,13 +369,12 @@ public function generate(Configuration $idp, Configuration $sp, $shire, $attribu
         }
 
         $id = Utils\Random::generateID();
-        
+
         $issueInstant = Utils\Time::generateTimestamp();
-        
+
         // 30 seconds timeskew back in time to allow differing clocks
         $notBefore = Utils\Time::generateTimestamp(time() - 30);
-        
-        
+
         $assertionExpire = Utils\Time::generateTimestamp(time() + 300); // 5 minutes
         $assertionid = Utils\Random::generateID();
 
@@ -453,13 +454,8 @@ public function generate(Configuration $idp, Configuration $sp, $shire, $attribu
      * @param array $scopedAttributes  Array of attributes names which are scoped.
      * @return string  The attribute encoded as an XML-string.
      */
-    private function encAttribute($name, $values, $base64, $scopedAttributes)
+    private function encAttribute(string $name, array $values, bool $base64, array $scopedAttributes): string
     {
-        assert(is_string($name));
-        assert(is_array($values));
-        assert(is_bool($base64));
-        assert(is_array($scopedAttributes));
-
         if (in_array($name, $scopedAttributes, true)) {
             $scoped = true;
         } else {
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Signer.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Signer.php
index bae8a0ce4f5a713ce05ed0dcd86fa571423d2ae3..e71c9079eec21cb0d34f1d0d1eaf596b859d8013 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Signer.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Signer.php
@@ -9,6 +9,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML\XML;
 
 use DOMComment;
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Validator.php b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Validator.php
index 0e201c88984a74b077aab0a2c0ddc6a42e1e7518..d20ece0be260c6c81556a929fbfa182c6a65f00e 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Validator.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/SimpleSAML/XML/Validator.php
@@ -7,6 +7,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 namespace SimpleSAML\XML;
 
 use RobRichards\XMLSecLibs\XMLSecEnc;
@@ -159,10 +161,8 @@ public function getX509Certificate()
      * @return string|null  The fingerprint as a 40-character lowercase hexadecimal number. NULL is returned if the
      *                 argument isn't an X509 certificate.
      */
-    private static function calculateX509Fingerprint($x509cert)
+    private static function calculateX509Fingerprint(string $x509cert): ?string
     {
-        assert(is_string($x509cert));
-
         $lines = explode("\n", $x509cert);
 
         $data = '';
@@ -203,11 +203,8 @@ private static function calculateX509Fingerprint($x509cert)
      * @throws \Exception
      * @return void
      */
-    private static function validateCertificateFingerprint($certificate, $fingerprints)
+    private static function validateCertificateFingerprint(string $certificate, array $fingerprints): void
     {
-        assert(is_string($certificate));
-        assert(is_array($fingerprints));
-
         $certFingerprint = self::calculateX509Fingerprint($certificate);
         if ($certFingerprint === null) {
             // Couldn't calculate fingerprint from X509 certificate. Should not happen.
@@ -323,11 +320,8 @@ public function validateCA($caFile)
      * @return boolean|string TRUE on success, or a string with error messages if it failed.
      * @deprecated
      */
-    private static function validateCABuiltIn($certificate, $caFile)
+    private static function validateCABuiltIn(string $certificate, string $caFile)
     {
-        assert(is_string($certificate));
-        assert(is_string($caFile));
-
         // Clear openssl errors
         while (openssl_error_string() !== false) {
         }
@@ -361,11 +355,8 @@ private static function validateCABuiltIn($certificate, $caFile)
      * @throws \Exception
      * @deprecated
      */
-    private static function validateCAExec($certificate, $caFile)
+    private static function validateCAExec(string $certificate, string $caFile)
     {
-        assert(is_string($certificate));
-        assert(is_string($caFile));
-
         $command = [
             'openssl', 'verify',
             '-CAfile', $caFile,
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/_autoload.php b/vendor/simplesamlphp/simplesamlphp/lib/_autoload.php
index e44c70f9774efcbb9815442d8d716445034592d1..99773aae25ff4f896f32cadfd0ebe080f30cb2cd 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/_autoload.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/_autoload.php
@@ -8,6 +8,8 @@
  * @package SimpleSAMLphp
  */
 
+declare(strict_types=1);
+
 // SSP is loaded as a separate project
 if (file_exists(dirname(dirname(__FILE__)) . '/vendor/autoload.php')) {
     require_once dirname(dirname(__FILE__)) . '/vendor/autoload.php';
diff --git a/vendor/simplesamlphp/simplesamlphp/lib/_autoload_modules.php b/vendor/simplesamlphp/simplesamlphp/lib/_autoload_modules.php
index 765dfd899bdba52dca796c719755ade6a0478767..3d7ca91848c91c77f886d2e96a9db0ec7bbe3607 100644
--- a/vendor/simplesamlphp/simplesamlphp/lib/_autoload_modules.php
+++ b/vendor/simplesamlphp/simplesamlphp/lib/_autoload_modules.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 /**
  * This file registers an autoloader for SimpleSAMLphp modules.
  *
@@ -17,7 +19,7 @@
  * with 'SimpleSAML_'.
  * @deprecated This function will be removed in SSP 2.0.
  */
-function temporaryLoader($class)
+function temporaryLoader(string $class)
 {
     // handle the upgrade to the latest version of XMLSecLibs using namespaces
     if (strstr($class, 'XMLSec') && !strstr($class, '\\RobRichards\\XMLSecLibs\\')) {
@@ -45,6 +47,7 @@ class_alias($new, $class);
         'SimpleSAML_IdP_LogoutIFrame' => 'SimpleSAML_IdP_IFrameLogoutHandler',
         'SimpleSAML_IdP_LogoutTraditional' => 'SimpleSAML_IdP_TraditionalLogoutHandler',
         'SimpleSAML_Auth_Default' => 'SimpleSAML_Auth_DefaultAuth',
+        'SimpleSAML_Auth_LDAP' => 'SimpleSAML_Module_ldap_Auth_Ldap',
     ];
     if (array_key_exists($class, $renamed)) {
         // the class has been renamed, try to load it and create an alias
@@ -82,7 +85,7 @@ class_alias($new, $original);
  *
  * TODO: this autoloader should be removed once everything has been migrated to namespaces.
  */
-function sspmodAutoloadPSR0($className)
+function sspmodAutoloadPSR0(string $className)
 {
     $modulePrefixLength = strlen('sspmod_');
     $classPrefix = substr($className, 0, $modulePrefixLength);
@@ -140,7 +143,7 @@ class_alias("SimpleSAML\\Module\\$module\\$nspath", $className);
  *
  * @param string $className Name of the class.
  */
-function sspmodAutoloadPSR4($className)
+function sspmodAutoloadPSR4(string $className)
 {
     $elements = explode('\\', $className);
     if ($elements[0] === '') {
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/el/LC_MESSAGES/messages.po b/vendor/simplesamlphp/simplesamlphp/locales/el/LC_MESSAGES/messages.po
index c0bc349fc2c3e63f256c8c2c77c0557420b99db8..ad2ef25ec1d4391859e9eb3f28e38a4944ef283e 100644
--- a/vendor/simplesamlphp/simplesamlphp/locales/el/LC_MESSAGES/messages.po
+++ b/vendor/simplesamlphp/simplesamlphp/locales/el/LC_MESSAGES/messages.po
@@ -203,9 +203,6 @@ msgstr "Προαιρετικά πεδία"
 msgid "{logout:return}"
 msgstr "Επιστροφή στην υπηρεσία"
 
-msgid "{errors:title_MEMCACHEDOWN}"
-msgstr "Δεν είναι δυνατή η ανάκτηση δεδομένων συνεδρίας"
-
 msgid "{admin:metadata_xmlurl}"
 msgstr "Διεύθυνση <a href=\"%METAURL%\">λήψης</a> μεταδεδομένων:"
 
@@ -311,9 +308,6 @@ msgstr ""
 "(sessions), σας συνιστούμε να <i>κλείσετε</i> το πρόγραμμα πλοήγησης (web"
 " browser)."
 
-msgid "{admin:metaconv_selectfile}"
-msgstr "ή επιλέξτε αρχείο"
-
 msgid "{admin:metadata_xmlformat}"
 msgstr "Μεταδεδομένα σε μορφή xml SAML 2.0:"
 
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/en/LC_MESSAGES/messages.po b/vendor/simplesamlphp/simplesamlphp/locales/en/LC_MESSAGES/messages.po
index eac57388e8c9cb5b2177104124d7759d35b7ef46..21ec9215cb89ace21a80002f03d91a5e38fb7802 100644
--- a/vendor/simplesamlphp/simplesamlphp/locales/en/LC_MESSAGES/messages.po
+++ b/vendor/simplesamlphp/simplesamlphp/locales/en/LC_MESSAGES/messages.po
@@ -44,9 +44,6 @@ msgstr "State information lost"
 msgid "{login:username}"
 msgstr "Username"
 
-msgid "{login:processing}"
-msgstr "Processing..."
-
 msgid "Back"
 msgstr "Back"
 
@@ -91,9 +88,6 @@ msgstr "Unable to locate metadata for %ENTITYID%"
 msgid "{admin:metadata_metadata}"
 msgstr "Metadata"
 
-msgid "{errors:title_SSOPARAMS}"
-msgstr "No SAML request provided"
-
 msgid "{errors:report_text}"
 msgstr ""
 "Optionally enter your email address, for the administrators to be able "
@@ -199,9 +193,6 @@ msgstr ""
 "The parameters sent to the discovery service were not according to "
 "specifications."
 
-msgid "{errors:title_ARSPARAMS}"
-msgstr "No SAML message provided"
-
 msgid "{errors:descr_CREATEREQUEST}"
 msgstr "An error occurred when trying to create the SAML request."
 
@@ -211,9 +202,6 @@ msgstr "Optional fields"
 msgid "{logout:return}"
 msgstr "Return to service"
 
-msgid "{errors:title_MEMCACHEDOWN}"
-msgstr "Cannot retrieve session data"
-
 msgid "{admin:metadata_xmlurl}"
 msgstr "You can <a href=\"%METAURL%\">get the metadata xml on a dedicated URL</a>:"
 
@@ -318,9 +306,6 @@ msgstr ""
 "logout</i>. To ensure that all your sessions are closed, you are "
 "encouraged to <i>close your webbrowser</i>."
 
-msgid "{admin:metaconv_selectfile}"
-msgstr "or select a file:"
-
 msgid "{admin:metadata_xmlformat}"
 msgstr "In SAML 2.0 Metadata XML format:"
 
@@ -509,12 +494,6 @@ msgstr "Send e-mail to help desk"
 msgid "{login:help_desk_link}"
 msgstr "Help desk homepage"
 
-msgid "{errors:descr_ARSPARAMS}"
-msgstr ""
-"You accessed the Artifact Resolution Service interface, but did not "
-"provide a SAML ArtifactResolve message. Please note that this endpoint is"
-" not intended to be accessed directly."
-
 msgid "{login:remember_me}"
 msgstr "Remember me"
 
@@ -636,12 +615,6 @@ msgstr ""
 msgid "{disco:selectidp_full}"
 msgstr "Please select the identity provider where you want to authenticate:"
 
-msgid "{errors:descr_SSOPARAMS}"
-msgstr ""
-"You accessed the Single Sign On Service interface, but did not provide a "
-"SAML Authentication Request. Please note that this endpoint is not "
-"intended to be accessed directly."
-
 msgid "{errors:descr_NOTFOUNDREASON}"
 msgstr "The given page was not found. The reason was: %REASON%  The URL was: %URL%"
 
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/es/LC_MESSAGES/messages.po b/vendor/simplesamlphp/simplesamlphp/locales/es/LC_MESSAGES/messages.po
index c6eb2c1f37cf120a6e269b3b797117896bb5b3a2..08bc12d68685841fdc1f70a48b8bd41921fd63b1 100644
--- a/vendor/simplesamlphp/simplesamlphp/locales/es/LC_MESSAGES/messages.po
+++ b/vendor/simplesamlphp/simplesamlphp/locales/es/LC_MESSAGES/messages.po
@@ -72,7 +72,7 @@ msgstr "Volver al listado de archivos"
 
 msgid "{errors:report_trackid}"
 msgstr ""
-"Por favor, si informa de este error, mantenga el <emph>tracking ID</emph>"
+"Por favor, si informa de este error, mantenga el <em>tracking ID</em>"
 " que permite encontrar su sesi&oacute;n en los registros de que dispone "
 "el administrador del sistema:"
 
@@ -1215,7 +1215,7 @@ msgid ""
 "makes it possible to locate your session in the logs available to the "
 "system administrator:"
 msgstr ""
-"Por favor, si informa de este error, mantenga el <emph>tracking ID</emph>"
+"Por favor, si informa de este error, mantenga el <em>tracking ID</em>"
 " que permite encontrar su sesi&oacute;n en los registros de que dispone "
 "el administrador del sistema:"
 
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/it/LC_MESSAGES/messages.po b/vendor/simplesamlphp/simplesamlphp/locales/it/LC_MESSAGES/messages.po
index 3a52011922b24665c2acee35ed4a482dd1b83332..49fc18a83861baedfb9e9f19321883c0d75c2bec 100644
--- a/vendor/simplesamlphp/simplesamlphp/locales/it/LC_MESSAGES/messages.po
+++ b/vendor/simplesamlphp/simplesamlphp/locales/it/LC_MESSAGES/messages.po
@@ -98,7 +98,7 @@ msgstr "Riporta gli errori"
 
 msgid "{login:change_home_org_text}"
 msgstr ""
-"E' stata selezionata <b>%HOMEORG%</b> come propria organizzazione. Se è "
+"&Egrave; stata selezionata <b>%HOMEORG%</b> come propria organizzazione. Se è "
 "sbagliata, è possibile selezionarne un'altra."
 
 msgid "{errors:title_PROCESSAUTHNREQUEST}"
@@ -126,7 +126,7 @@ msgstr "Metadati Shib 1.3 IdP"
 msgid "{login:help_text}"
 msgstr ""
 "Senza il nome utente e la password, non è possibile effettuare "
-"l'autenticazione al servizio. C'è probabilmente qualcuno che può fornire "
+"l'autenticazione al servizio. C'è probabilmente qualcuno che può fornirti "
 "aiuto. Consultare il proprio help desk."
 
 msgid "{logout:default_link_text}"
@@ -151,10 +151,10 @@ msgstr ""
 "configurazione dei metadati sia corretta."
 
 msgid "{errors:title_BADREQUEST}"
-msgstr "E' stata ricevuta una richiesta erronea."
+msgstr "&Egrave; stata ricevuta una richiesta erronea."
 
 msgid "{status:sessionsize}"
-msgstr "Dimensione della session: %SIZE%"
+msgstr "Dimensione della sessione: %SIZE%"
 
 msgid "{logout:title}"
 msgstr "Disconnesso"
@@ -198,14 +198,14 @@ msgstr "Ritornare al servizio"
 msgid "{admin:metadata_xmlurl}"
 msgstr ""
 "Si possono <a href=\"%METAURL%\">ottenere i metadati in XML dall'URL "
-"dedicata</a>:"
+"dedicato</a>:"
 
 msgid "{logout:logout_all}"
 msgstr "Si, da tutti i servizi"
 
 msgid "{admin:debug_disable_debug_mode}"
 msgstr ""
-"E' possibile disabilitare la modalità di debug nel file di configurazione"
+"&Egrave; possibile disabilitare la modalità di debug nel file di configurazione"
 " globale di SimpleSAMLphp, <tt>config/config.php</tt>."
 
 msgid "{disco:select}"
@@ -263,7 +263,7 @@ msgid "{admin:cfg_check_missing}"
 msgstr "Opzioni mancanti dal file di configurazione"
 
 msgid "{errors:descr_UNHANDLEDEXCEPTION}"
-msgstr "E' stata generata un'eccezione che non è stata gestita."
+msgstr "&Egrave; stata generata un'eccezione che non è stata gestita."
 
 msgid "{general:yes}"
 msgstr "Sì"
@@ -310,7 +310,7 @@ msgid "{admin:metaover_group_metadata.saml20-idp-remote}"
 msgstr "SAML 2.0 Identity Provider (Remoto)"
 
 msgid "{admin:metaover_group_metadata.saml20-idp-hosted}"
-msgstr "SAML 2.o Identity Provider (Hosted)"
+msgstr "SAML 2.0 Identity Provider (Hosted)"
 
 msgid "{admin:metaover_required_found}"
 msgstr "Campi richiesti"
@@ -320,14 +320,14 @@ msgstr "Selezionare il file di configurazione da verificare:"
 
 msgid "{errors:descr_UNKNOWNCERT}"
 msgstr ""
-"L'autenticazione è fallita perché il tuo browser ha inviato un certificat"
+"L'autenticazione è fallita perché il tuo browser ha inviato un certificato"
 " sconosciuto."
 
 msgid "{logout:logging_out_from}"
 msgstr "Disconnessione in corso dai seguenti servizi:"
 
 msgid "{logout:loggedoutfrom}"
-msgstr "Adesso sei correttamente disconnesso da %SP%"
+msgstr "Sei stato correttamente disconnesso da %SP%"
 
 msgid "{errors:errorreport_text}"
 msgstr "Il rapporto dell'errore è stato inviato agli amministratori."
@@ -364,7 +364,7 @@ msgstr "Completato"
 msgid "{errors:descr_NOTSET}"
 msgstr ""
 "La password definita nella configurazione (auth.adminpassword) non è "
-"stata cambiata dal valore di default. Si prega di editare il file di "
+"stata cambiata dal valore di default. Si prega di modificare il file di "
 "configurazione."
 
 msgid "{general:service_provider}"
@@ -450,7 +450,7 @@ msgstr ""
 "specificare come proseguire dopo il login."
 
 msgid "{status:header_diagnostics}"
-msgstr "Diagnostici di SimpleSAMLphp"
+msgstr "Diagnostica di SimpleSAMLphp"
 
 msgid "{status:intro}"
 msgstr ""
@@ -465,7 +465,7 @@ msgid "{admin:debug_sending_message_title}"
 msgstr "Invio del messaggio"
 
 msgid "{errors:title_RESPONSESTATUSNOSUCCESS}"
-msgstr "E' stato ricevuto un errore dall'Identity Provider"
+msgstr "&Egrave; stato ricevuto un errore dall'Identity Provider"
 
 msgid "{admin:metadata_shib13-sp}"
 msgstr "Metadati Shib 1.3 SP"
@@ -689,7 +689,7 @@ msgid "Explain what you did when this error occurred..."
 msgstr "Descrivi cosa stavi facendo al momento dell'errore"
 
 msgid "An unhandled exception was thrown."
-msgstr "E' stata generata un'eccezione che non è stata gestita."
+msgstr "&Egrave; stata generata un'eccezione che non è stata gestita."
 
 msgid "Invalid certificate"
 msgstr "Certificato non valido"
@@ -732,7 +732,7 @@ msgid "Unable to locate metadata for %ENTITYID%"
 msgstr "Impossibile individuare i metatadi per %ENTITYID%"
 
 msgid "Organizational number"
-msgstr "Numero organizzativo"
+msgstr "Numero dell'organizzazione"
 
 msgid "Password not set"
 msgstr "Password non impostata"
@@ -784,7 +784,7 @@ msgid ""
 "from the default value. Please edit the configuration file."
 msgstr ""
 "La password definita nella configurazione (auth.adminpassword) non è "
-"stata cambiata dal valore di default. Si prega di editare il file di "
+"stata cambiata dal valore di default. Si prega di modificare il file di "
 "configurazione."
 
 msgid "Converted metadata"
@@ -800,7 +800,7 @@ msgid ""
 "You have chosen <b>%HOMEORG%</b> as your home organization. If this is "
 "wrong you may choose another one."
 msgstr ""
-"E' stata selezionata <b>%HOMEORG%</b> come propria organizzazione. Se è "
+"&Egrave; stata selezionata <b>%HOMEORG%</b> come propria organizzazione. Se è "
 "sbagliata, è possibile selezionarne un'altra."
 
 msgid "Error processing request from Service Provider"
@@ -852,7 +852,7 @@ msgid "Your attributes"
 msgstr "I tuoi attributi"
 
 msgid "Given name"
-msgstr "Nome "
+msgstr "Nome"
 
 msgid "Identity assurance profile"
 msgstr "Profilo di garanzia sull'identità"
@@ -868,7 +868,7 @@ msgstr "Nome dell'organizzazione"
 
 msgid "Authentication failed: the certificate your browser sent is unknown"
 msgstr ""
-"L'autenticazione è fallita perché il tuo browser ha inviato un certificat"
+"L'autenticazione è fallita perché il tuo browser ha inviato un certificato"
 " sconosciuto."
 
 msgid ""
@@ -879,7 +879,7 @@ msgstr ""
 "continuare."
 
 msgid "Home organization domain name"
-msgstr "Nome del dominio della propria organizzazione"
+msgstr "Nome di dominio della propria organizzazione"
 
 msgid "Go back to the file list"
 msgstr "Tornare indietro alla lista dei file"
@@ -897,13 +897,13 @@ msgid "Logout failed"
 msgstr "Disconnessione fallita"
 
 msgid "Identity number assigned by public authorities"
-msgstr "Numero di identità assegnato dall'autorità pubblica"
+msgstr "Numero di identità assegnato dalle autorità pubbliche"
 
 msgid "WS-Federation Identity Provider (Remote)"
 msgstr "WS-Federation Identity Provider (Remoto)"
 
 msgid "Error received from Identity Provider"
-msgstr "E' stato ricevuto un errore dall'Identity Provider"
+msgstr "&Egrave; stato ricevuto un errore dall'Identity Provider"
 
 msgid "LDAP Error"
 msgstr "Errore LDAP"
@@ -1013,7 +1013,7 @@ msgid "You are also logged in on these services:"
 msgstr "Attualmente sei anche connesso ai seguenti servizi:"
 
 msgid "SimpleSAMLphp Diagnostics"
-msgstr "Diagnostici di SimpleSAMLphp"
+msgstr "Diagnostica di SimpleSAMLphp"
 
 msgid "Debug information"
 msgstr "Informazioni di debug"
@@ -1031,7 +1031,7 @@ msgid "You have successfully logged out from all services listed above."
 msgstr "Sei stato disconnesso da tutti i servizi sopra elencati."
 
 msgid "You are now successfully logged out from %SP%."
-msgstr "Adesso sei correttamente disconnesso da %SP%"
+msgstr "Sei stato correttamente disconnesso da %SP%"
 
 msgid "Affiliation"
 msgstr "Affiliazione"
@@ -1075,7 +1075,7 @@ msgid "Authentication error in source %AUTHSOURCE%. The reason was: %REASON%"
 msgstr "Errore di autenticazione in sorgente %AUTHSOURCE%. La ragione è $REASON%"
 
 msgid "Bad request received"
-msgstr "E' stata ricevuta una richiesta erronea."
+msgstr "&Egrave; stata ricevuta una richiesta erronea."
 
 msgid "User ID"
 msgstr "Identificativo utente"
@@ -1149,7 +1149,7 @@ msgid "Metadata not found"
 msgstr "Metadati non trovati"
 
 msgid "SAML 2.0 Identity Provider (Hosted)"
-msgstr "SAML 2.o Identity Provider (Hosted)"
+msgstr "SAML 2.0 Identity Provider (Hosted)"
 
 msgid "Primary affiliation"
 msgstr "Affiliazione primaria"
@@ -1182,7 +1182,7 @@ msgstr ""
 "chiudere tutte le sessioni si consiglia di <i>chiudere il browser</i>"
 
 msgid "Bad request to discovery service"
-msgstr "Richiesta errata al discovery service"
+msgstr "Richiesta erronea al discovery service"
 
 msgid "Select your identity provider"
 msgstr "Selezionare il proprio identity provider"
@@ -1280,7 +1280,7 @@ msgid ""
 "You can turn off debug mode in the global SimpleSAMLphp configuration "
 "file <tt>config/config.php</tt>."
 msgstr ""
-"E' possibile disabilitare la modalità di debug nel file di configurazione"
+"&Egrave; possibile disabilitare la modalità di debug nel file di configurazione"
 " globale di SimpleSAMLphp, <tt>config/config.php</tt>."
 
 msgid "How to get help"
@@ -1330,7 +1330,7 @@ msgstr ""
 msgid "You can <a href=\"%METAURL%\">get the metadata xml on a dedicated URL</a>:"
 msgstr ""
 "Si possono <a href=\"%METAURL%\">ottenere i metadati in XML dall'URL "
-"dedicata</a>:"
+"dedicato</a>:"
 
 msgid "Street"
 msgstr "Via"
@@ -1389,7 +1389,7 @@ msgid "Error in this metadata entry"
 msgstr "Errore in questo elemento dei metadati"
 
 msgid "Session size: %SIZE%"
-msgstr "Dimensione della session: %SIZE%"
+msgstr "Dimensione della sessione: %SIZE%"
 
 msgid "Parse"
 msgstr "Analisi"
@@ -1400,7 +1400,7 @@ msgid ""
 "you. Consult the help desk at your organization!"
 msgstr ""
 "Senza il nome utente e la password, non è possibile effettuare "
-"l'autenticazione al servizio. C'è probabilmente qualcuno che può fornire "
+"l'autenticazione al servizio. C'è probabilmente qualcuno che può fornirti "
 "aiuto. Consultare il proprio help desk."
 
 msgid "Metadata parser"
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/ja/LC_MESSAGES/attributes.po b/vendor/simplesamlphp/simplesamlphp/locales/ja/LC_MESSAGES/attributes.po
index c5897cbdba8f0160916285582609fb9ce331379d..8de7fe1abd57765408d65677dfbc7f896be75224 100644
--- a/vendor/simplesamlphp/simplesamlphp/locales/ja/LC_MESSAGES/attributes.po
+++ b/vendor/simplesamlphp/simplesamlphp/locales/ja/LC_MESSAGES/attributes.po
@@ -588,15 +588,15 @@ msgstr "urn:oid:2.5.4.47"
 
 # English string: Fax number
 msgid "facsimileTelephoneNumber"
-msgstr "Fax番号"
+msgstr "FAX番号"
 
 # English string: Fax number
 msgid "urn:mace:dir:attribute-def:facsimileTelephoneNumber"
-msgstr "Fax番号"
+msgstr "FAX番号"
 
 # English string: Fax number
 msgid "urn:oid:2.5.4.23"
-msgstr "Fax番号"
+msgstr "FAX番号"
 
 msgid "favouriteDrink"
 msgstr "favouriteDrink"
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/ja/LC_MESSAGES/messages.po b/vendor/simplesamlphp/simplesamlphp/locales/ja/LC_MESSAGES/messages.po
index a70892416f3c40bf4d2e033d47c6d43547fdc979..cc6d3fd36c0217a11a4f50f89bfa53f3de97db0c 100644
--- a/vendor/simplesamlphp/simplesamlphp/locales/ja/LC_MESSAGES/messages.po
+++ b/vendor/simplesamlphp/simplesamlphp/locales/ja/LC_MESSAGES/messages.po
@@ -19,7 +19,7 @@ msgid "{admin:metadata_saml20-idp}"
 msgstr "SAML 2.0 IdPメタデータ"
 
 msgid "{errors:descr_WRONGUSERPASS}"
-msgstr "ユーザー名が見つからなかったか、パスワードが間違っているかの何方かです。ユーザー名、パスワードを確認して試してください。"
+msgstr "ユーザー名またはパスワードが間違っています。ユーザー名、パスワードを確認して再度試してください。"
 
 msgid "{logout:failed}"
 msgstr "ログアウトに失敗しました"
@@ -43,7 +43,7 @@ msgid "{login:username}"
 msgstr "ユーザー名"
 
 msgid "{errors:title_METADATA}"
-msgstr "目らーデータの読み込み中にエラーが発生しました"
+msgstr "メタデータの読み込み中にエラーが発生しました"
 
 msgid "{admin:metaconv_title}"
 msgstr "メタデータパーサ"
@@ -53,14 +53,11 @@ msgstr "エラーは見つかりませんでした。"
 
 msgid "{errors:descr_LOGOUTINFOLOST}"
 msgstr ""
-"The information about the current logout operation has been lost. You "
-"should return to the service you were trying to log out from and try to "
-"log out again. This error can be caused by the logout information "
-"expiring. The logout information is stored for a limited amout of time - "
-"usually a number of hours. This is longer than any normal logout "
-"operation should take, so this error may indicate some other error with "
-"the configuration. If the problem persists, contact your service "
-"provider."
+"ログアウト操作に関する情報が失われました。ログアウトしようとしていたサービスに戻り、再度ログアウトを行ってください。"
+"このエラーは、ログアウト情報の期限切れが原因で発生する可能性があります。"
+"ログアウト情報は、通常は数時間の限られた時間だけ保存されます。"
+"このエラーは、通常のログアウト操作にかかるよりも長いため、構成に関する他のエラーの可能性もあります。"
+"問題が解決しない場合は、サービスプロバイダにお問い合わせください。"
 
 msgid "{disco:previous_auth}"
 msgstr "前回選択した認証: "
@@ -69,7 +66,7 @@ msgid "{admin:cfg_check_back}"
 msgstr "ファイルリストに戻る"
 
 msgid "{errors:report_trackid}"
-msgstr "このエラーを報告する場合、システム管理者がログからあなたのセッションを特定する為に、トラッキング番号を報告してください。"
+msgstr "このエラーを報告する場合、システム管理者がログからあなたのセッションを特定するために、トラッキング番号を報告してください。"
 
 msgid "{login:change_home_org_title}"
 msgstr "あなたの組織を変更してください"
@@ -81,7 +78,7 @@ msgid "{admin:metadata_metadata}"
 msgstr "メタデータ"
 
 msgid "{errors:report_text}"
-msgstr "任意ですがメールアドレスを入力してください、管理者があなたへ問題についての追加質問を行う為に使用します。"
+msgstr "任意ですがメールアドレスを入力してください、管理者があなたへ問題についての追加質問を行うために使用します。"
 
 msgid "{errors:report_header}"
 msgstr "エラーをレポート"
@@ -99,7 +96,7 @@ msgid "{errors:debuginfo_header}"
 msgstr "デバッグ情報"
 
 msgid "{admin:debug_sending_message_msg_text}"
-msgstr "お気づきの様にあなたはデバッグモードにいます。あなたは送信するメッセージの内容を見ることが出来ます。"
+msgstr "現在はデバッグモードです。あなたは送信するメッセージの内容を見ることが出来ます。"
 
 msgid "{errors:descr_RESPONSESTATUSNOSUCCESS}"
 msgstr "アイデンティティプロバイダがエラーを受けとりました。(SAMLレスポンスに失敗したステータスコード)"
@@ -109,8 +106,8 @@ msgstr "Shib 1.3 IdPメタデータ"
 
 msgid "{login:help_text}"
 msgstr ""
-"お気の毒です! - "
-"ユーザー名とパスワードが無くてはサービスにアクセスする為にあなた自身を認証する事が出来ません。あなたの大学のヘルプデスクに相談すると、あなたの助けになってくれるでしょう。"
+"ユーザー名とパスワードがないと、サービスにアクセスするための認証ができません。"
+"組織のヘルプデスクに相談してください。"
 
 msgid "{logout:default_link_text}"
 msgstr "SimpleSAMLphpの設定ページに戻る"
@@ -203,7 +200,7 @@ msgid "{errors:descr_PROCESSAUTHNREQUEST}"
 msgstr "このアイデンティティプロバイダはサービスプロバイダからの認証リクエストを受け付けましたが、リクエストの処理中にエラーが発生しました。"
 
 msgid "{logout:logout_all_question}"
-msgstr "上記の全てのサービスからログアウトしますか?"
+msgstr "上記の全てのサービスからログアウトしますか?"
 
 msgid "{errors:title_NOACCESS}"
 msgstr "アクセスがありません"
@@ -221,10 +218,10 @@ msgid "{login:password}"
 msgstr "パスワード"
 
 msgid "{errors:debuginfo_text}"
-msgstr "システム管理者やヘルプデスクは以下のデバッグ情報に興味を持つかもしれません:"
+msgstr "システム管理者やヘルプデスクは以下のデバッグ情報が役立つかもしれません:"
 
 msgid "{admin:cfg_check_missing}"
-msgstr "設定ファイルにオプションが在りません"
+msgstr "設定ファイルにオプションがありません"
 
 msgid "{errors:descr_UNHANDLEDEXCEPTION}"
 msgstr "未処理例外が投げられました。"
@@ -236,7 +233,7 @@ msgid "{errors:title_CONFIG}"
 msgstr "設定エラー"
 
 msgid "{errors:title_LOGOUTREQUEST}"
-msgstr "ログアウト洋弓の処理中にエラーが発生しました"
+msgstr "ログアウト処理中にエラーが発生しました"
 
 msgid "{admin:metaover_errorentry}"
 msgstr "このメタデータエントリでのエラー"
@@ -260,7 +257,7 @@ msgid "{errors:title_USERABORTED}"
 msgstr "認証は中断されました"
 
 msgid "{logout:incapablesps}"
-msgstr "<i>ログアウトをサポートしていない</i>一つ以上のサービスにログイン中です。確実にセッションを終了させるには、<i>WEBブラウザを閉じる</i>事を推奨します。"
+msgstr "<i>ログアウトをサポートしていない</i>サービスにログイン中です。確実にセッションを終了させるには、<i>WEBブラウザを閉じる</i>を行ってください。"
 
 msgid "{admin:metadata_xmlformat}"
 msgstr "SAML 2.0 用のメタデータXMLフォーマット:"
@@ -278,7 +275,7 @@ msgid "{admin:cfg_check_select_file}"
 msgstr "確認する設定ファイルを選択:"
 
 msgid "{errors:descr_UNKNOWNCERT}"
-msgstr "認証に失敗しました: ブラウザから不明な証明書が送られました"
+msgstr "認証に失敗しました: ブラウザから不正な証明書が送られました"
 
 msgid "{logout:logging_out_from}"
 msgstr "以下のサービスからログアウトしました:"
@@ -338,15 +335,14 @@ msgid "{login:user_pass_header}"
 msgstr "ユーザー名とパスワードを入力してください"
 
 msgid "{errors:report_explain}"
-msgstr "何をした際にこのエラーが発生したかを説明してください..."
+msgstr "何をした際にこのエラーが発生したかを教えてください。"
 
 msgid "{errors:title_ACSPARAMS}"
 msgstr "SAMLレスポンスがありません"
 
 msgid "{errors:descr_SLOSERVICEPARAMS}"
 msgstr ""
-"SingleLogoutServiceインターフェースへアクセスしましたが、SAML LogoutRequest や LogoutResponse"
-" が提供されませんでした。"
+"SingleLogoutServiceインターフェースへアクセスしましたが、SAML LogoutRequestやLogoutResponseが提供されませんでした。"
 
 msgid "{login:organization}"
 msgstr "組織"
@@ -385,7 +381,7 @@ msgid "{errors:report_email}"
 msgstr "Eメールアドレス:"
 
 msgid "{errors:howto_header}"
-msgstr "ヘルプを得るには"
+msgstr "困ったときには"
 
 msgid "{errors:title_NOTSET}"
 msgstr "パスワードが設定されていません"
@@ -398,8 +394,7 @@ msgstr "SimpleSAMLphp 診断"
 
 msgid "{status:intro}"
 msgstr ""
-"こんにちは、ここは "
-"SimpleSAMLphpのステータスページです。ここではセッションのタイムアウト時間やセッションに結びつけられた属性情報を見ることが出来ます。"
+"ここはSimpleSAMLphpのステータスページです。ここではセッションのタイムアウト時間やセッションに結びつけられた属性情報を見ることが出来ます。"
 
 msgid "{errors:title_NOTFOUNDREASON}"
 msgstr "ページが見つかりません"
@@ -414,7 +409,7 @@ msgid "{admin:metadata_shib13-sp}"
 msgstr "Shib 1.3 SPメタデータ"
 
 msgid "{admin:metaover_intro}"
-msgstr "SAML実体の詳細を確認する為には、SAML実体ヘッダをクリックして下さい。"
+msgstr "SAMLエンティティの詳細を確認するためには、SAMLエンティティヘッダをクリックして下さい。"
 
 msgid "{errors:title_NOTVALIDCERT}"
 msgstr "無効な証明書です"
@@ -450,7 +445,7 @@ msgid "{admin:metaover_group_metadata.saml20-sp-hosted}"
 msgstr "SAML 2.0サービスプロバイダ(ホスト)"
 
 msgid "{admin:metadata_simplesamlformat}"
-msgstr "SimpleSAMLphp のファイルフォーマット - 片側でも SimpleSAMLphpエンティティを使用する場合にこれを使用します:"
+msgstr "SimpleSAMLphp のファイルフォーマット - もう一方でSimpleSAMLphpエンティティを使用する場合にこれを使用します:"
 
 msgid "{disco:login_at}"
 msgstr "ログイン: "
@@ -486,19 +481,19 @@ msgid "{admin:debug_sending_message_msg_title}"
 msgstr "メッセージ"
 
 msgid "{errors:title_UNKNOWNCERT}"
-msgstr "不明な証明書です"
+msgstr "不正な証明書です"
 
 msgid "{errors:title_LDAPERROR}"
 msgstr "LDAPエラー"
 
 msgid "{logout:failedsps}"
-msgstr "一つ以上のサービスかたログアウト出来ませんでした。確実にセッションを終了させるには、<i>WEBブラウザを閉じる</i>事を推奨します。"
+msgstr "一つ以上のサービスからログアウト出来ませんでした。確実にセッションを終了させるには、<i>WEBブラウザを閉じる</i>を行ってください。"
 
 msgid "{errors:descr_NOTFOUND}"
 msgstr "与えられたページは見つかりませんでした。URLは: %URL%"
 
 msgid "{errors:howto_text}"
-msgstr "このエラーは恐らく未知の問題かSimpleSAMLphpの設定ミスです。ログインサービスの管理者に上記のエラーメッセージを連絡して下さい。"
+msgstr "このエラーは恐らく未知の問題、またはSimpleSAMLphpの設定ミスです。ログインサービスの管理者に上記のエラーメッセージを連絡して下さい。"
 
 msgid "{admin:metaover_group_metadata.shib13-idp-hosted}"
 msgstr "Shib 1.3アイデンティティプロバイダ(ホスト)"
@@ -537,13 +532,13 @@ msgid "{admin:metaover_group_metadata.shib13-idp-remote}"
 msgstr "Shib 1.3アイデンティティプロバイダ(リモート)"
 
 msgid "{errors:descr_CONFIG}"
-msgstr "SimpleSAMLphpの設定にミスがある様です。"
+msgstr "SimpleSAMLphpの設定にミスがあるようです。"
 
 msgid "{admin:metadata_intro}"
-msgstr "ここは SimpleSAMLphp が生成したメタデータがあります。あなたは信頼するパートナーにこのメタデータを送信し信頼された連携を構築出来ます。"
+msgstr "SimpleSAMLphpが生成したメタデータです。このメタデータドキュメントを信頼できるパートナーに送信して、信頼できる連携を設定できます。"
 
 msgid "{errors:descr_INVALIDCERT}"
-msgstr "認証失敗: あなたのブラウザは無効か読むことの出来ない証明書を送信しました。"
+msgstr "認証失敗: あなたのブラウザは無効か不正な証明書を送信しました。"
 
 msgid "{status:header_shib}"
 msgstr "Shibboleth デモ"
@@ -555,7 +550,7 @@ msgid "Person's principal name at home organization"
 msgstr "永続的利用者名"
 
 msgid "Superfluous options in config file"
-msgstr "設定ファイルに不適切なオプションが在ります"
+msgstr "設定ファイルに不適切なオプションがあります"
 
 msgid "Mobile"
 msgstr "携帯電話"
@@ -571,7 +566,7 @@ msgstr "あなたがログインを行う時、LDAPというユーザーデー
 msgid ""
 "Optionally enter your email address, for the administrators to be able "
 "contact you for further questions about your issue:"
-msgstr "任意ですがメールアドレスを入力してください、管理者があなたへ問題についての追加質問を行う為に使用します。"
+msgstr "任意ですがメールアドレスを入力してください、管理者があなたへ問題についての追加質問を行うために使用します。"
 
 msgid "Display name"
 msgstr "表示名"
@@ -593,11 +588,10 @@ msgid ""
 "session is timed out, how long it lasts until it times out and all the "
 "attributes that are attached to your session."
 msgstr ""
-"こんにちは、ここは "
-"SimpleSAMLphpのステータスページです。ここではセッションのタイムアウト時間やセッションに結びつけられた属性情報を見ることが出来ます。"
+"ここはSimpleSAMLphpのステータスページです。ここではセッションのタイムアウト時間やセッションに結びつけられた属性情報を見ることが出来ます。"
 
 msgid "Explain what you did when this error occurred..."
-msgstr "何をした際にこのエラーが発生したかを説明してください..."
+msgstr "何をした際にこのエラーが発生したかを教えてください。"
 
 msgid "An unhandled exception was thrown."
 msgstr "未処理例外が投げられました。"
@@ -662,12 +656,12 @@ msgstr "CASエラー"
 msgid ""
 "The debug information below may be of interest to the administrator / "
 "help desk:"
-msgstr "システム管理者やヘルプデスクは以下のデバッグ情報に興味を持つかもしれません:"
+msgstr "システム管理者やヘルプデスクは以下のデバッグ情報が役立つかもしれません:"
 
 msgid ""
 "Either no user with the given username could be found, or the password "
 "you gave was wrong. Please check the username and try again."
-msgstr "ユーザー名が見つからなかったか、パスワードが間違っているかの何方かです。ユーザー名、パスワードを確認して試してください。"
+msgstr "ユーザー名またはパスワードが間違っています。ユーザー名、パスワードを確認して再度試してください。"
 
 msgid "Error"
 msgstr "エラー"
@@ -709,7 +703,7 @@ msgstr "主要組織単位識別名"
 msgid ""
 "To look at the details for an SAML entity, click on the SAML entity "
 "header."
-msgstr "SAML実体の詳細を確認する為には、SAML実体ヘッダをクリックして下さい。"
+msgstr "SAMLエンティティの詳細を確認するためには、SAMLエンティティヘッダをクリックして下さい。"
 
 msgid "Enter your username and password"
 msgstr "ユーザー名とパスワードを入力してください"
@@ -730,10 +724,10 @@ msgid "SAML 2.0 Identity Provider (Remote)"
 msgstr "SAML 2.0アイデンティティプロバイダ(リモート)"
 
 msgid "Error processing the Logout Request"
-msgstr "ログアウト洋弓の処理中にエラーが発生しました"
+msgstr "ログアウト処理中にエラーが発生しました"
 
 msgid "Do you want to logout from all the services above?"
-msgstr "上記の全てのサービスからログアウトしますか?"
+msgstr "上記の全てのサービスからログアウトしますか?"
 
 msgid "Select"
 msgstr "選択"
@@ -760,7 +754,7 @@ msgid "Organization name"
 msgstr "所属組織"
 
 msgid "Authentication failed: the certificate your browser sent is unknown"
-msgstr "認証に失敗しました: ブラウザから不明な証明書が送られました"
+msgstr "認証に失敗しました: ブラウザから不正な証明書が送られました"
 
 msgid ""
 "You are about to send a message. Hit the submit message button to "
@@ -807,14 +801,11 @@ msgid ""
 "the configuration. If the problem persists, contact your service "
 "provider."
 msgstr ""
-"The information about the current logout operation has been lost. You "
-"should return to the service you were trying to log out from and try to "
-"log out again. This error can be caused by the logout information "
-"expiring. The logout information is stored for a limited amout of time - "
-"usually a number of hours. This is longer than any normal logout "
-"operation should take, so this error may indicate some other error with "
-"the configuration. If the problem persists, contact your service "
-"provider."
+"ログアウト操作に関する情報が失われました。ログアウトしようとしていたサービスに戻り、再度ログアウトを行ってください。"
+"このエラーは、ログアウト情報の期限切れが原因で発生する可能性があります。"
+"ログアウト情報は、通常は数時間の限られた時間だけ保存されます。"
+"このエラーは、通常のログアウト操作にかかるよりも長いため、構成に関する他のエラーの可能性もあります。"
+"問題が解決しない場合は、サービスプロバイダにお問い合わせください。"
 
 msgid "Some error occurred"
 msgstr "幾つかのエラーが発生しました"
@@ -856,7 +847,7 @@ msgid ""
 "This error probably is due to some unexpected behaviour or to "
 "misconfiguration of SimpleSAMLphp. Contact the administrator of this "
 "login service, and send them the error message above."
-msgstr "このエラーは恐らく未知の問題かSimpleSAMLphpの設定ミスです。ログインサービスの管理者に上記のエラーメッセージを連絡して下さい。"
+msgstr "このエラーは恐らく未知の問題、またはSimpleSAMLphpの設定ミスです。ログインサービスの管理者に上記のエラーメッセージを連絡して下さい。"
 
 #, python-format
 msgid "Your session is valid for %remaining% seconds from now."
@@ -889,7 +880,7 @@ msgid "Date of birth"
 msgstr "生年月日"
 
 msgid "Private information elements"
-msgstr "個人情報要素"
+msgstr "個人情報"
 
 msgid "You are also logged in on these services:"
 msgstr "あなたはまだこれらのサービスにログインしています:"
@@ -990,7 +981,7 @@ msgid "Labeled URI"
 msgstr "URI"
 
 msgid "SimpleSAMLphp appears to be misconfigured."
-msgstr "SimpleSAMLphpの設定にミスがある様です。"
+msgstr "SimpleSAMLphpの設定にミスがあるようです。"
 
 msgid "Shib 1.3 Identity Provider (Hosted)"
 msgstr "Shib 1.3アイデンティティプロバイダ(ホスト)"
@@ -1031,7 +1022,7 @@ msgid ""
 "If you report this error, please also report this tracking number which "
 "makes it possible to locate your session in the logs available to the "
 "system administrator:"
-msgstr "このエラーを報告する場合、システム管理者がログからあなたのセッションを特定する為に、トラッキング番号を報告してください。"
+msgstr "このエラーを報告する場合、システム管理者がログからあなたのセッションを特定するために、トラッキング番号を報告してください。"
 
 msgid "XML metadata"
 msgstr "XMLメタデータ"
@@ -1047,7 +1038,7 @@ msgstr "電話番号"
 msgid ""
 "Unable to log out of one or more services. To ensure that all your "
 "sessions are closed, you are encouraged to <i>close your webbrowser</i>."
-msgstr "一つ以上のサービスかたログアウト出来ませんでした。確実にセッションを終了させるには、<i>WEBブラウザを閉じる</i>事を推奨します。"
+msgstr "ログアウト出来ませんでした。確実にセッションを終了させるには、<i>WEBブラウザを閉じる</i>を行ってください。"
 
 msgid "Bad request to discovery service"
 msgstr "サービスディスカバリ中の不正なリクエスト"
@@ -1064,7 +1055,7 @@ msgstr "Shib 1.3 SPメタデータ"
 msgid ""
 "As you are in debug mode, you get to see the content of the message you "
 "are sending:"
-msgstr "お気づきの様にあなたはデバッグモードにいます。あなたは送信するメッセージの内容を見ることが出来ます。"
+msgstr "このエラーを報告する場合、システム管理者がログからあなたのセッションを特定するために、トラッキング番号を報告してください。"
 
 msgid "Remember"
 msgstr "記憶する"
@@ -1082,7 +1073,7 @@ msgid "Authentication aborted"
 msgstr "認証は中断されました"
 
 msgid "Local identity number"
-msgstr "支部ID"
+msgstr "ローカル識別番号"
 
 msgid "Report errors"
 msgstr "エラーをレポート"
@@ -1102,7 +1093,7 @@ msgstr "パスワードハッシュ"
 msgid ""
 "In SimpleSAMLphp flat file format - use this if you are using a "
 "SimpleSAMLphp entity on the other side:"
-msgstr "SimpleSAMLphp のファイルフォーマット - 片側でも SimpleSAMLphpエンティティを使用する場合にこれを使用します:"
+msgstr "SimpleSAMLphp のファイルフォーマット - もう一方でSimpleSAMLphpエンティティを使用する場合にこれを使用します:"
 
 msgid "Yes, continue"
 msgstr "はい、続けます"
@@ -1116,7 +1107,7 @@ msgid ""
 msgstr "アイデンティティプロバイダがエラーを受けとりました。(SAMLレスポンスに失敗したステータスコード)"
 
 msgid "Error loading metadata"
-msgstr "目らーデータの読み込み中にエラーが発生しました"
+msgstr "メタデータの読み込み中にエラーが発生しました"
 
 msgid "Select configuration file to check:"
 msgstr "確認する設定ファイルを選択:"
@@ -1139,15 +1130,14 @@ msgid ""
 msgstr "あなたはSimpleSAMLphpのグローバル設定<tt>config/config.php</tt>でデバックモードをオフに出来ます。"
 
 msgid "How to get help"
-msgstr "ヘルプを得るには"
+msgstr "困ったときには"
 
 msgid ""
 "You accessed the SingleLogoutService interface, but did not provide a "
 "SAML LogoutRequest or LogoutResponse. Please note that this endpoint is "
 "not intended to be accessed directly."
 msgstr ""
-"SingleLogoutServiceインターフェースへアクセスしましたが、SAML LogoutRequest や LogoutResponse"
-" が提供されませんでした。"
+"SingleLogoutServiceインターフェースへアクセスしましたが、SAML LogoutRequestやLogoutResponseが提供されませんでした。"
 
 msgid "SimpleSAMLphp error"
 msgstr "SimpleSAMLphpエラー"
@@ -1156,13 +1146,13 @@ msgid ""
 "One or more of the services you are logged into <i>do not support "
 "logout</i>. To ensure that all your sessions are closed, you are "
 "encouraged to <i>close your webbrowser</i>."
-msgstr "<i>ログアウトをサポートしていない</i>一つ以上のサービスにログイン中です。確実にセッションを終了させるには、<i>WEBブラウザを閉じる</i>事を推奨します。"
+msgstr "ここは SimpleSAMLphp が生成したメタデータがあります。あなたは信頼するパートナーにこのメタデータを送信し信頼された連携を構築出来ます。"
 
 msgid "Organization's legal name"
 msgstr "組織の正式名称"
 
 msgid "Options missing from config file"
-msgstr "設定ファイルにオプションが在りません"
+msgstr "設定ファイルにオプションがありません"
 
 msgid "The following optional fields was not found"
 msgstr "以下の任意項目は見つかりませんでした"
@@ -1197,7 +1187,7 @@ msgid "Contact information:"
 msgstr "連絡先:"
 
 msgid "Unknown certificate"
-msgstr "不明な証明書です"
+msgstr "不正な証明書です"
 
 msgid "Legal name"
 msgstr "正式名称"
@@ -1219,7 +1209,7 @@ msgid ""
 msgstr "あなたはログインページで何かを送信しましたが、何らかの理由でパスワードが送信されませんでした。再度試してみてください。"
 
 msgid "Fax number"
-msgstr "Fax番号"
+msgstr "FAX番号"
 
 msgid "Shibboleth demo"
 msgstr "Shibboleth デモ"
@@ -1238,8 +1228,8 @@ msgid ""
 "yourself for access to the service. There may be someone that can help "
 "you. Consult the help desk at your organization!"
 msgstr ""
-"お気の毒です! - "
-"ユーザー名とパスワードが無くてはサービスにアクセスする為にあなた自身を認証する事が出来ません。あなたの大学のヘルプデスクに相談すると、あなたの助けになってくれるでしょう。"
+"ユーザー名とパスワードがないと、サービスにアクセスするための認証ができません。"
+"組織のヘルプデスクに相談してください。"
 
 msgid "Metadata parser"
 msgstr "メタデータパーサ"
@@ -1287,7 +1277,7 @@ msgid ""
 "Here is the metadata that SimpleSAMLphp has generated for you. You may "
 "send this metadata document to trusted partners to setup a trusted "
 "federation."
-msgstr "ここは SimpleSAMLphp が生成したメタデータがあります。あなたは信頼するパートナーにこのメタデータを送信し信頼された連携を構築出来ます。"
+msgstr "SimpleSAMLphpが生成したメタデータです。このメタデータドキュメントを信頼できるパートナーに送信して、信頼できる連携を設定できます。"
 
 msgid "[Preferred choice]"
 msgstr "[推奨する選択]"
@@ -1307,4 +1297,4 @@ msgid ""
 "is for testing and pre-production verification only. If someone sent you "
 "a link that pointed you here, and you are not <i>a tester</i> you "
 "probably got the wrong link, and should <b>not be here</b>."
-msgstr "あなたは今試験環境へアクセスしています。この認証設定は試験環境のテストと検証の為のものです。もし誰かがこのリンクをあなたに送り、あなたが<i>テスター</i>でないのであれば恐らく間違ったリンクであり、ここに<b>来てはいけない</b>でしょう。"
+msgstr "あなたは今テスト環境へアクセスしています。この認証設定は検証のためのものです。もし誰かがこのリンクをあなたに送り、あなたが<i>テスター</i>でないのであれば恐らく間違ったリンクであり、ここに<b>来てはいけない</b>でしょう。"
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/nl/LC_MESSAGES/messages.po b/vendor/simplesamlphp/simplesamlphp/locales/nl/LC_MESSAGES/messages.po
index 9eed3f830f582fe6d20132ea4f51f49493cc4023..3653636989c7667b0d2d86a290f5a9a7693baaee 100644
--- a/vendor/simplesamlphp/simplesamlphp/locales/nl/LC_MESSAGES/messages.po
+++ b/vendor/simplesamlphp/simplesamlphp/locales/nl/LC_MESSAGES/messages.po
@@ -192,6 +192,9 @@ msgstr ""
 "De parameters die naar de discovery service zijn gestuurd, zijn niet "
 "correct volgens de specificatie."
 
+msgid "No SAML message provided"
+msgstr "Geen SAML bericht opgegeven"
+
 msgid "{errors:descr_CREATEREQUEST}"
 msgstr "Er is een fout opgetreden bij het aanmaken van een SAML request."
 
@@ -958,18 +961,33 @@ msgstr ""
 "wijzen dat er een configuratie probleem is. Als het probleem zich blijft "
 "voordoen kun u contact opnemen met de Service Provider."
 
+msgid "No SAML request provided"
+msgstr "Geen SAML request opgegeven"
+
 msgid "Some error occurred"
 msgstr "Er is een fout opgetreden"
 
 msgid "Organization"
 msgstr "Organisatie"
 
+msgid ""
+"You accessed the Single Sign On Service interface, but did not provide a "
+"SAML Authentication Request. Please note that this endpoint is not "
+"intended to be accessed directly."
+msgstr ""
+"Je hebt het Single Sign On interface aangeroepen, maar stuurde geen SAML "
+"Authentication Request mee. Merk op dat dit 'endpoint' niet bedoeld is om"
+" direct benaderd te worden."
+
 msgid "No certificate"
 msgstr "Geen certificaat"
 
 msgid "Choose home organization"
 msgstr "Kies je organisatie"
 
+msgid "Cannot retrieve session data"
+msgstr "Kan sessie data niet ophalen"
+
 msgid "Persistent pseudonymous ID"
 msgstr "Persistente anonieme ID"
 
@@ -1016,6 +1034,9 @@ msgstr "Shib 1.3 Service Provider (Remote)"
 msgid "Password"
 msgstr "Wachtwoord"
 
+msgid "ORCID researcher identifiers"
+msgstr "ORCID onderzoeker identifiers"
+
 msgid "Nickname"
 msgstr "Bijnaam"
 
@@ -1038,6 +1059,10 @@ msgstr "Geboortedatum"
 msgid "Private information elements"
 msgstr "Privé informatie-elementen"
 
+msgid "Person's non-reassignable, persistent pseudonymous ID at home organization"
+msgstr "Niet opnieuw toekenbare, persistente pseudonieme ID bij organisatie "
+"van de persoon"
+
 msgid "You are also logged in on these services:"
 msgstr "Je bent ook ingelogd bij deze diensten:"
 
@@ -1072,7 +1097,7 @@ msgid "Return to service"
 msgstr "Terug naar service"
 
 msgid "Logout"
-msgstr "Logout"
+msgstr "Afmelden"
 
 msgid "State information lost, and no way to restart the request"
 msgstr ""
@@ -1118,6 +1143,13 @@ msgstr "JPEG-foto"
 msgid "Postal address"
 msgstr "Adres"
 
+msgid ""
+"Your session data cannot be retrieved right now due to technical "
+"difficulties. Please try again in a few minutes."
+msgstr ""
+"Je sessie data kan op dit moment niet opgehaald worden door technische "
+"problemen. Probeer het over een paar minuten nogmaals."
+
 msgid "An error occurred when trying to process the Logout Request."
 msgstr "Er is een fout opgetreden tijdens het verwerken van een Logout Request."
 
@@ -1314,9 +1346,6 @@ msgstr "ADFS Identity Provider (Hosted)"
 msgid "Error when communicating with the CAS server."
 msgstr "Fout tijdens communicatie met de CAS server."
 
-msgid "No SAML message provided"
-msgstr "Geen SAML bericht gevonden"
-
 msgid "Help! I don't remember my password."
 msgstr "Help! Ik weet mijn wachtwoord niet meer."
 
@@ -1350,6 +1379,9 @@ msgstr ""
 "voor uitloggen</i>. Om er zeker van te zijn dat al je sessies zijn "
 "beëindigd, kun je het beste <i>je webbrowser afsluiten</i>."
 
+msgid "or select a file:"
+msgstr "of kies een file:"
+
 msgid "Remember me"
 msgstr "Onthoud mij"
 
@@ -1485,6 +1517,15 @@ msgstr "Configuratie-validatie"
 msgid "We did not accept the response sent from the Identity Provider."
 msgstr "Het antwoord van de Identity Provider is niet geaccepteerd."
 
+msgid ""
+"You accessed the Artifact Resolution Service interface, but did not "
+"provide a SAML ArtifactResolve message. Please note that this endpoint is"
+" not intended to be accessed directly."
+msgstr ""
+"Je hebt het Artifact Resolution Service interface aangeroepen, maar stuurde "
+"geen SAML ArtifactResolve bericht mee. Merk op dat dit 'endpoint' niet "
+"bedoeld is om direct benaderd te worden."
+
 msgid "The given page was not found. The reason was: %REASON%  The URL was: %URL%"
 msgstr ""
 "De opgegeven pagina kon niet worden gevonden. De oorzaak is: %REASON%. De"
@@ -1507,6 +1548,9 @@ msgstr "[Voorkeurskeuze]"
 msgid "Organizational homepage"
 msgstr "Organisatie homepage"
 
+msgid "Processing..."
+msgstr "Verwerken..."
+
 msgid ""
 "You accessed the Assertion Consumer Service interface, but did not "
 "provide a SAML Authentication Response. Please note that this endpoint is"
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/st/LC_MESSAGES/attributes.po b/vendor/simplesamlphp/simplesamlphp/locales/st/LC_MESSAGES/attributes.po
new file mode 100644
index 0000000000000000000000000000000000000000..6503d306ef8e62c51a328b9e15db2b2579a4cea9
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/locales/st/LC_MESSAGES/attributes.po
@@ -0,0 +1,1863 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"PO-Revision-Date: 2019-12-12 15:50+0200\n
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+msgid "aRecord"
+msgstr "aRecord"
+
+msgid "urn:mace:dir:attribute-def:aRecord"
+msgstr "urn:mace:dir:attribute-def:aRecord"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.26"
+msgstr "urn:oid:0.9.2342.19200300.100.1.26"
+
+msgid "aliasedEntryName"
+msgstr "aliasedEntryName"
+
+msgid "urn:mace:dir:attribute-def:aliasedEntryName"
+msgstr "urn:mace:dir:attribute-def:aliasedEntryName"
+
+msgid "urn:oid:2.5.4.1"
+msgstr "urn:oid:2.5.4.1"
+
+msgid "aliasedObjectName"
+msgstr "aliasedObjectName"
+
+msgid "urn:mace:dir:attribute-def:aliasedObjectName"
+msgstr "urn:mace:dir:attribute-def:aliasedObjectName"
+
+msgid "associatedDomain"
+msgstr "associatedDomain"
+
+msgid "urn:mace:dir:attribute-def:associatedDomain"
+msgstr "urn:mace:dir:attribute-def:associatedDomain"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.37"
+msgstr "urn:oid:0.9.2342.19200300.100.1.37"
+
+msgid "associatedName"
+msgstr "associatedName"
+
+msgid "urn:mace:dir:attribute-def:associatedName"
+msgstr "urn:mace:dir:attribute-def:associatedName"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.38"
+msgstr "urn:oid:0.9.2342.19200300.100.1.38"
+
+msgid "audio"
+msgstr "audio"
+
+msgid "urn:mace:dir:attribute-def:audio"
+msgstr "urn:mace:dir:attribute-def:audio"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.55"
+msgstr "urn:oid:0.9.2342.19200300.100.1.55"
+
+msgid "authorityRevocationList"
+msgstr "authorityRevocationList"
+
+msgid "urn:mace:dir:attribute-def:authorityRevocationList"
+msgstr "urn:mace:dir:attribute-def:authorityRevocationList"
+
+msgid "urn:oid:2.5.4.38"
+msgstr "urn:oid:2.5.4.38"
+
+msgid "buildingName"
+msgstr "buildingName"
+
+msgid "urn:mace:dir:attribute-def:buildingName"
+msgstr "urn:mace:dir:attribute-def:buildingName"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.48"
+msgstr "urn:oid:0.9.2342.19200300.100.1.48"
+
+msgid "businessCategory"
+msgstr "businessCategory"
+
+msgid "urn:mace:dir:attribute-def:businessCategory"
+msgstr "urn:mace:dir:attribute-def:businessCategory"
+
+msgid "urn:oid:2.5.4.15"
+msgstr "urn:oid:2.5.4.15"
+
+msgid "c"
+msgstr "c"
+
+msgid "urn:mace:dir:attribute-def:c"
+msgstr "urn:mace:dir:attribute-def:c"
+
+msgid "urn:oid:2.5.4.6"
+msgstr "urn:oid:2.5.4.6"
+
+msgid "cACertificate"
+msgstr "cACertificate"
+
+msgid "urn:mace:dir:attribute-def:cACertificate"
+msgstr "urn:mace:dir:attribute-def:cACertificate"
+
+msgid "urn:oid:2.5.4.37"
+msgstr "urn:oid:2.5.4.37"
+
+msgid "cNAMERecord"
+msgstr "cNAMERecord"
+
+msgid "urn:mace:dir:attribute-def:cNAMERecord"
+msgstr "urn:mace:dir:attribute-def:cNAMERecord"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.31"
+msgstr "urn:oid:0.9.2342.19200300.100.1.31"
+
+msgid "carLicense"
+msgstr "carLicense"
+
+msgid "urn:mace:dir:attribute-def:carLicense"
+msgstr "urn:mace:dir:attribute-def:carLicense"
+
+msgid "urn:oid:2.16.840.1.113730.3.1.1"
+msgstr "urn:oid:2.16.840.1.113730.3.1.1"
+
+msgid "certificateRevocationList"
+msgstr "certificateRevocationList"
+
+msgid "urn:mace:dir:attribute-def:certificateRevocationList"
+msgstr "urn:mace:dir:attribute-def:certificateRevocationList"
+
+msgid "urn:oid:2.5.4.39"
+msgstr "urn:oid:2.5.4.39"
+
+msgid "cn"
+msgstr "Lebitso le tlwaelehileng"
+
+msgid "urn:mace:dir:attribute-def:cn"
+msgstr "Lebitso le tlwaelehileng"
+
+msgid "urn:oid:2.5.4.3"
+msgstr "Lebitso le tlwaelehileng"
+
+msgid "co"
+msgstr "co"
+
+msgid "urn:mace:dir:attribute-def:co"
+msgstr "urn:mace:dir:attribute-def:co"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.43"
+msgstr "urn:oid:0.9.2342.19200300.100.1.43"
+
+msgid "commonName"
+msgstr "commonName"
+
+msgid "urn:mace:dir:attribute-def:commonName"
+msgstr "urn:mace:dir:attribute-def:commonName"
+
+msgid "countryName"
+msgstr "countryName"
+
+msgid "urn:mace:dir:attribute-def:countryName"
+msgstr "urn:mace:dir:attribute-def:countryName"
+
+msgid "crossCertificatePair"
+msgstr "crossCertificatePair"
+
+msgid "urn:mace:dir:attribute-def:crossCertificatePair"
+msgstr "urn:mace:dir:attribute-def:crossCertificatePair"
+
+msgid "urn:oid:2.5.4.40"
+msgstr "urn:oid:2.5.4.40"
+
+msgid "dITRedirect"
+msgstr "dITRedirect"
+
+msgid "urn:mace:dir:attribute-def:dITRedirect"
+msgstr "urn:mace:dir:attribute-def:dITRedirect"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.54"
+msgstr "urn:oid:0.9.2342.19200300.100.1.54"
+
+msgid "dSAQuality"
+msgstr "dSAQuality"
+
+msgid "urn:mace:dir:attribute-def:dSAQuality"
+msgstr "urn:mace:dir:attribute-def:dSAQuality"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.49"
+msgstr "urn:oid:0.9.2342.19200300.100.1.49"
+
+msgid "dc"
+msgstr "Karolwana ya domeine (DC)"
+
+msgid "urn:mace:dir:attribute-def:dc"
+msgstr "Karolwana ya domeine (DC)"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.25"
+msgstr "Karolwana ya domeine (DC)"
+
+msgid "deltaRevocationList"
+msgstr "deltaRevocationList"
+
+msgid "urn:mace:dir:attribute-def:deltaRevocationList"
+msgstr "urn:mace:dir:attribute-def:deltaRevocationList"
+
+msgid "urn:oid:2.5.4.53"
+msgstr "urn:oid:2.5.4.53"
+
+msgid "departmentNumber"
+msgstr "departmentNumber"
+
+msgid "urn:mace:dir:attribute-def:departmentNumber"
+msgstr "urn:mace:dir:attribute-def:departmentNumber"
+
+msgid "urn:oid:2.16.840.1.113730.3.1.2"
+msgstr "urn:oid:2.16.840.1.113730.3.1.2"
+
+msgid "description"
+msgstr "description"
+
+msgid "urn:mace:dir:attribute-def:description"
+msgstr "urn:mace:dir:attribute-def:description"
+
+msgid "urn:oid:2.5.4.13"
+msgstr "urn:oid:2.5.4.13"
+
+msgid "destinationIndicator"
+msgstr "destinationIndicator"
+
+msgid "urn:mace:dir:attribute-def:destinationIndicator"
+msgstr "urn:mace:dir:attribute-def:destinationIndicator"
+
+msgid "urn:oid:2.5.4.27"
+msgstr "urn:oid:2.5.4.27"
+
+msgid "displayName"
+msgstr "Lebitso le bontshwang"
+
+msgid "urn:mace:dir:attribute-def:displayName"
+msgstr "Lebitso le bontshwang"
+
+msgid "urn:oid:2.16.840.1.113730.3.1.241"
+msgstr "Lebitso le bontshwang"
+
+msgid "distinguishedName"
+msgstr "distinguishedName"
+
+msgid "urn:mace:dir:attribute-def:distinguishedName"
+msgstr "urn:mace:dir:attribute-def:distinguishedName"
+
+msgid "urn:oid:2.5.4.49"
+msgstr "urn:oid:2.5.4.49"
+
+msgid "dmdName"
+msgstr "dmdName"
+
+msgid "urn:mace:dir:attribute-def:dmdName"
+msgstr "urn:mace:dir:attribute-def:dmdName"
+
+msgid "urn:oid:2.5.4.54"
+msgstr "urn:oid:2.5.4.54"
+
+msgid "dnQualifier"
+msgstr "dnQualifier"
+
+msgid "urn:mace:dir:attribute-def:dnQualifier"
+msgstr "urn:mace:dir:attribute-def:dnQualifier"
+
+msgid "urn:oid:2.5.4.46"
+msgstr "urn:oid:2.5.4.46"
+
+msgid "documentAuthor"
+msgstr "documentAuthor"
+
+msgid "urn:mace:dir:attribute-def:documentAuthor"
+msgstr "urn:mace:dir:attribute-def:documentAuthor"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.14"
+msgstr "urn:oid:0.9.2342.19200300.100.1.14"
+
+msgid "documentIdentifier"
+msgstr "documentIdentifier"
+
+msgid "urn:mace:dir:attribute-def:documentIdentifier"
+msgstr "urn:mace:dir:attribute-def:documentIdentifier"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.11"
+msgstr "urn:oid:0.9.2342.19200300.100.1.11"
+
+msgid "documentLocation"
+msgstr "documentLocation"
+
+msgid "urn:mace:dir:attribute-def:documentLocation"
+msgstr "urn:mace:dir:attribute-def:documentLocation"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.15"
+msgstr "urn:oid:0.9.2342.19200300.100.1.15"
+
+msgid "documentPublisher"
+msgstr "documentPublisher"
+
+msgid "urn:mace:dir:attribute-def:documentPublisher"
+msgstr "urn:mace:dir:attribute-def:documentPublisher"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.56"
+msgstr "urn:oid:0.9.2342.19200300.100.1.56"
+
+msgid "documentTitle"
+msgstr "documentTitle"
+
+msgid "urn:mace:dir:attribute-def:documentTitle"
+msgstr "urn:mace:dir:attribute-def:documentTitle"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.12"
+msgstr "urn:oid:0.9.2342.19200300.100.1.12"
+
+msgid "documentVersion"
+msgstr "documentVersion"
+
+msgid "urn:mace:dir:attribute-def:documentVersion"
+msgstr "urn:mace:dir:attribute-def:documentVersion"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.13"
+msgstr "urn:oid:0.9.2342.19200300.100.1.13"
+
+msgid "domainComponent"
+msgstr "domainComponent"
+
+msgid "urn:mace:dir:attribute-def:domainComponent"
+msgstr "urn:mace:dir:attribute-def:domainComponent"
+
+msgid "drink"
+msgstr "drink"
+
+msgid "urn:mace:dir:attribute-def:drink"
+msgstr "urn:mace:dir:attribute-def:drink"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.5"
+msgstr "urn:oid:0.9.2342.19200300.100.1.5"
+
+msgid "eduOrgHomePageURI"
+msgstr "Leqephe la lapeng la khampani"
+
+msgid "urn:mace:dir:attribute-def:eduOrgHomePageURI"
+msgstr "Leqephe la lapeng la khampani"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.2.1.2"
+msgstr "Leqephe la lapeng la khampani"
+
+msgid "eduOrgIdentityAuthNPolicyURI"
+msgstr "eduOrgIdentityAuthNPolicyURI"
+
+msgid "urn:mace:dir:attribute-def:eduOrgIdentityAuthNPolicyURI"
+msgstr "urn:mace:dir:attribute-def:eduOrgIdentityAuthNPolicyURI"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.2.1.3"
+msgstr "urn:oid:1.3.6.1.4.1.5923.1.2.1.3"
+
+msgid "eduOrgLegalName"
+msgstr "Lebitso la molao la khampani"
+
+msgid "urn:mace:dir:attribute-def:eduOrgLegalName"
+msgstr "Lebitso la molao la khampani"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.2.1.4"
+msgstr "Lebitso la molao la khampani"
+
+msgid "eduOrgSuperiorURI"
+msgstr "eduOrgSuperiorURI"
+
+msgid "urn:mace:dir:attribute-def:eduOrgSuperiorURI"
+msgstr "urn:mace:dir:attribute-def:eduOrgSuperiorURI"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.2.1.5"
+msgstr "urn:oid:1.3.6.1.4.1.5923.1.2.1.5"
+
+msgid "eduOrgWhitePagesURI"
+msgstr "eduOrgWhitePagesURI"
+
+msgid "urn:mace:dir:attribute-def:eduOrgWhitePagesURI"
+msgstr "urn:mace:dir:attribute-def:eduOrgWhitePagesURI"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.2.1.6"
+msgstr "urn:oid:1.3.6.1.4.1.5923.1.2.1.6"
+
+msgid "eduPersonAffiliation"
+msgstr "Kamano"
+
+msgid "urn:mace:dir:attribute-def:eduPersonAffiliation"
+msgstr "Kamano"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.1"
+msgstr "Kamano"
+
+msgid "eduPersonAssurance"
+msgstr "Profaele ya tiisetso ya boitsebiso"
+
+msgid "urn:mace:dir:attribute-def:eduPersonAssurance"
+msgstr "Profaele ya tiisetso ya boitsebiso"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.11"
+msgstr "Profaele ya tiisetso ya boitsebiso"
+
+msgid "eduPersonEntitlement"
+msgstr "Thuo bakeng sa tshebeletso"
+
+msgid "urn:mace:dir:attribute-def:eduPersonEntitlement"
+msgstr "Thuo bakeng sa tshebeletso"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.7"
+msgstr "Thuo bakeng sa tshebeletso"
+
+msgid "eduPersonNickname"
+msgstr "Lebitso la boswaswi"
+
+msgid "urn:mace:dir:attribute-def:eduPersonNickname"
+msgstr "Lebitso la boswaswi"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.2"
+msgstr "Lebitso la boswaswi"
+
+msgid "eduPersonOrgDN"
+msgstr "Lebitso le kgethehileng (DN) la khampani ya habo motho"
+
+msgid "urn:mace:dir:attribute-def:eduPersonOrgDN"
+msgstr "Lebitso le kgethehileng (DN) la khampani ya habo motho"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.3"
+msgstr "Lebitso le kgethehileng (DN) la khampani ya habo motho"
+
+msgid "eduPersonOrgUnitDN"
+msgstr ""Lebitso le kgethehileng (DN) la yuniti ya khampani ya habo motho"
+
+msgid "urn:mace:dir:attribute-def:eduPersonOrgUnitDN"
+msgstr ""Lebitso le kgethehileng (DN) la yuniti ya khampani ya habo motho"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.4"
+msgstr ""Lebitso le kgethehileng (DN) la yuniti ya khampani ya habo motho"
+
+msgid "eduPersonPrimaryAffiliation"
+msgstr "Kamano ya motheo"
+
+msgid "urn:mace:dir:attribute-def:eduPersonPrimaryAffiliation"
+msgstr "Kamano ya motheo"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.5"
+msgstr "Kamano ya motheo"
+
+msgid "eduPersonPrimaryOrgUnitDN"
+msgstr "Lebitso le kgethehileng (DN) la Yuniti ya Khampani ya Motheo ya habo motho"
+
+msgid "urn:mace:dir:attribute-def:eduPersonPrimaryOrgUnitDN"
+msgstr "Lebitso le kgethehileng (DN) la Yuniti ya Khampani ya Motheo ya habo motho"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.8"
+msgstr "Lebitso le kgethehileng (DN) la Yuniti ya Khampani ya Motheo ya habo motho"
+
+msgid "eduPersonPrincipalName"
+msgstr "Lebitso la sehlooho la motho khampaning ya habo"
+
+msgid "urn:mace:dir:attribute-def:eduPersonPrincipalName"
+msgstr "Lebitso la sehlooho la motho khampaning ya habo"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.6"
+msgstr "Lebitso la sehlooho la motho khampaning ya habo"
+
+msgid "eduPersonScopedAffiliation"
+msgstr "Kamano khampaning ya habo"
+
+msgid "urn:mace:dir:attribute-def:eduPersonScopedAffiliation"
+msgstr "Kamano khampaning ya habo"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.9"
+msgstr "Kamano khampaning ya habo"
+
+msgid "eduPersonTargetedID"
+msgstr "ID e phehellang ya lebitso la boiqapelo"
+
+msgid "urn:mace:dir:attribute-def:eduPersonTargetedID"
+msgstr "ID e phehellang ya lebitso la boiqapelo"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.10"
+msgstr "ID e phehellang ya lebitso la boiqapelo"
+
+msgid "eduPersonUniqueId"
+msgstr "ID ya boiqapelo le phehellang, e sa ajweng botjha ya motho ya khampani ya lapeng"
+
+msgid "urn:mace:dir:attribute-def:eduPersonUniqueId"
+msgstr "ID ya boiqapelo le phehellang, e sa ajweng botjha ya motho ya khampani ya lapeng"
+
+msgid "urn:oid:1.3.6.1.4.1.5923.1.1.1.13"
+msgstr "ID ya boiqapelo le phehellang, e sa ajweng botjha ya motho ya khampani ya lapeng"
+
+msgid "email"
+msgstr "Poso"
+
+msgid "urn:mace:dir:attribute-def:email"
+msgstr "Poso"
+
+msgid "urn:oid:1.2.840.113549.1.9.1"
+msgstr "Poso"
+
+msgid "emailAddress"
+msgstr "Poso"
+
+msgid "urn:mace:dir:attribute-def:emailAddress"
+msgstr "Poso"
+
+msgid "employeeNumber"
+msgstr "employeeNumber"
+
+msgid "urn:mace:dir:attribute-def:employeeNumber"
+msgstr "urn:mace:dir:attribute-def:employeeNumber"
+
+msgid "urn:oid:2.16.840.1.113730.3.1.3"
+msgstr "urn:oid:2.16.840.1.113730.3.1.3"
+
+msgid "employeeType"
+msgstr "employeeType"
+
+msgid "urn:mace:dir:attribute-def:employeeType"
+msgstr "urn:mace:dir:attribute-def:employeeType"
+
+msgid "urn:oid:2.16.840.1.113730.3.1.4"
+msgstr "urn:oid:2.16.840.1.113730.3.1.4"
+
+msgid "enhancedSearchGuide"
+msgstr "enhancedSearchGuide"
+
+msgid "urn:mace:dir:attribute-def:enhancedSearchGuide"
+msgstr "urn:mace:dir:attribute-def:enhancedSearchGuide"
+
+msgid "urn:oid:2.5.4.47"
+msgstr "urn:oid:2.5.4.47"
+
+msgid "facsimileTelephoneNumber"
+msgstr "Nomoro ya fekse"
+
+msgid "urn:mace:dir:attribute-def:facsimileTelephoneNumber"
+msgstr "Nomoro ya fekse"
+
+msgid "urn:oid:2.5.4.23"
+msgstr "Nomoro ya fekse"
+
+msgid "favouriteDrink"
+msgstr "favouriteDrink"
+
+msgid "urn:mace:dir:attribute-def:favouriteDrink"
+msgstr "urn:mace:dir:attribute-def:favouriteDrink"
+
+msgid "fax"
+msgstr "fax"
+
+msgid "urn:mace:dir:attribute-def:fax"
+msgstr "urn:mace:dir:attribute-def:fax"
+
+msgid "federationFeideSchemaVersion"
+msgstr "federationFeideSchemaVersion"
+
+msgid "urn:mace:dir:attribute-def:federationFeideSchemaVersion"
+msgstr "urn:mace:dir:attribute-def:federationFeideSchemaVersion"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.9"
+msgstr "urn:oid:1.3.6.1.4.1.2428.90.1.9"
+
+msgid "friendlyCountryName"
+msgstr "friendlyCountryName"
+
+msgid "urn:mace:dir:attribute-def:friendlyCountryName"
+msgstr "urn:mace:dir:attribute-def:friendlyCountryName"
+
+msgid "generationQualifier"
+msgstr "generationQualifier"
+
+msgid "urn:mace:dir:attribute-def:generationQualifier"
+msgstr "urn:mace:dir:attribute-def:generationQualifier"
+
+msgid "urn:oid:2.5.4.44"
+msgstr "urn:oid:2.5.4.44"
+
+msgid "givenName"
+msgstr "Lebitso le fanweng"
+
+msgid "urn:mace:dir:attribute-def:givenName"
+msgstr "Lebitso le fanweng"
+
+msgid "urn:oid:2.5.4.42"
+msgstr "Lebitso le fanweng"
+
+msgid "gn"
+msgstr "gn"
+
+msgid "urn:mace:dir:attribute-def:gn"
+msgstr "urn:mace:dir:attribute-def:gn"
+
+msgid "homePhone"
+msgstr "Founu ya lapeng"
+
+msgid "urn:mace:dir:attribute-def:homePhone"
+msgstr "Founu ya lapeng"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.20"
+msgstr "Founu ya lapeng"
+
+msgid "homePostalAddress"
+msgstr "Aterese ya lapeng ya poso"
+
+msgid "urn:mace:dir:attribute-def:homePostalAddress"
+msgstr "Aterese ya lapeng ya poso"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.39"
+msgstr "Aterese ya lapeng ya poso"
+
+msgid "homeTelephoneNumber"
+msgstr "homeTelephoneNumber"
+
+msgid "urn:mace:dir:attribute-def:homeTelephoneNumber"
+msgstr "urn:mace:dir:attribute-def:homeTelephoneNumber"
+
+msgid "host"
+msgstr "host"
+
+msgid "urn:mace:dir:attribute-def:host"
+msgstr "urn:mace:dir:attribute-def:host"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.9"
+msgstr "urn:oid:0.9.2342.19200300.100.1.9"
+
+msgid "houseIdentifier"
+msgstr "houseIdentifier"
+
+msgid "urn:mace:dir:attribute-def:houseIdentifier"
+msgstr "urn:mace:dir:attribute-def:houseIdentifier"
+
+msgid "urn:oid:2.5.4.51"
+msgstr "urn:oid:2.5.4.51"
+
+msgid "info"
+msgstr "info"
+
+msgid "urn:mace:dir:attribute-def:info"
+msgstr "urn:mace:dir:attribute-def:info"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.4"
+msgstr "urn:oid:0.9.2342.19200300.100.1.4"
+
+msgid "initials"
+msgstr "initials"
+
+msgid "urn:mace:dir:attribute-def:initials"
+msgstr "urn:mace:dir:attribute-def:initials"
+
+msgid "urn:oid:2.5.4.43"
+msgstr "urn:oid:2.5.4.43"
+
+msgid "internationaliSDNNumber"
+msgstr "internationaliSDNNumber"
+
+msgid "urn:mace:dir:attribute-def:internationaliSDNNumber"
+msgstr "urn:mace:dir:attribute-def:internationaliSDNNumber"
+
+msgid "urn:oid:2.5.4.25"
+msgstr "urn:oid:2.5.4.25"
+
+msgid "janetMailbox"
+msgstr "janetMailbox"
+
+msgid "urn:mace:dir:attribute-def:janetMailbox"
+msgstr "urn:mace:dir:attribute-def:janetMailbox"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.46"
+msgstr "urn:oid:0.9.2342.19200300.100.1.46"
+
+msgid "jpegPhoto"
+msgstr "Foto ya JPEG"
+
+msgid "urn:mace:dir:attribute-def:jpegPhoto"
+msgstr "Foto ya JPEG"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.60"
+msgstr "Foto ya JPEG"
+
+msgid "knowledgeInformation"
+msgstr "knowledgeInformation"
+
+msgid "urn:mace:dir:attribute-def:knowledgeInformation"
+msgstr "urn:mace:dir:attribute-def:knowledgeInformation"
+
+msgid "urn:oid:2.5.4.2"
+msgstr "urn:oid:2.5.4.2"
+
+msgid "l"
+msgstr "Tulo"
+
+msgid "urn:mace:dir:attribute-def:l"
+msgstr "Tulo"
+
+msgid "urn:oid:2.5.4.7"
+msgstr "Tulo"
+
+msgid "labeledURI"
+msgstr "Ya Leibole ya URI"
+
+msgid "urn:mace:dir:attribute-def:labeledURI"
+msgstr "Ya Leibole ya URI"
+
+msgid "urn:oid:1.3.6.1.4.1.250.1.57"
+msgstr "Ya Leibole ya URI"
+
+msgid "localityName"
+msgstr "localityName"
+
+msgid "urn:mace:dir:attribute-def:localityName"
+msgstr "urn:mace:dir:attribute-def:localityName"
+
+msgid "mDRecord"
+msgstr "mDRecord"
+
+msgid "urn:mace:dir:attribute-def:mDRecord"
+msgstr "urn:mace:dir:attribute-def:mDRecord"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.27"
+msgstr "urn:oid:0.9.2342.19200300.100.1.27"
+
+msgid "mXRecord"
+msgstr "mXRecord"
+
+msgid "urn:mace:dir:attribute-def:mXRecord"
+msgstr "urn:mace:dir:attribute-def:mXRecord"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.28"
+msgstr "urn:oid:0.9.2342.19200300.100.1.28"
+
+msgid "Poso"
+msgstr "Poso"
+
+msgid "urn:mace:dir:attribute-def:mail"
+msgstr "Poso"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.3"
+msgstr "Poso"
+
+msgid "mailPreferenceOption"
+msgstr "mailPreferenceOption"
+
+msgid "urn:mace:dir:attribute-def:mailPreferenceOption"
+msgstr "urn:mace:dir:attribute-def:mailPreferenceOption"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.47"
+msgstr "urn:oid:0.9.2342.19200300.100.1.47"
+
+msgid "Mookamedi"
+msgstr "Mookamedi"
+
+msgid "urn:mace:dir:attribute-def:manager"
+msgstr "Mookamedi"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.10"
+msgstr "Mookamedi"
+
+msgid "member"
+msgstr "member"
+
+msgid "urn:mace:dir:attribute-def:member"
+msgstr "urn:mace:dir:attribute-def:member"
+
+msgid "urn:oid:2.5.4.31"
+msgstr "urn:oid:2.5.4.31"
+
+msgid "E tsamayang"
+msgstr "E tsamayang"
+
+msgid "urn:mace:dir:attribute-def:mobile"
+msgstr "E tsamayang"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.41"
+msgstr "E tsamayang"
+
+msgid "mobileTelephoneNumber"
+msgstr "E tsamayang"
+
+msgid "urn:mace:dir:attribute-def:mobileTelephoneNumber"
+msgstr "E tsamayang"
+
+msgid "nSRecord"
+msgstr "nSRecord"
+
+msgid "urn:mace:dir:attribute-def:nSRecord"
+msgstr "urn:mace:dir:attribute-def:nSRecord"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.29"
+msgstr "urn:oid:0.9.2342.19200300.100.1.29"
+
+msgid "name"
+msgstr "name"
+
+msgid "urn:mace:dir:attribute-def:name"
+msgstr "urn:mace:dir:attribute-def:name"
+
+msgid "urn:oid:2.5.4.41"
+msgstr "urn:oid:2.5.4.41"
+
+msgid "norEduOrgAcronym"
+msgstr "norEduOrgAcronym"
+
+msgid "urn:mace:dir:attribute-def:norEduOrgAcronym"
+msgstr "urn:mace:dir:attribute-def:norEduOrgAcronym"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.6"
+msgstr "urn:oid:1.3.6.1.4.1.2428.90.1.6"
+
+msgid "norEduOrgNIN"
+msgstr "Nomoro ya khampani"
+
+msgid "urn:mace:dir:attribute-def:norEduOrgNIN"
+msgstr "Nomoro ya khampani"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.12"
+msgstr "Nomoro ya khampani"
+
+msgid "norEduOrgSchemaVersion"
+msgstr "norEduOrgSchemaVersion"
+
+msgid "urn:mace:dir:attribute-def:norEduOrgSchemaVersion"
+msgstr "urn:mace:dir:attribute-def:norEduOrgSchemaVersion"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.11"
+msgstr "urn:oid:1.3.6.1.4.1.2428.90.1.11"
+
+msgid "norEduOrgUniqueIdentifier"
+msgstr "norEduOrgUniqueIdentifier"
+
+msgid "urn:mace:dir:attribute-def:norEduOrgUniqueIdentifier"
+msgstr "urn:mace:dir:attribute-def:norEduOrgUniqueIdentifier"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.7"
+msgstr "urn:oid:1.3.6.1.4.1.2428.90.1.7"
+
+msgid "norEduOrgUniqueNumber"
+msgstr "norEduOrgUniqueNumber"
+
+msgid "urn:mace:dir:attribute-def:norEduOrgUniqueNumber"
+msgstr "urn:mace:dir:attribute-def:norEduOrgUniqueNumber"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.1"
+msgstr "urn:oid:1.3.6.1.4.1.2428.90.1.1"
+
+msgid "norEduOrgUnitUniqueIdentifier"
+msgstr "norEduOrgUnitUniqueIdentifier"
+
+msgid "urn:mace:dir:attribute-def:norEduOrgUnitUniqueIdentifier"
+msgstr "urn:mace:dir:attribute-def:norEduOrgUnitUniqueIdentifier"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.8"
+msgstr "urn:oid:1.3.6.1.4.1.2428.90.1.8"
+
+msgid "norEduOrgUnitUniqueNumber"
+msgstr "norEduOrgUnitUniqueNumber"
+
+msgid "urn:mace:dir:attribute-def:norEduOrgUnitUniqueNumber"
+msgstr "urn:mace:dir:attribute-def:norEduOrgUnitUniqueNumber"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.2"
+msgstr "urn:oid:1.3.6.1.4.1.2428.90.1.2"
+
+msgid "norEduPersonBirthDate"
+msgstr "Letsatsi la tswalo"
+
+msgid "urn:mace:dir:attribute-def:norEduPersonBirthDate"
+msgstr "Letsatsi la tswalo"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.3"
+msgstr "Letsatsi la tswalo"
+
+msgid "norEduPersonLIN"
+msgstr "Nomoro ya boitsebiso ya lehae"
+
+msgid "urn:mace:dir:attribute-def:norEduPersonLIN"
+msgstr "Nomoro ya boitsebiso ya lehae"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.4"
+msgstr "Nomoro ya boitsebiso ya lehae"
+
+msgid "norEduPersonNIN"
+msgstr "Nomoro ya boitsebiso e abilwe ke bolaodi ba puso"
+
+msgid "urn:mace:dir:attribute-def:norEduPersonNIN"
+msgstr "Nomoro ya boitsebiso e abilwe ke bolaodi ba puso"
+
+msgid "urn:oid:1.3.6.1.4.1.2428.90.1.5"
+msgstr "Nomoro ya boitsebiso e abilwe ke bolaodi ba puso"
+
+msgid "o"
+msgstr "Lebitso la khampani"
+
+msgid "urn:mace:dir:attribute-def:o"
+msgstr "Lebitso la khampani"
+
+msgid "urn:oid:2.5.4.10"
+msgstr "Lebitso la khampani"
+
+msgid "objectClass"
+msgstr "objectClass"
+
+msgid "urn:mace:dir:attribute-def:objectClass"
+msgstr "urn:mace:dir:attribute-def:objectClass"
+
+msgid "urn:oid:2.5.4.0"
+msgstr "urn:oid:2.5.4.0"
+
+msgid "organizationName"
+msgstr "organizationName"
+
+msgid "urn:mace:dir:attribute-def:organizationName"
+msgstr "urn:mace:dir:attribute-def:organizationName"
+
+msgid "organizationalStatus"
+msgstr "organizationalStatus"
+
+msgid "urn:mace:dir:attribute-def:organizationalStatus"
+msgstr "urn:mace:dir:attribute-def:organizationalStatus"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.45"
+msgstr "urn:oid:0.9.2342.19200300.100.1.45"
+
+msgid "organizationalUnitName"
+msgstr "organizationalUnitName"
+
+msgid "urn:mace:dir:attribute-def:organizationalUnitName"
+msgstr "urn:mace:dir:attribute-def:organizationalUnitName"
+
+msgid "urn:oid:2.5.4.11"
+msgstr "Yuniti ya khampani"
+
+msgid "otherMailbox"
+msgstr "otherMailbox"
+
+msgid "urn:mace:dir:attribute-def:otherMailbox"
+msgstr "urn:mace:dir:attribute-def:otherMailbox"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.22"
+msgstr "urn:oid:0.9.2342.19200300.100.1.22"
+
+msgid "ou"
+msgstr "Yuniti ya khampani"
+
+msgid "urn:mace:dir:attribute-def:ou"
+msgstr "Yuniti ya khampani"
+
+msgid "owner"
+msgstr "owner"
+
+msgid "urn:mace:dir:attribute-def:owner"
+msgstr "urn:mace:dir:attribute-def:owner"
+
+msgid "urn:oid:2.5.4.32"
+msgstr "urn:oid:2.5.4.32"
+
+msgid "pager"
+msgstr "pager"
+
+msgid "urn:mace:dir:attribute-def:pager"
+msgstr "urn:mace:dir:attribute-def:pager"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.42"
+msgstr "urn:oid:0.9.2342.19200300.100.1.42"
+
+msgid "pagerTelephoneNumber"
+msgstr "pagerTelephoneNumber"
+
+msgid "urn:mace:dir:attribute-def:pagerTelephoneNumber"
+msgstr "urn:mace:dir:attribute-def:pagerTelephoneNumber"
+
+msgid "pairwise-id"
+msgstr "Service-specific pseudonymous ID at home organization"
+
+msgid "urn:oasis:names:tc:SAML:attribute:pairwise-id"
+msgstr "Service-specific pseudonymous ID at home organization"
+
+msgid "personalSignature"
+msgstr "personalSignature"
+
+msgid "urn:mace:dir:attribute-def:personalSignature"
+msgstr "urn:mace:dir:attribute-def:personalSignature"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.53"
+msgstr "urn:oid:0.9.2342.19200300.100.1.53"
+
+msgid "personalTitle"
+msgstr "personalTitle"
+
+msgid "urn:mace:dir:attribute-def:personalTitle"
+msgstr "urn:mace:dir:attribute-def:personalTitle"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.40"
+msgstr "urn:oid:0.9.2342.19200300.100.1.40"
+
+msgid "photo"
+msgstr "photo"
+
+msgid "urn:mace:dir:attribute-def:photo"
+msgstr "urn:mace:dir:attribute-def:photo"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.7"
+msgstr "urn:oid:0.9.2342.19200300.100.1.7"
+
+msgid "physicalDeliveryOfficeName"
+msgstr "physicalDeliveryOfficeName"
+
+msgid "urn:mace:dir:attribute-def:physicalDeliveryOfficeName"
+msgstr "urn:mace:dir:attribute-def:physicalDeliveryOfficeName"
+
+msgid "urn:oid:2.5.4.19"
+msgstr "urn:oid:2.5.4.19"
+
+msgid "pkcs9email"
+msgstr "pkcs9email"
+
+msgid "urn:mace:dir:attribute-def:pkcs9email"
+msgstr "urn:mace:dir:attribute-def:pkcs9email"
+
+msgid "postOfficeBox"
+msgstr "Lebokose la poso"
+
+msgid "urn:mace:dir:attribute-def:postOfficeBox"
+msgstr "Lebokose la poso"
+
+msgid "urn:oid:2.5.4.18"
+msgstr "Lebokose la poso"
+
+msgid "postalAddress"
+msgstr "Aterese ya poso"
+
+msgid "urn:mace:dir:attribute-def:postalAddress"
+msgstr "Aterese ya poso"
+
+msgid "urn:oid:2.5.4.16"
+msgstr "Aterese ya poso"
+
+msgid "postalCode"
+msgstr "Khoutu ya poso"
+
+msgid "urn:mace:dir:attribute-def:postalCode"
+msgstr "Khoutu ya poso"
+
+msgid "urn:oid:2.5.4.17"
+msgstr "Khoutu ya poso"
+
+msgid "preferredDeliveryMethod"
+msgstr "preferredDeliveryMethod"
+
+msgid "urn:mace:dir:attribute-def:preferredDeliveryMethod"
+msgstr "urn:mace:dir:attribute-def:preferredDeliveryMethod"
+
+msgid "urn:oid:2.5.4.28"
+msgstr "urn:oid:2.5.4.28"
+
+msgid "preferredLanguage"
+msgstr "Puo e kgethwang"
+
+msgid "urn:mace:dir:attribute-def:preferredLanguage"
+msgstr "Puo e kgethwang"
+
+msgid "urn:oid:2.16.840.1.113730.3.1.39"
+msgstr "Puo e kgethwang"
+
+msgid "presentationAddress"
+msgstr "presentationAddress"
+
+msgid "urn:mace:dir:attribute-def:presentationAddress"
+msgstr "urn:mace:dir:attribute-def:presentationAddress"
+
+msgid "urn:oid:2.5.4.29"
+msgstr "urn:oid:2.5.4.29"
+
+msgid "protocolInformation"
+msgstr "protocolInformation"
+
+msgid "urn:mace:dir:attribute-def:protocolInformation"
+msgstr "urn:mace:dir:attribute-def:protocolInformation"
+
+msgid "urn:oid:2.5.4.48"
+msgstr "urn:oid:2.5.4.48"
+
+msgid "pseudonym"
+msgstr "pseudonym"
+
+msgid "urn:mace:dir:attribute-def:pseudonym"
+msgstr "urn:mace:dir:attribute-def:pseudonym"
+
+msgid "urn:oid:2.5.4.65"
+msgstr "urn:oid:2.5.4.65"
+
+msgid "registeredAddress"
+msgstr "registeredAddress"
+
+msgid "urn:mace:dir:attribute-def:registeredAddress"
+msgstr "urn:mace:dir:attribute-def:registeredAddress"
+
+msgid "urn:oid:2.5.4.26"
+msgstr "urn:oid:2.5.4.26"
+
+msgid "rfc822Mailbox"
+msgstr "rfc822Mailbox"
+
+msgid "urn:mace:dir:attribute-def:rfc822Mailbox"
+msgstr "urn:mace:dir:attribute-def:rfc822Mailbox"
+
+msgid "roleOccupant"
+msgstr "roleOccupant"
+
+msgid "urn:mace:dir:attribute-def:roleOccupant"
+msgstr "urn:mace:dir:attribute-def:roleOccupant"
+
+msgid "urn:oid:2.5.4.33"
+msgstr "urn:oid:2.5.4.33"
+
+msgid "roomNumber"
+msgstr "roomNumber"
+
+msgid "urn:mace:dir:attribute-def:roomNumber"
+msgstr "urn:mace:dir:attribute-def:roomNumber"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.6"
+msgstr "urn:oid:0.9.2342.19200300.100.1.6"
+
+msgid "sOARecord"
+msgstr "sOARecord"
+
+msgid "urn:mace:dir:attribute-def:sOARecord"
+msgstr "urn:mace:dir:attribute-def:sOARecord"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.30"
+msgstr "urn:oid:0.9.2342.19200300.100.1.30"
+
+msgid "schacCountryOfCitizenship"
+msgstr "schacCountryOfCitizenship"
+
+msgid "urn:mace:terena.org:attribute-def:schacCountryOfCitizenship"
+msgstr "urn:mace:terena.org:attribute-def:schacCountryOfCitizenship"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.5"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.5"
+
+msgid "urn:schac:attribute-def:schacCountryOfCitizenship"
+msgstr "urn:schac:attribute-def:schacCountryOfCitizenship"
+
+msgid "schacCountryOfResidence"
+msgstr "schacCountryOfResidence"
+
+msgid "urn:mace:terena.org:attribute-def:schacCountryOfResidence"
+msgstr "urn:mace:terena.org:attribute-def:schacCountryOfResidence"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.11"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.11"
+
+msgid "urn:schac:attribute-def:schacCountryOfResidence"
+msgstr "urn:schac:attribute-def:schacCountryOfResidence"
+
+msgid "schacDateOfBirth"
+msgstr "schacDateOfBirth"
+
+msgid "urn:mace:terena.org:attribute-def:schacDateOfBirth"
+msgstr "urn:mace:terena.org:attribute-def:schacDateOfBirth"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.3"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.3"
+
+msgid "urn:schac:attribute-def:schacDateOfBirth"
+msgstr "urn:schac:attribute-def:schacDateOfBirth"
+
+msgid "schacExpiryDate"
+msgstr "schacExpiryDate"
+
+msgid "urn:mace:terena.org:attribute-def:schacExpiryDate"
+msgstr "urn:mace:terena.org:attribute-def:schacExpiryDate"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.17"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.17"
+
+msgid "urn:schac:attribute-def:schacExpiryDate"
+msgstr "urn:schac:attribute-def:schacExpiryDate"
+
+msgid "schacGender"
+msgstr "schacGender"
+
+msgid "urn:mace:terena.org:attribute-def:schacGender"
+msgstr "urn:mace:terena.org:attribute-def:schacGender"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.2"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.2"
+
+msgid "urn:schac:attribute-def:schacGender"
+msgstr "urn:schac:attribute-def:schacGender"
+
+msgid "schacHomeOrganization"
+msgstr "Lebitso la domeine ya khampani"
+
+msgid "urn:mace:terena.org:attribute-def:schacHomeOrganization"
+msgstr "Lebitso la domeine ya khampani"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.9"
+msgstr "Lebitso la domeine ya khampani"
+
+msgid "urn:schac:attribute-def:schacHomeOrganization"
+msgstr "Lebitso la domeine ya khampani"
+
+msgid "schacHomeOrganizationType"
+msgstr "schacHomeOrganizationType"
+
+msgid "urn:mace:terena.org:attribute-def:schacHomeOrganizationType"
+msgstr "urn:mace:terena.org:attribute-def:schacHomeOrganizationType"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.10"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.10"
+
+msgid "urn:schac:attribute-def:schacHomeOrganizationType"
+msgstr "urn:schac:attribute-def:schacHomeOrganizationType"
+
+msgid "schacMotherTongue"
+msgstr "schacMotherTongue"
+
+msgid "urn:mace:terena.org:attribute-def:schacMotherTongue"
+msgstr "urn:mace:terena.org:attribute-def:schacMotherTongue"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.1"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.1"
+
+msgid "urn:schac:attribute-def:schacMotherTongue"
+msgstr "urn:schac:attribute-def:schacMotherTongue"
+
+msgid "schacPersonalPosition"
+msgstr "schacPersonalPosition"
+
+msgid "urn:mace:terena.org:attribute-def:schacPersonalPosition"
+msgstr "urn:mace:terena.org:attribute-def:schacPersonalPosition"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.13"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.13"
+
+msgid "urn:schac:attribute-def:schacPersonalPosition"
+msgstr "urn:schac:attribute-def:schacPersonalPosition"
+
+msgid "schacPersonalTitle"
+msgstr "schacPersonalTitle"
+
+msgid "urn:mace:terena.org:attribute-def:schacPersonalTitle"
+msgstr "urn:mace:terena.org:attribute-def:schacPersonalTitle"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.8"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.8"
+
+msgid "urn:schac:attribute-def:schacPersonalTitle"
+msgstr "urn:schac:attribute-def:schacPersonalTitle"
+
+msgid "schacPersonalUniqueCode"
+msgstr "schacPersonalUniqueCode"
+
+msgid "urn:mace:terena.org:attribute-def:schacPersonalUniqueCode"
+msgstr "urn:mace:terena.org:attribute-def:schacPersonalUniqueCode"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.14"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.14"
+
+msgid "urn:schac:attribute-def:schacPersonalUniqueCode"
+msgstr "urn:schac:attribute-def:schacPersonalUniqueCode"
+
+msgid "schacPersonalUniqueID"
+msgstr "schacPersonalUniqueID"
+
+msgid "urn:mace:terena.org:attribute-def:schacPersonalUniqueID"
+msgstr "urn:mace:terena.org:attribute-def:schacPersonalUniqueID"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.15"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.15"
+
+msgid "urn:schac:attribute-def:schacPersonalUniqueID"
+msgstr "urn:schac:attribute-def:schacPersonalUniqueID"
+
+msgid "schacPlaceOfBirth"
+msgstr "schacPlaceOfBirth"
+
+msgid "urn:mace:terena.org:attribute-def:schacPlaceOfBirth"
+msgstr "urn:mace:terena.org:attribute-def:schacPlaceOfBirth"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.4"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.4"
+
+msgid "urn:schac:attribute-def:schacPlaceOfBirth"
+msgstr "urn:schac:attribute-def:schacPlaceOfBirth"
+
+msgid "schacProjectMembership"
+msgstr "schacProjectMembership"
+
+msgid "urn:mace:terena.org:attribute-def:schacProjectMembership"
+msgstr "urn:mace:terena.org:attribute-def:schacProjectMembership"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.20"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.20"
+
+msgid "urn:schac:attribute-def:schacProjectMembership"
+msgstr "urn:schac:attribute-def:schacProjectMembership"
+
+msgid "schacProjectSpecificRole"
+msgstr "schacProjectSpecificRole"
+
+msgid "urn:mace:terena.org:attribute-def:schacProjectSpecificRole"
+msgstr "urn:mace:terena.org:attribute-def:schacProjectSpecificRole"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.21"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.21"
+
+msgid "urn:schac:attribute-def:schacProjectSpecificRole"
+msgstr "urn:schac:attribute-def:schacProjectSpecificRole"
+
+msgid "schacSn1"
+msgstr "schacSn1"
+
+msgid "urn:mace:terena.org:attribute-def:schacSn1"
+msgstr "urn:mace:terena.org:attribute-def:schacSn1"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.6"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.6"
+
+msgid "urn:schac:attribute-def:schacSn1"
+msgstr "urn:schac:attribute-def:schacSn1"
+
+msgid "schacSn2"
+msgstr "schacSn2"
+
+msgid "urn:mace:terena.org:attribute-def:schacSn2"
+msgstr "urn:mace:terena.org:attribute-def:schacSn2"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.7"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.7"
+
+msgid "urn:schac:attribute-def:schacSn2"
+msgstr "urn:schac:attribute-def:schacSn2"
+
+msgid "schacUserPresenceID"
+msgstr "schacUserPresenceID"
+
+msgid "urn:mace:terena.org:attribute-def:schacUserPresenceID"
+msgstr "urn:mace:terena.org:attribute-def:schacUserPresenceID"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.12"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.12"
+
+msgid "urn:schac:attribute-def:schacUserPresenceID"
+msgstr "urn:schac:attribute-def:schacUserPresenceID"
+
+msgid "schacUserPrivateAttribute"
+msgstr "Dielemente tsa tlhahisoleseding ya poraefete"
+
+msgid "urn:mace:terena.org:attribute-def:schacUserPrivateAttribute"
+msgstr "Dielemente tsa tlhahisoleseding ya poraefete"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.18"
+msgstr "Dielemente tsa tlhahisoleseding ya poraefete"
+
+msgid "urn:schac:attribute-def:schacUserPrivateAttribute"
+msgstr "Dielemente tsa tlhahisoleseding ya poraefete"
+
+msgid "schacUserStatus"
+msgstr "schacUserStatus"
+
+msgid "urn:mace:terena.org:attribute-def:schacUserStatus"
+msgstr "urn:mace:terena.org:attribute-def:schacUserStatus"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.2.19"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.2.19"
+
+msgid "urn:schac:attribute-def:schacUserStatus"
+msgstr "urn:schac:attribute-def:schacUserStatus"
+
+msgid "schacYearOfBirth"
+msgstr "schacYearOfBirth"
+
+msgid "urn:mace:terena.org:attribute-def:schacYearOfBirth"
+msgstr "urn:mace:terena.org:attribute-def:schacYearOfBirth"
+
+msgid "urn:oid:1.3.6.1.4.1.25178.1.0.2.3"
+msgstr "urn:oid:1.3.6.1.4.1.25178.1.0.2.3"
+
+msgid "urn:schac:attribute-def:schacYearOfBirth"
+msgstr "urn:schac:attribute-def:schacYearOfBirth"
+
+msgid "searchGuide"
+msgstr "searchGuide"
+
+msgid "urn:mace:dir:attribute-def:searchGuide"
+msgstr "urn:mace:dir:attribute-def:searchGuide"
+
+msgid "urn:oid:2.5.4.14"
+msgstr "urn:oid:2.5.4.14"
+
+msgid "secretary"
+msgstr "secretary"
+
+msgid "urn:mace:dir:attribute-def:secretary"
+msgstr "urn:mace:dir:attribute-def:secretary"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.21"
+msgstr "urn:oid:0.9.2342.19200300.100.1.21"
+
+msgid "seeAlso"
+msgstr "seeAlso"
+
+msgid "urn:mace:dir:attribute-def:seeAlso"
+msgstr "urn:mace:dir:attribute-def:seeAlso"
+
+msgid "urn:oid:2.5.4.34"
+msgstr "urn:oid:2.5.4.34"
+
+msgid "serialNumber"
+msgstr "serialNumber"
+
+msgid "urn:mace:dir:attribute-def:serialNumber"
+msgstr "urn:mace:dir:attribute-def:serialNumber"
+
+msgid "urn:oid:2.5.4.5"
+msgstr "urn:oid:2.5.4.5"
+
+msgid "singleLevelQuality"
+msgstr "singleLevelQuality"
+
+msgid "urn:mace:dir:attribute-def:singleLevelQuality"
+msgstr "urn:mace:dir:attribute-def:singleLevelQuality"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.50"
+msgstr "urn:oid:0.9.2342.19200300.100.1.50"
+
+msgid "sisSchoolGrade"
+msgstr "sisSchoolGrade"
+
+msgid "urn:mace:dir:attribute-def:sisSchoolGrade"
+msgstr "urn:mace:dir:attribute-def:sisSchoolGrade"
+
+msgid "urn:oid:1.2.752.194.10.2.2"
+msgstr "urn:oid:1.2.752.194.10.2.2"
+
+msgid "sisLegalGuardianFor"
+msgstr "sisLegalGuardianFor"
+
+msgid "urn:mace:dir:attribute-def:sisLegalGuardianFor"
+msgstr "urn:mace:dir:attribute-def:sisLegalGuardianFor"
+
+msgid "urn:oid:1.2.752.194.10.2.1"
+msgstr "urn:oid:1.2.752.194.10.2.1"
+
+msgid "sn"
+msgstr "Difane"
+
+msgid "urn:mace:dir:attribute-def:sn"
+msgstr "Difane"
+
+msgid "urn:oid:2.5.4.4"
+msgstr "Difane"
+
+msgid "st"
+msgstr "st"
+
+msgid "urn:mace:dir:attribute-def:st"
+msgstr "urn:mace:dir:attribute-def:st"
+
+msgid "urn:oid:2.5.4.8"
+msgstr "urn:oid:2.5.4.8"
+
+msgid "stateOrProvinceName"
+msgstr "stateOrProvinceName"
+
+msgid "urn:mace:dir:attribute-def:stateOrProvinceName"
+msgstr "urn:mace:dir:attribute-def:stateOrProvinceName"
+
+msgid "Seterata"
+msgstr "Seterata"
+
+msgid "urn:mace:dir:attribute-def:street"
+msgstr "Seterata"
+
+msgid "urn:oid:2.5.4.9"
+msgstr "Seterata"
+
+msgid "streetAddress"
+msgstr "streetAddress"
+
+msgid "urn:mace:dir:attribute-def:streetAddress"
+msgstr "urn:mace:dir:attribute-def:streetAddress"
+
+msgid "subject-id"
+msgstr "Pseudonymous ID at home organization"
+
+msgid "urn:oasis:names:tc:SAML:attribute:subject-id"
+msgstr "Pseudonymous ID at home organization"
+
+msgid "subtreeMaximumQuality"
+msgstr "subtreeMaximumQuality"
+
+msgid "urn:mace:dir:attribute-def:subtreeMaximumQuality"
+msgstr "urn:mace:dir:attribute-def:subtreeMaximumQuality"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.52"
+msgstr "urn:oid:0.9.2342.19200300.100.1.52"
+
+msgid "subtreeMinimumQuality"
+msgstr "subtreeMinimumQuality"
+
+msgid "urn:mace:dir:attribute-def:subtreeMinimumQuality"
+msgstr "urn:mace:dir:attribute-def:subtreeMinimumQuality"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.51"
+msgstr "urn:oid:0.9.2342.19200300.100.1.51"
+
+msgid "supportedAlgorithms"
+msgstr "supportedAlgorithms"
+
+msgid "urn:mace:dir:attribute-def:supportedAlgorithms"
+msgstr "urn:mace:dir:attribute-def:supportedAlgorithms"
+
+msgid "urn:oid:2.5.4.52"
+msgstr "urn:oid:2.5.4.52"
+
+msgid "supportedApplicationContext"
+msgstr "supportedApplicationContext"
+
+msgid "urn:mace:dir:attribute-def:supportedApplicationContext"
+msgstr "urn:mace:dir:attribute-def:supportedApplicationContext"
+
+msgid "urn:oid:2.5.4.30"
+msgstr "urn:oid:2.5.4.30"
+
+msgid "Difane"
+msgstr "Difane"
+
+msgid "urn:mace:dir:attribute-def:surname"
+msgstr "urn:mace:dir:attribute-def:surname"
+
+msgid "telephoneNumber"
+msgstr "Nomoro ya founu"
+
+msgid "urn:mace:dir:attribute-def:telephoneNumber"
+msgstr "Nomoro ya founu"
+
+msgid "urn:oid:2.5.4.20"
+msgstr "Nomoro ya founu"
+
+msgid "teletexTerminalIdentifier"
+msgstr "teletexTerminalIdentifier"
+
+msgid "urn:mace:dir:attribute-def:teletexTerminalIdentifier"
+msgstr "urn:mace:dir:attribute-def:teletexTerminalIdentifier"
+
+msgid "urn:oid:2.5.4.22"
+msgstr "urn:oid:2.5.4.22"
+
+msgid "telexNumber"
+msgstr "telexNumber"
+
+msgid "urn:mace:dir:attribute-def:telexNumber"
+msgstr "urn:mace:dir:attribute-def:telexNumber"
+
+msgid "urn:oid:2.5.4.21"
+msgstr "urn:oid:2.5.4.21"
+
+msgid "textEncodedORAddress"
+msgstr "textEncodedORAddress"
+
+msgid "urn:mace:dir:attribute-def:textEncodedORAddress"
+msgstr "urn:mace:dir:attribute-def:textEncodedORAddress"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.2"
+msgstr "urn:oid:0.9.2342.19200300.100.1.2"
+
+msgid "title"
+msgstr "Thaetlele"
+
+msgid "urn:mace:dir:attribute-def:title"
+msgstr "Thaetlele"
+
+msgid "urn:oid:2.5.4.12"
+msgstr "Thaetlele"
+
+msgid "uid"
+msgstr "ID ya Mosebedisi"
+
+msgid "urn:mace:dir:attribute-def:uid"
+msgstr "ID ya Mosebedisi"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.1"
+msgstr "ID ya Mosebedisi"
+
+msgid "uniqueIdentifier"
+msgstr "uniqueIdentifier"
+
+msgid "urn:mace:dir:attribute-def:uniqueIdentifier"
+msgstr "urn:mace:dir:attribute-def:uniqueIdentifier"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.44"
+msgstr "urn:oid:0.9.2342.19200300.100.1.44"
+
+msgid "uniqueMember"
+msgstr "uniqueMember"
+
+msgid "urn:mace:dir:attribute-def:uniqueMember"
+msgstr "urn:mace:dir:attribute-def:uniqueMember"
+
+msgid "urn:oid:2.5.4.50"
+msgstr "urn:oid:2.5.4.50"
+
+msgid "userCertificate"
+msgstr "userCertificate"
+
+msgid "urn:mace:dir:attribute-def:userCertificate"
+msgstr "urn:mace:dir:attribute-def:userCertificate"
+
+msgid "urn:oid:2.5.4.36"
+msgstr "urn:oid:2.5.4.36"
+
+msgid "userClass"
+msgstr "userClass"
+
+msgid "urn:mace:dir:attribute-def:userClass"
+msgstr "urn:mace:dir:attribute-def:userClass"
+
+msgid "urn:oid:0.9.2342.19200300.100.1.8"
+msgstr "urn:oid:0.9.2342.19200300.100.1.8"
+
+msgid "userPKCS12"
+msgstr "userPKCS12"
+
+msgid "urn:mace:dir:attribute-def:userPKCS12"
+msgstr "urn:mace:dir:attribute-def:userPKCS12"
+
+msgid "urn:oid:2.16.840.1.113730.3.1.216"
+msgstr "urn:oid:2.16.840.1.113730.3.1.216"
+
+msgid "userPassword"
+msgstr "Hesh ya phasewete ya mosebedisi"
+
+msgid "urn:mace:dir:attribute-def:userPassword"
+msgstr "Hesh ya phasewete ya mosebedisi"
+
+msgid "urn:oid:2.5.4.35"
+msgstr "Hesh ya phasewete ya mosebedisi"
+
+msgid "userSMIMECertificate"
+msgstr "userSMIMECertificate"
+
+msgid "urn:mace:dir:attribute-def:userSMIMECertificate"
+msgstr "urn:mace:dir:attribute-def:userSMIMECertificate"
+
+msgid "urn:oid:2.16.840.1.113730.3.1.40"
+msgstr "urn:oid:2.16.840.1.113730.3.1.40"
+
+msgid "userid"
+msgstr "userid"
+
+msgid "urn:mace:dir:attribute-def:userid"
+msgstr "urn:mace:dir:attribute-def:userid"
+
+msgid "x121Address"
+msgstr "x121Address"
+
+msgid "urn:mace:dir:attribute-def:x121Address"
+msgstr "urn:mace:dir:attribute-def:x121Address"
+
+msgid "urn:oid:2.5.4.24"
+msgstr "urn:oid:2.5.4.24"
+
+msgid "x500UniqueIdentifier"
+msgstr "x500UniqueIdentifier"
+
+msgid "urn:mace:dir:attribute-def:x500UniqueIdentifier"
+msgstr "urn:mace:dir:attribute-def:x500UniqueIdentifier"
+
+msgid "urn:oid:2.5.4.45"
+msgstr "urn:oid:2.5.4.45"
+
+msgid "facebook_cn"
+msgstr "Lebitso le tlwaelehileng"
+
+msgid "http://axschema.org/contact/country/home"
+msgstr "http://axschema.org/contact/country/home"
+
+msgid "openid.sreg.country"
+msgstr "openid.sreg.country"
+
+msgid "facebook.about_me"
+msgstr "facebook.about_me"
+
+msgid "linkedin.summary"
+msgstr "linkedin.summary"
+
+msgid "twitter.description"
+msgstr "twitter.description"
+
+msgid "facebook.name"
+msgstr "Lebitso le bontshwang"
+
+msgid "http://axschema.org/namePerson/friendly"
+msgstr "Lebitso le bontshwang"
+
+msgid "openid.sreg.nickname"
+msgstr "Lebitso le bontshwang"
+
+msgid "http://axschema.org/namePerson"
+msgstr "Lebitso le bontshwang"
+
+msgid "openid.sreg.fullname"
+msgstr "Lebitso le bontshwang"
+
+msgid "twitter.name"
+msgstr "Lebitso le bontshwang"
+
+msgid "windowslive.displayName"
+msgstr "Lebitso le bontshwang"
+
+msgid "facebook_user"
+msgstr "Lebitso la sehlooho la motho khampaning ya habo"
+
+msgid "linkedin_user"
+msgstr "Lebitso la sehlooho la motho khampaning ya habo"
+
+msgid "twitter_screen_n_realm"
+msgstr "Lebitso la sehlooho la motho khampaning ya habo"
+
+msgid "windowslive_user"
+msgstr "Lebitso la sehlooho la motho khampaning ya habo"
+
+msgid "windowslive.userPrincipalName"
+msgstr "Lebitso la sehlooho la motho khampaning ya habo"
+
+msgid "facebook_targetedID"
+msgstr "ID e phehellang ya lebitso la boiqapelo"
+
+msgid "linkedin_targetedID"
+msgstr "ID e phehellang ya lebitso la boiqapelo"
+
+msgid "twitter_targetedID"
+msgstr "ID e phehellang ya lebitso la boiqapelo"
+
+msgid "windowslive_targetedID"
+msgstr "ID e phehellang ya lebitso la boiqapelo"
+
+msgid "http://axschema.org/contact/phone/fax"
+msgstr "Nomoro ya fekse"
+
+msgid "facebook.first_name"
+msgstr "Lebitso le fanweng"
+
+msgid "linkedin.firstName"
+msgstr "Lebitso le fanweng"
+
+msgid "http://axschema.org/namePerson/first"
+msgstr "Lebitso le fanweng"
+
+msgid "windowslive.FirstName"
+msgstr "Lebitso le fanweng"
+
+msgid "windowslive.givenName"
+msgstr "Lebitso le fanweng"
+
+msgid "http://axschema.org/contact/phone/home"
+msgstr "Founu ya lapeng"
+
+msgid "windowslive.Location"
+msgstr "Tulo"
+
+msgid "facebook.profile_url"
+msgstr "Ya Leibole ya URI"
+
+msgid "twitter.url"
+msgstr "Ya Leibole ya URI"
+
+msgid "facebook.email"
+msgstr "Poso"
+
+msgid "http://axschema.org/contact/email"
+msgstr "Poso"
+
+msgid "openid.sreg.email"
+msgstr "Poso"
+
+msgid "windowslive_mail"
+msgstr "Poso"
+
+msgid "windowslive.mail"
+msgstr "Poso"
+
+msgid "http://axschema.org/contact/phone/cell"
+msgstr "E tsamayang"
+
+msgid "http://axschema.org/company/name"
+msgstr "Lebitso la khampani"
+
+msgid "http://axschema.org/namePerson/prefix"
+msgstr "http://axschema.org/namePerson/prefix"
+
+msgid "http://axschema.org/contact/postalCode/home"
+msgstr "Khoutu ya poso"
+
+msgid "openid.sreg.postcode"
+msgstr "Khoutu ya poso"
+
+msgid "facebook.locale"
+msgstr "Puo e kgethwang"
+
+msgid "http://axschema.org/pref/language"
+msgstr "Puo e kgethwang"
+
+msgid "openid.sreg.language"
+msgstr "Puo e kgethwang"
+
+msgid "twitter.lang"
+msgstr "Puo e kgethwang"
+
+msgid "windowslive.preferredLanguage"
+msgstr "Puo e kgethwang"
+
+msgid "facebook.last_name"
+msgstr "Difane"
+
+msgid "linkedin.lastName"
+msgstr "Difane"
+
+msgid "http://axschema.org/namePerson/last"
+msgstr "Difane"
+
+msgid "windowslive.LastName"
+msgstr "Difane"
+
+msgid "windowslive.surname"
+msgstr "Difane"
+
+msgid "http://axschema.org/contact/phone/default"
+msgstr "Nomoro ya founu"
+
+msgid "http://axschema.org/contact/phone/business"
+msgstr "Nomoro ya founu"
+
+msgid "linkedin.headline"
+msgstr "Thaetlele"
+
+msgid "http://axschema.org/company/title"
+msgstr "Thaetlele"
+
+msgid "facebook.username"
+msgstr "ID ya Mosebedisi"
+
+msgid "linkedin.id"
+msgstr "ID ya Mosebedisi"
+
+msgid "twitter.screen_name"
+msgstr "ID ya Mosebedisi"
+
+msgid "windowslive_uid"
+msgstr "ID ya Mosebedisi"
+
+msgid "windowslive.id"
+msgstr "ID ya Mosebedisi"
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/st/LC_MESSAGES/messages.po b/vendor/simplesamlphp/simplesamlphp/locales/st/LC_MESSAGES/messages.po
new file mode 100644
index 0000000000000000000000000000000000000000..a862b0803aa962c08337a6fa4fe927369050cb8e
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/locales/st/LC_MESSAGES/messages.po
@@ -0,0 +1,1103 @@
+
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SimpleSAMLphp 1.15\n"
+"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n"
+"POT-Creation-Date: 2019-12-12 15:44+0200\n"
+"PO-Revision-Date: 2019-12-12 15:44+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
+msgid ""
+"You accessed the Assertion Consumer Service interface, but did not "
+"provide a SAML Authentication Response. Please note that this endpoint is"
+" not intended to be accessed directly."
+msgstr ""
+"O fihletse kopano ya Tiiso ya Tshebeletso ya Bareki, empa ha o a fana ka "
+"Karabelo ya Netefatso ya SAML. Ka kopo lemoha hore ntlha ena ya bofelo ha"
+" e a rerelwa ho fihlellwa ka kotloloho."
+
+msgid "Return to service"
+msgstr "E kgutlela tshebeletsong"
+
+msgid "{general:yes}"
+msgstr "E"
+
+msgid "{errors:title_PROCESSAUTHNREQUEST}"
+msgstr "Phoso ho sebetseng kopo ho tswa ho Mofani wa Tshebeletso"
+
+msgid ""
+"One or more of the services you are logged into <i>do not support "
+"logout</i>. To ensure that all your sessions are closed, you are "
+"encouraged to <i>close your webbrowser</i>."
+msgstr ""
+"E le nngwe kapa ho feta ya ditshebeletso tseo o keneng ho tsona <i>ha e "
+"tshehetse ho tswa</i>. Ho netefatsa hore diseshene tsohle tsa hao di "
+"kwetswe, o kgothaletswa ho <i>kwala sebadi sa webo sa hao</i>."
+
+msgid "E-mail address:"
+msgstr "Aterese ya imeile:"
+
+msgid "{logout:logout_all_question}"
+msgstr "Na o batla ho tswa ditshebeletsong tsohle tse ka hodimo moo?"
+
+msgid "{errors:howto_header}"
+msgstr "Ka moo o ka fumanang thuso"
+
+msgid "Help! I don't remember my password."
+msgstr "Thuso! Ha ke hopole phasewete ya ka."
+
+msgid "{logout:title}"
+msgstr "O ntshitswe"
+
+msgid "{errors:descr_PROCESSASSERTION}"
+msgstr "Ha re a amohela karabelo ho tswa ho Mofani wa Boitsebiso."
+
+msgid "{errors:title_BADREQUEST}"
+msgstr "Kopo e mpe e amohetswe"
+
+msgid "{errors:title_RESPONSESTATUSNOSUCCESS}"
+msgstr "Phoso e amohetswe ho tswa ho Mofani wa Boitsebiso"
+
+msgid "No access"
+msgstr "Ha ho phihlello"
+
+msgid "{status:logout}"
+msgstr "Ho tswa"
+
+msgid "{errors:descr_SLOSERVICEPARAMS}"
+msgstr ""
+"O fihletse tshebeletsano ya SingleLogoutService, empa ha o a fana ka SAML"
+" LogoutRequest kapa LogoutResponse. Ka kopo lemoha hore ntlha ena ya "
+"bofelo ha e a rerelwa ho fihlellwa ka kotloloho."
+
+msgid "Organization"
+msgstr "Khampani"
+
+msgid "{login:organization}"
+msgstr "Khampani"
+
+msgid "{errors:title_WRONGUSERPASS}"
+msgstr "Lebitso la mosebedisi kapa phasewete e fosahetseng"
+
+msgid "{disco:previous_auth}"
+msgstr "O qadile ka ho kgetha netefatso ho"
+
+msgid "{logout:hold}"
+msgstr "Tshwarisitswe"
+
+msgid "Authentication source error"
+msgstr "Phoso ya netefatso ya mohlodi"
+
+msgid "{errors:debuginfo_header}"
+msgstr "Tlhahisoleseding ya debug"
+
+msgid ""
+"The Identity Provider responded with an error. (The status code in the "
+"SAML Response was not success)"
+msgstr ""
+"Mofani wa Boitsebiso o arabetse ka phoso. (Khoutu ya boemo Karabelong ya "
+"SAML ha e a atleha)"
+
+msgid "{login:contact_info}"
+msgstr "Tlhahisoleseding ya boikopanyo:"
+
+msgid "{errors:descr_GENERATEAUTHNRESPONSE}"
+msgstr ""
+"Ha mofani enwa wa boitsebiso a leka ho theha karabelo ya netefatso, phoso"
+" e bile teng."
+
+msgid "Remember"
+msgstr "Hopola"
+
+msgid "{errors:title_SLOSERVICEPARAMS}"
+msgstr "Ha ho molaetsa wa SAML o fanweng"
+
+msgid "You have successfully logged out from all services listed above."
+msgstr ""
+"O tswile ka katleho ditshebeletsong tsohle tse thathamisitsweng ka hodimo"
+" mona."
+
+msgid "{errors:title_DISCOPARAMS}"
+msgstr "Kopo e mpe bakeng sa tshebeletso ya tshibollo"
+
+msgid "{logout:failed}"
+msgstr "Ho tswa ho hlolehile"
+
+msgid "{errors:title_CONFIG}"
+msgstr "Phoso ya Netefatso"
+
+msgid "{errors:title_CREATEREQUEST}"
+msgstr "Phoso ho thehweng ha kopo"
+
+msgid "The error report has been sent to the administrators."
+msgstr "Tlaleho ya phoso e rometswe ho batsamaisi."
+
+msgid "{errors:title_UNKNOWNCERT}"
+msgstr "Setifikeiti se sa tsejweng"
+
+msgid "{general:service_provider}"
+msgstr "Mofani wa Tshebeletso"
+
+msgid "{general:no_cancel}"
+msgstr "Tjhe, hlakola"
+
+msgid "{logout:logging_out_from}"
+msgstr "E tswa ditshebeletsong tse latelang:"
+
+msgid "{login:help_desk_email}"
+msgstr "Romela imeile ho ba deske ya thuso"
+
+msgid "{login:change_home_org_title}"
+msgstr "Fetola khampani ya lehae ya heno"
+
+msgid "{errors:descr_UNKNOWNCERT}"
+msgstr ""
+"Netefatso e hlolehile: setifikeiti se rometsweng ke sebadi sa hao ha se "
+"tsejwe"
+
+msgid "{errors:title_ACSPARAMS}"
+msgstr "Ha ho karabelo ya SAML e fanweng"
+
+msgid "{errors:report_text}"
+msgstr ""
+"Ka boikgethelo o ka kenya aterse ya imeile ya hao, bakeng sa batsamaisi "
+"hore ba kgone ho ikopanya le wena mabapi le dipotso tse ding ka ditaba "
+"tsa hao:"
+
+msgid "Incorrect username or password"
+msgstr "Lebitso la mosebedisi kapa phasewete e fosahetseng"
+
+msgid "Bad request to discovery service"
+msgstr "Kopo e mpe bakeng sa tshebeletso ya tshibollo"
+
+msgid "{errors:report_header}"
+msgstr "Tlaleha diphoso"
+
+msgid "Select"
+msgstr "Kgetha"
+
+msgid "Format"
+msgstr "Fomata"
+
+msgid "Contact information:"
+msgstr "Tlhahisoleseding ya boikopanyo:"
+
+msgid "Authentication error in source %AUTHSOURCE%. The reason was: %REASON%"
+msgstr "Phoso ya tiiso mohloding %AUTHSOURCE%. Lebaka e bile: %REASON%"
+
+msgid "{errors:title_UNHANDLEDEXCEPTION}"
+msgstr "Mokgelo o sa rarollwang"
+
+msgid "{errors:title_NORELAYSTATE}"
+msgstr "Ha ho RelayState"
+
+msgid "{status:subject_format}"
+msgstr "Fomata"
+
+msgid "Password"
+msgstr "Phasewete"
+
+msgid "{errors:title_AUTHSOURCEERROR}"
+msgstr "Phoso ya netefatso ya mohlodi"
+
+msgid "Debug information"
+msgstr "Tlhahisoleseding ya debug"
+
+msgid "{logout:success}"
+msgstr ""
+"O tswile ka katleho ditshebeletsong tsohle tse thathamisitsweng ka hodimo"
+" mona."
+
+msgid "Remember my choice"
+msgstr "Hopola kgetho ya ka"
+
+msgid ""
+"You accessed the SingleLogoutService interface, but did not provide a "
+"SAML LogoutRequest or LogoutResponse. Please note that this endpoint is "
+"not intended to be accessed directly."
+msgstr ""
+"O fihletse tshebeletsano ya SingleLogoutService, empa ha o a fana ka SAML"
+" LogoutRequest kapa LogoutResponse. Ka kopo lemoha hore ntlha ena ya "
+"bofelo ha e a rerelwa ho fihlellwa ka kotloloho."
+
+msgid "{errors:title_NOTSET}"
+msgstr "Phasewete ha e a setwa"
+
+msgid "{errors:report_explain}"
+msgstr "Hlalosa seo o se entseng ha phoso ena e ne e hlaha..."
+
+msgid ""
+"If you report this error, please also report this tracking number which "
+"makes it possible to locate your session in the logs available to the "
+"system administrator:"
+msgstr ""
+"Haeba o tlaleha phoso ena, ka kopo tlaleha hape nomoro ena ya ho sala "
+"morao e kgonahatsang hore o fumane seshene ya hao ho di-log ts "
+"efumanehang ho sistimi ya motsamaisi:"
+
+msgid "{logout:logout_all}"
+msgstr "E, ditshebeletso tsohle"
+
+msgid "{login:error_wrongpassword}"
+msgstr "Lebitso la mosebedisi kapa phasewete e fosahetse."
+
+msgid "SAML Subject"
+msgstr "Taba ya SAML"
+
+msgid "{logout:failedsps}"
+msgstr ""
+"Ha e kgone ho tswa tshebeletsong e le nngwe kapa ho feta. Ho netefatsa "
+"hore diseshene tsohle tsa hao di kwetswe, o kgothaletswa ho <i>kwala "
+"sebadi sa webo sa hao</i>."
+
+msgid "Completed"
+msgstr "E phethilwe"
+
+msgid "No RelayState"
+msgstr "Ha ho RelayState"
+
+msgid "Explain what you did when this error occurred..."
+msgstr "Hlalosa seo o se entseng ha phoso ena e ne e hlaha..."
+
+msgid ""
+"A service has requested you to authenticate yourself. Please enter your "
+"username and password in the form below."
+msgstr ""
+"Tshebeletso  e kopile hore o inetefatse. Ka kopo kenya lebitso la "
+"mosebedisi le phasewete ya hao foromong e ka tlase mona."
+
+msgid "{login:user_pass_header}"
+msgstr "Kenya lebitso la mosebedisi le phasewete"
+
+msgid ""
+"Either no user with the given username could be found, or the password "
+"you gave was wrong. Please check the username and try again."
+msgstr ""
+"Ekaba mosebedisi wa lebitso la mosebedisi le fanweng ha a fumanwe, kapa "
+"phasewete eo o e fananeng e fosahetse. Ka kopo hlahloba lebitso la "
+"mosebedisi la hao, ebe o leka hape."
+
+msgid "Change your home organization"
+msgstr "Fetola khampani ya lehae ya heno"
+
+msgid "Processing..."
+msgstr "E a sebetsa..."
+
+msgid "Metadata not found"
+msgstr "Metadata ha e a fumanwa"
+
+#, python-format
+msgid "Unable to locate metadata for %ENTITYID%"
+msgstr "Ha e kgone ho fumana metadata bakeng sa %ID YA SETHEO%"
+
+msgid "{status:some_error_occurred}"
+msgstr "Ho na le phoso e etsahetseng"
+
+msgid "{errors:debuginfo_text}"
+msgstr ""
+"Tlhahisoleseding ya debug e ka tlase mona e  ka nna ya kgahla motsamaisi "
+"/ deske ya thuso:"
+
+msgid "CAS Error"
+msgstr "Phoso ya CAS"
+
+msgid "The given page was not found. The reason was: %REASON%  The URL was: %URL%"
+msgstr ""
+"Leqephe le fanweng ha le a fumanwa. Lebaka e bile: %LEBAKA%  URL e bile: "
+"%URL%"
+
+msgid "Authentication failed: the certificate your browser sent is unknown"
+msgstr ""
+"Netefatso e hlolehile: setifikeiti se rometsweng ke sebadi sa hao ha se "
+"tsejwe"
+
+msgid ""
+"You sent something to the login page, but for some reason the password "
+"was not sent. Try again please."
+msgstr ""
+"o Rometse se seng leqepheng la ho kena, empa ka lebaka le sa tsejweng "
+"phaewete ha e a romelwa. Ka kopo leka hape."
+
+msgid "{errors:descr_CONFIG}"
+msgstr "SimpleSAMLphp e bonahala e hlophisitswe hampe."
+
+msgid "Page not found"
+msgstr "Leqephe ha le a fumanwa"
+
+msgid "{logout:logged_out_text}"
+msgstr "O ntshitswe."
+
+msgid "Error loading metadata"
+msgstr "Phoso ya ho louta metadata"
+
+msgid "{disco:selectidp}"
+msgstr "Kgetha mofani wa boitsebiso wa hao"
+
+msgid ""
+"This Identity Provider received an Authentication Request from a Service "
+"Provider, but an error occurred when trying to process the request."
+msgstr ""
+"Mofani enwa wa Boitsebiso o fumane Kopo ya Netefatso ho tswa ho Mofani wa"
+" Tshebeletso, empa ho bile le phoso ha ho leka ho fihlellwa kopo."
+
+msgid "{errors:descr_LDAPERROR}"
+msgstr ""
+"LDAP ke dathabeise ya mosebedisi, mme ha o leka ho kena, re hloka ho "
+"ikopanya le dathabeise ya LDAP. Phoso e hlahile ha re e leka lekgelong "
+"lena."
+
+msgid "{status:attributes_header}"
+msgstr "Makgabane a hao"
+
+msgid "{errors:report_email}"
+msgstr "Aterese ya imeile:"
+
+msgid ""
+"The parameters sent to the discovery service were not according to "
+"specifications."
+msgstr ""
+"Dipharamitha tse rometsweng tshebeltsong ya tshibollo di ne di se ho "
+"latela ditekanyetso."
+
+msgid "Remember my username"
+msgstr "Hopola lebitso la ka la mosebedisi"
+
+msgid ""
+"When this identity provider tried to create an authentication response, "
+"an error occurred."
+msgstr ""
+"Ha mofani enwa wa boitsebiso a leka ho theha karabelo ya netefatso, phoso"
+" e bile teng."
+
+msgid "{errors:title_METADATA}"
+msgstr "Phoso ya ho louta metadata"
+
+msgid "{errors:descr_NOTFOUND}"
+msgstr "Leqephe le fanweng ha le a fumanwa. URL e bile: %URL%"
+
+msgid "{errors:title_NOTFOUNDREASON}"
+msgstr "Leqephe ha le a fumanwa"
+
+msgid "{disco:select}"
+msgstr "Kgetha"
+
+msgid "{errors:descr_NOACCESS}"
+msgstr ""
+"Ntlha ya bofelo ha e a bulelwa. Hlahloba dikgetho tse tlhophisong ya hao "
+"ya SimpleSAMLphp."
+
+msgid "An error occurred when trying to create the SAML request."
+msgstr "Phoso e hlahile ha o leka ho theha kopo ya SAML."
+
+msgid "Yes, all services"
+msgstr "E, ditshebeletso tsohle"
+
+msgid "SimpleSAMLphp appears to be misconfigured."
+msgstr "SimpleSAMLphp e bonahala e hlophisitswe hampe."
+
+msgid "{errors:descr_NOCERT}"
+msgstr "Netefatso e hlolehile: sebadi sa hao ha se a romela setifikeiti sa letho"
+
+msgid "Password not set"
+msgstr "Phasewete ha e a setwa"
+
+msgid "Authentication aborted"
+msgstr "Netefatso e kgaoditswe"
+
+msgid "The authentication was aborted by the user"
+msgstr "Netefatso e kgaoditswe ke mosebedisi"
+
+msgid "Error processing response from Identity Provider"
+msgstr "Phoso ho sebetseng karabelo ho tswa ho Mofani wa Boitsebiso"
+
+msgid "{errors:report_submit}"
+msgstr "Romela tlaleho ya phoso"
+
+msgid "{errors:title_LDAPERROR}"
+msgstr "Phoso ya LDAP"
+
+msgid "{logout:progress}"
+msgstr "E a tswa..."
+
+msgid "Report errors"
+msgstr "Tlaleha diphoso"
+
+msgid "Login"
+msgstr "Ho kena"
+
+msgid "{errors:descr_USERABORTED}"
+msgstr "Netefatso e kgaoditswe ke mosebedisi"
+
+msgid "{logout:no}"
+msgstr "Tjhe"
+
+msgid "{disco:selectidp_full}"
+msgstr "Ka kopo kgetha mofani wa boitsebiso moo o batlang ho netefatsa:"
+
+msgid "{errors:descr_AUTHSOURCEERROR}"
+msgstr "Phoso ya tiiso mohloding %AUTHSOURCE%. Lebaka e bile: %REASON%"
+
+msgid "You did not present a valid certificate."
+msgstr "Ha o a fana ka setifikeiti se nepahetseng."
+
+msgid "Please select the identity provider where you want to authenticate:"
+msgstr "Ka kopo kgetha mofani wa boitsebiso moo o batlang ho netefatsa:"
+
+msgid "On hold"
+msgstr "Tshwarisitswe"
+
+msgid "An unhandled exception was thrown."
+msgstr "Kgeloho e sa rarollwang e lahlilwe."
+
+msgid "{login:remember_me}"
+msgstr "Nkgopole"
+
+msgid "No SAML message provided"
+msgstr "Ha ho molaetsa wa SAML o fanweng"
+
+msgid "{errors:title_INVALIDCERT}"
+msgstr "Setifikeiti se sa nepahalang"
+
+msgid "AuthData"
+msgstr "AuthData"
+
+msgid ""
+"Unable to log out of one or more services. To ensure that all your "
+"sessions are closed, you are encouraged to <i>close your webbrowser</i>."
+msgstr ""
+"Ha e kgone ho tswa tshebeletsong e le nngwe kapa ho feta. Ho netefatsa "
+"hore diseshene tsohle tsa hao di kwetswe, o kgothaletswa ho <i>kwala "
+"sebadi sa webo sa hao</i>."
+
+msgid "{login:user_pass_text}"
+msgstr ""
+"Tshebeletso  e kopile hore o inetefatse. Ka kopo kenya lebitso la "
+"mosebedisi le phasewete ya hao foromong e ka tlase mona."
+
+msgid "No"
+msgstr "Tjhe"
+
+msgid ""
+"LDAP is the user database, and when you try to login, we need to contact "
+"an LDAP database. An error occurred when we tried it this time."
+msgstr ""
+"LDAP ke dathabeise ya mosebedisi, mme ha o leka ho kena, re hloka ho "
+"ikopanya le dathabeise ya LDAP. Phoso e hlahile ha re e leka lekgelong "
+"lena."
+
+msgid "{status:intro}"
+msgstr ""
+"Dumela, lena ke leqephe la boemo la SimpleSAMLphp. Mona o ka bona hore na"
+" seshene ya hao e feletswe ke nako na, hore e nka nako e kae hore e "
+"fellwe ke nako le makgabane ohle a hoketsweng sesheneng ya hao."
+
+msgid "Logging out of the following services:"
+msgstr "E tswa ditshebeletsong tse latelang:"
+
+msgid "{status:subject_header}"
+msgstr "Taba ya SAML"
+
+msgid "{errors:title_GENERATEAUTHNRESPONSE}"
+msgstr "Ha e a kgona ho theha karabelo ya ntefatso"
+
+msgid "{errors:title_NOACCESS}"
+msgstr "Ha ho phihlello"
+
+msgid "{errors:title_NOCERT}"
+msgstr "Ha ho setifikeiti"
+
+msgid "{disco:remember}"
+msgstr "Hopola kgetho ya ka"
+
+msgid "{logout:completed}"
+msgstr "E phethilwe"
+
+msgid ""
+"This endpoint is not enabled. Check the enable options in your "
+"configuration of SimpleSAMLphp."
+msgstr ""
+"Ntlha ya bofelo ha e a bulelwa. Hlahloba dikgetho tse tlhophisong ya hao "
+"ya SimpleSAMLphp."
+
+msgid "{login:error_nopassword}"
+msgstr ""
+"o Rometse se seng leqepheng la ho kena, empa ka lebaka le sa tsejweng "
+"phaewete ha e a romelwa. Ka kopo leka hape."
+
+msgid "{status:header_shib}"
+msgstr "Pontsho ya Shibboleth"
+
+msgid "Session size: %SIZE%"
+msgstr "Saese ya seshene: %SIZE%"
+
+msgid ""
+"Hi, this is the status page of SimpleSAMLphp. Here you can see if your "
+"session is timed out, how long it lasts until it times out and all the "
+"attributes that are attached to your session."
+msgstr ""
+"Dumela, lena ke leqephe la boemo la SimpleSAMLphp. Mona o ka bona hore na"
+" seshene ya hao e feletswe ke nako na, hore e nka nako e kae hore e "
+"fellwe ke nako le makgabane ohle a hoketsweng sesheneng ya hao."
+
+msgid "{general:no}"
+msgstr "Tjhe"
+
+msgid "{errors:title_NOTFOUND}"
+msgstr "Leqephe ha le a fumanwa"
+
+msgid ""
+"You accessed the Single Sign On Service interface, but did not provide a "
+"SAML Authentication Request. Please note that this endpoint is not "
+"intended to be accessed directly."
+msgstr ""
+"O fihletse tshebeletsano ya Tshaeno ya Hang, empa ha o a fan aka Kopo ya "
+"Netefatso ya SAML. Ka kopo lemoha hore ntlha ena ya bofelo ha e a rerelwa"
+" ho fihlellwa ka kotloloho."
+
+msgid "LDAP Error"
+msgstr "Phoso ya LDAP"
+
+msgid "You are now successfully logged out from %SP%."
+msgstr "Jwale o ntshitswe ka katleho ho %SP%."
+
+msgid "Error creating request"
+msgstr "Phoso ho thehweng ha kopo"
+
+msgid "We did not accept the response sent from the Identity Provider."
+msgstr "Ha re a amohela karabelo ho tswa ho Mofani wa Boitsebiso."
+
+msgid ""
+"You have chosen <b>%HOMEORG%</b> as your home organization. If this is "
+"wrong you may choose another one."
+msgstr ""
+"O kgethile <b>%HOMEORG%</b> jwalo ka khampani ya lehae ya heno. Haeba "
+"sena se fosahetse o ka kgetha e nngwe hape."
+
+msgid "{logout:logout_only}"
+msgstr "Tjhe, %SP% feela"
+
+msgid "There is an error in the request to this page. The reason was: %REASON%"
+msgstr "Ho na le phoso kopong e leqepheng lena. Lebaka e bile: %REASON%"
+
+msgid "{status:authData_header}"
+msgstr "AuthData"
+
+msgid "{errors:descr_WRONGUSERPASS}"
+msgstr ""
+"Ekaba mosebedisi wa lebitso la mosebedisi le fanweng ha a fumanwe, kapa "
+"phasewete eo o e fananeng e fosahetse. Ka kopo hlahloba lebitso la "
+"mosebedisi la hao, ebe o leka hape."
+
+msgid "Unknown certificate"
+msgstr "Setifikeiti se sa tsejweng"
+
+msgid "SimpleSAMLphp Diagnostics"
+msgstr "Dimanollo tsa SimpleSAMLphp"
+
+msgid "{login:help_header}"
+msgstr "Thuso! Ha ke hopole phasewete ya ka."
+
+msgid "Incorrect username or password."
+msgstr "Lebitso la mosebedisi kapa phasewete e fosahetse."
+
+msgid "{errors:descr_NOTSET}"
+msgstr ""
+"Phasewete ya tlhophiso (auth.adminpassword) ha e a fetolwa ho tswa palong"
+" ya tlwaelo. Ka kopo edita faele ya tlhophiso."
+
+msgid "{login:next}"
+msgstr "E latelang"
+
+msgid "Shibboleth demo"
+msgstr "Pontsho ya Shibboleth"
+
+msgid "{logout:incapablesps}"
+msgstr ""
+"E le nngwe kapa ho feta ya ditshebeletso tseo o keneng ho tsona <i>ha e "
+"tshehetse ho tswa</i>. Ho netefatsa hore diseshene tsohle tsa hao di "
+"kwetswe, o kgothaletswa ho <i>kwala sebadi sa webo sa hao</i>."
+
+msgid "{status:subject_notset}"
+msgstr "ha e a setwa"
+
+msgid "{disco:login_at}"
+msgstr "Kena ho"
+
+msgid "Could not create authentication response"
+msgstr "Ha e a kgona ho theha karabelo ya ntefatso"
+
+msgid "Some error occurred"
+msgstr "Ho na le phoso e etsahetseng"
+
+msgid ""
+"You accessed the Artifact Resolution Service interface, but did not "
+"provide a SAML ArtifactResolve message. Please note that this endpoint is"
+" not intended to be accessed directly."
+msgstr ""
+"O fihletse kopano ya Tshebeletso ya Tlhakiso ya Athifekte, empa ha o a "
+"fana ka molaetsa wa SAML ArtifactResolve. Ka kopo lemoha hore ntlha ena "
+"ya bofelo ha e a rerelwa ho fihlellwa ka kotloloho."
+
+msgid "{errors:title_CASERROR}"
+msgstr "Phoso ya CAS"
+
+msgid "SimpleSAMLphp error"
+msgstr "Phoso ya SimpleSAMLphp"
+
+msgid "{errors:errorreport_text}"
+msgstr "Tlaleho ya phoso e rometswe ho batsamaisi."
+
+msgid "{errors:title_NOSTATE}"
+msgstr "Tlhahisoleseding ya provense e lahlehile"
+
+msgid "{errors:descr_CASERROR}"
+msgstr "Phoso e bile teng ka seva ya CAS."
+
+msgid "{errors:descr_ACSPARAMS}"
+msgstr ""
+"O fihletse kopano ya Tiiso ya Tshebeletso ya Bareki, empa ha o a fana ka "
+"Karabelo ya Netefatso ya SAML. Ka kopo lemoha hore ntlha ena ya bofelo ha"
+" e a rerelwa ho fihlellwa ka kotloloho."
+
+msgid "Service Provider"
+msgstr "Mofani wa Tshebeletso"
+
+msgid "{login:error_header}"
+msgstr "Phoso"
+
+msgid ""
+"Without your username and password you cannot authenticate yourself for "
+"access to the service. There may be someone that can help you. Consult "
+"the help desk at your organization!"
+msgstr ""
+"Ntle le lebitso l ahao la mosebedisi le phasewete o ke ke wa inetefatsa "
+"bakeng sa phihlello ho tshebeletso. Ho ka nna ha ba le motho ya ka o "
+"thusang. Ikopanye le ba deske ya thuso khampaning ya heno!"
+
+msgid "{login:password}"
+msgstr "Phasewete"
+
+msgid "not set"
+msgstr "ha e a setwa"
+
+msgid ""
+"The information about the current logout operation has been lost. You "
+"should return to the service you were trying to log out from and try to "
+"log out again. This error can be caused by the logout information "
+"expiring. The logout information is stored for a limited amout of time - "
+"usually a number of hours. This is longer than any normal logout "
+"operation should take, so this error may indicate some other error with "
+"the configuration. If the problem persists, contact your service "
+"provider."
+msgstr ""
+"Tlhahisoleseding e mabapi le tshebetos ya ho tswa ya hajwale e lahlehile."
+" O tlameha ho kgutlela tshebeletsong eo o neng o leka ho tswa ho yona le "
+"ho leka ho tswa hape. Phoso ena e ka bakwa ke phelo nako ya "
+"tlhahisoleseding ya ho tswa. Tlhahisoleseding ya ho tswa e bolokwa nako e"
+" lekantsweng - ka tlwaelo ke palo ya dihora. Sena se setelele ho feta "
+"nako eo tshebetso efe kapa efe ya tlwaelo ya ho tswa e tlamehang ho e "
+"nka, ka hona phoso ena e ka nna ya bontsha phoso e nngwe ka tlhophiso "
+"esele. Haeba bothata bo phehella, ikopanye le mofani wa tshebeletso wa "
+"hao."
+
+msgid "{general:yes_continue}"
+msgstr "E, tswela pele"
+
+msgid "{login:help_text}"
+msgstr ""
+"Ntle le lebitso l ahao la mosebedisi le phasewete o ke ke wa inetefatsa "
+"bakeng sa phihlello ho tshebeletso. Ho ka nna ha ba le motho ya ka o "
+"thusang. Ikopanye le ba deske ya thuso khampaning ya heno!"
+
+msgid "Next"
+msgstr "E latelang"
+
+msgid "Your attributes"
+msgstr "Makgabane a hao"
+
+msgid "{login:help_desk_link}"
+msgstr "Leqephe la lapeng la ba deske ya thuso"
+
+msgid "Logout failed"
+msgstr "Ho tswa ho hlolehile"
+
+msgid "You have been logged out."
+msgstr "O ntshitswe."
+
+msgid ""
+"There is some misconfiguration of your SimpleSAMLphp installation. If you"
+" are the administrator of this service, you should make sure your "
+"metadata configuration is correctly setup."
+msgstr ""
+"Ho na le tlhophiso e fosahetseng ya kenyo ya ho instola SimpleSAMLphp ya "
+"hao. Haeba o motsamaisi wa tshebeletso ena, o tlameha ho etsa bonnete ba "
+"hore tlhophiso ya metadata ya hao e setilwe ka nepo."
+
+msgid "Authentication failed: your browser did not send any certificate"
+msgstr "Netefatso e hlolehile: sebadi sa hao ha se a romela setifikeiti sa letho"
+
+msgid "Send e-mail to help desk"
+msgstr "Romela imeile ho ba deske ya thuso"
+
+msgid "{errors:descr_BADREQUEST}"
+msgstr "Ho na le phoso kopong e leqepheng lena. Lebaka e bile: %REASON%"
+
+msgid "How to get help"
+msgstr "Ka moo o ka fumanang thuso"
+
+msgid "Choose your home organization"
+msgstr "Kgetha khampani ya lehae ya hao"
+
+msgid "Go back to SimpleSAMLphp installation page"
+msgstr "Kgutlela leqepheng la ho instola la SimpleSAMLphp"
+
+msgid "{errors:title_NOTVALIDCERT}"
+msgstr "Setifikeiti se sa tshwaneleheng"
+
+msgid "Cannot retrieve session data"
+msgstr "Ha e a kgona ho fumana datha ya seshene"
+
+msgid "{disco:icon_prefered_idp}"
+msgstr "[Kgetho e kgethwang]"
+
+msgid "{login:login_button}"
+msgstr "Ho kena"
+
+msgid "Do you want to logout from all the services above?"
+msgstr "Na o batla ho tswa ditshebeletsong tsohle tse ka hodimo moo?"
+
+msgid "{errors:descr_UNHANDLEDEXCEPTION}"
+msgstr "Kgeloho e sa rarollwang e lahlilwe."
+
+msgid "{errors:descr_DISCOPARAMS}"
+msgstr ""
+"Dipharamitha tse rometsweng tshebeltsong ya tshibollo di ne di se ho "
+"latela ditekanyetso."
+
+msgid "{errors:descr_MEMCACHEDOWN}"
+msgstr ""
+"Datha ya seshene ya hao ha e kgone ho fumanwa hona jwale ka lebaka la "
+"mathata a sethekeniki. Ka kopo leka hape kamora metsotso e mmalwa."
+
+msgid "Error received from Identity Provider"
+msgstr "Phoso e amohetswe ho tswa ho Mofani wa Boitsebiso"
+
+msgid "Configuration error"
+msgstr "Phoso ya Netefatso"
+
+msgid "Send error report"
+msgstr "Romela tlaleho ya phoso"
+
+msgid "Logout information lost"
+msgstr "Tlhahisoleseding ya ho tswa e lahlehile"
+
+msgid "{status:header_diagnostics}"
+msgstr "Dimanollo tsa SimpleSAMLphp"
+
+msgid "{errors:report_trackid}"
+msgstr ""
+"Haeba o tlaleha phoso ena, ka kopo tlaleha hape nomoro ena ya ho sala "
+"morao e kgonahatsang hore o fumane seshene ya hao ho di-log ts "
+"efumanehang ho sistimi ya motsamaisi:"
+
+msgid "Bad request received"
+msgstr "Kopo e mpe e amohetswe"
+
+msgid "{errors:descr_PROCESSAUTHNREQUEST}"
+msgstr ""
+"Mofani enwa wa Boitsebiso o fumane Kopo ya Netefatso ho tswa ho Mofani wa"
+" Tshebeletso, empa ho bile le phoso ha ho leka ho fihlellwa kopo."
+
+msgid "State information lost"
+msgstr "Tlhahisoleseding ya provense e lahlehile"
+
+msgid "The given page was not found. The URL was: %URL%"
+msgstr "Leqephe le fanweng ha le a fumanwa. URL e bile: %URL%"
+
+msgid "{errors:descr_RESPONSESTATUSNOSUCCESS}"
+msgstr ""
+"Mofani wa Boitsebiso o arabetse ka phoso. (Khoutu ya boemo Karabelong ya "
+"SAML ha e a atleha)"
+
+msgid "{login:change_home_org_button}"
+msgstr "Kgetha khampani ya lehae"
+
+msgid "SAML 2.0 SP Demo Example"
+msgstr "Mohlala wa Pontsho wa SAML 2.0 SP"
+
+msgid "{logout:also_from}"
+msgstr "Hape o kene ditshebeletsong tsena:"
+
+msgid "{errors:howto_text}"
+msgstr ""
+"Mohlomong phoso ena e ka lebaka la boitshwaro bo itseng bo sa lebellwang "
+"kapa tlhophiso e fosahetseng ya SimpleSAMLphp. Ikopanye le motsamaisi wa "
+"tshebeletso ena ya ho kena, ebe o romela molaetsa wa phoso ka hodimo "
+"mona."
+
+msgid "You are also logged in on these services:"
+msgstr "Hape o kene ditshebeletsong tsena:"
+
+msgid "No certificate"
+msgstr "Ha ho setifikeiti"
+
+msgid ""
+"This error probably is due to some unexpected behaviour or to "
+"misconfiguration of SimpleSAMLphp. Contact the administrator of this "
+"login service, and send them the error message above."
+msgstr ""
+"Mohlomong phoso ena e ka lebaka la boitshwaro bo itseng bo sa lebellwang "
+"kapa tlhophiso e fosahetseng ya SimpleSAMLphp. Ikopanye le motsamaisi wa "
+"tshebeletso ena ya ho kena, ebe o romela molaetsa wa phoso ka hodimo "
+"mona."
+
+msgid "{errors:errorreport_header}"
+msgstr "Tlaleho ya phoso e rometswe"
+
+msgid "Logged out"
+msgstr "O ntshitswe"
+
+msgid "{login:remember_username}"
+msgstr "Hopola lebitso la ka la mosebedisi"
+
+msgid "No SAML request provided"
+msgstr "Ha ho kopo ya SAML e fanweng"
+
+msgid "{errors:title_USERABORTED}"
+msgstr "Netefatso e kgaoditswe"
+
+msgid "{errors:title_PROCESSASSERTION}"
+msgstr "Phoso ho sebetseng karabelo ho tswa ho Mofani wa Boitsebiso"
+
+msgid "Enter your username and password"
+msgstr "Kenya lebitso la mosebedisi le phasewete"
+
+msgid "[Preferred choice]"
+msgstr "[Kgetho e kgethwang]"
+
+msgid "{status:header_saml20_sp}"
+msgstr "Mohlala wa Pontsho wa SAML 2.0 SP"
+
+msgid "{logout:loggedoutfrom}"
+msgstr "Jwale o ntshitswe ka katleho ho %SP%."
+
+msgid "{status:sessionsize}"
+msgstr "Saese ya seshene: %SIZE%"
+
+msgid "{status:validfor}"
+msgstr ""
+"Seshene ya hao e na le matla feela bakeng sa metsotswana e %SECONDS% ho "
+"tloha hona jwale."
+
+msgid "Help desk homepage"
+msgstr "Leqephe la lapeng la ba deske ya thuso"
+
+msgid "{login:username}"
+msgstr "Lebitso la mosebedisi"
+
+msgid "{errors:descr_NOTFOUNDREASON}"
+msgstr ""
+"Leqephe le fanweng ha le a fumanwa. Lebaka e bile: %LEBAKA%  URL e bile: "
+"%URL%"
+
+msgid "{errors:error_header}"
+msgstr "Phoso ya SimpleSAMLphp"
+
+msgid ""
+"The password in the configuration (auth.adminpassword) is not changed "
+"from the default value. Please edit the configuration file."
+msgstr ""
+"Phasewete ya tlhophiso (auth.adminpassword) ha e a fetolwa ho tswa palong"
+" ya tlwaelo. Ka kopo edita faele ya tlhophiso."
+
+msgid "Error processing request from Service Provider"
+msgstr "Phoso ho sebetseng kopo ho tswa ho Mofani wa Tshebeletso"
+
+msgid "Login at"
+msgstr "Kena ho"
+
+msgid ""
+"The debug information below may be of interest to the administrator / "
+"help desk:"
+msgstr ""
+"Tlhahisoleseding ya debug e ka tlase mona e  ka nna ya kgahla motsamaisi "
+"/ deske ya thuso:"
+
+msgid ""
+"Authentication failed: the certificate your browser sent is invalid or "
+"cannot be read"
+msgstr ""
+"Netefatso e hlolehile: setifikeiti seo sebadi sa hao se se rometseng ha "
+"se a nepahala kapa ha se balehe"
+
+msgid "{errors:descr_INVALIDCERT}"
+msgstr ""
+"Netefatso e hlolehile: setifikeiti seo sebadi sa hao se se rometseng ha "
+"se a nepahala kapa ha se balehe"
+
+msgid "No, only %SP%"
+msgstr "Tjhe, %SP% feela"
+
+msgid "Invalid certificate"
+msgstr "Setifikeiti se sa nepahalang"
+
+msgid "Logging out..."
+msgstr "E a tswa..."
+
+msgid "Error processing the Logout Request"
+msgstr "Phoso ho sebetseng Kopo ya Ho Tswa"
+
+msgid ""
+"The initiator of this request did not provide a RelayState parameter "
+"indicating where to go next."
+msgstr ""
+"Moqadi wa kopo ena ha a fana pharamitha ya RelayState e bontshang hore ho"
+" uwe kae ho tloha mona."
+
+msgid "Remember me"
+msgstr "Nkgopole"
+
+msgid "{errors:descr_LOGOUTINFOLOST}"
+msgstr ""
+"Tlhahisoleseding e mabapi le tshebetos ya ho tswa ya hajwale e lahlehile."
+" O tlameha ho kgutlela tshebeletsong eo o neng o leka ho tswa ho yona le "
+"ho leka ho tswa hape. Phoso ena e ka bakwa ke phelo nako ya "
+"tlhahisoleseding ya ho tswa. Tlhahisoleseding ya ho tswa e bolokwa nako e"
+" lekantsweng - ka tlwaelo ke palo ya dihora. Sena se setelele ho feta "
+"nako eo tshebetso efe kapa efe ya tlwaelo ya ho tswa e tlamehang ho e "
+"nka, ka hona phoso ena e ka nna ya bontsha phoso e nngwe ka tlhophiso "
+"esele. Haeba bothata bo phehella, ikopanye le mofani wa tshebeletso wa "
+"hao."
+
+msgid "{errors:descr_NOTVALIDCERT}"
+msgstr "Ha o a fana ka setifikeiti se nepahetseng."
+
+msgid "State information lost, and no way to restart the request"
+msgstr ""
+"Tlhahisoleeding ya porofensi e lahlehile, mmeha ho tsela ya ho qala kopo "
+"botjha"
+
+msgid "Error report sent"
+msgstr "Tlaleho ya phoso e rometswe"
+
+msgid "Select your identity provider"
+msgstr "Kgetha mofani wa boitsebiso wa hao"
+
+msgid ""
+"Your session data cannot be retrieved right now due to technical "
+"difficulties. Please try again in a few minutes."
+msgstr ""
+"Datha ya seshene ya hao ha e kgone ho fumanwa hona jwale ka lebaka la "
+"mathata a sethekeniki. Ka kopo leka hape kamora metsotso e mmalwa."
+
+msgid "{errors:descr_NORELAYSTATE}"
+msgstr ""
+"Moqadi wa kopo ena ha a fana pharamitha ya RelayState e bontshang hore ho"
+" uwe kae ho tloha mona."
+
+msgid "{errors:descr_LOGOUTREQUEST}"
+msgstr "Phoso e hlahile ha e leka ho sebetsa Kopo ya Ho Tswa."
+
+msgid "{errors:title_LOGOUTREQUEST}"
+msgstr "Phoso ho sebetseng Kopo ya Ho Tswa"
+
+#, python-format
+msgid "Your session is valid for %SECONDS% seconds from now."
+msgstr ""
+"Seshene ya hao e na le matla feela bakeng sa metsotswana e %SECONDS% ho "
+"tloha hona jwale."
+
+msgid "{errors:title_LOGOUTINFOLOST}"
+msgstr "Tlhahisoleseding ya ho tswa e lahlehile"
+
+msgid "You have previously chosen to authenticate at"
+msgstr "O qadile ka ho kgetha netefatso ho"
+
+msgid "{login:change_home_org_text}"
+msgstr ""
+"O kgethile <b>%HOMEORG%</b> jwalo ka khampani ya lehae ya heno. Haeba "
+"sena se fosahetse o ka kgetha e nngwe hape."
+
+msgid "Choose home organization"
+msgstr "Kgetha khampani ya lehae"
+
+msgid "Error"
+msgstr "Phoso"
+
+msgid "{errors:descr_METADATANOTFOUND}"
+msgstr "Ha e kgone ho fumana metadata bakeng sa %ID YA SETHEO%"
+
+msgid "{errors:title_METADATANOTFOUND}"
+msgstr "Metadata ha e a fumanwa"
+
+msgid "{logout:return}"
+msgstr "E kgutlela tshebeletsong"
+
+msgid "{errors:descr_CREATEREQUEST}"
+msgstr "Phoso e hlahile ha o leka ho theha kopo ya SAML."
+
+msgid "Unhandled exception"
+msgstr "Mokgelo o sa rarollwang"
+
+msgid "{status:authData_summary}"
+msgstr "Tlelika ho sheba AuthData"
+
+msgid "No SAML response provided"
+msgstr "Ha ho karabelo ya SAML e fanweng"
+
+msgid "Click to view AuthData"
+msgstr "Tlelika ho sheba AuthData"
+
+msgid "{logout:default_link_text}"
+msgstr "Kgutlela leqepheng la ho instola la SimpleSAMLphp"
+
+msgid "Logout"
+msgstr "Ho tswa"
+
+msgid ""
+"Optionally enter your email address, for the administrators to be able "
+"contact you for further questions about your issue:"
+msgstr ""
+"Ka boikgethelo o ka kenya aterse ya imeile ya hao, bakeng sa batsamaisi "
+"hore ba kgone ho ikopanya le wena mabapi le dipotso tse ding ka ditaba "
+"tsa hao:"
+
+msgid "{general:remember}"
+msgstr "Hopola"
+
+msgid "An error occurred when trying to process the Logout Request."
+msgstr "Phoso e hlahile ha e leka ho sebetsa Kopo ya Ho Tswa."
+
+msgid "{errors:descr_METADATA}"
+msgstr ""
+"Ho na le tlhophiso e fosahetseng ya kenyo ya ho instola SimpleSAMLphp ya "
+"hao. Haeba o motsamaisi wa tshebeletso ena, o tlameha ho etsa bonnete ba "
+"hore tlhophiso ya metadata ya hao e setilwe ka nepo."
+
+msgid "Yes, continue"
+msgstr "E"
+
+msgid "{errors:descr_NOSTATE}"
+msgstr ""
+"Tlhahisoleeding ya porofensi e lahlehile, mmeha ho tsela ya ho qala kopo "
+"botjha"
+
+msgid "Username"
+msgstr "Lebitso la mosebedisi"
+
+msgid "{login:select_home_org}"
+msgstr "Kgetha khampani ya lehae ya hao"
+
+msgid "Error when communicating with the CAS server."
+msgstr "Phoso e bile teng ka seva ya CAS."
+
+msgid "No, cancel"
+msgstr "Tjhe"
+
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/xh/LC_MESSAGES/messages.po b/vendor/simplesamlphp/simplesamlphp/locales/xh/LC_MESSAGES/messages.po
index eb159b6de2a9a00e9f4ad692f4f1b9c10889ae78..72dd81286deccc250a30dab1c5cf4fb3e06d8dd0 100644
--- a/vendor/simplesamlphp/simplesamlphp/locales/xh/LC_MESSAGES/messages.po
+++ b/vendor/simplesamlphp/simplesamlphp/locales/xh/LC_MESSAGES/messages.po
@@ -35,7 +35,7 @@ msgstr ""
 msgid "{errors:descr_NOSTATE}"
 msgstr "Inkcazelo yobume ilahlekile, yaye akukho ndlela yokuqalisa isicelo"
 
-msgid "{errors:title_SSOPARAMS}"
+msgid "No SAML request provided"
 msgstr "Akukho sicelo se-SAML sinikelweyo"
 
 msgid "{errors:descr_CASERROR}"
@@ -207,7 +207,10 @@ msgstr "Hayi, rhoxisa"
 msgid "{status:header_diagnostics}"
 msgstr "Uhlalutyo lwe-SimpleSAMLphp"
 
-msgid "{errors:descr_SSOPARAMS}"
+msgid ""
+"You accessed the Single Sign On Service interface, but did not provide a "
+"SAML Authentication Request. Please note that this endpoint is not "
+"intended to be accessed directly."
 msgstr ""
 "Ufikelele i-intafeyisi ye-Single Sign On Service, kodwa awukhange unikele"
 " iMpendulo Yongqinisiso ye-SAML. Nceda uqaphele ukuba le ndawo yokuphela "
@@ -396,9 +399,6 @@ msgstr ""
 "Uye wakhetha u-<b>%HOMEORG%</b> njengombutho wakho wekhaya. Ukuba oku "
 "akuchanekanga usenokukhetha omnye."
 
-msgid "{login:processing}"
-msgstr "Iyaprosesa..."
-
 msgid "{logout:default_link_text}"
 msgstr "Buyela emva kwikhasi lofakelo le-SimpleSAMLphp"
 
@@ -458,13 +458,16 @@ msgstr ""
 "Ungqinisiso lusilele: ibhrawuza yakho ayithumelanga nasiphi na "
 "isatifikethi"
 
-msgid "{errors:descr_ARSPARAMS}"
+msgid ""
+"You accessed the Artifact Resolution Service interface, but did not "
+"provide a SAML ArtifactResolve message. Please note that this endpoint is"
+" not intended to be accessed directly."
 msgstr ""
 "Ufikelele i-intafeyisi ye-Artifact Resolution Service, kodwa awukhange "
 "unikrele umyalezo we-SAML ArtifactResolve. Nceda uqaphele ukuba le ndawo "
 "yokuphela ayilungiselelwanga ukuba ifikelelwe ngokuthe ngqo."
 
-msgid "{errors:title_MEMCACHEDOWN}"
+msgid "Cannot retrieve session data"
 msgstr "Ayikwazi ukubuyisela ingcombolo yeseshoni"
 
 msgid "{status:some_error_occurred}"
@@ -473,7 +476,7 @@ msgstr "Kwenzeke impazamo ethile"
 msgid "{errors:errorreport_text}"
 msgstr "Ingxelo yempazamo ithunyelwe kubalawuli."
 
-msgid "{errors:title_ARSPARAMS}"
+msgid "No SAML message provided"
 msgstr "Akukho myalezo we-SAML unikelweyo"
 
 msgid "{login:help_desk_email}"
diff --git a/vendor/simplesamlphp/simplesamlphp/locales/zu/LC_MESSAGES/messages.po b/vendor/simplesamlphp/simplesamlphp/locales/zu/LC_MESSAGES/messages.po
index e9a14aafe81faec4a0777692bbd27c0e633160b0..6bd75d091031f7bc3c7263afb23de7f5252fcc89 100644
--- a/vendor/simplesamlphp/simplesamlphp/locales/zu/LC_MESSAGES/messages.po
+++ b/vendor/simplesamlphp/simplesamlphp/locales/zu/LC_MESSAGES/messages.po
@@ -36,7 +36,7 @@ msgstr ""
 "Ulwazi lwesifunda lulahlekile, futhi ayikho indlela yokuqala kabusha "
 "isicelo"
 
-msgid "{errors:title_SSOPARAMS}"
+msgid "No SAML request provided"
 msgstr "Asikho isicelo se-SAML esinikeziwe"
 
 msgid "{errors:descr_CASERROR}"
@@ -210,7 +210,10 @@ msgstr "Cha, khansela"
 msgid "{status:header_diagnostics}"
 msgstr "Ukuhlonzwa Kwe-SimpleSAMLphp"
 
-msgid "{errors:descr_SSOPARAMS}"
+msgid ""
+"You accessed the Single Sign On Service interface, but did not provide a "
+"SAML Authentication Request. Please note that this endpoint is not "
+"intended to be accessed directly."
 msgstr ""
 "Ufinyelele ukusebenzisana Kwesevisi Yokubhalisa Okukodwa, kodwa awuzange "
 "uhlinzeke Ngempendulo Yokuqinisekisa ye-SAML. Sicela uphawule ukuthi "
@@ -402,9 +405,6 @@ msgstr ""
 "Ukhethe okuthi <b>%HOMEORG%</b> njengenhlangano yakho yasekhaya. Uma "
 "lokhu kungalungile ungase ukhethe enye."
 
-msgid "{login:processing}"
-msgstr "Iyacubungula..."
-
 msgid "{logout:default_link_text}"
 msgstr "Buyela emuva ekhasini lokufaka le-SimpleSAMLphp"
 
@@ -464,13 +464,16 @@ msgstr ""
 "Ukuqinisekisa kuhlulekile: isiphequluli sakho asizange sithumele noma "
 "yisiphi isitifiketi"
 
-msgid "{errors:descr_ARSPARAMS}"
+msgid ""
+"You accessed the Artifact Resolution Service interface, but did not "
+"provide a SAML ArtifactResolve message. Please note that this endpoint is"
+" not intended to be accessed directly."
 msgstr ""
 "Ufinyelele ukusebenzisana Kwesevisi Yokucaciswa Kobuciko, kodwa awuzange "
 "uhlinzeke umlayezo we-SAML ArtifactResolve. Sicela uphawule ukuthi "
 "isiphetho asihloselwe ukufinyelelwa ngokuqondile."
 
-msgid "{errors:title_MEMCACHEDOWN}"
+msgid "Cannot retrieve session data"
 msgstr "Ayikwazi ukubuyisela idatha yeseshini"
 
 msgid "{status:some_error_occurred}"
@@ -479,7 +482,7 @@ msgstr "Kuvele iphutha elithile"
 msgid "{errors:errorreport_text}"
 msgstr "Umbiko wephutha uthunyelwe kubalawuli."
 
-msgid "{errors:title_ARSPARAMS}"
+msgid "No SAML message provided"
 msgstr "Awukho umlayezo we-SAML onikeziwe"
 
 msgid "{login:help_desk_email}"
diff --git a/vendor/simplesamlphp/simplesamlphp/metadata-templates/saml20-sp-remote.php b/vendor/simplesamlphp/simplesamlphp/metadata-templates/saml20-sp-remote.php
index 0b0315ce02f7a38a5e579f04c33eca13191f41d6..c95da84d78072a8f757778eac4a2531df0362195 100644
--- a/vendor/simplesamlphp/simplesamlphp/metadata-templates/saml20-sp-remote.php
+++ b/vendor/simplesamlphp/simplesamlphp/metadata-templates/saml20-sp-remote.php
@@ -15,9 +15,9 @@
 ];
 
 /*
- * This example shows an example config that works with G Suite (Google Apps) for education.
+ * This example shows an example config that works with Google Workspace (G Suite / Google Apps) for education.
  * What is important is that you have an attribute in your IdP that maps to the local part of the email address at
- * G Suite. In example, if your Google account is foo.com, and you have a user that has an email john@foo.com, then you
+ * Google Workspace. In example, if your Google account is foo.com, and you have a user that has an email john@foo.com, then you
  * must set the simplesaml.nameidattribute to be the name of an attribute that for this user has the value of 'john'.
  */
 $metadata['google.com'] = [
diff --git a/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-idp-hosted.php b/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-idp-hosted.php
index dc6c9e0a9516b5eb756b2a4960b6a16fdab15df8..3af97d688bfc2cb80fb318dc9a937330c6f4576d 100644
--- a/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-idp-hosted.php
+++ b/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-idp-hosted.php
@@ -3,6 +3,8 @@
 /**
  * SAML 1.1 IdP configuration for SimpleSAMLphp.
  *
+ * Note that SAML 1.1 support has been deprecated and will be removed in SimpleSAMLphp 2.0.
+ *
  * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-hosted
  */
 
diff --git a/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-idp-remote.php b/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-idp-remote.php
index 9aa6f0e647b7dbe9a6c008b8f08f855bfc2d000e..d2eed7ab73ed2a2b3e5f2e9601092c7e69786115 100644
--- a/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-idp-remote.php
+++ b/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-idp-remote.php
@@ -3,6 +3,8 @@
 /**
  * SAML 1.1 remote IdP metadata for SimpleSAMLphp.
  *
+ * Note that SAML 1.1 support has been deprecated and will be removed in SimpleSAMLphp 2.0.
+ *
  * Remember to remove the IdPs you don't use from this file.
  *
  * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-remote
diff --git a/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-sp-hosted.php b/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-sp-hosted.php
index 15a275a3837e0670afe7954712deebfc5ada0b71..5cb8dc2de6bbcdebad1dc96638bb0b67debc057d 100644
--- a/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-sp-hosted.php
+++ b/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-sp-hosted.php
@@ -3,6 +3,8 @@
 /**
  * SAML 1.1 SP configuration for SimpleSAMLphp.
  *
+ * Note that SAML 1.1 support has been deprecated and will be removed in SimpleSAMLphp 2.0.
+ *
  * See: https://simplesamlphp.org/docs/stable/saml:sp
  */
 
diff --git a/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-sp-remote.php b/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-sp-remote.php
index b2fb1d8e0a07cb2c7c8733b5e3c16b13e019c458..f686733c466eec67c28360c7f10ec41c48894c93 100644
--- a/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-sp-remote.php
+++ b/vendor/simplesamlphp/simplesamlphp/metadata-templates/shib13-sp-remote.php
@@ -3,6 +3,8 @@
 /**
  * SAML 1.1 remote SP metadata for SimpleSAMLphp.
  *
+ * Note that SAML 1.1 support has been deprecated and will be removed in SimpleSAMLphp 2.0.
+ *
  * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-sp-remote
  */
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/adfs/.codecov.yml
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/authYubikey/.codecov.yml
rename to vendor/simplesamlphp/simplesamlphp/modules/adfs/.codecov.yml
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/.github/workflows/php.yml b/vendor/simplesamlphp/simplesamlphp/modules/adfs/.github/workflows/php.yml
new file mode 100644
index 0000000000000000000000000000000000000000..18d93f5dd010fead80d64fafd8c950b98ced2df7
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/adfs/.github/workflows/php.yml
@@ -0,0 +1,201 @@
+name: CI
+
+on:
+  push:
+    branches: [ '**' ]
+  pull_request:
+    branches: [ master, release-* ]
+
+jobs:
+  basic-tests:
+    name: Syntax and unit tests, PHP ${{ matrix.php-versions }}, ${{ matrix.operating-system }}
+    runs-on: ${{ matrix.operating-system }}
+    strategy:
+      fail-fast: false
+      matrix:
+        operating-system: [ubuntu-latest, windows-latest]
+        php-versions: ['7.1', '7.2', '7.3', '7.4']
+
+    steps:
+      - name: Setup PHP, with composer and extensions
+        uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
+        with:
+          php-version: ${{ matrix.php-versions }}
+          extensions: mbstring, xml
+          coverage: pcov
+
+      - name: Setup problem matchers for PHP
+        run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
+
+      - name: Setup problem matchers for PHPUnit
+        run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
+
+      - name: Set git to use LF
+        run: |
+          git config --global core.autocrlf false
+          git config --global core.eol lf
+
+      - uses: actions/checkout@v2
+
+      - name: Get composer cache directory
+        id: composer-cache
+        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+      - name: Cache composer dependencies
+        uses: actions/cache@v1
+        with:
+          path: ${{ steps.composer-cache.outputs.dir }}
+          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+          restore-keys: ${{ runner.os }}-composer-
+
+      - name: Validate composer.json and composer.lock
+        run: composer validate
+
+      - name: Install Composer dependencies
+        run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader
+
+      - name: Syntax check PHP
+        run: bash vendor/bin/check-syntax-php.sh
+
+      - name: Decide whether to run code coverage or not
+        if: ${{ matrix.php-versions != '7.4' || matrix.operating-system != 'ubuntu-latest' }}
+        run: |
+          echo "NO_COVERAGE=--no-coverage" >> $GITHUB_ENV
+
+      - name: Run unit tests
+        run: |
+          echo $NO_COVERAGE
+          ./vendor/bin/phpunit $NO_COVERAGE
+
+      - name: Save coverage data
+        if: ${{ matrix.php-versions == '7.4' && matrix.operating-system == 'ubuntu-latest' }}
+        uses: actions/upload-artifact@v1
+        with:
+            name: build-data
+            path: ${{ github.workspace }}/build
+
+  security:
+    name: Security checks
+    runs-on: [ubuntu-latest]
+    steps:
+      - name: Setup PHP, with composer and extensions
+        uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
+        with:
+            php-version: '7.4'
+            extensions: mbstring, xml
+            coverage: none
+
+      - name: Setup problem matchers for PHP
+        run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
+
+      - uses: actions/checkout@v2
+
+      - name: Get composer cache directory
+        id: composer-cache
+        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+      - name: Cache composer dependencies
+        uses: actions/cache@v1
+        with:
+            path: ${{ steps.composer-cache.outputs.dir }}
+            key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+            restore-keys: ${{ runner.os }}-composer-
+
+      - name: Install Composer dependencies
+        run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader
+
+      - name: Security check for locked dependencies
+        uses: symfonycorp/security-checker-action@v2
+
+      - name: Update Composer dependencies
+        run: composer update --no-progress --no-suggest --prefer-dist --optimize-autoloader
+
+      - name: Security check for locked dependencies
+        uses: symfonycorp/security-checker-action@v2
+  sanity-check:
+    name: Sanity checks
+    runs-on: [ubuntu-latest]
+
+    steps:
+      - name: Setup PHP, with composer and extensions
+        uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
+        with:
+          php-version: '7.4'
+          extensions: mbstring, xml
+          coverage: none
+
+      - name: Setup problem matchers for PHP
+        run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
+
+      - uses: actions/checkout@v2
+
+      - name: Get composer cache directory
+        id: composer-cache
+        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+      - name: Cache composer dependencies
+        uses: actions/cache@v1
+        with:
+            path: ${{ steps.composer-cache.outputs.dir }}
+            key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+            restore-keys: ${{ runner.os }}-composer-
+
+      - name: Install Composer dependencies
+        run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader
+
+      - name: Syntax check YAML / XML / JSON
+        run: |
+          bash vendor/bin/check-syntax-yaml.sh
+          bash vendor/bin/check-syntax-xml.sh
+          bash vendor/bin/check-syntax-json.sh
+
+  quality:
+    name: Quality control
+    runs-on: [ubuntu-latest]
+    needs: [basic-tests]
+
+    steps:
+      - name: Setup PHP, with composer and extensions
+        uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
+        with:
+          php-version: '7.4'
+          extensions: mbstring, xml
+
+      - name: Setup problem matchers for PHP
+        run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
+
+      - uses: actions/checkout@v2
+
+      - name: Get composer cache directory
+        id: composer-cache
+        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+      - name: Cache composer dependencies
+        uses: actions/cache@v1
+        with:
+            path: ${{ steps.composer-cache.outputs.dir }}
+            key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+            restore-keys: ${{ runner.os }}-composer-
+
+      - name: Install Composer dependencies
+        run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader
+
+      - uses: actions/download-artifact@v1
+        with:
+          name: build-data
+          path: ${{ github.workspace }}/build
+
+      - name: Codecov
+        uses: codecov/codecov-action@v1
+
+      - name: PHP Code Sniffer
+        continue-on-error: true
+        run: php vendor/bin/phpcs
+
+      - name: Psalm
+        continue-on-error: true
+        run: php vendor/bin/psalm --show-info=true
+
+      - name: Psalter
+        continue-on-error: true
+        run: php vendor/bin/psalter --issues=UnnecessaryVarAnnotation --dry-run
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/.gitignore b/vendor/simplesamlphp/simplesamlphp/modules/adfs/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..5eac57243bd762323174f813219434ff0d31a2ed
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/adfs/.gitignore
@@ -0,0 +1,10 @@
+### php-cs-fixer ###
+.php_cs.cache
+composer.lock
+cs_fixer_tmp*
+bin/*
+tools/*
+vendor/*
+build/*
+.phpunit.result.cache
+
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/adfs/.travis.yml
deleted file mode 100644
index fec43ab41a5a3b2129c6a4b00802c56325717fe9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/adfs/.travis.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-sudo: required
-
-language: php
-
-php:
-  - 5.6
-  - 7.0
-  - 7.1
-  - 7.2
-  - 7.3
-
-env:
-  - SIMPLESAMLPHP_VERSION=1.17.*
-
-before_script:
-  - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
-  - composer update --no-interaction
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then composer require --dev vimeo/psalm:1.1.9; fi
-
-script:
-  - bin/check-syntax.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
-
-after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/adfs/composer.json
index eae34314e6780ecb82b3fcd21a15c9ad954699a5..91b6899884ef208d8b4286b9ebe748cc26ef490f 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/adfs/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/adfs/composer.json
@@ -14,6 +14,10 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true,
+            "simplesamlphp/composer-module-installer": true
         }
     },
     "autoload": {
@@ -27,16 +31,16 @@
         }
     },
     "require": {
-        "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1"
+        "php": ">=7.1",
+        "simplesamlphp/composer-module-installer": "^1.1.7",
+        "simplesamlphp/assert": "^0.0.13"
     },
     "require-dev": {
-        "simplesamlphp/simplesamlphp": "^1.17",
-        "webmozart/assert": "<1.7",
-        "phpunit/phpunit": "~5.7"
+        "simplesamlphp/simplesamlphp": "^1.18",
+        "simplesamlphp/simplesamlphp-test-framework": "^0.1.2"
     },
     "support": {
-        "issues": "https://github.com/tvdijen/simplesamlphp-module-adfs/issues",
-        "source": "https://github.com/tvdijen/simplesamlphp-module-adfs"
+        "issues": "https://github.com/simplesamlphp/simplesamlphp-module-adfs/issues",
+        "source": "https://github.com/simplesamlphp/simplesamlphp-module-adfs"
     }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/default-enable b/vendor/simplesamlphp/simplesamlphp/modules/adfs/default-enable
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/default-enable
rename to vendor/simplesamlphp/simplesamlphp/modules/adfs/default-enable
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/AdfsController.php b/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/AdfsController.php
deleted file mode 100644
index 47eeb88f2328a7519466074c88c34eac58a1994d..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/AdfsController.php
+++ /dev/null
@@ -1,287 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\adfs;
-
-use SAML2\Constants;
-use SimpleSAML\Configuration;
-use SimpleSAML\Error as SspError;
-use SimpleSAML\IdP;
-use SimpleSAML\Locale\Translate;
-use SimpleSAML\Logger;
-use SimpleSAML\Module;
-use SimpleSAML\Module\adfs\IdP\ADFS;
-use SimpleSAML\Metadata;
-use SimpleSAML\Session;
-use SimpleSAML\Utils;
-use SimpleSAML\XHTML\Template;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpFoundation\StreamedResponse;
-use Webmozart\Assert\Assert;
-
-/**
- * Controller class for the adfs module.
- *
- * This class serves the adfs views available in the module.
- *
- * @package SimpleSAML\Module\adfs
- */
-class AdfsController
-{
-    /** @var \SimpleSAML\Configuration */
-    protected $config;
-
-    /** @var \SimpleSAML\Metadata\MetaDataStorageHandler */
-    protected $metadata;
-
-    /** @var \SimpleSAML\Session */
-    protected $session;
-
-    /**
-     * AdfsController constructor.
-     *
-     * @param \SimpleSAML\Configuration $config The configuration to use.
-     * @param \SimpleSAML\Session $session The current user session.
-     */
-    public function __construct(Configuration $config, Session $session)
-    {
-        $this->config = $config;
-        $this->metadata = Metadata\MetaDataStorageHandler::getMetadataHandler();
-        $this->session = $session;
-    }
-
-
-    /**
-     * @param \Symfony\Component\HttpFoundation\Request $request
-     * @return \Symfony\Component\HttpFoundation\Response|\SimpleSAML\XHTML\Template
-     */
-    public function metadata(Request $request)
-    {
-        if (!$this->config->getBoolean('enable.adfs-idp', false)) {
-            throw new SspError\Error('NOACCESS');
-        }
-
-        // check if valid local session exists
-        if ($this->config->getBoolean('admin.protectmetadata', false)) {
-            Utils\Auth::requireAdmin();
-        }
-
-        try {
-            $idpentityid = isset($_GET['idpentityid']) ?
-                $_GET['idpentityid'] : $this->metadata->getMetaDataCurrentEntityID('adfs-idp-hosted');
-            $idpmeta = $this->metadata->getMetaDataConfig($idpentityid, 'adfs-idp-hosted');
-
-            $availableCerts = [];
-            $keys = [];
-            $certInfo = Utils\Crypto::loadPublicKey($idpmeta, false, 'new_');
-
-            if ($certInfo !== null) {
-                $availableCerts['new_idp.crt'] = $certInfo;
-                $keys[] = [
-                    'type'            => 'X509Certificate',
-                    'signing'         => true,
-                    'encryption'      => true,
-                    'X509Certificate' => $certInfo['certData'],
-                ];
-                $hasNewCert = true;
-            } else {
-                $hasNewCert = false;
-            }
-
-            /** @var array $certInfo */
-            $certInfo = Utils\Crypto::loadPublicKey($idpmeta, true);
-            $availableCerts['idp.crt'] = $certInfo;
-            $keys[] = [
-                'type'            => 'X509Certificate',
-                'signing'         => true,
-                'encryption'      => ($hasNewCert ? false : true),
-                'X509Certificate' => $certInfo['certData'],
-            ];
-
-            if ($idpmeta->hasValue('https.certificate')) {
-                /** @var array $httpsCert */
-                $httpsCert = Utils\Crypto::loadPublicKey($idpmeta, true, 'https.');
-                Assert::keyExists($httpsCert, 'certData');
-                $availableCerts['https.crt'] = $httpsCert;
-                $keys[] = [
-                    'type'            => 'X509Certificate',
-                    'signing'         => true,
-                    'encryption'      => false,
-                    'X509Certificate' => $httpsCert['certData'],
-                ];
-            }
-
-            $adfs_service_location = Module::getModuleURL('adfs').'/idp/prp.php';
-            $metaArray = [
-                'metadata-set'        => 'adfs-idp-remote',
-                'entityid'            => $idpentityid,
-                'SingleSignOnService' => [
-                    0 => [
-                        'Binding'  => Constants::BINDING_HTTP_REDIRECT,
-                        'Location' => $adfs_service_location
-                    ]
-                ],
-                'SingleLogoutService' => [
-                    0 => [
-                        'Binding'  => Constants::BINDING_HTTP_REDIRECT,
-                        'Location' => $adfs_service_location
-                    ]
-                ],
-            ];
-
-            if (count($keys) === 1) {
-                $metaArray['certData'] = $keys[0]['X509Certificate'];
-            } else {
-                $metaArray['keys'] = $keys;
-            }
-
-            $metaArray['NameIDFormat'] = $idpmeta->getString(
-                'NameIDFormat',
-                Constants::NAMEID_TRANSIENT
-            );
-
-            if ($idpmeta->hasValue('OrganizationName')) {
-                $metaArray['OrganizationName'] = $idpmeta->getLocalizedString('OrganizationName');
-                $metaArray['OrganizationDisplayName'] = $idpmeta->getLocalizedString(
-                    'OrganizationDisplayName',
-                    $metaArray['OrganizationName']
-                );
-
-                if (!$idpmeta->hasValue('OrganizationURL')) {
-                    throw new SspError\Exception('If OrganizationName is set, OrganizationURL must also be set.');
-                }
-                $metaArray['OrganizationURL'] = $idpmeta->getLocalizedString('OrganizationURL');
-            }
-
-            if ($idpmeta->hasValue('scope')) {
-                $metaArray['scope'] = $idpmeta->getArray('scope');
-            }
-
-            if ($idpmeta->hasValue('EntityAttributes')) {
-                $metaArray['EntityAttributes'] = $idpmeta->getArray('EntityAttributes');
-            }
-
-            if ($idpmeta->hasValue('UIInfo')) {
-                $metaArray['UIInfo'] = $idpmeta->getArray('UIInfo');
-            }
-
-            if ($idpmeta->hasValue('DiscoHints')) {
-                $metaArray['DiscoHints'] = $idpmeta->getArray('DiscoHints');
-            }
-
-            if ($idpmeta->hasValue('RegistrationInfo')) {
-                $metaArray['RegistrationInfo'] = $idpmeta->getArray('RegistrationInfo');
-            }
-
-            $metaflat = '$metadata['.var_export($idpentityid, true).'] = '.var_export($metaArray, true).';';
-
-            $metaBuilder = new Metadata\SAMLBuilder($idpentityid);
-            $metaBuilder->addSecurityTokenServiceType($metaArray);
-            $metaBuilder->addOrganizationInfo($metaArray);
-            $technicalContactEmail = $this->config->getString('technicalcontact_email', null);
-            if ($technicalContactEmail && $technicalContactEmail !== 'na@example.org') {
-                $metaBuilder->addContact('technical', Utils\Config\Metadata::getContact([
-                    'emailAddress' => $technicalContactEmail,
-                    'name'         => $this->config->getString('technicalcontact_name', null),
-                    'contactType'  => 'technical',
-                ]));
-            }
-            $output_xhtml = array_key_exists('output', $_GET) && $_GET['output'] == 'xhtml';
-            $metaxml = $metaBuilder->getEntityDescriptorText($output_xhtml);
-            if (!$output_xhtml) {
-                $metaxml = str_replace("\n", '', $metaxml);
-            }
-
-            // sign the metadata if enabled
-            $metaxml = Metadata\Signer::sign($metaxml, $idpmeta->toArray(), 'ADFS IdP');
-
-            if ($output_xhtml) {
-                $t = new Template($this->config, 'metadata.php', 'admin');
-
-                $t->data['clipboard.js'] = true;
-                $t->data['available_certs'] = $availableCerts;
-                $certdata = [];
-                foreach (array_keys($availableCerts) as $availableCert) {
-                    $certdata[$availableCert]['name'] = $availableCert;
-                    $certdata[$availableCert]['url'] = Module::getModuleURL('saml/idp/certs.php').
-                        '/'.$availableCert;
-
-                    $certdata[$availableCert]['comment'] = '';
-                    if ($availableCerts[$availableCert]['certFingerprint'][0] === 'afe71c28ef740bc87425be13a2263d37971da1f9') {
-                        $certdata[$availableCert]['comment'] = 'This is the default certificate.'.
-                            ' Generate a new certificate if this is a production system.';
-                    }
-                }
-                $t->data['certdata'] = $certdata;
-                $t->data['header'] = 'adfs-idp'; // TODO: Replace with headerString in 2.0
-                $t->data['headerString'] = Translate::noop('metadata_adfs-idp');
-                $t->data['metaurl'] = Utils\HTTP::getSelfURLNoQuery();
-                $t->data['metadata'] = htmlspecialchars($metaxml);
-                $t->data['metadataflat'] = htmlspecialchars($metaflat);
-
-                return $t;
-            } else {
-                // make sure to export only the md:EntityDescriptor
-                $i = strpos($metaxml, '<md:EntityDescriptor');
-                $metaxml = substr($metaxml, $i ? $i : 0);
-
-                // 22 = strlen('</md:EntityDescriptor>')
-                $i = strrpos($metaxml, '</md:EntityDescriptor>');
-                $metaxml = substr($metaxml, 0, $i ? $i + 22 : 0);
-
-                $response = new Response();
-                $response->headers->set('Content-Type', 'application/xml');
-                $response->setContent($metaxml);
-
-                return $response;
-            }
-        } catch (\Exception $exception) {
-            throw new SspError\Error('METADATA', $exception);
-        }
-    }
-
-
-    /**
-     * @param \Symfony\Component\HttpFoundation\Request $request
-     * @return \Symfony\Component\HttpFoundation\Response
-     */
-    public function prp(Request $request)
-    {
-        Logger::info('ADFS - IdP.prp: Accessing ADFS IdP endpoint prp');
-
-        $idpEntityId = $this->metadata->getMetaDataCurrentEntityID('adfs-idp-hosted');
-        $idp = IdP::getById('adfs:'.$idpEntityId);
-
-        if (isset($_GET['wa'])) {
-            if ($_GET['wa'] === 'wsignout1.0') {
-                return new StreamedResponse(
-                    /** @return void */
-                    function () use ($idp) {
-                        ADFS::receiveLogoutMessage($idp);
-                    }
-                );
-            } elseif ($_GET['wa'] === 'wsignin1.0') {
-                return new StreamedResponse(
-                    /** @return void */
-                    function () use ($idp) {
-                        ADFS::receiveAuthnRequest($idp);
-                    }
-                );
-            }
-            throw new SspError\BadRequest("Unsupported value for 'wa' specified in request.");
-        } elseif (isset($_GET['assocId'])) {
-            // logout response from ADFS SP
-            $assocId = $_GET['assocId']; // Association ID of the SP that sent the logout response
-            $relayState = $_GET['relayState']; // Data that was sent in the logout request to the SP. Can be null
-            $logoutError = null; // null on success, or an instance of a \SimpleSAML\Error\Exception on failure.
-
-            return new StreamedResponse(
-                /** @return void */
-                function () use ($idp, $assocId, $relayState, $logoutError) {
-                    $idp->handleLogoutResponse($assocId, $relayState, $logoutError);
-                }
-            );
-        }
-        throw new SspError\BadRequest("Missing parameter 'wa' or 'assocId' in request.");
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/IdP/ADFS.php b/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/IdP/ADFS.php
index 5c9f8f2315e6f1fe64a342526ab69dbe34fb9395..7333c7f513bcba798022d9ddbd783ae48c2bb4ea 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/IdP/ADFS.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/IdP/ADFS.php
@@ -6,6 +6,7 @@
 use RobRichards\XMLSecLibs\XMLSecurityKey;
 use SAML2\Constants;
 
+use SimpleSAML\Module;
 use SimpleSAML\Utils\Config\Metadata;
 use SimpleSAML\Utils\Crypto;
 use SimpleSAML\Utils\HTTP;
@@ -138,7 +139,6 @@ private static function generateResponse($issuer, $target, $nameid, $attributes,
      * @param string $key
      * @param string $cert
      * @param string $algo
-     * @param string|null $passphrase
      * @return string
      */
     private static function signResponse($response, $key, $cert, $algo, $passphrase)
@@ -186,14 +186,17 @@ private static function signResponse($response, $key, $cert, $algo, $passphrase)
      */
     private static function postResponse($url, $wresult, $wctx)
     {
-        $config = \SimpleSAML\Configuration::getInstance();
-        $usenewui = $config->getBoolean('usenewui', false);
-        if ($usenewui === false) {
-            $wresult = htmlspecialchars($wresult);
-            $wctx = htmlspecialchars($wctx);
-
-            $post = <<<MSG
-    <body onload="document.forms[0].submit()">
+        $wresult = htmlspecialchars($wresult);
+        $wctx = htmlspecialchars($wctx);
+        $javaScript = Module::getModuleURL('adfs/assets/js/postResponse.js');
+
+        $post = <<<MSG
+<!DOCTYPE html>
+<html>
+    <head>
+        <script src="$javaScript"></script>
+    </head>
+    <body>
         <form method="post" action="$url">
             <input type="hidden" name="wa" value="wsignin1.0">
             <input type="hidden" name="wresult" value="$wresult">
@@ -203,16 +206,11 @@ private static function postResponse($url, $wresult, $wctx)
             </noscript>
         </form>
     </body>
+</html>
 MSG;
-            echo $post;
-        } else {
-            $t = new \SimpleSAML\XHTML\Template($config, 'adfs:postResponse.twig');
-            $t->data['baseurlpath'] = \SimpleSAML\Module::getModuleURL('adfs');
-            $t->data['url'] = $url;
-            $t->data['wresult'] = $wresult;
-            $t->data['wctx'] = $wctx;
-            $t->show();
-        }
+
+        echo $post;
+        exit;
     }
 
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Constants.php b/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Constants.php
index db326b3488466fb903b6b3db672df1344574e1cb..8fe5b60410bcf963e993b2b3c7ace853ee4fb36b 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Constants.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Constants.php
@@ -13,5 +13,5 @@ class Constants
     /**
      * The namespace for WS-FED protocol.
      */
-    const NS_FED = 'http://docs.oasis-open.org/wsfed/federation/200706';
+    public const NS_FED = 'http://docs.oasis-open.org/wsfed/federation/200706';
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Endpoint.php b/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Endpoint.php
index 46b4940251b14f16e7b4615dca5fcc6e22503396..bc6dde533df4ef82e84eb6174cc9b986fef097e3 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Endpoint.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Endpoint.php
@@ -2,6 +2,8 @@
 
 namespace SimpleSAML\Module\adfs\SAML2\XML\fed;
 
+use Webmozart\Assert\Assert;
+
 /**
  * Class representing fed Endpoint.
  *
@@ -20,8 +22,8 @@ class Endpoint
      */
     public static function appendXML(\DOMElement $parent, $name, $address)
     {
-        assert(is_string($name));
-        assert(is_string($address));
+        Assert::string($name);
+        Assert::string($address);
 
         $e = $parent->ownerDocument->createElement($name);
         $parent->appendChild($e);
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/SecurityTokenServiceType.php b/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/SecurityTokenServiceType.php
index 9eae1277795fdcabaa1bbcdf2e6d3d5a77b754aa..31647463c9b2273139c394faa1da0044c199a11e 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/SecurityTokenServiceType.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/SecurityTokenServiceType.php
@@ -2,6 +2,8 @@
 
 namespace SimpleSAML\Module\adfs\SAML2\XML\fed;
 
+use Webmozart\Assert\Assert;
+
 /**
  * Class representing SecurityTokenServiceType RoleDescriptor.
  *
@@ -33,6 +35,8 @@ class SecurityTokenServiceType extends \SAML2\XML\md\RoleDescriptor
     public function __construct(\DOMElement $xml = null)
     {
         parent::__construct('RoleDescriptor', $xml);
+        parent::setProtocolSupportEnumeration($this->protocolSupportEnumeration);
+
         if ($xml === null) {
             return;
         }
@@ -44,14 +48,14 @@ public function __construct(\DOMElement $xml = null)
      * @param \DOMElement $parent  The element we should add this contact to.
      * @return \DOMElement  The new ContactPerson-element.
      */
-    public function toXML(\DOMElement $parent)
+    public function toXML(\DOMElement $parent): \DOMElement
     {
+        Assert::string($this->Location);
+
         if (is_null($this->Location)) {
             throw new \Exception('Location not set');
         }
 
-        assert(is_string($this->Location));
-
         $e = parent::toXML($parent);
         $e->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:fed', Constants::NS_FED);
         $e->setAttributeNS(\SAML2\Constants::NS_XSI, 'xsi:type', 'fed:SecurityTokenServiceType');
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/adfs/phpunit.xml
index c0985fdd804b18d8d9179ecd956d63582c189e95..d710d05b57036b3e6fc90334a11ffb60f736b190 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/adfs/phpunit.xml
+++ b/vendor/simplesamlphp/simplesamlphp/modules/adfs/phpunit.xml
@@ -1,19 +1,20 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="tests/bootstrap.php">
-    <testsuites>
-        <testsuite name="The project's test suite">
-            <directory>tests/</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./lib</directory>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" />
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
-        <log type="coverage-clover" target="build/logs/clover.xml" />
-    </logging>
+<?xml version="1.0" encoding="utf-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" bootstrap="tests/bootstrap.php" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
+  <coverage processUncoveredFiles="true">
+    <include>
+      <directory suffix=".php">./lib</directory>
+    </include>
+    <report>
+      <clover outputFile="build/logs/clover.xml"/>
+      <html outputDirectory="build/coverage" lowUpperBound="35" highLowerBound="70"/>
+      <text outputFile="php://stdout" showUncoveredFiles="true"/>
+    </report>
+  </coverage>
+  <testsuites>
+    <testsuite name="The project's test suite">
+      <directory>./vendor/simplesamlphp/simplesamlphp-test-framework/src</directory>
+      <directory>tests</directory>
+    </testsuite>
+  </testsuites>
+  <logging/>
 </phpunit>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/www/idp/metadata.php b/vendor/simplesamlphp/simplesamlphp/modules/adfs/www/idp/metadata.php
index 7d04309be17b744af32f3e73d4aae3d4a8c789de..0342863d9519c2f1a0c7d7d7afee9ae25e892244 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/adfs/www/idp/metadata.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/adfs/www/idp/metadata.php
@@ -1,15 +1,189 @@
 <?php
 
-namespace SimpleSAML\Module\adfs;
+use Webmozart\Assert\Assert;
 
-use SimpleSAML\Configuration;
-use SimpleSAML\Session;
-use Symfony\Component\HttpFoundation\Request;
+// load configuration and metadata
+$config = \SimpleSAML\Configuration::getInstance();
+$metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
 
-$config = Configuration::getInstance();
-$session = Session::getSessionFromRequest();
-$request = Request::createFromGlobals();
+if (!$config->getBoolean('enable.adfs-idp', false)) {
+    throw new \SimpleSAML\Error\Error('NOACCESS');
+}
 
-$controller = new AdfsController($config, $session);
-$t = $controller->metadata($request);
-$t->send();
+// check if valid local session exists
+if ($config->getBoolean('admin.protectmetadata', false)) {
+    \SimpleSAML\Utils\Auth::requireAdmin();
+}
+
+try {
+    $idpentityid = isset($_GET['idpentityid']) ?
+        $_GET['idpentityid'] : $metadata->getMetaDataCurrentEntityID('adfs-idp-hosted');
+    $idpmeta = $metadata->getMetaDataConfig($idpentityid, 'adfs-idp-hosted');
+
+    $availableCerts = [];
+
+    $keys = [];
+    $certInfo = \SimpleSAML\Utils\Crypto::loadPublicKey($idpmeta, false, 'new_');
+    if ($certInfo !== null) {
+        $availableCerts['new_idp.crt'] = $certInfo;
+        $keys[] = [
+            'type'            => 'X509Certificate',
+            'signing'         => true,
+            'encryption'      => true,
+            'X509Certificate' => $certInfo['certData'],
+        ];
+        $hasNewCert = true;
+    } else {
+        $hasNewCert = false;
+    }
+
+    /** @var array $certInfo */
+    $certInfo = \SimpleSAML\Utils\Crypto::loadPublicKey($idpmeta, true);
+    $availableCerts['idp.crt'] = $certInfo;
+    $keys[] = [
+        'type'            => 'X509Certificate',
+        'signing'         => true,
+        'encryption'      => ($hasNewCert ? false : true),
+        'X509Certificate' => $certInfo['certData'],
+    ];
+
+    if ($idpmeta->hasValue('https.certificate')) {
+        /** @var array $httpsCert */
+        $httpsCert = \SimpleSAML\Utils\Crypto::loadPublicKey($idpmeta, true, 'https.');
+        Assert::keyExists($httpsCert, 'certData');
+        $availableCerts['https.crt'] = $httpsCert;
+        $keys[] = [
+            'type'            => 'X509Certificate',
+            'signing'         => true,
+            'encryption'      => false,
+            'X509Certificate' => $httpsCert['certData'],
+        ];
+    }
+
+    $adfs_service_location = \SimpleSAML\Module::getModuleURL('adfs').'/idp/prp.php';
+    $metaArray = [
+        'metadata-set'        => 'adfs-idp-remote',
+        'entityid'            => $idpentityid,
+        'SingleSignOnService' => [
+            0 => [
+                'Binding'  => \SAML2\Constants::BINDING_HTTP_REDIRECT,
+                'Location' => $adfs_service_location
+            ]
+        ],
+        'SingleLogoutService' => [
+            0 => [
+                'Binding'  => \SAML2\Constants::BINDING_HTTP_REDIRECT,
+                'Location' => $adfs_service_location
+            ]
+        ],
+    ];
+
+    if (count($keys) === 1) {
+        $metaArray['certData'] = $keys[0]['X509Certificate'];
+    } else {
+        $metaArray['keys'] = $keys;
+    }
+
+    $metaArray['NameIDFormat'] = $idpmeta->getString(
+        'NameIDFormat',
+        'urn:oasis:names:tc:SAML:2.0:nameid-format:transient'
+    );
+
+    if ($idpmeta->hasValue('OrganizationName')) {
+        $metaArray['OrganizationName'] = $idpmeta->getLocalizedString('OrganizationName');
+        $metaArray['OrganizationDisplayName'] = $idpmeta->getLocalizedString(
+            'OrganizationDisplayName',
+            $metaArray['OrganizationName']
+        );
+
+        if (!$idpmeta->hasValue('OrganizationURL')) {
+            throw new \SimpleSAML\Error\Exception('If OrganizationName is set, OrganizationURL must also be set.');
+        }
+        $metaArray['OrganizationURL'] = $idpmeta->getLocalizedString('OrganizationURL');
+    }
+
+    if ($idpmeta->hasValue('scope')) {
+        $metaArray['scope'] = $idpmeta->getArray('scope');
+    }
+
+    if ($idpmeta->hasValue('EntityAttributes')) {
+        $metaArray['EntityAttributes'] = $idpmeta->getArray('EntityAttributes');
+    }
+
+    if ($idpmeta->hasValue('UIInfo')) {
+        $metaArray['UIInfo'] = $idpmeta->getArray('UIInfo');
+    }
+
+    if ($idpmeta->hasValue('DiscoHints')) {
+        $metaArray['DiscoHints'] = $idpmeta->getArray('DiscoHints');
+    }
+
+    if ($idpmeta->hasValue('RegistrationInfo')) {
+        $metaArray['RegistrationInfo'] = $idpmeta->getArray('RegistrationInfo');
+    }
+
+    $metaflat = '$metadata['.var_export($idpentityid, true).'] = '.var_export($metaArray, true).';';
+
+    $metaBuilder = new \SimpleSAML\Metadata\SAMLBuilder($idpentityid);
+    $metaBuilder->addSecurityTokenServiceType($metaArray);
+    $metaBuilder->addOrganizationInfo($metaArray);
+    $technicalContactEmail = $config->getString('technicalcontact_email', null);
+    if ($technicalContactEmail && $technicalContactEmail !== 'na@example.org') {
+        $metaBuilder->addContact('technical', \SimpleSAML\Utils\Config\Metadata::getContact([
+            'emailAddress' => $technicalContactEmail,
+            'name'         => $config->getString('technicalcontact_name', null),
+            'contactType'  => 'technical',
+        ]));
+    }
+    $output_xhtml = array_key_exists('output', $_GET) && $_GET['output'] == 'xhtml';
+    $metaxml = $metaBuilder->getEntityDescriptorText($output_xhtml);
+    if (!$output_xhtml) {
+        $metaxml = str_replace("\n", '', $metaxml);
+    }
+
+    // sign the metadata if enabled
+    $metaxml = \SimpleSAML\Metadata\Signer::sign($metaxml, $idpmeta->toArray(), 'ADFS IdP');
+
+    if ($output_xhtml) {
+        $defaultidp = $config->getString('default-adfs-idp', null);
+
+        $t = new \SimpleSAML\XHTML\Template($config, 'metadata.php', 'admin');
+
+        $t->data['clipboard.js'] = true;
+        $t->data['available_certs'] = $availableCerts;
+        $certdata = [];
+        foreach (array_keys($availableCerts) as $availableCert) {
+            $certdata[$availableCert]['name'] = $availableCert;
+            $certdata[$availableCert]['url'] = \SimpleSAML\Module::getModuleURL('saml/idp/certs.php').
+                '/'.$availableCert;
+
+            $certdata[$availableCert]['comment'] = '';
+            if ($availableCerts[$availableCert]['certFingerprint'][0] === 'afe71c28ef740bc87425be13a2263d37971da1f9') {
+                $certdata[$availableCert]['comment'] = 'This is the default certificate.'.
+                    ' Generate a new certificate if this is a production system.';
+            }
+        }
+        $t->data['certdata'] = $certdata;
+        $t->data['header'] = 'adfs-idp'; // TODO: Replace with headerString in 2.0
+        $t->data['headerString'] = \SimpleSAML\Locale\Translate::noop('metadata_adfs-idp');
+        $t->data['metaurl'] = \SimpleSAML\Utils\HTTP::getSelfURLNoQuery();
+        $t->data['metadata'] = htmlspecialchars($metaxml);
+        $t->data['metadataflat'] = htmlspecialchars($metaflat);
+        $t->data['defaultidp'] = $defaultidp;
+        $t->show();
+    } else {
+        header('Content-Type: application/xml');
+
+        // make sure to export only the md:EntityDescriptor
+        $i = strpos($metaxml, '<md:EntityDescriptor');
+        $metaxml = substr($metaxml, $i ? $i : 0);
+        // 22 = strlen('</md:EntityDescriptor>')
+        $i = strrpos($metaxml, '</md:EntityDescriptor>');
+        $metaxml = substr($metaxml, 0, $i ? $i + 22 : 0);
+        echo $metaxml;
+
+        exit(0);
+    }
+} catch (\Exception $exception) {
+    throw new \SimpleSAML\Error\Error('METADATA', $exception);
+}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/www/idp/prp.php b/vendor/simplesamlphp/simplesamlphp/modules/adfs/www/idp/prp.php
index 0ea84380977f0fc7f22329eddff4c364d285cfdd..a94d32804f0001b879cf80fe9b9744e5daec4bd4 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/adfs/www/idp/prp.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/adfs/www/idp/prp.php
@@ -7,16 +7,23 @@
  * @package SimpleSAMLphp
  */
 
-namespace SimpleSAML\Module\adfs;
+\SimpleSAML\Logger::info('ADFS - IdP.prp: Accessing ADFS IdP endpoint prp');
 
-use SimpleSAML\Configuration;
-use SimpleSAML\Session;
-use Symfony\Component\HttpFoundation\Request;
+$metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
+$idpEntityId = $metadata->getMetaDataCurrentEntityID('adfs-idp-hosted');
+$idp = \SimpleSAML\IdP::getById('adfs:'.$idpEntityId);
 
-$config = Configuration::getInstance();
-$session = Session::getSessionFromRequest();
-$request = Request::createFromGlobals();
-
-$controller = new AdfsController($config, $session);
-$t = $controller->prp($request);
-$t->send();
+if (isset($_GET['wa'])) {
+    if ($_GET['wa'] === 'wsignout1.0') {
+        \SimpleSAML\Module\adfs\IdP\ADFS::receiveLogoutMessage($idp);
+    } elseif ($_GET['wa'] === 'wsignin1.0') {
+        \SimpleSAML\Module\adfs\IdP\ADFS::receiveAuthnRequest($idp);
+    }
+    throw new \Exception("Code should never be reached");
+} elseif (isset($_GET['assocId'])) {
+    // logout response from ADFS SP
+    $assocId = $_GET['assocId']; // Association ID of the SP that sent the logout response
+    $relayState = $_GET['relayState']; // Data that was sent in the logout request to the SP. Can be null
+    $logoutError = null; // null on success, or an instance of a \SimpleSAML\Error\Exception on failure.
+    $idp->handleLogoutResponse($assocId, $relayState, $logoutError);
+}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/ConfigController.php b/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Config.php
similarity index 96%
rename from vendor/simplesamlphp/simplesamlphp/modules/admin/lib/ConfigController.php
rename to vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Config.php
index d4764b58502c09e98d764bf9546288a7eba0c5e1..f51f1f32ad82fad175f885f3818d67c39a2e3056 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/ConfigController.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Config.php
@@ -1,6 +1,8 @@
 <?php
 
-namespace SimpleSAML\Module\admin;
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\admin\Controller;
 
 use SimpleSAML\Configuration;
 use SimpleSAML\HTTP\RunnableResponse;
@@ -18,11 +20,11 @@
  *
  * @package SimpleSAML\Module\admin
  */
-class ConfigController
+class Config
 {
-    const LATEST_VERSION_STATE_KEY = 'core:latest_simplesamlphp_version';
+    public const LATEST_VERSION_STATE_KEY = 'core:latest_simplesamlphp_version';
 
-    const RELEASES_API = 'https://api.github.com/repos/simplesamlphp/simplesamlphp/releases/latest';
+    public const RELEASES_API = 'https://api.github.com/repos/simplesamlphp/simplesamlphp/releases/latest';
 
     /** @var \SimpleSAML\Configuration */
     protected $config;
@@ -155,11 +157,11 @@ protected function getPrerequisiteChecks()
                 'descr' => [
                     Translate::noop('PHP %minimum% or newer is needed. You are running: %current%'),
                     [
-                        '%minimum%' => '5.6',
+                        '%minimum%' => '7.1',
                         '%current%' => explode('-', phpversion())[0]
                     ]
                 ],
-                'enabled' => version_compare(phpversion(), '5.6', '>=')
+                'enabled' => version_compare(phpversion(), '7.1', '>=')
             ]
         ];
         $store = $this->config->getString('store.type', '');
@@ -272,7 +274,7 @@ protected function getPrerequisiteChecks()
         // check object-oriented external libraries and extensions
         $libs = [
             [
-                'classes' => ['\Predis\Predis'],
+                'classes' => ['\Predis\Client'],
                 'required' => $store === 'redis' ? 'required' : 'optional',
                 'descr' => [
                     'optional' => Translate::noop('predis/predis (required if the redis data store is used)'),
@@ -389,7 +391,7 @@ protected function getWarnings()
                     $response = curl_exec($ch);
 
                     if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) === 200) {
-                        /** @psalm-suppress InvalidScalarArgument */
+                        /** @psalm-var string $response */
                         $latest = json_decode($response, true);
                         $this->session->setData(self::LATEST_VERSION_STATE_KEY, 'version', $latest);
                     }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/FederationController.php b/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Federation.php
similarity index 84%
rename from vendor/simplesamlphp/simplesamlphp/modules/admin/lib/FederationController.php
rename to vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Federation.php
index f167514972a4a4b3161d4fe2533c4a1162040db0..e1621b2d2aa12527ebfa7d8052f48ea973c5f832 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/FederationController.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Federation.php
@@ -1,7 +1,10 @@
 <?php
 
-namespace SimpleSAML\Module\admin;
+declare(strict_types=1);
 
+namespace SimpleSAML\Module\admin\Controller;
+
+use Exception;
 use SimpleSAML\Auth;
 use SimpleSAML\Configuration;
 use SimpleSAML\HTTP\RunnableResponse;
@@ -20,6 +23,7 @@
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpFoundation\ResponseHeaderBag;
+use Symfony\Component\VarExporter\VarExporter;
 
 /**
  * Controller class for the admin module.
@@ -28,9 +32,8 @@
  *
  * @package SimpleSAML\Module\admin
  */
-class FederationController
+class Federation
 {
-
     /** @var \SimpleSAML\Configuration */
     protected $config;
 
@@ -60,8 +63,9 @@ public function __construct(Configuration $config)
      * @return \SimpleSAML\XHTML\Template
      * @throws \SimpleSAML\Error\Exception
      * @throws \SimpleSAML\Error\Exception
+     * @return \SimpleSAML\XHTML\Template
      */
-    public function main()
+    public function main(): Template
     {
         Utils\Auth::requireAdmin();
 
@@ -162,7 +166,7 @@ public function main()
      * @return array
      * @throws \Exception
      */
-    private function getHostedIdP()
+    private function getHostedIdP(): array
     {
         $entities = [];
 
@@ -173,7 +177,7 @@ private function getHostedIdP()
                 $saml2entities = [];
                 if (count($idps) > 1) {
                     foreach ($idps as $index => $idp) {
-                        $idp['url'] = Module::getModuleURL('saml/2/idp/metadata/' . $idp['auth']);
+                        $idp['url'] = Module::getModuleURL('saml2/idp/metadata/' . $idp['auth']);
                         $idp['metadata-set'] = 'saml20-idp-hosted';
                         $idp['metadata-index'] = $index;
                         $idp['metadata_array'] = SAML2_IdP::getHostedMetadata($idp['entityid']);
@@ -191,8 +195,10 @@ private function getHostedIdP()
                     $builder = new SAMLBuilder($entity['entityid']);
                     $builder->addMetadataIdP20($entity['metadata_array']);
                     $builder->addOrganizationInfo($entity['metadata_array']);
-                    foreach ($entity['metadata_array']['contacts'] as $contact) {
-                        $builder->addContact($contact['contactType'], $contact);
+                    if (isset($entity['metadata_array']['contacts'])) {
+                        foreach ($entity['metadata_array']['contacts'] as $contact) {
+                            $builder->addContact($contact['contactType'], $contact);
+                        }
                     }
 
                     $entity['metadata'] = Signer::sign(
@@ -232,14 +238,16 @@ private function getHostedIdP()
                     $builder = new SAMLBuilder($entity['entityid']);
                     $builder->addMetadataIdP11($entity['metadata_array']);
                     $builder->addOrganizationInfo($entity['metadata_array']);
-                    foreach ($entity['metadata_array']['contacts'] as $contact) {
-                        $builder->addContact($contact['contactType'], $contact);
+                    if (isset($entity['metadata_array']['contacts'])) {
+                        foreach ($entity['metadata_array']['contacts'] as $contact) {
+                            $builder->addContact($contact['contactType'], $contact);
+                        }
                     }
 
                     $entity['metadata'] = Signer::sign(
                         $builder->getEntityDescriptorText(),
                         $entity['metadata_array'],
-                        'SAML 2 SP'
+                        'Shib 1.3 IdP'
                     );
                     $entities[$index] = $entity;
                 }
@@ -273,8 +281,10 @@ private function getHostedIdP()
                     $builder = new SAMLBuilder($entity['entityid']);
                     $builder->addSecurityTokenServiceType($entity['metadata_array']);
                     $builder->addOrganizationInfo($entity['metadata_array']);
-                    foreach ($entity['metadata_array']['contacts'] as $contact) {
-                        $builder->addContact($contact['contactType'], $contact);
+                    if (isset($entity['metadata_array']['contacts'])) {
+                        foreach ($entity['metadata_array']['contacts'] as $contact) {
+                            $builder->addContact($contact['contactType'], $contact);
+                        }
                     }
 
                     $entity['metadata'] = Signer::sign(
@@ -313,7 +323,7 @@ private function getHostedIdP()
                 unset($entity['metadata_array']['keys']);
             }
 
-            $entities[$index]['metadata_array'] = var_export($entity['metadata_array'], true);
+            $entities[$index]['metadata_array'] = VarExporter::export($entity['metadata_array']);
         }
 
         return $entities;
@@ -326,7 +336,7 @@ private function getHostedIdP()
      * @return array
      * @throws \SimpleSAML\Error\Exception If OrganizationName is set for an SP instance but OrganizationURL is not.
      */
-    private function getHostedSP()
+    private function getHostedSP(): array
     {
         $entities = [];
 
@@ -375,7 +385,7 @@ private function getHostedSP()
                 'url' => $source->getMetadataURL(),
                 'name' => $name,
                 'metadata' => $xml,
-                'metadata_array' => var_export($metadata, true),
+                'metadata_array' => VarExporter::export($metadata),
                 'certificates' => $certificates,
             ];
         }
@@ -383,6 +393,7 @@ private function getHostedSP()
         return $entities;
     }
 
+
     /**
      * Metadata converter
      *
@@ -393,48 +404,62 @@ private function getHostedSP()
     public function metadataConverter(Request $request)
     {
         Utils\Auth::requireAdmin();
-
         if ($xmlfile = $request->files->get('xmlfile')) {
-            $xmldata = trim(file_get_contents($xmlfile));
+            $xmldata = trim(file_get_contents($xmlfile->getPathname()));
         } elseif ($xmldata = $request->request->get('xmldata')) {
             $xmldata = trim($xmldata);
         }
 
+        $error = null;
         if (!empty($xmldata)) {
             Utils\XML::checkSAMLMessage($xmldata, 'saml-meta');
-            $entities = SAMLParser::parseDescriptorsString($xmldata);
-
-            // get all metadata for the entities
-            foreach ($entities as &$entity) {
-                $entity = [
-                    'shib13-sp-remote'  => $entity->getMetadata1xSP(),
-                    'shib13-idp-remote' => $entity->getMetadata1xIdP(),
-                    'saml20-sp-remote'  => $entity->getMetadata20SP(),
-                    'saml20-idp-remote' => $entity->getMetadata20IdP(),
-                ];
+
+            $entities = null;
+            try {
+                $entities = SAMLParser::parseDescriptorsString($xmldata);
+            } catch (Exception $e) {
+                $error = $e->getMessage();
             }
 
-            // transpose from $entities[entityid][type] to $output[type][entityid]
-            $output = Utils\Arrays::transpose($entities);
+            if ($entities !== null) {
+                // get all metadata for the entities
+                foreach ($entities as &$entity) {
+                    $entity = [
+                        'saml20-sp-remote'  => $entity->getMetadata20SP(),
+                        'saml20-idp-remote' => $entity->getMetadata20IdP(),
+                    ];
+                }
 
-            // merge all metadata of each type to a single string which should be added to the corresponding file
-            foreach ($output as $type => &$entities) {
-                $text = '';
-                foreach ($entities as $entityId => $entityMetadata) {
-                    if ($entityMetadata === null) {
-                        continue;
+                // transpose from $entities[entityid][type] to $output[type][entityid]
+                $output = Utils\Arrays::transpose($entities);
+
+                // merge all metadata of each type to a single string which should be added to the corresponding file
+                foreach ($output as $type => &$entities) {
+                    $text = '';
+                    foreach ($entities as $entityId => $entityMetadata) {
+                        if ($entityMetadata === null) {
+                            continue;
+                        }
+
+                        /**
+                         * remove the entityDescriptor element because it is unused,
+                         * and only makes the output harder to read
+                         */
+                        unset($entityMetadata['entityDescriptor']);
+
+                        /**
+                         * Remove any expire from the metadata. This is not so useful
+                         * for manually converted metadata and frequently gives rise
+                         * to unexpected results when copy-pased statically.
+                         */
+                        unset($entityMetadata['expire']);
+
+                        $text .= '$metadata[' . var_export($entityId, true) . '] = '
+                            . VarExporter::export($entityMetadata) . ";\n";
                     }
 
-                    /**
-                     * remove the entityDescriptor element because it is unused,
-                     * and only makes the output harder to read
-                     */
-                    unset($entityMetadata['entityDescriptor']);
-
-                    $text .= '$metadata[' . var_export($entityId, true) . '] = '
-                        . var_export($entityMetadata, true) . ";\n";
+                    $entities = $text;
                 }
-                $entities = $text;
             }
         } else {
             $xmldata = '';
@@ -446,12 +471,14 @@ public function metadataConverter(Request $request)
             'logouturl' => Utils\Auth::getAdminLogoutURL(),
             'xmldata' => $xmldata,
             'output' => $output,
+            'error' => $error,
         ];
 
         $this->menu->addOption('logout', $t->data['logouturl'], Translate::noop('Log out'));
         return $this->menu->insert($t);
     }
 
+
     /**
      * Download a certificate for a given entity.
      *
@@ -494,6 +521,7 @@ public function downloadCert(Request $request)
         return $response;
     }
 
+
     /**
      * Show remote entity metadata
      *
@@ -512,7 +540,7 @@ public function showRemoteEntity(Request $request)
 
         $t = new Template($this->config, 'admin:show_metadata.twig');
         $t->data['entityid'] = $entityId;
-        $t->data['metadata'] = var_export($metadata, true);
+        $t->data['metadata'] = VarExporter::export($metadata);
         return $t;
     }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Menu.php b/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Menu.php
similarity index 97%
rename from vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Menu.php
rename to vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Menu.php
index c1d87d9597776ca7d533b26fcf2f578072c5fbac..6887fab1abd066809ea8b0207d8db5d701c6bfb7 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Menu.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Menu.php
@@ -1,6 +1,8 @@
 <?php
 
-namespace SimpleSAML\Module\admin;
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\admin\Controller;
 
 use SimpleSAML\Locale\Translate;
 use SimpleSAML\Module;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/TestController.php b/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Test.php
similarity index 90%
rename from vendor/simplesamlphp/simplesamlphp/modules/admin/lib/TestController.php
rename to vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Test.php
index ac4afebcd6374ef5b4cef182b4d868002ebff057..64595187af83b04114b20f0d7a44704110bf536e 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/TestController.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/admin/lib/Controller/Test.php
@@ -1,6 +1,8 @@
 <?php
 
-namespace SimpleSAML\Module\admin;
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\admin\Controller;
 
 use SAML2\Constants;
 use SAML2\XML\saml\NameID;
@@ -14,6 +16,7 @@
 use SimpleSAML\XHTML\Template;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
+use Webmozart\Assert\Assert;
 
 /**
  * Controller class for the admin module.
@@ -22,9 +25,8 @@
  *
  * @package SimpleSAML\Module\admin
  */
-class TestController
+class Test
 {
-
     /** @var \SimpleSAML\Configuration */
     protected $config;
 
@@ -52,6 +54,7 @@ public function __construct(Configuration $config, Session $session)
     /**
      * Display the list of available authsources.
      *
+     * @param \Symfony\Component\HttpFoundation\Request $request
      * @param string|null $as
      * @return \SimpleSAML\XHTML\Template
      */
@@ -71,7 +74,7 @@ public function main(Request $request, $as)
                 // This is just a simple example of an error
                 /** @var array $state */
                 $state = Auth\State::loadExceptionState();
-                assert(array_key_exists(Auth\State::EXCEPTION_DATA, $state));
+                Assert::keyExists($state, Auth\State::EXCEPTION_DATA);
                 throw $state[Auth\State::EXCEPTION_DATA];
             }
 
@@ -115,10 +118,12 @@ public function main(Request $request, $as)
      * @param \SAML2\XML\saml\NameID $nameId
      * @return string
      */
-    private function getNameIDHTML(Template $t, NameID $nameId)
+    private function getNameIDHTML(Template $t, NameID $nameId): string
     {
         $translator = $t->getTranslator();
         $result = '';
+
+        /** @psalm-suppress TypeDoesNotContainNull  Remove if-case in 2.0 */
         if ($nameId->getValue() === null) {
             $list = ["NameID" => [$translator->t('{status:subject_notset}')]];
             /** @var string $notset */
@@ -130,7 +135,9 @@ private function getNameIDHTML(Template $t, NameID $nameId)
             ];
             if ($nameId->getFormat() !== null) {
                 /** @var string $format */
-                $format = $translator->t('{status:subject_format}');
+                $format = $translator->getPreferredTranslation(
+                    $translator->getTag('{status:subject_format}') ?? ['en'=>'Format']
+                );
                 $list[$format] = [$nameId->getFormat()];
             }
             if ($nameId->getNameQualifier() !== null) {
@@ -153,7 +160,7 @@ private function getNameIDHTML(Template $t, NameID $nameId)
      * @param string $nameParent
      * @return string
      */
-    private function getAttributesHTML(Template $t, $attributes, $nameParent)
+    private function getAttributesHTML(Template $t, array $attributes, string $nameParent): string
     {
         $alternate = ['pure-table-odd', 'pure-table-even'];
         $i = 0;
@@ -200,7 +207,7 @@ private function getAttributesHTML(Template $t, $attributes, $nameParent)
                             . '" /></td></tr>';
                     } elseif (is_a($value[0], 'DOMNodeList')) {
                         // try to see if we have a NameID here
-                        /** @var \DOMNodeList $value [0] */
+                        /** @var \DOMNodeList $value[0] */
                         $n = $value[0]->length;
                         for ($idx = 0; $idx < $n; $idx++) {
                             $elem = $value[0]->item($idx);
@@ -231,7 +238,7 @@ private function getAttributesHTML(Template $t, $attributes, $nameParent)
      * @param array|string $attr
      * @return string
      */
-    private function presentList($attr)
+    private function presentList($attr): string
     {
         if (is_array($attr) && count($attr) > 1) {
             $str = '<ul>';
@@ -250,7 +257,7 @@ private function presentList($attr)
      * @param array|string $attr
      * @return string
      */
-    private function presentAssoc($attr)
+    private function presentAssoc($attr): string
     {
         if (is_array($attr)) {
             $str = '<dl>';
@@ -270,14 +277,15 @@ private function presentAssoc($attr)
      * @param \SAML2\XML\saml\NameID $nameID
      * @return string
      */
-    private function presentEptid(Translate $t, NameID $nameID)
+    private function presentEptid(Translate $t, NameID $nameID): string
     {
         $eptid = [
             'NameID' => [$nameID->getValue()],
         ];
         if ($nameID->getFormat() !== null) {
-            /** @var string $format */
-            $format = $t->t('{status:subject_format}');
+            $format = $t->getPreferredTranslation(
+                $t->getTag('{status:subject_format}') ?? ['en' => 'Format']
+            );
             $eptid[$format] = [$nameID->getFormat()];
         }
         if ($nameID->getNameQualifier() !== null) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/routes.yaml b/vendor/simplesamlphp/simplesamlphp/modules/admin/routes.yaml
deleted file mode 100644
index 34490c3f96e88236489c96e16185ffb0940b8d75..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/admin/routes.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-admin-main:
-    path:       /
-    defaults:   { _controller: 'SimpleSAML\Module\admin\ConfigController::main' }
-admin-diagnostics:
-    path:       /diagnostics
-    defaults:   { _controller: 'SimpleSAML\Module\admin\ConfigController::diagnostics' }
-admin-phpinfo:
-    path:       /phpinfo
-    defaults:   { _controller: 'SimpleSAML\Module\admin\ConfigController::phpinfo' }
-admin-test:
-    path:       /test/{as}
-    defaults:   { _controller: 'SimpleSAML\Module\admin\TestController::main', as: null }
-admin-fed:
-    path:       /federation
-    defaults:   { _controller: 'SimpleSAML\Module\admin\FederationController::main' }
-admin-fed-cert:
-    path:       /federation/cert
-    defaults:   { _controller: 'SimpleSAML\Module\admin\FederationController::downloadCert' }
-admin-fed-show:
-    path:       /federation/show
-    defaults:   { _controller: 'SimpleSAML\Module\admin\FederationController::showRemoteEntity' }
-admin-fed-converter:
-    path:       /federation/metadata-converter
-    defaults:   { _controller: 'SimpleSAML\Module\admin\FederationController::metadataConverter' }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/routing/routes/routes.yml b/vendor/simplesamlphp/simplesamlphp/modules/admin/routing/routes/routes.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3cff6ed4c5fb4ec82a4e83a7d3c5df5bae7812fa
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/admin/routing/routes/routes.yml
@@ -0,0 +1,24 @@
+admin-main:
+    path:       /
+    defaults:   { _controller: 'SimpleSAML\Module\admin\Controller\Config::main' }
+admin-diagnostics:
+    path:       /diagnostics
+    defaults:   { _controller: 'SimpleSAML\Module\admin\Controller\Config::diagnostics' }
+admin-phpinfo:
+    path:       /phpinfo
+    defaults:   { _controller: 'SimpleSAML\Module\admin\Controller\Config::phpinfo' }
+admin-test:
+    path:       /test/{as}
+    defaults:   { _controller: 'SimpleSAML\Module\admin\Controller\Test::main', as: null }
+admin-fed:
+    path:       /federation
+    defaults:   { _controller: 'SimpleSAML\Module\admin\Controller\Federation::main' }
+admin-fed-cert:
+    path:       /federation/cert
+    defaults:   { _controller: 'SimpleSAML\Module\admin\Controller\Federation::downloadCert' }
+admin-fed-show:
+    path:       /federation/show
+    defaults:   { _controller: 'SimpleSAML\Module\admin\Controller\Federation::showRemoteEntity' }
+admin-fed-converter:
+    path:       /federation/metadata-converter
+    defaults:   { _controller: 'SimpleSAML\Module\admin\Controller\Federation::metadataConverter' }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/authsource_list.twig b/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/authsource_list.twig
index 6a40aca0a4365e6026068a0e71b2eff36f6bf0e6..a5e731ab216971f64872bde3fd3d560c162a91fb 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/authsource_list.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/authsource_list.twig
@@ -8,7 +8,7 @@
     <h2>{{ pagetitle }} </h2>
     <ul>
     {% for key, name in sources %}
-        <li><a href="test/{{ name|escape('url') }}">{{ name }}</a></li>
+        <li><a href="{{ moduleURL('admin/test/' ~ name|escape('url')) }}">{{ name }}</a></li>
     {% endfor %}
     </ul>
 {% endblock %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/federation.twig b/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/federation.twig
index d9059ae761cc39b4e6eeeab39137a285607fc87f..7d7f2cf9094d108ece0bb90887d8a61cc766845d 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/federation.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/federation.twig
@@ -8,7 +8,6 @@
 
     <h2>{% trans %}Hosted entities{% endtrans %}</h2>
       {%- for key, set in entries.hosted %}
-        {%- set metadataset = attribute(set, 'metadata-set') %}
         {%- if not loop.first %}
 
         <br/>
@@ -17,13 +16,13 @@
           {%- block general %}
 
           <dl>
-            {%- if set.name %}
+            {%- if set.name is defined %}
 
               <dt>{{ set.name|translateFromArray }}</dt>
             {%- endif %}
 
             <dd>EntityID: <code>{{ set.entityid }}</code></dd>
-            {%- if set.deprecated %}
+            {%- if set.deprecated is defined and set.deprecated %}
 
               <dd><span class="entity-deprecated">Deprecated</span></dd>
             {%- endif %}
@@ -46,7 +45,7 @@
                 <a class="pure-button copy hljs" data-clipboard-target="#url-{{ key }}"
                    title="{% trans %}Copy to clipboard{% endtrans %}"><span class="fa fa-copy"></span></a>
                 <a class="pure-button hljs" href="{{ set.url }}">
-                  <span class="fa fa-external-link-square"></span>
+                  <span class="fa fa-external-link-square-alt"></span>
                 </a>
               </div>
               <code id="url-{{ key }}" class="code-box-content">{{ set.url }}</code>
@@ -105,11 +104,11 @@
       <ul>
       {% for entityid, entity in set %}
 
-        <li><a href="federation/show{{ ('?entityid=' ~ (entity.entityid|url_encode) ~ '&set=' ~ key) }}">
-          {%- if entity.name_translated -%}
+        <li><a href="{{ moduleURL('admin/federation/show?entityid=' ~ (entity.entityid|url_encode) ~ '&set=' ~ key) }}">
+          {%- if entity.name_translated is defined -%}
 
           {{ entity.name_translated }}
-          {%- elseif entity.organizationdisplayname_translated -%}
+          {%- elseif entity.organizationdisplayname_translated is defined -%}
 
           {{ entity.organizationdisplayname_translated }}
           {%- else -%}
@@ -117,16 +116,13 @@
           {{ entity.entityid|escape('html') }}
           {%- endif -%}
           </a>
-          {%- if entity.expire %}
-            {%- if entity.expire < date().timestamp %}
-
-          <span class="entity-expired"> (expired {{ ((date().timestamp - entity.expire) / 3600) }} hours ago)</span>
-            {%- else %}
-              {%- set expiration = (entity.expire - date().timestamp) / 3600 %}
-
-          ({% trans %}expires in {{ expiration }} hours{% endtrans %})
-            {%- endif -%}
-          {%- endif -%}
+          {% if entity.expire is defined %}
+            {% if entity.expire < date().timestamp %}
+              <span class="entity-expired"> ({% trans %}expired{% endtrans %} {{ entity.expire | time_diff }})</span>
+            {% else %}
+              <span class="entity-expires"> ({% trans %}expires{% endtrans %} {{ entity.expire | time_diff }})</span>
+            {% endif %}
+          {% endif %}
         </li>
       {% endfor %}
       </ul>
@@ -142,7 +138,7 @@
       {%- endfor %}
 
     </ul>
-    <form action="federation/show" method="get" class="pure-form">
+    <form action="{{ moduleURL('admin/federation/show') }}" method="get" class="pure-form">
       <fieldset class="fancyfieldset">
         <legend>{% trans %}Look up metadata for entity:{% endtrans %}</legend>
         <select name="set">
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/metadata_converter.twig b/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/metadata_converter.twig
index 785fe0f36cb5861c685a05a1fb80b37a5ffb8362..5c08911c1434723452dafd1d23e62c42508f9c03 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/metadata_converter.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/metadata_converter.twig
@@ -47,6 +47,14 @@
             <br><br>
             {%- set i=i+1 %}
         {%- endfor -%}
+    {% elseif error is not null %}
+    <br>
+    <h2 id="error">{{ 'An error occured'|trans }}</h2>
+    <div class="code-box">
+        <div class="code-box-content">
+            <pre id="error" class="fa fa-warning">&nbsp;&nbsp;{{ error }}</pre>
+        </div>
+    </div>
     {% endif -%}
 {% endblock content -%}
 {% block postload %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/show_metadata.twig b/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/show_metadata.twig
index ca51cca1cc41490a346a916e2f37244601f55531..24fdc3ea9235150343e333eebe5b1793382106d4 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/show_metadata.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/show_metadata.twig
@@ -13,6 +13,6 @@
         </div>
     </div>
     <div class="center">
-        <a href="../federation" class="pure-button pure-button-red">{{ 'Back'|trans }}</a>
+        <a href="{{ moduleURL('admin/federation') }}" class="pure-button pure-button-red">{{ 'Back'|trans }}</a>
     </div>
 {% endblock content %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/status.twig b/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/status.twig
index f0ff2556267ee693ae6551a54d58b290f0242ffc..44c87ccd24188c4b1e4eb67c002ff69754bd249a 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/status.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/admin/templates/status.twig
@@ -56,7 +56,8 @@
     {% endif %}
 
     {% if authData %}
-    <h3>{% trans %}Authentication data{% endtrans %}</h3>
+    <details>
+    <summary>{% trans %}Authentication data{% endtrans %}</summary>
     <div class="code-box hljs">
       <div class="pure-button-group top-right-corner">
         <a class="pure-button copy hljs" data-clipboard-target="#auth-data"
@@ -66,6 +67,7 @@
         {{- authData|json_encode(constant("JSON_PRETTY_PRINT") b-or constant("JSON_UNESCAPED_SLASHES")) }}
       </code>
     </div>
+    </details>
     <br/>
     {% endif %}
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authX509/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/authX509/composer.json
index 93af4b6cc09a4a6fcbc43ad4ba507c3291c04f1d..96ccbf9a40c6682c9b5a9b7e75637f221ab99b39 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/authX509/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authX509/composer.json
@@ -18,6 +18,10 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true,
+            "simplesamlphp/composer-module-installer": true
         }
     },
     "autoload": {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authX509/phpcs.xml b/vendor/simplesamlphp/simplesamlphp/modules/authX509/phpcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f7f6a20f3c6bff181f038c1af0279295e7c99469
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authX509/phpcs.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<ruleset name="SimpleSAMLphp ruleset">
+    <config name="ignore_warnings_on_exit" value="1"/>
+
+    <description>
+        By default it is less stringent about long lines than other coding standards
+    </description>
+
+    <file>lib</file>
+    <file>templates</file>
+    <file>tests</file>
+    <file>www</file>
+
+    <!-- This is the rule we inherit from. If you want to exlude some specific rules, see the docs on how to do that -->
+    <rule ref="PSR12"/>
+</ruleset>
+
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/.gitignore b/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ce45e2079dfd89a01b30303086b3b2a84f895810
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/.gitignore
@@ -0,0 +1,8 @@
+.phpunit.result.cache
+composer.lock
+composer.phar
+/vendor/
+
+# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
+# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
+# composer.lock
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/LICENSE
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..a345e48d049f9c6756e9364e908b3f26e36c9df1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/LICENSE
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/LICENSE
@@ -1,165 +1,459 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
 
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
 Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/codecov.yml
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/adfs/codecov.yml
rename to vendor/simplesamlphp/simplesamlphp/modules/authYubikey/codecov.yml
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/composer.json
index 7a7c70b37f092c133e4c3c21311515c19df342f2..8f8772a7d3b9f91a29146bfdeaf7c67ee09c5412 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authYubikey/composer.json
@@ -3,7 +3,7 @@
     "description": "A module that is able to authenticate against YubiKey",
     "type": "simplesamlphp-module",
     "keywords": ["simplesamlphp", "authyubikey"],
-    "license": "LGPL-3.0-or-later",
+    "license": "LGPL-2.1-or-later",
     "authors": [
         {
             "name": "Tim van Dijen",
@@ -14,10 +14,13 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true
         }
     },
     "extra": {
-        "ssp-mixedcase-module-name": "authYubikey"
+        "ssp-mixedcase-module-name": "authYubiKey"
     },
     "autoload": {
         "psr-4": {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authcrypt/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/authcrypt/composer.json
index ad05c24a654b02aea192c0a372c0a57ba930a9bf..c8c5aa833e31edffa8526951ef6faf88085e9821 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/authcrypt/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authcrypt/composer.json
@@ -14,6 +14,10 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true,
+            "simplesamlphp/composer-module-installer": true
         }
     },
     "autoload": {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/.php_cs.dist b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/.php_cs.dist
deleted file mode 100644
index aba775e95879036ecc29dfdb23ccaf3d5adfee9f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/.php_cs.dist
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-$finder = PhpCsFixer\Finder::create()
-    ->in([
-        __DIR__ . '/lib',
-        __DIR__ . '/extlibinc',
-        __DIR__ . '/tests',
-        __DIR__ . '/www',
-    ])
-;
-return PhpCsFixer\Config::create()
-    ->setRules([
-        '@PSR2' => true,
-        '@PSR4' => true,
-        '@PSR5' => true,
-    ])
-    ->setFinder($finder)
-;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/.travis.yml
deleted file mode 100644
index 208a6d6c78faaea8f1720aff7a6a2a756d266ab3..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/.travis.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-sudo: required
-
-language: php
-
-php:
-  - 5.6
-  - 7.0
-  - 7.1
-  - 7.2
-  - 7.3
-
-env:
-  - SIMPLESAMLPHP_VERSION=1.17.*
-
-before_script:
-  - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
-  - composer update --no-interaction
-
-script:
-  - vendor/simplesamlphp/simplesamlphp-test-framework/bin/check-syntax-php.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
-
-after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/LICENSE
deleted file mode 100644
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/LICENSE
+++ /dev/null
@@ -1,165 +0,0 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/composer.json
deleted file mode 100644
index ffee58ae498908d4b5fc3838585d507c5795af6c..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/composer.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-    "name": "simplesamlphp/simplesamlphp-module-authfacebook",
-    "description": "A module that is able to authenticate against Facebook",
-    "type": "simplesamlphp-module",
-    "keywords": ["simplesamlphp", "facebook"],
-    "license": "LGPL-3.0-or-later",
-    "authors": [
-        {
-            "name": "Andjelko Horvat",
-            "email": "comel@vingd.com"
-        },
-        {
-            "name": "Tim van Dijen",
-            "email": "tvdijen@gmail.com"
-        }
-    ],
-    "config": {
-        "preferred-install": {
-            "simplesamlphp/simplesamlphp": "source",
-            "*": "dist"
-        }
-    },
-    "autoload": {
-        "psr-4": {
-            "SimpleSAML\\Module\\authfacebook\\": "lib/"
-        }
-    },
-    "autoload-dev": {
-        "psr-4": {
-            "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils"
-        }
-    },
-    "require": {
-        "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1"
-    },
-    "require-dev": {
-        "simplesamlphp/simplesamlphp": "^1.17",
-        "simplesamlphp/simplesamlphp-test-framework": "^0.0.10"
-    },
-    "support": {
-        "issues": "https://github.com/simplesamlphp/simplesamlphp-module-authfacebook/issues",
-        "source": "https://github.com/simplesamlphp/simplesamlphp-module-authfacebook"
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/default-disable b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/default-disable
deleted file mode 100644
index fa0bd82e2df7bd79d57593d35bc53c1f9d3ef71f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/default-disable
+++ /dev/null
@@ -1,3 +0,0 @@
-This file indicates that the default state of this module
-is disabled. To enable, create a file named enable in the
-same directory as this file.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/docs/authfacebook.md b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/docs/authfacebook.md
deleted file mode 100644
index 41de42681fed292cb3aed7f6cddfdecde46d1116..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/docs/authfacebook.md
+++ /dev/null
@@ -1,13 +0,0 @@
-Using the Facebook authentication source with SimpleSAMLphp
-===========================================================
-
-Remember to configure `authsources.php`, with both App ID (or API Key) and App Secret.
-
-To get an App ID/API Key and secret, register the application at:
-
- * <http://www.facebook.com/developers/>
-
-Note: requests with App ID should be faster <https://github.com/facebook/php-sdk/issues/214>.
-
-This module needs the CURL and JSON PHP extensions.
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/extlibinc/base_facebook.php b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/extlibinc/base_facebook.php
deleted file mode 100644
index e53c2b2769ac343ab79d28dbb0cf51b161ba6ec9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/extlibinc/base_facebook.php
+++ /dev/null
@@ -1,1488 +0,0 @@
-<?php
-/**
- * Copyright 2011 Facebook, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License. You may obtain
- * a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-if (!function_exists('curl_init')) {
-    throw new Exception('Facebook needs the CURL PHP extension.');
-}
-if (!function_exists('json_decode')) {
-    throw new Exception('Facebook needs the JSON PHP extension.');
-}
-
-/**
- * Thrown when an API call returns an exception.
- *
- * @author Naitik Shah <naitik@facebook.com>
- */
-class FacebookApiException extends Exception
-{
-    /**
-     * The result from the API server that represents the exception information.
-     */
-    protected $result;
-
-    /**
-     * Make a new API Exception with the given result.
-     *
-     * @param array $result The result from the API server
-     */
-    public function __construct($result)
-    {
-        $this->result = $result;
-
-        $code = isset($result['error_code']) ? $result['error_code'] : 0;
-
-        if (isset($result['error_description'])) {
-            // OAuth 2.0 Draft 10 style
-            $msg = $result['error_description'];
-        } elseif (isset($result['error']) && is_array($result['error'])) {
-            // OAuth 2.0 Draft 00 style
-            $msg = $result['error']['message'];
-        } elseif (isset($result['error_msg'])) {
-            // Rest server style
-            $msg = $result['error_msg'];
-        } else {
-            $msg = 'Unknown Error. Check getResult()';
-        }
-
-        parent::__construct($msg, $code);
-    }
-
-    /**
-     * Return the associated result object returned by the API server.
-     *
-     * @return array The result from the API server
-     */
-    public function getResult()
-    {
-        return $this->result;
-    }
-
-    /**
-     * Returns the associated type for the error. This will default to
-     * 'Exception' when a type is not available.
-     *
-     * @return string
-     */
-    public function getType()
-    {
-        if (isset($this->result['error'])) {
-            $error = $this->result['error'];
-            if (is_string($error)) {
-                // OAuth 2.0 Draft 10 style
-                return $error;
-            } elseif (is_array($error)) {
-                // OAuth 2.0 Draft 00 style
-                if (isset($error['type'])) {
-                    return $error['type'];
-                }
-            }
-        }
-
-        return 'Exception';
-    }
-
-    /**
-     * To make debugging easier.
-     *
-     * @return string The string representation of the error
-     */
-    public function __toString()
-    {
-        $str = $this->getType() . ': ';
-        if ($this->code != 0) {
-            $str .= $this->code . ': ';
-        }
-        return $str . $this->message;
-    }
-}
-
-/**
- * Provides access to the Facebook Platform.  This class provides
- * a majority of the functionality needed, but the class is abstract
- * because it is designed to be sub-classed.  The subclass must
- * implement the four abstract methods listed at the bottom of
- * the file.
- *
- * @author Naitik Shah <naitik@facebook.com>
- */
-abstract class BaseFacebook
-{
-    /**
-     * Version.
-     */
-    const VERSION = '3.2.2';
-
-    /**
-     * Signed Request Algorithm.
-     */
-    const SIGNED_REQUEST_ALGORITHM = 'HMAC-SHA256';
-
-    /**
-     * Default options for curl.
-     */
-    public static $CURL_OPTS = [
-        CURLOPT_CONNECTTIMEOUT => 10,
-        CURLOPT_RETURNTRANSFER => true,
-        CURLOPT_TIMEOUT        => 60,
-        CURLOPT_USERAGENT      => 'facebook-php-3.2',
-    ];
-
-    /**
-     * Maps aliases to Facebook domains.
-     */
-    public static $DOMAIN_MAP = [
-        'api'         => 'https://api.facebook.com/',
-        'api_video'   => 'https://api-video.facebook.com/',
-        'api_read'    => 'https://api-read.facebook.com/',
-        'graph'       => 'https://graph.facebook.com/',
-        'graph_video' => 'https://graph-video.facebook.com/',
-        'www'         => 'https://www.facebook.com/',
-    ];
-
-    /**
-     * The Application ID.
-     *
-     * @var string
-     */
-    protected $appId;
-
-    /**
-     * The Application App Secret.
-     *
-     * @var string
-     */
-    protected $appSecret;
-
-    /**
-     * The ID of the Facebook user, or 0 if the user is logged out.
-     *
-     * @var integer|null
-     */
-    protected $user = null;
-
-    /**
-     * The data from the signed_request token.
-     * @var array|null
-     */
-    protected $signedRequest = null;
-
-    /**
-     * A CSRF state variable to assist in the defense against CSRF attacks.
-     * @var string|null
-     */
-    protected $state = null;
-
-    /**
-     * The OAuth access token received in exchange for a valid authorization
-     * code.  null means the access token has yet to be determined.
-     *
-     * @var string|null
-     */
-    protected $accessToken = null;
-
-    /**
-     * Indicates if the CURL based @ syntax for file uploads is enabled.
-     *
-     * @var boolean
-     */
-    protected $fileUploadSupport = false;
-
-    /**
-     * Indicates if we trust HTTP_X_FORWARDED_* headers.
-     *
-     * @var boolean
-     */
-    protected $trustForwarded = false;
-
-    /**
-     * Initialize a Facebook Application.
-     *
-     * The configuration:
-     * - appId: the application ID
-     * - secret: the application secret
-     * - fileUpload: (optional) boolean indicating if file uploads are enabled
-     *
-     * @param array $config The application configuration
-     */
-    public function __construct($config)
-    {
-        $this->setAppId($config['appId']);
-        $this->setAppSecret($config['secret']);
-        if (isset($config['fileUpload'])) {
-            $this->setFileUploadSupport($config['fileUpload']);
-        }
-        if (isset($config['trustForwarded']) && $config['trustForwarded']) {
-            $this->trustForwarded = true;
-        }
-        $state = $this->getPersistentData('state');
-        if (!empty($state)) {
-            $this->state = $state;
-        }
-    }
-
-    /**
-     * Set the Application ID.
-     *
-     * @param string $appId The Application ID
-     * @return BaseFacebook
-     */
-    public function setAppId($appId)
-    {
-        $this->appId = $appId;
-        return $this;
-    }
-
-    /**
-     * Get the Application ID.
-     *
-     * @return string the Application ID
-     */
-    public function getAppId()
-    {
-        return $this->appId;
-    }
-
-    /**
-     * Set the App Secret.
-     *
-     * @param string $apiSecret The App Secret
-     * @return BaseFacebook
-     * @deprecated
-     */
-    public function setApiSecret($apiSecret)
-    {
-        $this->setAppSecret($apiSecret);
-        return $this;
-    }
-
-    /**
-     * Set the App Secret.
-     *
-     * @param string $appSecret The App Secret
-     * @return BaseFacebook
-     */
-    public function setAppSecret($appSecret)
-    {
-        $this->appSecret = $appSecret;
-        return $this;
-    }
-
-    /**
-     * Get the App Secret.
-     *
-     * @return string the App Secret
-     * @deprecated
-     */
-    public function getApiSecret()
-    {
-        return $this->getAppSecret();
-    }
-
-    /**
-     * Get the App Secret.
-     *
-     * @return string the App Secret
-     */
-    public function getAppSecret()
-    {
-        return $this->appSecret;
-    }
-
-    /**
-     * Set the file upload support status.
-     *
-     * @param boolean $fileUploadSupport The file upload support status.
-     * @return BaseFacebook
-     */
-    public function setFileUploadSupport($fileUploadSupport)
-    {
-        $this->fileUploadSupport = $fileUploadSupport;
-        return $this;
-    }
-
-    /**
-     * Get the file upload support status.
-     *
-     * @return boolean true if and only if the server supports file upload.
-     */
-    public function getFileUploadSupport()
-    {
-        return $this->fileUploadSupport;
-    }
-
-    /**
-     * DEPRECATED! Please use getFileUploadSupport instead.
-     *
-     * Get the file upload support status.
-     *
-     * @return boolean true if and only if the server supports file upload.
-     */
-    public function useFileUploadSupport()
-    {
-        return $this->getFileUploadSupport();
-    }
-
-    /**
-     * Sets the access token for api calls.  Use this if you get
-     * your access token by other means and just want the SDK
-     * to use it.
-     *
-     * @param string $access_token an access token.
-     * @return BaseFacebook
-     */
-    public function setAccessToken($access_token)
-    {
-        $this->accessToken = $access_token;
-        return $this;
-    }
-
-    /**
-     * Extend an access token, while removing the short-lived token that might
-     * have been generated via client-side flow. Thanks to http://bit.ly/b0Pt0H
-     * for the workaround.
-     *
-     * @return boolean Return true is the access token is set.
-     */
-    public function setExtendedAccessToken()
-    {
-        try {
-            // need to circumvent json_decode by calling _oauthRequest
-            // directly, since response isn't JSON format
-            $access_token_response = $this->_oauthRequest(
-                $this->getUrl('graph', '/oauth/access_token'),
-                $params = [
-                    'client_id' => $this->getAppId(),
-                    'client_secret' => $this->getAppSecret(),
-                    'grant_type' => 'fb_exchange_token',
-                    'fb_exchange_token' => $this->getAccessToken(),
-                ]
-            );
-        } catch (FacebookApiException $e) {
-            // most likely that user very recently revoked authorization
-            // In any event, we don't have an access token, so say so
-            return false;
-        }
-
-        if (empty($access_token_response)) {
-            return false;
-        }
-
-        $response_params = [];
-        parse_str($access_token_response, $response_params);
-
-        if (!isset($response_params['access_token'])) {
-            return false;
-        }
-
-        $this->destroySession();
-
-        $this->setPersistentData(
-            'access_token',
-            $response_params['access_token']
-        );
-        return true;
-    }
-
-    /**
-     * Determines the access token that should be used for API calls.
-     * The first time this is called, $this->accessToken is set equal
-     * to either a valid user access token, or it's set to the application
-     * access token if a valid user access token wasn't available.  Subsequent
-     * calls return whatever the first call returned.
-     *
-     * @return string|null The access token
-     */
-    public function getAccessToken()
-    {
-        if ($this->accessToken !== null) {
-            // we've done this already and cached it.  Just return.
-            return $this->accessToken;
-        }
-
-        // first establish access token to be the application
-        // access token, in case we navigate to the /oauth/access_token
-        // endpoint, where SOME access token is required
-        $this->setAccessToken($this->getApplicationAccessToken());
-        $user_access_token = $this->getUserAccessToken();
-        if ($user_access_token) {
-            $this->setAccessToken($user_access_token);
-        }
-
-        return $this->accessToken;
-    }
-
-    /**
-     * Determines and returns the user access token, first using
-     * the signed request if present, and then falling back on
-     * the authorization code if present.  The intent is to
-     * return a valid user access token, or false if one is determined
-     * to not be available.
-     *
-     * @return false|string A valid user access token, or false if one
-     *                could not be determined.
-     */
-    protected function getUserAccessToken()
-    {
-        // first, consider a signed request if it's supplied
-        // if there is a signed request, then it alone determines
-        // the access token
-        $signed_request = $this->getSignedRequest();
-        if ($signed_request) {
-            // apps.facebook.com hands the access_token in the signed_request
-            if (array_key_exists('oauth_token', $signed_request)) {
-                $access_token = $signed_request['oauth_token'];
-                $this->setPersistentData('access_token', $access_token);
-                return $access_token;
-            }
-
-            // the JS SDK puts a code in with the redirect_uri of ''
-            if (array_key_exists('code', $signed_request)) {
-                $code = $signed_request['code'];
-                if ($code && $code == $this->getPersistentData('code')) {
-                    // short-circuit if the code we have is the same as the one presented
-                    return $this->getPersistentData('access_token');
-                }
-
-                $access_token = $this->getAccessTokenFromCode($code, '');
-                if ($access_token) {
-                    $this->setPersistentData('code', $code);
-                    $this->setPersistentData('access_token', $access_token);
-                    return $access_token;
-                }
-            }
-
-            // signed request states there's no access token, so anything
-            // stored should be cleared
-            $this->clearAllPersistentData();
-            return false;
-            // respect the signed request's data, even if there's an authorization code or something else
-        }
-
-        $code = $this->getCode();
-        if ($code && $code != $this->getPersistentData('code')) {
-            $access_token = $this->getAccessTokenFromCode($code);
-            if ($access_token) {
-                $this->setPersistentData('code', $code);
-                $this->setPersistentData('access_token', $access_token);
-                return $access_token;
-            }
-
-            // code was bogus, so everything based on it should be invalidated
-            $this->clearAllPersistentData();
-            return false;
-        }
-
-        // as a fallback, just return whatever is in the persistent
-        // store, knowing nothing explicit (signed request, authorization
-        // code, etc.) was present to shadow it (or we saw a code in $_REQUEST,
-        // but it's the same as what's in the persistent store)
-        return $this->getPersistentData('access_token');
-    }
-
-    /**
-     * Retrieve the signed request, either from a request parameter or,
-     * if not present, from a cookie.
-     *
-     * @return array|null the signed request, if available, or null otherwise.
-     */
-    public function getSignedRequest()
-    {
-        if (!$this->signedRequest) {
-            if (!empty($_REQUEST['signed_request'])) {
-                $this->signedRequest = $this->parseSignedRequest(
-                    $_REQUEST['signed_request']
-                );
-            } elseif (!empty($_COOKIE[$this->getSignedRequestCookieName()])) {
-                $this->signedRequest = $this->parseSignedRequest(
-                    $_COOKIE[$this->getSignedRequestCookieName()]
-                );
-            }
-        }
-        return $this->signedRequest;
-    }
-
-    /**
-     * Get the UID of the connected user, or 0
-     * if the Facebook user is not connected.
-     *
-     * @return int the UID if available.
-     */
-    public function getUser()
-    {
-        if ($this->user !== null) {
-            // we've already determined this and cached the value
-            return $this->user;
-        }
-
-        return $this->user = $this->getUserFromAvailableData();
-    }
-
-    /**
-     * Determines the connected user by first examining any signed
-     * requests, then considering an authorization code, and then
-     * falling back to any persistent store storing the user.
-     *
-     * @return int The id of the connected Facebook user,
-     *                 or 0 if no such user exists.
-     */
-    protected function getUserFromAvailableData()
-    {
-        // if a signed request is supplied, then it solely determines
-        // who the user is
-        $signed_request = $this->getSignedRequest();
-        if ($signed_request) {
-            if (array_key_exists('user_id', $signed_request)) {
-                $user = $signed_request['user_id'];
-
-                if ($user != $this->getPersistentData('user_id')) {
-                    $this->clearAllPersistentData();
-                }
-
-                $this->setPersistentData('user_id', $signed_request['user_id']);
-                return $user;
-            }
-
-            // if the signed request didn't present a user id, then invalidate
-            // all entries in any persistent store
-            $this->clearAllPersistentData();
-            return 0;
-        }
-
-        $user = $this->getPersistentData('user_id', $default = false);
-        $persisted_access_token = $this->getPersistentData('access_token');
-
-        // use access_token to fetch user id if we have a user access_token, or if
-        // the cached access token has changed
-        $access_token = $this->getAccessToken();
-        if (
-            $access_token
-            && $access_token != $this->getApplicationAccessToken()
-            && !($user
-            && $persisted_access_token == $access_token)
-        ) {
-            $user = $this->getUserFromAccessToken();
-            if ($user) {
-                $this->setPersistentData('user_id', $user);
-            } else {
-                $this->clearAllPersistentData();
-            }
-        }
-
-        return $user;
-    }
-
-    /**
-     * Get a Login URL for use with redirects. By default, full page redirect is
-     * assumed. If you are using the generated URL with a window.open() call in
-     * JavaScript, you can pass in display=popup as part of the $params.
-     *
-     * The parameters:
-     * - redirect_uri: the URL to go to after a successful login
-     * - scope: comma separated list of requested extended perms
-     *
-     * @param array $params Provide custom parameters
-     * @return string The URL for the login flow
-     */
-    public function getLoginUrl($params = [])
-    {
-        $this->establishCSRFTokenState();
-        $currentUrl = $this->getCurrentUrl();
-
-        // if 'scope' is passed as an array, convert to comma separated list
-        $scopeParams = isset($params['scope']) ? $params['scope'] : null;
-        if ($scopeParams && is_array($scopeParams)) {
-            $params['scope'] = implode(',', $scopeParams);
-        }
-
-        return $this->getUrl(
-            'www',
-            'dialog/oauth',
-            array_merge(
-                [
-                    'client_id' => $this->getAppId(),
-                    'redirect_uri' => $currentUrl, // possibly overwritten
-                    'state' => $this->state
-                ],
-                $params
-            )
-        );
-    }
-
-    /**
-     * Get a Logout URL suitable for use with redirects.
-     *
-     * The parameters:
-     * - next: the URL to go to after a successful logout
-     *
-     * @param array $params Provide custom parameters
-     * @return string The URL for the logout flow
-     */
-    public function getLogoutUrl($params = [])
-    {
-        return $this->getUrl(
-            'www',
-            'logout.php',
-            array_merge([
-                'next' => $this->getCurrentUrl(),
-                'access_token' => $this->getUserAccessToken(),
-            ], $params)
-        );
-    }
-
-    /**
-     * Get a login status URL to fetch the status from Facebook.
-     *
-     * The parameters:
-     * - ok_session: the URL to go to if a session is found
-     * - no_session: the URL to go to if the user is not connected
-     * - no_user: the URL to go to if the user is not signed into facebook
-     *
-     * @param array $params Provide custom parameters
-     * @return string The URL for the logout flow
-     */
-    public function getLoginStatusUrl($params = [])
-    {
-        return $this->getUrl(
-            'www',
-            'extern/login_status.php',
-            array_merge([
-                'api_key' => $this->getAppId(),
-                'no_session' => $this->getCurrentUrl(),
-                'no_user' => $this->getCurrentUrl(),
-                'ok_session' => $this->getCurrentUrl(),
-                'session_version' => 3,
-            ], $params)
-        );
-    }
-
-    /**
-     * Make an API call.
-     *
-     * @return mixed The decoded response
-     */
-    public function api(/* polymorphic */)
-    {
-        $args = func_get_args();
-        if (is_array($args[0])) {
-            return $this->_restserver($args[0]);
-        } else {
-            return call_user_func_array([$this, '_graph'], $args);
-        }
-    }
-
-    /**
-     * Constructs and returns the name of the cookie that
-     * potentially houses the signed request for the app user.
-     * The cookie is not set by the BaseFacebook class, but
-     * it may be set by the JavaScript SDK.
-     *
-     * @return string the name of the cookie that would house
-     *         the signed request value.
-     */
-    protected function getSignedRequestCookieName()
-    {
-        return 'fbsr_' . $this->getAppId();
-    }
-
-    /**
-     * Constructs and returns the name of the coookie that potentially contain
-     * metadata. The cookie is not set by the BaseFacebook class, but it may be
-     * set by the JavaScript SDK.
-     *
-     * @return string the name of the cookie that would house metadata.
-     */
-    protected function getMetadataCookieName()
-    {
-        return 'fbm_' . $this->getAppId();
-    }
-
-    /**
-     * Get the authorization code from the query parameters, if it exists,
-     * and otherwise return false to signal no authorization code was
-     * discoverable.
-     *
-     * @return mixed The authorization code, or false if the authorization
-     *               code could not be determined.
-     */
-    protected function getCode()
-    {
-        if (isset($_REQUEST['code'])) {
-            if (
-                $this->state !== null
-                && isset($_REQUEST['state'])
-                && $this->state === $_REQUEST['state']
-            ) {
-                // CSRF state has done its job, so clear it
-                $this->state = null;
-                $this->clearPersistentData('state');
-                return $_REQUEST['code'];
-            } else {
-                self::errorLog(
-                    'CSRF state token does not match one provided. ' . strval($this->state) . '!=' . $_REQUEST['state']
-                );
-                return false;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Retrieves the UID with the understanding that
-     * $this->accessToken has already been set and is
-     * seemingly legitimate.  It relies on Facebook's Graph API
-     * to retrieve user information and then extract
-     * the user ID.
-     *
-     * @return integer Returns the UID of the Facebook user, or 0
-     *                 if the Facebook user could not be determined.
-     */
-    protected function getUserFromAccessToken()
-    {
-        try {
-            $user_info = $this->api('/me');
-            return $user_info['id'];
-        } catch (FacebookApiException $e) {
-            return 0;
-        }
-    }
-
-    /**
-     * Returns the access token that should be used for logged out
-     * users when no authorization code is available.
-     *
-     * @return string The application access token, useful for gathering
-     *                public information about users and applications.
-     */
-    protected function getApplicationAccessToken()
-    {
-        return $this->appId . '|' . $this->appSecret;
-    }
-
-    /**
-     * Lays down a CSRF state token for this process.
-     *
-     * @return void
-     */
-    protected function establishCSRFTokenState()
-    {
-        if ($this->state === null) {
-            $this->state = md5(uniqid(strval(mt_rand()), true));
-            $this->setPersistentData('state', $this->state);
-        }
-    }
-
-    /**
-     * Retrieves an access token for the given authorization code
-     * (previously generated from www.facebook.com on behalf of
-     * a specific user).  The authorization code is sent to graph.facebook.com
-     * and a legitimate access token is generated provided the access token
-     * and the user for which it was generated all match, and the user is
-     * either logged in to Facebook or has granted an offline access permission.
-     *
-     * @param string $code An authorization code.
-     * @param string|null $redirect_uri
-     * @return mixed An access token exchanged for the authorization code, or
-     *               false if an access token could not be generated.
-     */
-    protected function getAccessTokenFromCode($code, $redirect_uri = null)
-    {
-        if (empty($code)) {
-            return false;
-        }
-
-        if ($redirect_uri === null) {
-            $redirect_uri = $this->getCurrentUrl();
-        }
-
-        try {
-            //self::errorLog('Redirect uri is ' . $redirect_uri);
-            // need to circumvent json_decode by calling _oauthRequest
-            // directly, since response isn't JSON format
-            $access_token_response =
-                $this->_oauthRequest(
-                    $this->getUrl('graph', '/oauth/access_token'),
-                    $params = [
-                        'client_id' => $this->getAppId(),
-                        'client_secret' => $this->getAppSecret(),
-                        'redirect_uri' => $redirect_uri,
-                        'code' => $code
-                    ]
-                );
-        } catch (FacebookApiException $e) {
-            self::errorLog($e->getMessage());
-            // most likely that user very recently revoked authorization.
-            // In any event, we don't have an access token, so say so.
-            return false;
-        }
-
-        if (empty($access_token_response)) {
-            self::errorLog('No access token response');
-            return false;
-        }
-
-        $response_params = json_decode($access_token_response, true);
-        if (!isset($response_params['access_token'])) {
-            self::errorLog('No access token in response. ' . $access_token_response);
-            return false;
-        }
-
-        return $response_params['access_token'];
-    }
-
-    /**
-     * Invoke the old restserver.php endpoint.
-     *
-     * @param array $params Method call object
-     *
-     * @return mixed The decoded response object
-     * @throws FacebookApiException
-     */
-    protected function _restserver($params)
-    {
-        // generic application level parameters
-        $params['api_key'] = $this->getAppId();
-        $params['format'] = 'json-strings';
-
-        $result = $this->_oauthRequest(
-            $this->getApiUrl($params['method']),
-            $params
-        );
-
-        $result = json_decode($result, true);
-
-        // results are returned, errors are thrown
-        if (is_array($result) && isset($result['error_code'])) {
-            $this->throwAPIException($result);
-            // @codeCoverageIgnoreStart
-        }
-        // @codeCoverageIgnoreEnd
-
-        $method = strtolower($params['method']);
-        if (
-            $method === 'auth.expiresession'
-            || $method === 'auth.revokeauthorization'
-        ) {
-            $this->destroySession();
-        }
-
-        return $result;
-    }
-
-    /**
-     * Return true if this is video post.
-     *
-     * @param string $path The path
-     * @param string $method The http method (default 'GET')
-     *
-     * @return boolean true if this is video post
-     */
-    protected function isVideoPost($path, $method = 'GET')
-    {
-        if ($method == 'POST' && preg_match("/^(\/)(.+)(\/)(videos)$/", $path)) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Invoke the Graph API.
-     *
-     * @param string $path The path (required)
-     * @param array|string $method The http method (default 'GET')
-     * @param array $params The query/post data
-     *
-     * @return mixed The decoded response object
-     * @throws FacebookApiException
-     */
-    protected function _graph($path, $method = 'GET', $params = [])
-    {
-        if (is_array($method) && empty($params)) {
-            $params = $method;
-            $method = 'GET';
-        }
-
-        /** @var string $method */
-        $params['method'] = $method; // method override as we always do a POST
-
-        if ($this->isVideoPost($path, $method)) {
-            $domainKey = 'graph_video';
-        } else {
-            $domainKey = 'graph';
-        }
-
-        $result = $this->_oauthRequest(
-            $this->getUrl($domainKey, $path),
-            $params
-        );
-
-        $result = json_decode($result, true);
-
-        // results are returned, errors are thrown
-        if (is_array($result) && isset($result['error'])) {
-            $this->throwAPIException($result);
-            // @codeCoverageIgnoreStart
-        }
-        // @codeCoverageIgnoreEnd
-
-        return $result;
-    }
-
-    /**
-     * Make a OAuth Request.
-     *
-     * @param string $url The path (required)
-     * @param array $params The query/post data
-     *
-     * @return string The decoded response object
-     * @throws FacebookApiException
-     */
-    protected function _oauthRequest($url, $params)
-    {
-        if (!isset($params['access_token'])) {
-            $params['access_token'] = $this->getAccessToken();
-        }
-
-        // json_encode all params values that are not strings
-        foreach ($params as $key => $value) {
-            if (!is_string($value)) {
-                $params[$key] = json_encode($value);
-            }
-        }
-
-        return $this->makeRequest($url, $params);
-    }
-
-    /**
-     * Makes an HTTP request. This method can be overridden by subclasses if
-     * developers want to do fancier things or use something other than curl to
-     * make the request.
-     *
-     * @param string $url The URL to make the request to
-     * @param array $params The parameters to use for the POST body
-     * @param resource|null $ch Initialized curl handle
-     *
-     * @return string The response text
-     */
-    protected function makeRequest($url, $params, $ch = null)
-    {
-        if ($ch === null) {
-            $ch = curl_init();
-        }
-
-        $opts = self::$CURL_OPTS;
-        if ($this->getFileUploadSupport()) {
-            $opts[CURLOPT_POSTFIELDS] = $params;
-        } else {
-            $opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
-        }
-        $opts[CURLOPT_URL] = $url;
-
-        // disable the 'Expect: 100-continue' behaviour. This causes CURL to wait
-        // for 2 seconds if the server does not support this header
-        if (isset($opts[CURLOPT_HTTPHEADER])) {
-            $existing_headers = $opts[CURLOPT_HTTPHEADER];
-            $existing_headers[] = 'Expect:';
-            $opts[CURLOPT_HTTPHEADER] = $existing_headers;
-        } else {
-            $opts[CURLOPT_HTTPHEADER] = ['Expect:'];
-        }
-
-        curl_setopt_array($ch, $opts);
-        $result = curl_exec($ch);
-
-        if (curl_errno($ch) == 60) {
-            // CURLE_SSL_CACERT
-            self::errorLog('Invalid or no certificate authority found, using bundled information');
-            curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/fb_ca_chain_bundle.crt');
-            $result = curl_exec($ch);
-        }
-
-        // With dual stacked DNS responses, it's possible for a server to
-        // have IPv6 enabled but not have IPv6 connectivity.  If this is
-        // the case, curl will try IPv4 first and if that fails, then it will
-        // fall back to IPv6 and the error EHOSTUNREACH is returned by the
-        // operating system
-        if ($result === false && empty($opts[CURLOPT_IPRESOLVE])) {
-            $matches = [];
-            $regex = '/Failed to connect to ([^:].*): Network is unreachable/';
-            if (preg_match($regex, curl_error($ch), $matches)) {
-                if (strlen(@inet_pton($matches[1])) === 16) {
-                    self::errorLog('Invalid IPv6 configuration on server, ' .
-                            'Please disable or get native IPv6 on your server.');
-                    self::$CURL_OPTS[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
-                    curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
-                    $result = curl_exec($ch);
-                }
-            }
-        }
-
-        if ($result === false) {
-            $e = new FacebookApiException([
-                'error_code' => curl_errno($ch),
-                'error' => [
-                    'message' => curl_error($ch),
-                    'type' => 'CurlException',
-                ],
-            ]);
-            curl_close($ch);
-            throw $e;
-        }
-        curl_close($ch);
-        /** @var string $result */
-        return $result;
-    }
-
-    /**
-     * Parses a signed_request and validates the signature.
-     *
-     * @param string $signed_request A signed token
-     * @return array|null The payload inside it or null if the sig is wrong
-     */
-    protected function parseSignedRequest($signed_request)
-    {
-        list($encoded_sig, $payload) = explode('.', $signed_request, 2);
-
-        // decode the data
-        $sig = self::base64UrlDecode($encoded_sig);
-        $data = json_decode(self::base64UrlDecode($payload), true);
-
-        if (strtoupper($data['algorithm']) !== self::SIGNED_REQUEST_ALGORITHM) {
-            self::errorLog('Unknown algorithm. Expected ' . self::SIGNED_REQUEST_ALGORITHM);
-            return null;
-        }
-
-        // check sig
-        $expected_sig = hash_hmac('sha256', $payload, $this->getAppSecret(), $raw = true);
-        if ($sig !== $expected_sig) {
-            self::errorLog('Bad Signed JSON signature!');
-            return null;
-        }
-
-        return $data;
-    }
-
-    /**
-     * Makes a signed_request blob using the given data.
-     *
-     * @param array $data The data array.
-     * @return string The signed request.
-     */
-    protected function makeSignedRequest(array $data)
-    {
-        $data['algorithm'] = self::SIGNED_REQUEST_ALGORITHM;
-        $data['issued_at'] = time();
-        $json = json_encode($data);
-        $b64 = self::base64UrlEncode($json);
-        $raw_sig = hash_hmac('sha256', $b64, $this->getAppSecret(), $raw = true);
-        $sig = self::base64UrlEncode($raw_sig);
-        return $sig . ' . ' . $b64;
-    }
-
-    /**
-     * Build the URL for api given parameters.
-     *
-     * @param string $method String the method name.
-     * @return string The URL for the given parameters
-     */
-    protected function getApiUrl($method)
-    {
-        static $READ_ONLY_CALLS =
-            [
-                'admin.getallocation' => 1,
-                'admin.getappproperties' => 1,
-                'admin.getbannedusers' => 1,
-                'admin.getlivestreamvialink' => 1,
-                'admin.getmetrics' => 1,
-                'admin.getrestrictioninfo' => 1,
-                'application.getpublicinfo' => 1,
-                'auth.getapppublickey' => 1,
-                'auth.getsession' => 1,
-                'auth.getsignedpublicsessiondata' => 1,
-                'comments.get' => 1,
-                'connect.getunconnectedfriendscount' => 1,
-                'dashboard.getactivity' => 1,
-                'dashboard.getcount' => 1,
-                'dashboard.getglobalnews' => 1,
-                'dashboard.getnews' => 1,
-                'dashboard.multigetcount' => 1,
-                'dashboard.multigetnews' => 1,
-                'data.getcookies' => 1,
-                'events.get' => 1,
-                'events.getmembers' => 1,
-                'fbml.getcustomtags' => 1,
-                'feed.getappfriendstories' => 1,
-                'feed.getregisteredtemplatebundlebyid' => 1,
-                'feed.getregisteredtemplatebundles' => 1,
-                'fql.multiquery' => 1,
-                'fql.query' => 1,
-                'friends.arefriends' => 1,
-                'friends.get' => 1,
-                'friends.getappusers' => 1,
-                'friends.getlists' => 1,
-                'friends.getmutualfriends' => 1,
-                'gifts.get' => 1,
-                'groups.get' => 1,
-                'groups.getmembers' => 1,
-                'intl.gettranslations' => 1,
-                'links.get' => 1,
-                'notes.get' => 1,
-                'notifications.get' => 1,
-                'pages.getinfo' => 1,
-                'pages.isadmin' => 1,
-                'pages.isappadded' => 1,
-                'pages.isfan' => 1,
-                'permissions.checkavailableapiaccess' => 1,
-                'permissions.checkgrantedapiaccess' => 1,
-                'photos.get' => 1,
-                'photos.getalbums' => 1,
-                'photos.gettags' => 1,
-                'profile.getinfo' => 1,
-                'profile.getinfooptions' => 1,
-                'stream.get' => 1,
-                'stream.getcomments' => 1,
-                'stream.getfilters' => 1,
-                'users.getinfo' => 1,
-                'users.getloggedinuser' => 1,
-                'users.getstandardinfo' => 1,
-                'users.hasapppermission' => 1,
-                'users.isappuser' => 1,
-                'users.isverified' => 1,
-                'video.getuploadlimits' => 1
-            ];
-        $name = 'api';
-        if (isset($READ_ONLY_CALLS[strtolower($method)])) {
-            $name = 'api_read';
-        } elseif (strtolower($method) == 'video.upload') {
-            $name = 'api_video';
-        }
-        return $this->getUrl($name, 'restserver.php');
-    }
-
-    /**
-     * Build the URL for given domain alias, path and parameters.
-     *
-     * @param string $name The name of the domain
-     * @param string $path Optional path (without a leading slash)
-     * @param array $params Optional query parameters
-     *
-     * @return string The URL for the given parameters
-     */
-    protected function getUrl($name, $path = '', $params = [])
-    {
-        $url = self::$DOMAIN_MAP[$name];
-        if ($path) {
-            if ($path[0] === '/') {
-                $path = substr($path, 1);
-            }
-            $url .= $path;
-        }
-        if (!empty($params)) {
-            $url .= '?' . http_build_query($params, null, '&');
-        }
-
-        return $url;
-    }
-
-    /**
-     * @return string
-     */
-    protected function getHttpHost()
-    {
-        if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
-            return $_SERVER['HTTP_X_FORWARDED_HOST'];
-        }
-        return $_SERVER['HTTP_HOST'];
-    }
-
-    /**
-     * @return string
-     */
-    protected function getHttpProtocol()
-    {
-        if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
-            if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
-                return 'https';
-            }
-            return 'http';
-        }
-        /*apache + variants specific way of checking for https*/
-        if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] == 1)) {
-            return 'https';
-        }
-        /*nginx way of checking for https*/
-        if (isset($_SERVER['SERVER_PORT']) && ($_SERVER['SERVER_PORT'] === '443')) {
-            return 'https';
-        }
-        return 'http';
-    }
-
-    /**
-     * Get the base domain used for the cookie.
-     * @return string
-     */
-    protected function getBaseDomain()
-    {
-        // The base domain is stored in the metadata cookie if not we fallback
-        // to the current hostname
-        $metadata = $this->getMetadataCookie();
-        if (array_key_exists('base_domain', $metadata) && !empty($metadata['base_domain'])) {
-            return trim($metadata['base_domain'], '.');
-        }
-        return $this->getHttpHost();
-    }
-
-    /**
-     * Returns the Current URL, stripping it of known FB parameters that should
-     * not persist.
-     *
-     * @return string The current URL
-     */
-    protected function getCurrentUrl()
-    {
-        $protocol = $this->getHttpProtocol() . '://';
-        $host = $this->getHttpHost();
-        $currentUrl = $protocol . $host . $_SERVER['REQUEST_URI'];
-        $parts = parse_url($currentUrl);
-
-        // use port if non default
-        $port =
-            isset($parts['port']) &&
-            (($protocol === 'http://' && $parts['port'] !== 80) ||
-            ($protocol === 'https://' && $parts['port'] !== 443))
-            ? ':' . $parts['port'] : '';
-
-        // rebuild
-        return $protocol . $parts['host'] . $port . $parts['path'];
-    }
-
-    /**
-     * Analyzes the supplied result to see if it was thrown
-     * because the access token is no longer valid.  If that is
-     * the case, then we destroy the session.
-     *
-     * @param array $result A record storing the error message returned
-     *                      by a failed API call.
-     * @return void
-     */
-    protected function throwAPIException($result)
-    {
-        $e = new FacebookApiException($result);
-        switch ($e->getType()) {
-            // OAuth 2.0 Draft 00 style
-            case 'OAuthException':
-            // OAuth 2.0 Draft 10 style
-            case 'invalid_token':
-            // REST server errors are just Exceptions
-            case 'Exception':
-                $message = $e->getMessage();
-                if (
-                    (strpos($message, 'Error validating access token') !== false) ||
-                    (strpos($message, 'Invalid OAuth access token') !== false) ||
-                    (strpos($message, 'An active access token must be used') !== false)
-                ) {
-                    $this->destroySession();
-                }
-                break;
-        }
-
-        throw $e;
-    }
-
-
-    /**
-     * Prints to the error log if you aren't in command line mode.
-     *
-     * @param string $msg Log message
-     * @return void
-     */
-    protected static function errorLog($msg)
-    {
-        // disable error log if we are running in a CLI environment
-        // @codeCoverageIgnoreStart
-        if (php_sapi_name() != 'cli') {
-            error_log($msg);
-        }
-        // @codeCoverageIgnoreEnd
-    }
-
-    /**
-     * Base64 encoding that doesn't need to be urlencode()ed.
-     * Exactly the same as base64_encode except it uses
-     *   - instead of +
-     *   _ instead of /
-     *   No padded =
-     *
-     * @param string $input base64UrlEncoded string
-     * @return string
-     */
-    protected static function base64UrlDecode($input)
-    {
-        return base64_decode(strtr($input, '-_', '+/'));
-    }
-
-    /**
-     * Base64 encoding that doesn't need to be urlencode()ed.
-     * Exactly the same as base64_encode except it uses
-     *   - instead of +
-     *   _ instead of /
-     *
-     * @param string $input string
-     * @return string base64Url encoded string
-     */
-    protected static function base64UrlEncode($input)
-    {
-        $str = strtr(base64_encode($input), '+/', '-_');
-        $str = str_replace('=', '', $str);
-        return $str;
-    }
-
-    /**
-     * Destroy the current session
-     * @return void
-     */
-    public function destroySession()
-    {
-        $this->accessToken = null;
-        $this->signedRequest = null;
-        $this->user = null;
-        $this->clearAllPersistentData();
-
-        // Javascript sets a cookie that will be used in getSignedRequest that we
-        // need to clear if we can
-        $cookie_name = $this->getSignedRequestCookieName();
-        if (array_key_exists($cookie_name, $_COOKIE)) {
-            unset($_COOKIE[$cookie_name]);
-            if (!headers_sent()) {
-                $base_domain = $this->getBaseDomain();
-                setcookie($cookie_name, '', 1, '/', '.' . $base_domain);
-            } else {
-                // @codeCoverageIgnoreStart
-                self::errorLog(
-                    'There exists a cookie that we wanted to clear that we couldn\'t ' .
-                    'clear because headers was already sent. Make sure to do the first ' .
-                    'API call before outputing anything.'
-                );
-                // @codeCoverageIgnoreEnd
-            }
-        }
-    }
-
-    /**
-     * Parses the metadata cookie that our Javascript API set
-     *
-     * @return array an array mapping key to value
-     */
-    protected function getMetadataCookie()
-    {
-        $cookie_name = $this->getMetadataCookieName();
-        if (!array_key_exists($cookie_name, $_COOKIE)) {
-            return [];
-        }
-
-        // The cookie value can be wrapped in "-characters so remove them
-        $cookie_value = trim($_COOKIE[$cookie_name], '"');
-
-        if (empty($cookie_value)) {
-            return [];
-        }
-
-        $parts = explode('&', $cookie_value);
-        $metadata = [];
-        foreach ($parts as $part) {
-            $pair = explode('=', $part, 2);
-            if (!empty($pair[0])) {
-                $metadata[urldecode($pair[0])] = (count($pair) > 1) ? urldecode($pair[1]) : '';
-            }
-        }
-
-        return $metadata;
-    }
-
-    /**
-     * @param string $big
-     * @param string $small
-     * @return string|bool
-     */
-    protected static function isAllowedDomain($big, $small)
-    {
-        if ($big === $small) {
-            return true;
-        }
-        return self::endsWith($big, '.' . $small);
-    }
-
-    /**
-     * @param string $big
-     * @param string $small
-     * @return string|bool
-     */
-    protected static function endsWith($big, $small)
-    {
-        $len = strlen($small);
-        if ($len === 0) {
-            return true;
-        }
-        return substr($big, -$len) === $small;
-    }
-
-    /**
-     * Each of the following four methods should be overridden in
-     * a concrete subclass, as they are in the provided Facebook class.
-     * The Facebook class uses PHP sessions to provide a primitive
-     * persistent store, but another subclass--one that you implement--
-     * might use a database, memcache, or an in-memory cache.
-     *
-     * @see Facebook
-     */
-
-    /**
-     * Stores the given ($key, $value) pair, so that future calls to
-     * getPersistentData($key) return $value. This call may be in another request.
-     *
-     * @param string $key
-     * @param mixed $value
-     *
-     * @return void
-     */
-    abstract protected function setPersistentData($key, $value);
-
-    /**
-     * Get the data for $key, persisted by BaseFacebook::setPersistentData()
-     *
-     * @param string $key The key of the data to retrieve
-     * @param boolean $default The default value to return if $key is not found
-     *
-     * @return mixed
-     */
-    abstract protected function getPersistentData($key, $default = false);
-
-    /**
-     * Clear the data with $key from the persistent storage
-     *
-     * @param string $key
-     * @return void
-     */
-    abstract protected function clearPersistentData($key);
-
-    /**
-     * Clear all data from the persistent storage
-     *
-     * @return void
-     */
-    abstract protected function clearAllPersistentData();
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/extlibinc/fb_ca_chain_bundle.crt b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/extlibinc/fb_ca_chain_bundle.crt
deleted file mode 100644
index 969239ff6768a1f8a650fbcff0ff6cb96d786fce..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/extlibinc/fb_ca_chain_bundle.crt
+++ /dev/null
@@ -1,3920 +0,0 @@
-##
-## ca-bundle.crt -- Bundle of CA Root Certificates
-##
-## Certificate data from Mozilla as of: Thu Oct 18 19:05:59 2012
-##
-## This is a bundle of X.509 certificates of public Certificate Authorities
-## (CA). These were automatically extracted from Mozilla's root certificates
-## file (certdata.txt).  This file can be found in the mozilla source tree:
-## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
-##
-## 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.
-##
-
-# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.86 $ $Date: 2012/10/18 16:26:52 $
-
-GTE CyberTrust Global Root
-==========================
------BEGIN CERTIFICATE-----
-MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
-Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
-A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
-MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
-Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
-IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
-sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
-HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
-AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
-M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
-NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
------END CERTIFICATE-----
-
-Thawte Server CA
-================
------BEGIN CERTIFICATE-----
-MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
-dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
-AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
-b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
-BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
-c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
-A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
-ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
-/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
-1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
-MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
-GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
-GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
------END CERTIFICATE-----
-
-Thawte Premium Server CA
-========================
------BEGIN CERTIFICATE-----
-MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
-dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
-AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
-ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
-AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
-VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
-aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
-cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
-aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
-Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
-qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
-SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
-8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
-UCemDaYj+bvLpgcUQg==
------END CERTIFICATE-----
-
-Equifax Secure CA
-=================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
-ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
-B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
-fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
-8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
-CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
-spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
-zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
-BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
-70+sB3c4
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 1
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
-MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
-NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
-o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
-kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
-RbyhkwS7hp86W0N6w4pl
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 3
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
-MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
-VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
-xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
-up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
-mPnHfxsb1gYgAlihw6ID
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
-f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
-hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
-TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
-WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
-Tqj/ZA1k
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd
-k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq
-WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB
-MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM
-XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC
-lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ
------END CERTIFICATE-----
-
-Verisign Class 2 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
-cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
-Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
-c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
-cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
-Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
-c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx
-nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC
-wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA
-ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK
-1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk
-LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg==
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
-FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
-lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
-MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
-1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
-Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
------END CERTIFICATE-----
-
-GlobalSign Root CA
-==================
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
-GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
-b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
-BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
-VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
-DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
-THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
-Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
-c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
-gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
-AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
-Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
-j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
-hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
-X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
-
-GlobalSign Root CA - R2
-=======================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
-YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
-bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
-aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
-bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
-ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
-s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
-S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
-TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
-ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
-YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
-BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
-9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
-01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
-9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
-
-ValiCert Class 1 VA
-===================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
-MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
-GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
-DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
-lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
-icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
-Orf1LXLI
------END CERTIFICATE-----
-
-ValiCert Class 2 VA
-===================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
-MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
-CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
-ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
-SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
-UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
-W9ViH0Pd
------END CERTIFICATE-----
-
-RSA Root Certificate 1
-======================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
-MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
-3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
-BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
-3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
-V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
-on+jjBXu
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E
-bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ
-rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+
-Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB
-FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
-y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
-ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h
-a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc
-D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
------END CERTIFICATE-----
-
-Verisign Class 2 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y
-azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug
-b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
-c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
-aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6
-tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7
-C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS
-0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs
-Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0
-JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
-0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
-sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx
-JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j
-GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
-EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
-cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
-EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
-055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
-j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
-xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
-t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
-
-Verisign Class 4 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
-tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
-8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
-Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
-Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
-mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
-fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
-RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
-UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
------END CERTIFICATE-----
-
-Entrust.net Secure Server CA
-============================
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
-cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
-ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
-A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
-eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
-dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
-aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
-gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
-ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
-CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
-dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
-bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
-dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
-NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
-HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
-BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
-Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
-n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----
-
-Entrust.net Premium 2048 Secure Server CA
-=========================================
------BEGIN CERTIFICATE-----
-MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
-ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
-bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
-BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
-NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
-d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
-MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
-ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
-Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
-hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
-nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
-VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
-AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
-gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
-AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
-oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
-o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
-2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
-OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
------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-----
-
-Equifax Secure Global eBusiness CA
-==================================
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
-bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
-HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
-b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
-PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
-qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
-hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
-BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
-MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
-I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
-NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 1
-=============================
------BEGIN CERTIFICATE-----
-MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
-LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
-ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
-IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
-1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
-IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
-MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
-Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
-AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
-lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
-KpYrtWKmpj29f5JZzVoqgrI3eQ==
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 2
-=============================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
-ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
-MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
-DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
-2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
-BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
-JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
-uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
-jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
-78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
-V+GRMOrN
------END CERTIFICATE-----
-
-AddTrust Low-Value Services Root
-================================
------BEGIN CERTIFICATE-----
-MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
-cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
-CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
-ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
-54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
-oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
-Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
-GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
-HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
-AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
-HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
-ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
-iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
-eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
-mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
-ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
------END CERTIFICATE-----
-
-AddTrust External Root
-======================
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
-VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
-NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
-cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
-Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
-+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
-Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
-aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
-2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
-7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
-VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
-VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
-IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
-j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
-e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
-G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----
-
-AddTrust Public Services Root
-=============================
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
-cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
-BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
-dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
-nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
-d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
-Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
-HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
-A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
-A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
-JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
-+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
-GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
-Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
-EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
------END CERTIFICATE-----
-
-AddTrust Qualified Certificates Root
-====================================
------BEGIN CERTIFICATE-----
-MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
-cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
-CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
-IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
-64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
-KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
-L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
-wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
-MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
-BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
-azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
-GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
-dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
-RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
-iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
------END CERTIFICATE-----
-
-Entrust Root Certification Authority
-====================================
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
-BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
-b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
-A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
-MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
-MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
-Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
-dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
-A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
-Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
-j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
-rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
-MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
-hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
-Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
-v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
-W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
-tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
-
-RSA Security 2048 v3
-====================
------BEGIN CERTIFICATE-----
-MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
-ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
-MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
-BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
-Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
-WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
-KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
-+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
-MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
-FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
-v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
-0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
-VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
-nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
-pKnXwiJPZ9d37CAFYd4=
------END CERTIFICATE-----
-
-GeoTrust Global CA
-==================
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
-Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
-MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
-LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
-BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
-8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
-T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
-vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
-DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
-zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
-d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
-mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
-XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
-Mw==
------END CERTIFICATE-----
-
-GeoTrust Global CA 2
-====================
------BEGIN CERTIFICATE-----
-MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
-MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
-LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
-NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
-LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
-Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
-HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
-K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
-srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
-ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
-OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
-x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
-H4z1Ir+rzoPz4iIprn2DQKi6bA==
------END CERTIFICATE-----
-
-GeoTrust Universal CA
-=====================
------BEGIN CERTIFICATE-----
-MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
-MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
-Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
-JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
-RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
-7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
-8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
-qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
-Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
-Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
-KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
-ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
-XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
-hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
-aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
-qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
-oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
-xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
-KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
-DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
-xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
-p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
-P/rmMuGNG2+k5o7Y+SlIis5z/iw=
------END CERTIFICATE-----
-
-GeoTrust Universal CA 2
-=======================
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
-MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
-SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
-DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
-j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
-JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
-QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
-WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
-20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
-ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
-SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
-8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
-+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
-BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
-dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
-4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
-mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
-A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
-Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
-pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
-FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
-gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
-X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
------END CERTIFICATE-----
-
-UTN-USER First-Network Applications
-===================================
------BEGIN CERTIFICATE-----
-MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp
-BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5
-WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T
-YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB
-cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug
-mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj
-DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu
-Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi
-P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE
-j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w
-HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j
-cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
-CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
-IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK
-RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp
-xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq
-DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE
------END CERTIFICATE-----
-
-America Online Root Certification Authority 1
-=============================================
------BEGIN CERTIFICATE-----
-MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
-T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
-v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
-DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
-sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
-8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
-AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
-o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
-GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
-VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
-3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
-Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
-sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
------END CERTIFICATE-----
-
-America Online Root Certification Authority 2
-=============================================
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
-T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
-fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
-f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
-qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
-RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
-gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
-6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
-FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
-Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
-B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
-aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
-AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
-T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
-+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
-JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
-zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
-ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
-1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
-GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
-Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
-cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
------END CERTIFICATE-----
-
-Visa eCommerce Root
-===================
------BEGIN CERTIFICATE-----
-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
-EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
-QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
-WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
-VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
-bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
-F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
-RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
-TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
-/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
-GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
-MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
-CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
-YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
-zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
-YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
-398znM/jra6O1I7mT1GvFpLgXPYHDw==
------END CERTIFICATE-----
-
-Certum Root CA
-==============
------BEGIN CERTIFICATE-----
-MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
-ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
-Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
-by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
-wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
-kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
-89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
-Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
-NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
-hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
-GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
-GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
-0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
-qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
------END CERTIFICATE-----
-
-Comodo AAA Services root
-========================
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
-MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
-c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
-BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
-C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
-i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
-Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
-Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
-Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
-BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
-cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
-LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
-7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
-8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
-12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
-
-Comodo Secure Services root
-===========================
------BEGIN CERTIFICATE-----
-MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
-MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
-Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
-BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
-9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
-rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
-oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
-p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
-FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
-gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
-YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
-aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
-4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
-Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
-DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
-pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
-RR3B7Hzs/Sk=
------END CERTIFICATE-----
-
-Comodo Trusted Services root
-============================
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
-MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
-bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
-IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
-3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
-/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
-juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
-ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
-DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
-ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
-cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
-uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
-pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
-BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
-R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
-9y5Xt5hwXsjEeLBi
------END CERTIFICATE-----
-
-QuoVadis Root CA
-================
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
-ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
-MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
-cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
-EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
-J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
-F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
-YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
-AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
-PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
-ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
-MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
-YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
-ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
-Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
-BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
-FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
-tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
-fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
-LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
-gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
-5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
-5nrQNiOKSnQ2+Q==
------END CERTIFICATE-----
-
-QuoVadis Root CA 2
-==================
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
-EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
-ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
-XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
-lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
-lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
-lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
-66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
-wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
-D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
-BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
-J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
-DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
-a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
-Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
-UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
-VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
-+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
-IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
-WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
-f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
-4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
-VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
-
-QuoVadis Root CA 3
-==================
------BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
-EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
-OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
-DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
-KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
-DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
-BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
-p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
-nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
-MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
-Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
-uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
-BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
-YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
-BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
-VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
-ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
-AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
-qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
-hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
-POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
-Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
-8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
-bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
-g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
-vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
-qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
-
-Security Communication Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
-8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
-DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
-5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
-DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
-JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
-0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
-mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
-s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
-6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
-FL39vmwLAw==
------END CERTIFICATE-----
-
-Sonera Class 1 Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
-U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw
-NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
-IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88
-7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9
-EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl
-0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645
-2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa
-HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT
-iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9
-28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV
-yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR
-vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P
-qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z
-IRlXvVWa
------END CERTIFICATE-----
-
-Sonera Class 2 Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
-U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
-NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
-IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
-/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
-dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
-f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
-tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
-nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
-XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
-0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
-cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
-Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
-EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
-llpwrN9M
------END CERTIFICATE-----
-
-Staat der Nederlanden Root CA
-=============================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
-ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
-HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
-bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
-vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
-jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
-C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
-vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
-22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
-HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
-dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
-BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
-EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
-MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
-nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
-iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
------END CERTIFICATE-----
-
-TDC Internet Root CA
-====================
------BEGIN CERTIFICATE-----
-MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
-ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
-NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
-ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
-xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
-znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
-5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
-otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
-AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
-VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
-MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
-AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
-UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
-CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
-gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
-2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
-O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
-Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
------END CERTIFICATE-----
-
-TDC OCES Root CA
-================
------BEGIN CERTIFICATE-----
-MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
-ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
-MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
-nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
-zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
-iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
-dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
-3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
-5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
-ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
-cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
-Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
-LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
-MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
-aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
-MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
-+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
-NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
-A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
-A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
-AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
-AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
------END CERTIFICATE-----
-
-UTN DATACorp SGC Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
-BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
-MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
-HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
-dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
-raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
-wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
-9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
-33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
-DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
-BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
-LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
-DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
-Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
-I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
-EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
-DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
------END CERTIFICATE-----
-
-UTN USERFirst Email Root CA
-===========================
------BEGIN CERTIFICATE-----
-MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0
-BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05
-OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx
-FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx
-ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz
-dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx
-B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8
-om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG
-TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl
-yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE
-AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV
-HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll
-bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
-AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne
-xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+
-5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV
-NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ
-w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
------END CERTIFICATE-----
-
-UTN USERFirst Hardware Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
-BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
-OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
-eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
-ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
-wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
-tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
-i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
-Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
-gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
-lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
-UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
-BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
-//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
-XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
-lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
-iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
-nfhmqA==
------END CERTIFICATE-----
-
-UTN USERFirst Object Root CA
-============================
------BEGIN CERTIFICATE-----
-MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb
-BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz
-NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx
-HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy
-dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR
-loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ
-w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu
-lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7
-RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL
-BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8
-ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly
-c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw
-DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
-NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO
-PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE
-qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG
-hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
------END CERTIFICATE-----
-
-Camerfirma Chambers of Commerce Root
-====================================
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
-QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
-ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
-NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
-cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
-MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
-AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
-xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
-NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
-DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
-d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
-EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
-cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
-AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
-bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
-VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
-aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
-fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
-L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
-UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
-ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
-erfutGWaIZDgqtCYvDi1czyL+Nw=
------END CERTIFICATE-----
-
-Camerfirma Global Chambersign Root
-==================================
------BEGIN CERTIFICATE-----
-MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
-QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
-ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
-NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
-YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
-MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
-ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
-1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
-by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
-6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
-8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
-BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
-aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
-Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
-aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
-ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
-bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
-PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
-gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
-PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
-IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
-t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
------END CERTIFICATE-----
-
-NetLock Qualified (Class QA) Root
-=================================
------BEGIN CERTIFICATE-----
-MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn
-eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0
-bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER
-MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0
-LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0
-dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP
-aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV
-CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e
-8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb
-m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ
-0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM
-0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
-HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2
-YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
-biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p
-a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz
-YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg
-YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg
-ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov
-L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr
-Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0
-aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg
-YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0
-IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3
-DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN
-wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg
-W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc
-R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR
-5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko
------END CERTIFICATE-----
-
-NetLock Notary (Class A) Root
-=============================
------BEGIN CERTIFICATE-----
-MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
-EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
-dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
-ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
-DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
-EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
-VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
-cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
-D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
-z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
-/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
-tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
-4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
-A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
-Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
-bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
-IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
-LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
-ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
-IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
-IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
-b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
-bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
-Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
-bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
-ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
-ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
-CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
-KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
-8CgHrTwXZoi1/baI
------END CERTIFICATE-----
-
-NetLock Business (Class B) Root
-===============================
------BEGIN CERTIFICATE-----
-MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
-VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
-VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
-bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
-VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
-iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
-o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
-1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
-HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
-RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
-dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
-ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
-c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
-YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
-c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
-Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
-bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
-IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
-YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
-cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
-43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
-stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
------END CERTIFICATE-----
-
-NetLock Express (Class C) Root
-==============================
------BEGIN CERTIFICATE-----
-MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
-KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
-BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
-dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
-ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
-jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
-W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
-euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
-DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
-RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
-YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
-IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
-aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
-ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
-ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
-dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
-emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
-IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
-UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
-YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
-xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
-gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
------END CERTIFICATE-----
-
-XRamp Global CA Root
-====================
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
-BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
-dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
-HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
-U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
-IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
-foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
-zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
-AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
-xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
-oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
-AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
-/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
-nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
-8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
-
-Go Daddy Class 2 CA
-===================
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
-VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
-A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
-RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
-ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
-2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
-qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
-YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
-vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
-BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
-atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
-MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
-A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
-PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
-I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
-Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
-vZ8=
------END CERTIFICATE-----
-
-Starfield Class 2 CA
-====================
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
-U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
-MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
-A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
-SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
-bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
-JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
-epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
-F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
-MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
-hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
-bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
-afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
-PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
-KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
-QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
-
-StartCom Certification Authority
-================================
------BEGIN CERTIFICATE-----
-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
-ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
-NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
-LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
-U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
-o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
-Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
-eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
-2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
-6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
-osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
-untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
-UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
-37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
-FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
-Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
-YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
-AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
-Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
-U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
-LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
-cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
-dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
-AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
-3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
-vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
-fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
-fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
-EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
-yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
-1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
-lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
-g14=
------END CERTIFICATE-----
-
-Taiwan GRCA
-===========
------BEGIN CERTIFICATE-----
-MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
-EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
-DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
-dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
-w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
-BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
-1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
-htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
-J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
-Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
-B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
-O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
-lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
-HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
-09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
-TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
-Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
-Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
-D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
-DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
-Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
-7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
-CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
-+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
------END CERTIFICATE-----
-
-Firmaprofesional Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
-GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
-Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
-ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
-MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
-OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
-ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
-j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
-lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
-3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
-NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
-KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
-AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
-ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
-u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
-wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
-7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
-VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
------END CERTIFICATE-----
-
-Wells Fargo Root CA
-===================
------BEGIN CERTIFICATE-----
-MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
-bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
-MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
-x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
-E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
-OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
-sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
-YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
-BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
-ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
-m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
-OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
-x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
-tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
------END CERTIFICATE-----
-
-Swisscom Root CA 1
-==================
------BEGIN CERTIFICATE-----
-MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
-EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
-dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
-MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
-aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
-IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
-MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
-NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
-AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
-b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
-7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
-cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
-WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
-haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
-MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
-HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
-BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
-MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
-jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
-MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
-VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
-vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
-OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
-1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
-nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
-x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
-NY6E0F/6MBr1mmz0DlP5OlvRHA==
------END CERTIFICATE-----
-
-DigiCert Assured ID Root CA
-===========================
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
-IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
-MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
-ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
-9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
-UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
-/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
-oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
-GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
-66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
-hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
-EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
-SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
-8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
------END CERTIFICATE-----
-
-DigiCert Global Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
-HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
-MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
-dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
-TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
-BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
-4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
-7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
-o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
-8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
-BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
-EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
-tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
-UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
------END CERTIFICATE-----
-
-DigiCert High Assurance EV Root CA
-==================================
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
-KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
-MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
-MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
-Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
-Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
-OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
-MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
-NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
-h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
-Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
-JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
-V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
-myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
-mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
------END CERTIFICATE-----
-
-Certplus Class 2 Primary CA
-===========================
------BEGIN CERTIFICATE-----
-MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
-BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
-OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
-dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
-5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
-Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
-YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
-e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
-CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
-YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
-L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
-P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
-TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
-7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
-//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
-l7+ijrRU
------END CERTIFICATE-----
-
-DST Root CA X3
-==============
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
-ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
-DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
-cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
-rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
-UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
-xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
-utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
-MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
-dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
-GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
-RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
-fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
-
-DST ACES CA X6
-==============
------BEGIN CERTIFICATE-----
-MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
-MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
-MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
-CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
-DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
-pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
-GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
-MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
-Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
-dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
-CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
-5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
-Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
-nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
-vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
-oKfN5XozNmr6mis=
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 1
-==============================================
------BEGIN CERTIFICATE-----
-MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
-MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
-acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
-MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
-U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
-TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
-aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
-yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
-Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
-8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
-W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
-BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
-sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
-q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
-B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
-nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 2
-==============================================
------BEGIN CERTIFICATE-----
-MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
-MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
-QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
-MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
-dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
-A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
-acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
-LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
-x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
-QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
-5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
-AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
-Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
-Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
-hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
-9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
-UrbnBEI=
------END CERTIFICATE-----
-
-SwissSign Platinum CA - G2
-==========================
------BEGIN CERTIFICATE-----
-MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT
-BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw
-HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM
-U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ
-KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu
-669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF
-eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne
-WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo
-j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6
-8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T
-aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy
-domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D
-+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV
-CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv
-zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
-IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1
-Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3
-NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4
-U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8
-KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl
-9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B
-aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs
-OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY
-Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci
-IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
------END CERTIFICATE-----
-
-SwissSign Gold CA - G2
-======================
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
-EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
-MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
-c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
-t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
-jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
-vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
-ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
-AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
-jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
-peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
-7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
-GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
-OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
-5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
-44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
-Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
-Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
-mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
-vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
-KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
-NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
-viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
-
-SwissSign Silver CA - G2
-========================
------BEGIN CERTIFICATE-----
-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
-BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
-DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
-aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
-9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
-N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
-+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
-6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
-MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
-qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
-FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
-ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
-celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
-CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
-tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
-cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
-4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
-kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
-3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
-/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
-DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
-e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
-WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
-DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
-DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority
-========================================
------BEGIN CERTIFICATE-----
-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
-CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
-cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
-b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
-nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
-RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
-tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
-AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
-hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
-Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
-NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
-Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
-1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
------END CERTIFICATE-----
-
-thawte Primary Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
-BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
-aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
-MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
-SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
-KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
-FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
-oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
-1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
-q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
-aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
-afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
-AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
-uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
-jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
-z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G5
-============================================================
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
-dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
-j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
-Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
-Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
-fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
-BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
-Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
-SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
-X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
-KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
-Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
-ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
-
-SecureTrust CA
-==============
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
-dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
-BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
-OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
-DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
-GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
-01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
-ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
-aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
-KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
-SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
-mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
-nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
-
-Secure Global CA
-================
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
-bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
-MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
-Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
-YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
-bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
-8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
-HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
-0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
-oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
-MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
-OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
-CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
-3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
-
-COMODO Certification Authority
-==============================
------BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
-BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
-A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
-MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
-T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
-+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
-xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
-4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
-1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
-rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
-b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
-AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
-OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
-IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
-+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
------END CERTIFICATE-----
-
-Network Solutions Certificate Authority
-=======================================
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
-EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
-IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
-MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
-jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
-aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
-crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
-/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
-AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
-bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
-A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
-4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
-GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
-ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
-
-WellsSecure Public Root Certificate Authority
-=============================================
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
-F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
-NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
-bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
-VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
-iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
-i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
-bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
-K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
-AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
-cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
-lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
-i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
-GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
-K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
-bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
-qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
-E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
-tylv2G0xffX8oRAHh84vWdw+WNs=
------END CERTIFICATE-----
-
-COMODO ECC Certification Authority
-==================================
------BEGIN CERTIFICATE-----
-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
-R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
-ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
-GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
-Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
-4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
-wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
-FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
-U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
------END CERTIFICATE-----
-
-IGC/A
-=====
------BEGIN CERTIFICATE-----
-MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
-VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
-Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
-MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
-EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
-STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
-TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
-So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
-HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
-frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
-tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
-egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
-iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
-q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
-MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
-Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
-lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
-0mBWWg==
------END CERTIFICATE-----
-
-Security Communication EV RootCA1
-=================================
------BEGIN CERTIFICATE-----
-MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
-U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
-dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
-BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
-Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
-/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
-WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
-ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
-bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
-9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
-SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
-iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
-Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
-mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
-T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
------END CERTIFICATE-----
-
-OISTE WISeKey Global Root GA CA
-===============================
------BEGIN CERTIFICATE-----
-MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
-BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
-A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
-bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
-VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
-IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
-IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
-Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
-Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
-d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
-/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
-LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
-KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
-MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
-+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
-hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
-okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
------END CERTIFICATE-----
-
-S-TRUST Authentication and Encryption Root CA 2005 PN
-=====================================================
------BEGIN CERTIFICATE-----
-MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
-BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh
-cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT
-LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w
-NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk
-ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj
-aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp
-b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob
-4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL
-g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf
-eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3
-KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB
-/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv
-bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU
-D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD
-pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08
-P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA
-nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit
-F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b
-Hz2eBIPdltkdOpQ=
------END CERTIFICATE-----
-
-Microsec e-Szigno Root CA
-=========================
------BEGIN CERTIFICATE-----
-MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
-BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
-EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
-MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
-dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
-GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
-d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
-oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
-QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
-PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
-MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
-IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
-VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
-LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
-dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
-AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
-4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
-AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
-egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
-Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
-PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
-c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
-cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
-IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
-WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
-MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
-MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
-Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
-HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
-nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
-aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
-86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
-yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
-S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
------END CERTIFICATE-----
-
-Certigna
-========
------BEGIN CERTIFICATE-----
-MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
-EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
-MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
-Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
-XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
-GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
-ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
-DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
-Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
-tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
-BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
-SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
-hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
-ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
-PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
-1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
-WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
------END CERTIFICATE-----
-
-AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
-======================================
------BEGIN CERTIFICATE-----
-MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
-AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
-LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
-HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
-U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
-IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
-yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
-2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
-4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
-2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
-8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
-HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
-Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
-5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
-czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
-AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
-ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
-BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
-cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
-AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
-EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
-/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
-MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
-3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
-eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
-/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
-RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
-Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 2 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
-MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
-IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
-xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
-Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
-SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
-dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
-KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
-TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
-JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
-vQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 3 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
-MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
-yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
-6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
-uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
-2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
-O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
-yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
-IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
-092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
-5A==
------END CERTIFICATE-----
-
-TC TrustCenter Universal CA I
-=============================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
-MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
-VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
-JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
-qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
-xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
-ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
-gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
-BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
-1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
-vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
-ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
-ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
-7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
------END CERTIFICATE-----
-
-Deutsche Telekom Root CA 2
-==========================
------BEGIN CERTIFICATE-----
-MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
-RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
-A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
-MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
-A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
-b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
-bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
-KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
-AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
-Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
-jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
-HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
-E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
-zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
-rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
-dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
-Cm26OWMohpLzGITY+9HPBVZkVw==
------END CERTIFICATE-----
-
-ComSign CA
-==========
------BEGIN CERTIFICATE-----
-MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD
-EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy
-MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp
-Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q
-ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy
-P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN
-GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk
-YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM
-rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy
-oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P
-AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+
-VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2
-QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI
-mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb
-/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG
-zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U
-AGegcQCCSA==
------END CERTIFICATE-----
-
-ComSign Secured CA
-==================
------BEGIN CERTIFICATE-----
-MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
-AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
-NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
-QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
-49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
-7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
-kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
-9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
-AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
-U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
-j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
-AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
-BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
-FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
-51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
-OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
------END CERTIFICATE-----
-
-Cybertrust Global Root
-======================
------BEGIN CERTIFICATE-----
-MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
-ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
-MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
-ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
-0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
-AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
-89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
-8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
-MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
-A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
-lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
-5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
-hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
-X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
-WL1WMRJOEcgh4LMRkWXbtKaIOM5V
------END CERTIFICATE-----
-
-ePKI Root Certification Authority
-=================================
------BEGIN CERTIFICATE-----
-MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
-EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
-MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
-MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
-IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
-lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
-qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
-12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
-WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
-ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
-lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
-vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
-Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
-MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
-ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
-1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
-KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
-xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
-NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
-GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
-xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
-gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
-sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
-BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
------END CERTIFICATE-----
-
-T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
-=============================================================================================================================
------BEGIN CERTIFICATE-----
-MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
-DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
-aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
-b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
-BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
-S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
-MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
-IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
-n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
-IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
-dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
-cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
-Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
-xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
-6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
-hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
-BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
-MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
-N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
-y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
-LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
-dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
------END CERTIFICATE-----
-
-Buypass Class 2 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
-MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
-cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
-0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
-0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
-uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
-1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
-7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
-fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
-wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
------END CERTIFICATE-----
-
-Buypass Class 3 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
-MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
-ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
-n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
-AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
-1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
-pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
-EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
-htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
-el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
------END CERTIFICATE-----
-
-EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
-==========================================================================
------BEGIN CERTIFICATE-----
-MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
-QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
-Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
-ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
-IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
-X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
-gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
-eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
-TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
-Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
-uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
-qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
-ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
-Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
-/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
-Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
-FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
-zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
-XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
-bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
-RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
-1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
-2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
-Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
-AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
------END CERTIFICATE-----
-
-certSIGN ROOT CA
-================
------BEGIN CERTIFICATE-----
-MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
-VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
-Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
-CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
-JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
-rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
-ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
-0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
-AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
-Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
-AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
-SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
-x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
-vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
-TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
------END CERTIFICATE-----
-
-CNNIC ROOT
-==========
------BEGIN CERTIFICATE-----
-MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
-ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
-OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
-o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
-VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
-VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
-czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
-y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
-wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
-lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
-Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
-O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
-BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
-G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
-mxE=
------END CERTIFICATE-----
-
-ApplicationCA - Japanese Government
-===================================
------BEGIN CERTIFICATE-----
-MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
-SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
-MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
-cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
-fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
-wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
-jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
-nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
-WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
-BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
-vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
-o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
-/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
-io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
-dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
-rosot4LKGAfmt1t06SAZf7IbiVQ=
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority - G3
-=============================================
------BEGIN CERTIFICATE-----
-MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
-BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
-IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
-NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
-YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
-LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
-K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
-c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
-IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
-dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
-2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
-cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
-Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
-AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
-t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
------END CERTIFICATE-----
-
-thawte Primary Root CA - G2
-===========================
------BEGIN CERTIFICATE-----
-MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
-VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
-IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
-Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
-MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
-b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
-IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
-LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
-8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
-mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
-G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
-rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
------END CERTIFICATE-----
-
-thawte Primary Root CA - G3
-===========================
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
-BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
-aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
-ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
-d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
-VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
-A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
-P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
-+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
-7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
-vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
-KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
-A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
-t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
-8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
-er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority - G2
-=============================================
------BEGIN CERTIFICATE-----
-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
-Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
-OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
-MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
-b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
-BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
-KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
-EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
-ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
-npaqBA+K
------END CERTIFICATE-----
-
-VeriSign Universal Root Certification Authority
-===============================================
------BEGIN CERTIFICATE-----
-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
-IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
-1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
-MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
-9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
-AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
-tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
-CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
-a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
-Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
-Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
-P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
-wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
-mJO37M2CYfE45k+XmCpajQ==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G4
-============================================================
------BEGIN CERTIFICATE-----
-MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
-VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
-b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
-ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
-b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
-Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
-rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
-HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
-Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
-A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
-AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
------END CERTIFICATE-----
-
-NetLock Arany (Class Gold) Főtanúsítvány
-============================================
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
-A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
-dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
-cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
-MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
-ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
-biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
-c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
-0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
-/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
-H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
-fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
-neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
-qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
-YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
-NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
-dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
------END CERTIFICATE-----
-
-Staat der Nederlanden Root CA - G2
-==================================
------BEGIN CERTIFICATE-----
-MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
-CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
-TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
-ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
-5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
-vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
-CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
-e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
-OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
-CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
-48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
-trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
-qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
-AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
-ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
-A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
-+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
-f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
-kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
-CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
-URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
-CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
-oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
-IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
-66+KAQ==
------END CERTIFICATE-----
-
-CA Disig
-========
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
-QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
-MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
-bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
-GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
-Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
-hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
-ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
-gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
-AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
-aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
-ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
-BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
-WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
-mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
-CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
-ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
-4Z7CRneC9VkGjCFMhwnN5ag=
------END CERTIFICATE-----
-
-Juur-SK
-=======
------BEGIN CERTIFICATE-----
-MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
-c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
-DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
-SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
-aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
-TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
-+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
-UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
-Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
-MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
-HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
-AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
-cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
-AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
-cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
-FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
-A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
-ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
-abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
-IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
-Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
-yyqcjg==
------END CERTIFICATE-----
-
-Hongkong Post Root CA 1
-=======================
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
-DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
-NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
-IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
-ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
-auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
-qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
-V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
-HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
-h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
-l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
-IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
-T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
-c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
------END CERTIFICATE-----
-
-SecureSign RootCA11
-===================
------BEGIN CERTIFICATE-----
-MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
-SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
-b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
-KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
-cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
-TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
-wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
-g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
-O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
-bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
-t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
-OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
-bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
-Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
-y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
-lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
------END CERTIFICATE-----
-
-ACEDICOM Root
-=============
------BEGIN CERTIFICATE-----
-MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
-T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
-MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
-A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
-WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
-YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
-MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
-m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
-HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
-xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
-3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
-2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
-TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
-4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
-9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
-bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
-aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
-eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
-zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
-ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
-KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
-nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
-I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
-MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
-tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ
-VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2
-yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa
-XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n
-0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ
-RjXZ+Hxb
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
-f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
-hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
-CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
-bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
-D/xwzoiQ
------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-----
-
-E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
-===================================================
------BEGIN CERTIFICATE-----
-MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
-EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
-ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
-MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
-cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
-aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
-8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
-jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
-JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
-9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
-SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
-F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
-D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
-Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
-fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
------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-----
-
-TC TrustCenter Universal CA III
-===============================
------BEGIN CERTIFICATE-----
-MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
-Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
-QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
-KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
-QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
-juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
-CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
-M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
-A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
-g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
-KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
-BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
-CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
-woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
------END CERTIFICATE-----
-
-Autoridad de Certificacion Firmaprofesional CIF A62634068
-=========================================================
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
-BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
-MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
-QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
-NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
-Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
-B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
-7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
-ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
-plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
-MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
-LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
-bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
-vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
-EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
-DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
-bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
-ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
-51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
-R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
-T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
-Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
-osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
-crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
-saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
-KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
-6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
------END CERTIFICATE-----
-
-Izenpe.com
-==========
------BEGIN CERTIFICATE-----
-MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
-EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
-MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
-QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
-03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
-ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
-+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
-PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
-OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
-F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
-0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
-0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
-leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
-AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
-SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
-NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
-MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
-BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
-Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
-kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
-hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
-g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
-aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
-nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
-ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
-Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
-WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
------END CERTIFICATE-----
-
-Chambers of Commerce Root - 2008
-================================
------BEGIN CERTIFICATE-----
-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
-Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
-ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
-EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
-cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
-XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
-h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
-ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
-NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
-D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
-lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
-0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
-EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
-G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
-BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
-bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
-bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
-CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
-AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
-wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
-3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
-RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
-M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
-YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
-9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
-zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
-nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
------END CERTIFICATE-----
-
-Global Chambersign Root - 2008
-==============================
------BEGIN CERTIFICATE-----
-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
-NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
-Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
-QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
-aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
-VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
-XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
-ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
-/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
-TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
-H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
-Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
-HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
-AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
-BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
-BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
-aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
-aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
-1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
-dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
-/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
-ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
-dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
-9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
-foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
-qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
-P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
-c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
------END CERTIFICATE-----
-
-Go Daddy Root Certificate Authority - G2
-========================================
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
-MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
-A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
-9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
-+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
-fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
-NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
-BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
-vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
-5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
-N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
------END CERTIFICATE-----
-
-Starfield Root Certificate Authority - G2
-=========================================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
-b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
-eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
-DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
-VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
-dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
-W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
-bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
-N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
-ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
-JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
-TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
-4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
-F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
-c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
------END CERTIFICATE-----
-
-Starfield Services Root Certificate Authority - G2
-==================================================
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
-b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
-IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
-BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
-dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
-h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
-hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
-LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
-rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
-SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
-E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
-xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
-YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
------END CERTIFICATE-----
-
-AffirmTrust Commercial
-======================
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
-MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
-bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
-DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
-C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
-BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
-MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
-HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
-hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
-qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
-0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
-sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
------END CERTIFICATE-----
-
-AffirmTrust Networking
-======================
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
-MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
-bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
-Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
-dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
-/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
-h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
-HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
-UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
-12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
-WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
-/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
------END CERTIFICATE-----
-
-AffirmTrust Premium
-===================
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
-OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
-dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
-BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
-5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
-+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
-GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
-p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
-S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
-6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
-/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
-+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
-MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
-6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
-L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
-+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
-BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
-IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
-g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
-zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
------END CERTIFICATE-----
-
-AffirmTrust Premium ECC
-=======================
------BEGIN CERTIFICATE-----
-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
-BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
-MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
-cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
-N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
-BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
-BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
-57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
-eQ==
------END CERTIFICATE-----
-
-Certum Trusted Network CA
-=========================
------BEGIN CERTIFICATE-----
-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
-ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
-MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
-ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
-l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
-J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
-fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
-cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
-Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
-DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
-jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
-mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
-Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
------END CERTIFICATE-----
-
-Certinomis - Autorité Racine
-=============================
------BEGIN CERTIFICATE-----
-MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
-Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
-LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
-A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
-JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
-wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
-Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
-2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
-jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
-c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
-lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
-xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
-530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
-4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
-KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
-WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
-R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
-nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
-CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
-JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
-qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
-WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
-wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
-vgt2Fl43N+bYdJeimUV5
------END CERTIFICATE-----
-
-Root CA Generalitat Valenciana
-==============================
------BEGIN CERTIFICATE-----
-MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
-ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
-IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
-WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
-CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
-F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
-ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
-D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
-JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
-AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
-dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
-ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
-AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
-YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
-AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
-aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
-AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
-YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
-AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
-OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
-dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
-BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
-A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
-b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
-TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
-Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
-NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
-iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
-+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
------END CERTIFICATE-----
-
-A-Trust-nQual-03
-================
------BEGIN CERTIFICATE-----
-MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
-Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
-a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
-dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
-RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
-ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
-c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
-zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
-yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
-SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
-iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
-cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
-eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
-ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
-sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
-JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
-mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
-ahq97BvIxYSazQ==
------END CERTIFICATE-----
-
-TWCA Root Certification Authority
-=================================
------BEGIN CERTIFICATE-----
-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
-VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
-EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
-IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
-QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
-oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
-4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
-y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
-9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
-mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
-QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
-T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
-Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
------END CERTIFICATE-----
-
-Security Communication RootCA2
-==============================
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
-U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
-dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
-SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
-aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
-+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
-3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
-spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
-EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
-QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
-CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
-u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
-3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
-tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
-mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
------END CERTIFICATE-----
-
-EC-ACC
-======
------BEGIN CERTIFICATE-----
-MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
-BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
-ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
-VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
-CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
-BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
-MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
-SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
-Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
-cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
-w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
-ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
-HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
-E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
-0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
-VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
-Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
-dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
-lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
-Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
-l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
-E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
-5EI=
------END CERTIFICATE-----
-
-Hellenic Academic and Research Institutions RootCA 2011
-=======================================================
------BEGIN CERTIFICATE-----
-MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
-O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
-aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
-IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
-AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
-IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
-IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
-1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
-71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
-8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
-3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
-MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
-MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
-b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
-XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
-TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
-/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
-7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
------END CERTIFICATE-----
-
-Actalis Authentication Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
-BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
-AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
-MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
-IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
-IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
-wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
-by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
-zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
-YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
-oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
-EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
-hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
-EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
-jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
-iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
-ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
-WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
-JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
-K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
-Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
-4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
-2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
-lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
-OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
-vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
------END CERTIFICATE-----
-
-Trustis FPS Root CA
-===================
------BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
-EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
-IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
-BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
-RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
-H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
-cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
-o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
-AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
-BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
-GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
-yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
-8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
-l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
-iB6XzCGcKQENZetX2fNXlrtIzYE=
------END CERTIFICATE-----
-
-StartCom Certification Authority
-================================
------BEGIN CERTIFICATE-----
-MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
-ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
-NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
-LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
-U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
-o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
-Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
-eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
-2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
-6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
-osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
-untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
-UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
-37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
-Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
-dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
-c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
-bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
-aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
-L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
-cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
-fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
-N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
-Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
-tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
-e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
-2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
-HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
-JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
-D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
------END CERTIFICATE-----
-
-StartCom Certification Authority G2
-===================================
------BEGIN CERTIFICATE-----
-MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
-ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
-o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
-4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
-Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
-Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
-O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
-vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
-nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
-FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
-z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
-KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
-2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
-J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
-JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
-/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
-nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
-blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
-l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
-7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
-obp573PYtlNXLfbQ4ddI
------END CERTIFICATE-----
-
-Buypass Class 2 Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
-DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
-eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
-g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
-9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
-/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
-CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
-awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
-zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
-Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
-Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
-M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
-AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
-A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
-osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
-aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
-DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
-LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
-oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
-wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
-CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
-rJgWVqA=
------END CERTIFICATE-----
-
-Buypass Class 3 Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
-DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
-eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
-sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
-5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
-7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
-ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
-2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
-/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
-RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
-Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
-j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
-AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
-cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
-uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
-Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
-ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
-KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
-6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
-UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
-eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
-Cp/HuZc=
------END CERTIFICATE-----
-
-TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı
-======================================================
------BEGIN CERTIFICATE-----
-MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
-MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
-QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
-DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
-a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
-BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
-bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
-YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
-KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
-KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
-rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
-AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
-Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
-aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
-Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
-BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
-poRq0Tl9
------END CERTIFICATE-----
-
-T-TeleSec GlobalRoot Class 3
-============================
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
-IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
-cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
-MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
-dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
-ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
-9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
-NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
-iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
-0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
-AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
-fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
-ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
-P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
-e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
------END CERTIFICATE-----
-
-EE Certification Centre Root CA
-===============================
------BEGIN CERTIFICATE-----
-MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
-EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
-dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
-MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
-UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
-ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
-TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
-rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
-93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
-P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
-MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
-BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
-xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
-lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
-uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
-3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
-dcGWxZ0=
------END CERTIFICATE-----
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/lib/Auth/Source/Facebook.php b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/lib/Auth/Source/Facebook.php
deleted file mode 100644
index b4a0c1ea9402ee9c943cda5c03318155a383ed7a..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/lib/Auth/Source/Facebook.php
+++ /dev/null
@@ -1,169 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\authfacebook\Auth\Source;
-
-use SimpleSAML\Auth;
-use SimpleSAML\Configuration;
-use SimpleSAML\Error;
-use SimpleSAML\Logger;
-use SimpleSAML\Module;
-use SimpleSAML\Utils;
-
-/**
- * Authenticate using Facebook Platform.
- *
- * @author Andreas Åkre Solberg, UNINETT AS.
- * @package SimpleSAMLphp
- */
-
-class Facebook extends \SimpleSAML\Auth\Source
-{
-    /**
-     * The string used to identify our states.
-     */
-    const STAGE_INIT = 'facebook:init';
-
-
-    /**
-     * The key of the AuthId field in the state.
-     */
-    const AUTHID = 'facebook:AuthId';
-
-
-    /**
-     * Facebook App ID or API Key
-     */
-    private $api_key;
-
-
-    /**
-     * Facebook App Secret
-     */
-    private $secret;
-
-
-    /**
-     * Which additional data permissions to request from user
-     */
-    private $req_perms;
-
-
-    /**
-     * A comma-separated list of user profile fields to request.
-     *
-     * Note that some user fields require appropriate permissions. For
-     * example, to retrieve the user's primary email address, "email" must
-     * be specified in both the req_perms and the user_fields parameter.
-     *
-     * When empty, only the app-specific user id and name will be returned.
-     *
-     * See the Graph API specification for all available user fields:
-     * https://developers.facebook.com/docs/graph-api/reference/v2.6/user
-     */
-    private $user_fields;
-
-
-    /**
-     * Constructor for this authentication source.
-     *
-     * @param array $info  Information about this authentication source.
-     * @param array $config  Configuration.
-     */
-    public function __construct($info, $config)
-    {
-        assert(is_array($info));
-        assert(is_array($config));
-
-        // Call the parent constructor first, as required by the interface
-        parent::__construct($info, $config);
-
-        $cfgParse = Configuration::loadFromArray(
-            $config,
-            'authsources[' . var_export($this->authId, true) . ']'
-        );
-
-        $this->api_key = $cfgParse->getString('api_key');
-        $this->secret = $cfgParse->getString('secret');
-        $this->req_perms = $cfgParse->getString('req_perms', null);
-        $this->user_fields = $cfgParse->getString('user_fields', null);
-    }
-
-
-    /**
-     * Log-in using Facebook platform
-     *
-     * @param array &$state  Information about the current authentication.
-     * @return void
-     */
-    public function authenticate(&$state)
-    {
-        assert(is_array($state));
-
-        // We are going to need the authId in order to retrieve this authentication source later
-        $state[self::AUTHID] = $this->authId;
-        Auth\State::saveState($state, self::STAGE_INIT);
-
-        $facebook = new Module\authfacebook\Facebook(
-            ['appId' => $this->api_key, 'secret' => $this->secret],
-            $state
-        );
-        $facebook->destroySession();
-
-        $linkback = Module::getModuleURL('authfacebook/linkback.php');
-        $url = $facebook->getLoginUrl(['redirect_uri' => $linkback, 'scope' => $this->req_perms]);
-        Auth\State::saveState($state, self::STAGE_INIT);
-
-        Utils\HTTP::redirectTrustedURL($url);
-    }
-
-
-    /**
-     * @param array &$state
-     * @return void
-     */
-    public function finalStep(&$state)
-    {
-        assert(is_array($state));
-
-        $facebook = new Module\authfacebook\Facebook(
-            ['appId' => $this->api_key, 'secret' => $this->secret],
-            $state
-        );
-        $uid = $facebook->getUser();
-
-        $info = null;
-        if ($uid > 0) {
-            try {
-                $info = $facebook->api("/" . $uid . ($this->user_fields ? "?fields=" . $this->user_fields : ""));
-            } catch (\FacebookApiException $e) {
-                throw new Error\AuthSource($this->authId, 'Error getting user profile.', $e);
-            }
-        }
-
-        if (!isset($info)) {
-            throw new Error\AuthSource($this->authId, 'Error getting user profile.');
-        }
-
-        $attributes = [];
-        foreach ($info as $key => $value) {
-            if (is_string($value) && !empty($value)) {
-                $attributes['facebook.' . $key] = [(string) $value];
-            }
-        }
-
-        if (array_key_exists('third_party_id', $info)) {
-            $attributes['facebook_user'] = [$info['third_party_id'] . '@facebook.com'];
-        } else {
-            $attributes['facebook_user'] = [$uid . '@facebook.com'];
-        }
-
-        $attributes['facebook_targetedID'] = ['http://facebook.com!' . $uid];
-        $attributes['facebook_cn'] = [$info['name']];
-
-        Logger::debug('Facebook Returned Attributes: ' . implode(", ", array_keys($attributes)));
-
-        $state['Attributes'] = $attributes;
-
-        $facebook->destroySession();
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/lib/Facebook.php b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/lib/Facebook.php
deleted file mode 100644
index 308bb6e6aa1b832bf4f000eec4da08bb2e7ff821..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/lib/Facebook.php
+++ /dev/null
@@ -1,223 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\authfacebook;
-
-require_once(dirname(dirname(__FILE__)) . '/extlibinc/base_facebook.php');
-
-/**
- * Extends the BaseFacebook class with the intent of using
- * PHP sessions to store user ids and access tokens.
- */
-
-class Facebook extends \BaseFacebook
-{
-    const FBSS_COOKIE_NAME = 'fbss';
-
-    // We can set this to a high number because the main session
-    // expiration will trump this
-    const FBSS_COOKIE_EXPIRE = 31556926; // 1 year
-
-    /**
-     * Stores the shared session ID if one is set
-     * @var string
-     */
-    protected $sharedSessionID = '';
-
-    /**
-     * SimpleSAMLphp state array
-     * @var array
-     */
-    protected $ssp_state = [];
-
-    /** @var string|null */
-    protected $state = null;
-
-    /** @var array */
-    protected static $kSupportedKeys = ['state', 'code', 'access_token', 'user_id'];
-
-
-    /**
-     * Identical to the parent constructor, except that
-     * we start a PHP session to store the user ID and
-     * access token if during the course of execution
-     * we discover them.
-     *
-     * @param array $config the application configuration. Additionally
-     * @param array &$ssp_state
-     * accepts "sharedSession" as a boolean to turn on a secondary
-     * cookie for environments with a shared session (that is, your app
-     * shares the domain with other apps).
-     * @see BaseFacebook::__construct in base_facebook.php
-     */
-    public function __construct(array $config, &$ssp_state)
-    {
-        $this->ssp_state = &$ssp_state;
-
-        parent::__construct($config);
-        if (!empty($config['sharedSession'])) {
-            $this->initSharedSession();
-        }
-    }
-
-
-    /**
-     * @return void
-     */
-    protected function initSharedSession()
-    {
-        $cookie_name = $this->getSharedSessionCookieName();
-        if (isset($_COOKIE[$cookie_name])) {
-            $data = $this->parseSignedRequest($_COOKIE[$cookie_name]);
-            if (
-                !empty($data)
-                && !empty($data['domain'])
-                && self::isAllowedDomain($this->getHttpHost(), $data['domain'])
-            ) {
-                // good case
-                $this->sharedSessionID = $data['id'];
-                return;
-            }
-            // ignoring potentially unreachable data
-        }
-        // evil/corrupt/missing case
-        $base_domain = $this->getBaseDomain();
-        $this->sharedSessionID = md5(uniqid(strval(mt_rand()), true));
-        $cookie_value = $this->makeSignedRequest(
-            [
-                'domain' => $base_domain,
-                'id' => $this->sharedSessionID,
-            ]
-        );
-        $_COOKIE[$cookie_name] = $cookie_value;
-        if (!headers_sent()) {
-            $expire = time() + self::FBSS_COOKIE_EXPIRE;
-            setcookie($cookie_name, $cookie_value, $expire, '/', '.' . $base_domain);
-        } else {
-            // @codeCoverageIgnoreStart
-            \SimpleSAML\Logger::debug(
-                'Shared session ID cookie could not be set! You must ensure you ' .
-                'create the Facebook instance before headers have been sent. This ' .
-                'will cause authentication issues after the first request.'
-            );
-            // @codeCoverageIgnoreEnd
-        }
-    }
-
-
-    /**
-     * Provides the implementations of the inherited abstract
-     * methods.  The implementation uses PHP sessions to maintain
-     * a store for authorization codes, user ids, CSRF states, and
-     * access tokens.
-     *
-     * @param string $key
-     * @param mixed $value
-     * @return void
-     */
-    protected function setPersistentData($key, $value)
-    {
-        if (!in_array($key, self::$kSupportedKeys)) {
-            \SimpleSAML\Logger::debug("Unsupported key passed to setPersistentData: " . var_export($key, true));
-            return;
-        }
-
-        $session_var_name = $this->constructSessionVariableName($key);
-        $this->ssp_state[$session_var_name] = $value;
-    }
-
-
-    /**
-     * @param string $key
-     * @param bool $default
-     * @return mixed
-     */
-    protected function getPersistentData($key, $default = false)
-    {
-        if (!in_array($key, self::$kSupportedKeys)) {
-            \SimpleSAML\Logger::debug("Unsupported key passed to getPersistentData: " . var_export($key, true));
-            return $default;
-        }
-
-        $session_var_name = $this->constructSessionVariableName($key);
-        return isset($this->ssp_state[$session_var_name]) ? $this->ssp_state[$session_var_name] : $default;
-    }
-
-
-    /**
-     * @param string $key
-     * @return void
-     */
-    protected function clearPersistentData($key)
-    {
-        if (!in_array($key, self::$kSupportedKeys)) {
-            \SimpleSAML\Logger::debug("Unsupported key passed to clearPersistentData: " . var_export($key, true));
-            return;
-        }
-
-        $session_var_name = $this->constructSessionVariableName($key);
-        if (isset($this->ssp_state[$session_var_name])) {
-            unset($this->ssp_state[$session_var_name]);
-        }
-    }
-
-
-    /**
-     * @return void
-     */
-    protected function clearAllPersistentData()
-    {
-        foreach (self::$kSupportedKeys as $key) {
-            $this->clearPersistentData($key);
-        }
-        if ($this->sharedSessionID) {
-            $this->deleteSharedSessionCookie();
-        }
-    }
-
-
-    /**
-     * @return void
-     */
-    protected function deleteSharedSessionCookie()
-    {
-        $cookie_name = $this->getSharedSessionCookieName();
-        unset($_COOKIE[$cookie_name]);
-        $base_domain = $this->getBaseDomain();
-        setcookie($cookie_name, '', 1, '/', '.' . $base_domain);
-    }
-
-
-    /**
-     * @return string
-     */
-    protected function getSharedSessionCookieName()
-    {
-        return self::FBSS_COOKIE_NAME . '_' . $this->getAppId();
-    }
-
-
-    /**
-     * @param string $key
-     * @return string
-     */
-    protected function constructSessionVariableName($key)
-    {
-        $parts = ['authfacebook:authdata:fb', $this->getAppId(), $key];
-        if ($this->sharedSessionID) {
-            array_unshift($parts, $this->sharedSessionID);
-        }
-        return implode('_', $parts);
-    }
-
-
-    /**
-     * @return void
-     */
-    protected function establishCSRFTokenState()
-    {
-        if ($this->state === null) {
-            $this->state = \SimpleSAML\Auth\State::getStateId($this->ssp_state);
-            $this->setPersistentData('state', $this->state);
-        }
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/phpunit.xml
deleted file mode 100644
index cfe86d3ec52b3a54c722bd41a5fc66bc438575d5..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/phpunit.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="tests/bootstrap.php">
-    <testsuites>
-        <testsuite name="The project's test suite">
-            <directory>./vendor/simplesamlphp/simplesamlphp-test-framework/tests/</directory>
-            <directory>tests/</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./lib</directory>
-            <directory suffix=".php">./extlibinc</directory>
-            <directory suffix=".php">./tests</directory>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" />
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
-        <log type="coverage-clover" target="build/logs/clover.xml" />
-    </logging>
-</phpunit>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/psalm.xml
deleted file mode 100644
index b670a64a6d43694b9e8e88dc2adb78565c0282c3..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/psalm.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    name="SimpleSAMLphp Module for Facebook Authentication"
-    useDocblockTypes="true"
-    totallyTyped="false"
->
-    <projectFiles>
-        <directory name="lib" />
-        <directory name="extlibinc" />
-        <directory name="www" />
-    </projectFiles>
-
-    <issueHandlers>
-        <LessSpecificReturnType errorLevel="info" />
-
-        <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives -->
-        <DeprecatedMethod errorLevel="info" />
-
-        <MissingClosureReturnType errorLevel="info" />
-        <MissingReturnType errorLevel="info" />
-        <MissingPropertyType errorLevel="info" />
-        <InvalidDocblock errorLevel="info" />
-        <MisplacedRequiredParam errorLevel="info" />
-
-        <PropertyNotSetInConstructor errorLevel="info" />
-        <MissingConstructor errorLevel="info" />
-        <MissingClosureParamType errorLevel="info" />
-        <MissingParamType errorLevel="info" />
-        <UnusedClass errorLevel="info" />
-        <PossiblyUnusedMethod errorLevel="info" />
-    </issueHandlers>
-</psalm>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/tests/bootstrap.php b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/tests/bootstrap.php
deleted file mode 100644
index 0436c472c9cb630598497d27a3b44c9c095f4bb1..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/tests/bootstrap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-$projectRoot = dirname(__DIR__);
-require_once($projectRoot . '/vendor/autoload.php');
-
-// Symlink module into ssp vendor lib so that templates and urls can resolve correctly
-$linkPath = $projectRoot . '/vendor/simplesamlphp/simplesamlphp/modules/authfacebook';
-if (file_exists($linkPath) === false) {
-    echo "Linking '$linkPath' to '$projectRoot'\n";
-    symlink($projectRoot, $linkPath);
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/www/linkback.php b/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/www/linkback.php
deleted file mode 100644
index 84e5e32c5db1689fb47e4e1dc2ea2ed0e92f8e37..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/www/linkback.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/**
- * Handle linkback() response from Facebook.
- */
-
-// For backwards compatability look for AuthState first
-if (array_key_exists('AuthState', $_REQUEST) && !empty($_REQUEST['AuthState'])) {
-    $state = \SimpleSAML\Auth\State::loadState(
-        $_REQUEST['AuthState'],
-        \SimpleSAML\Module\authfacebook\Auth\Source\Facebook::STAGE_INIT
-    );
-} elseif (array_key_exists('state', $_REQUEST) && !empty($_REQUEST['state'])) {
-    $state = \SimpleSAML\Auth\State::loadState(
-        $_REQUEST['state'],
-        \SimpleSAML\Module\authfacebook\Auth\Source\Facebook::STAGE_INIT
-    );
-} else {
-    throw new \SimpleSAML\Error\BadRequest('Missing state parameter on facebook linkback endpoint.');
-}
-
-// Find authentication source
-if (is_null($state) || !array_key_exists(\SimpleSAML\Module\authfacebook\Auth\Source\Facebook::AUTHID, $state)) {
-    throw new \SimpleSAML\Error\BadRequest(
-        'No data in state for ' . \SimpleSAML\Module\authfacebook\Auth\Source\Facebook::AUTHID
-    );
-}
-$sourceId = $state[\SimpleSAML\Module\authfacebook\Auth\Source\Facebook::AUTHID];
-
-/** @var \SimpleSAML\Module\authfacebook\Auth\Source\Facebook|null $source */
-$source = \SimpleSAML\Auth\Source::getById($sourceId);
-if ($source === null) {
-    throw new \SimpleSAML\Error\BadRequest(
-        'Could not find authentication source with id ' . var_export($sourceId, true)
-    );
-}
-
-try {
-    if (isset($_REQUEST['error_reason']) && $_REQUEST['error_reason'] == 'user_denied') {
-        throw new \SimpleSAML\Error\UserAborted();
-    }
-
-    $source->finalStep($state);
-} catch (\SimpleSAML\Error\Exception $e) {
-    \SimpleSAML\Auth\State::throwException($state, $e);
-} catch (\Exception $e) {
-    \SimpleSAML\Auth\State::throwException(
-        $state,
-        new \SimpleSAML\Error\AuthSource($sourceId, 'Error on facebook linkback endpoint.', $e)
-    );
-}
-
-\SimpleSAML\Auth\Source::completeAuth($state);
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authorize/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/authorize/LICENSE
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..a345e48d049f9c6756e9364e908b3f26e36c9df1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/authorize/LICENSE
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authorize/LICENSE
@@ -1,165 +1,459 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
 
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
 Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authorize/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/authorize/composer.json
index 2e2194e354061416265c50f170761000dd5f12b6..9ec7530e6b220213ccb8417b23d9866c7284ea62 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/authorize/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authorize/composer.json
@@ -3,7 +3,7 @@
     "description": "This module provides a user authorization filter based on attribute matching",
     "type": "simplesamlphp-module",
     "keywords": ["simplesamlphp", "authorize"],
-    "license": "LGPL-3.0-or-later",
+    "license": "LGPL-2.1-or-later",
     "authors": [
         {
             "name": "Ernesto Revilla",
@@ -14,6 +14,10 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true,
+            "simplesamlphp/composer-module-installer": true
         }
     },
     "autoload": {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authorize/templates/authorize_403.twig b/vendor/simplesamlphp/simplesamlphp/modules/authorize/templates/authorize_403.twig
index 52d9a24308851c10625ca655bafde3577c389f99..de7718759ca4c2f4236f23ffada38edc7d0123aa 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/authorize/templates/authorize_403.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authorize/templates/authorize_403.twig
@@ -2,12 +2,12 @@
 
 {% block content %}
   <h1>{% trans %}{authorize:Authorize:403_header}{% endtrans %}</h1>
-{% if reject_msg %}
+{% if reject_msg is defined %}
   <p>{{ reject_msg|translateFromArray }}</p>
 {% else %}
   <p>{% trans %}{authorize:Authorize:403_text}{% endtrans %}</p>
 {% endif %}
-  {% if logoutURL %}
+  {% if logoutURL is defined %}
   <p>
       <a href="{{ logoutURL }}">{% trans %}{status:logout}{% endtrans %}</a>
   </p>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authtwitter/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/authtwitter/LICENSE
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..a345e48d049f9c6756e9364e908b3f26e36c9df1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/authtwitter/LICENSE
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authtwitter/LICENSE
@@ -1,165 +1,459 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
 
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
 Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authfacebook/codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/authtwitter/codecov.yml
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/authfacebook/codecov.yml
rename to vendor/simplesamlphp/simplesamlphp/modules/authtwitter/codecov.yml
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authtwitter/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/authtwitter/composer.json
index c2166419679630dcd5136c12a8d48628db63e9f3..d73e8cc66ebe41aa4f3a78e05f6df4b9848558d8 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/authtwitter/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/authtwitter/composer.json
@@ -3,7 +3,7 @@
     "description": "A module that is able to perform authentication against Twitter",
     "type": "simplesamlphp-module",
     "keywords": ["simplesamlphp", "twitter"],
-    "license": "LGPL-3.0-or-later",
+    "license": "LGPL-2.1-or-later",
     "authors": [
         {
             "name": "Olav Morken",
@@ -18,6 +18,10 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true,
+            "simplesamlphp/composer-module-installer": true
         }
     },
     "autoload": {
@@ -37,7 +41,8 @@
     },
     "require-dev": {
         "simplesamlphp/simplesamlphp": "^1.17",
-        "phpunit/phpunit": "~4.8.35"
+        "phpunit/phpunit": "~4.8.35",
+        "webmozart/assert": "<1.7"
     },
     "support": {
         "issues": "https://github.com/tvdijen/simplesamlphp-module-authtwitter/issues",
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/.php_cs.dist b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/.php_cs.dist
deleted file mode 100644
index 33467ebed8fd85e1f86baae2dc2f5b75cbe7143f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/.php_cs.dist
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-$finder = PhpCsFixer\Finder::create()
-    ->in([
-        __DIR__ . '/lib',
-        __DIR__ . '/tests',
-        __DIR__ . '/www',
-    ])
-;
-return PhpCsFixer\Config::create()
-    ->setRules([
-        '@PSR2' => true,
-        '@PSR4' => true,
-        '@PSR5' => true,
-    ])
-    ->setFinder($finder)
-;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/.travis.yml
deleted file mode 100644
index fec43ab41a5a3b2129c6a4b00802c56325717fe9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/.travis.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-sudo: required
-
-language: php
-
-php:
-  - 5.6
-  - 7.0
-  - 7.1
-  - 7.2
-  - 7.3
-
-env:
-  - SIMPLESAMLPHP_VERSION=1.17.*
-
-before_script:
-  - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
-  - composer update --no-interaction
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then composer require --dev vimeo/psalm:1.1.9; fi
-
-script:
-  - bin/check-syntax.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
-
-after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/LICENSE
deleted file mode 100644
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/LICENSE
+++ /dev/null
@@ -1,165 +0,0 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/bin/check-syntax.sh b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/bin/check-syntax.sh
deleted file mode 100755
index 96dfbb9f5565e3550d3609f8ca9a44814d157af5..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/bin/check-syntax.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-PHP='/usr/bin/env php'
-RETURN=0
-
-# check PHP files
-for FILE in `find lib tests www -name "*.php"`; do
-    $PHP -l $FILE > /dev/null 2>&1
-    if [ $? -ne 0 ]; then
-        echo "Syntax check failed for ${FILE}"
-        RETURN=`expr ${RETURN} + 1`
-    fi
-done
-
-exit $RETURN
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/composer.json
deleted file mode 100644
index 484f420145b5d09b18dac359a6f4db22db87a777..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/composer.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-    "name": "simplesamlphp/simplesamlphp-module-authwindowslive",
-    "description": "A module that is able to perform authentication against Windows Live",
-    "type": "simplesamlphp-module",
-    "keywords": ["simplesamlphp", "windowslive", "windows", "live"],
-    "license": "LGPL-3.0-or-later",
-    "authors": [
-        {
-            "name": "Olav Morken",
-            "email": "olavmrk@gmail.com"
-        },
-        {
-            "name": "Tim van Dijen",
-            "email": "tvdijen@gmail.com"
-        }
-    ],
-    "config": {
-        "preferred-install": {
-            "simplesamlphp/simplesamlphp": "source",
-            "*": "dist"
-        }
-    },
-    "autoload": {
-        "psr-4": {
-            "SimpleSAML\\Module\\authwindowslive\\": "lib/"
-        }
-    },
-    "autoload-dev": {
-        "psr-4": {
-            "Tests\\SimpleSAML\\modules\\authwindowslive\\TestFiles\\": "tests/files",
-            "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils"
-        }
-    },
-    "require": {
-        "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1"
-    },
-    "require-dev": {
-        "simplesamlphp/simplesamlphp": "^1.17",
-        "phpunit/phpunit": "~5.7"
-    },
-    "support": {
-        "issues": "https://github.com/tvdijen/simplesamlphp-module-authwindowslive/issues",
-        "source": "https://github.com/tvdijen/simplesamlphp-module-authwindowslive"
-    }
-}
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/default-disable b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/default-disable
deleted file mode 100644
index fa0bd82e2df7bd79d57593d35bc53c1f9d3ef71f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/default-disable
+++ /dev/null
@@ -1,3 +0,0 @@
-This file indicates that the default state of this module
-is disabled. To enable, create a file named enable in the
-same directory as this file.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/docs/windowsliveid.md b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/docs/windowsliveid.md
deleted file mode 100644
index b80116cf3a7ad20fc55ad1e0ceacb6999e438693..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/docs/windowsliveid.md
+++ /dev/null
@@ -1,22 +0,0 @@
-Using the Windows Live ID authentication source with SimpleSAMLphp
-==================================================================
-This module works around the limitation in Microsoft Online/Azure OIDC implementation of not supplying the OIDC userinfo endpoint.
-Microsoft explains the omission by suggesting that the Graph API can produce anything userinfo would have brought, in place.
-
-Remember to configure `authsources.php`, with both your Client ID and Secret key.
-
-To get an API key and a secret, register the application at:
-
- * <https://msdn.microsoft.com/en-us/library/ff751474.aspx>
- * <https://apps.dev.microsoft.com/>
-
-## Testing authentication
-
-On the SimpleSAMLphp frontpage, go to the *Authentication* tab, and use the link:
-
-  * *Test configured authentication sources*
-
-Then choose the *windowsliveid* authentication source.
-
-Expected behaviour would then be that you are sent to Windows Live ID and asked to login.
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/lib/Auth/Source/LiveID.php b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/lib/Auth/Source/LiveID.php
deleted file mode 100644
index 5a1ef32018b3a21f4a317a83d460505df85c66ad..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/lib/Auth/Source/LiveID.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\authwindowslive\Auth\Source;
-
-/**
- * Authenticate using LiveID.
- *
- * @author Brook Schofield, TERENA.
- * @author Guy Halse, TENET.
- * @package SimpleSAMLphp
- */
-class LiveID extends \SimpleSAML\Auth\Source
-{
-    /**
-     * The string used to identify our states.
-     */
-    const STAGE_INIT = 'authwindowslive:init';
-
-    /**
-     * The key of the AuthId field in the state.
-     */
-    const AUTHID = 'authwindowslive:AuthId';
-
-    /** @var string */
-    private $key;
-
-    /** @var string */
-    private $secret;
-
-
-    /**
-     * Constructor for this authentication source.
-     *
-     * @param array $info  Information about this authentication source.
-     * @param array $config  Configuration.
-     *
-     * @throws \Exception In case of misconfiguration.
-     */
-    public function __construct($info, $config)
-    {
-        assert(is_array($info));
-        assert(is_array($config));
-
-        // Call the parent constructor first, as required by the interface
-        parent::__construct($info, $config);
-
-        if (!array_key_exists('key', $config)) {
-            throw new \Exception('LiveID authentication source is not properly configured: missing [key]');
-        }
-
-        $this->key = $config['key'];
-
-        if (!array_key_exists('secret', $config)) {
-            throw new \Exception('LiveID authentication source is not properly configured: missing [secret]');
-        }
-
-        $this->secret = $config['secret'];
-    }
-
-    /**
-     * Log-in using LiveID platform
-     *
-     * @param array &$state  Information about the current authentication.
-     * @return void
-     */
-    public function authenticate(&$state)
-    {
-        assert(is_array($state));
-
-        // we are going to need the authId in order to retrieve this authentication source later
-        $state[self::AUTHID] = $this->authId;
-
-        $stateID = \SimpleSAML\Auth\State::saveState($state, self::STAGE_INIT);
-
-        \SimpleSAML\Logger::debug('authwindowslive auth state id = '.$stateID);
-
-        // authenticate the user
-        // documentation at:
-        // https://azure.microsoft.com/en-us/documentation/articles/active-directory-v2-protocols-oauth-code/
-        $authorizeURL = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize'.
-            '?client_id='.$this->key.
-            '&response_type=code'.
-            '&response_mode=query'.
-            '&redirect_uri='.urlencode(\SimpleSAML\Module::getModuleURL('authwindowslive').'/linkback.php').
-            '&state='.urlencode($stateID).
-            '&scope='.urlencode('openid https://graph.microsoft.com/user.read')
-        ;
-
-        \SimpleSAML\Utils\HTTP::redirectTrustedURL($authorizeURL);
-    }
-
-    /**
-     * @param array &$state
-     * @return void
-     * @throws \Exception
-     */
-    public function finalStep(&$state)
-    {
-        \SimpleSAML\Logger::debug(
-            "authwindowslive oauth: Using this verification code [".$state['authwindowslive:verification_code']."]"
-        );
-
-        // retrieve Access Token
-        // documentation at:
-        // https://azure.microsoft.com/en-us/documentation/articles/active-directory-v2-protocols-oauth-code/#request-an-access-token
-        $postData = 'client_id='.urlencode($this->key).
-            '&client_secret='.urlencode($this->secret).
-            '&scope='.urlencode('https://graph.microsoft.com/user.read').
-            '&grant_type=authorization_code'.
-            '&redirect_uri='.urlencode(\SimpleSAML\Module::getModuleURL('authwindowslive').'/linkback.php').
-            '&code='.urlencode($state['authwindowslive:verification_code']);
-
-        $context = [
-            'http' => [
-                'method' => 'POST',
-                'header' => 'Content-type: application/x-www-form-urlencoded',
-                'content' => $postData,
-            ],
-        ];
-
-        /** @var string $result */
-        $result = \SimpleSAML\Utils\HTTP::fetch('https://login.microsoftonline.com/common/oauth2/v2.0/token', $context, false);
-
-        $response = json_decode($result, true);
-
-        // error checking of $response to make sure we can proceed
-        if (!array_key_exists('access_token', $response)) {
-            throw new \Exception(
-                '['.$response['error'].'] '.$response['error_description'].
-                "\r\nNo access_token returned - cannot proceed\r\n".implode(', ', $response['error_codes'])
-            );
-        }
-
-        \SimpleSAML\Logger::debug(
-            "authwindowslive: Got an access token from the OAuth service provider [".$response['access_token']."]"
-        );
-
-        // documentation at: http://graph.microsoft.io/en-us/docs/overview/call_api
-        $opts = [
-            'http' => ['header' => "Accept: application/json\r\nAuthorization: Bearer ".
-                $response['access_token']."\r\n"]
-        ];
-
-        /** @var string $data */
-        $data = \SimpleSAML\Utils\HTTP::fetch('https://graph.microsoft.com/v1.0/me', $opts);
-        $userdata = json_decode($data, true);
-
-        // this is the simplest case
-        if (!array_key_exists('@odata.context', $userdata) || array_key_exists('error', $userdata)) {
-            throw new \Exception(
-                'Unable to retrieve userdata from Microsoft Graph ['.$userdata['error']['code'].'] '.
-                $userdata['error']['message']
-            );
-        }
-        $attributes = [];
-        $attributes['windowslive_targetedID'] = [
-            'https://graph.microsoft.com!'.(!empty($userdata['id']) ? $userdata['id'] : 'unknown')
-        ];
-        foreach ($userdata as $key => $value) {
-            if (is_string($value)) {
-                $attributes['windowslive.'.$key] = [(string) $value];
-            }
-        }
-
-
-        \SimpleSAML\Logger::debug('LiveID Returned Attributes: '.implode(", ", array_keys($attributes)));
-
-        $state['Attributes'] = $attributes;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/phpunit.xml
deleted file mode 100644
index c0985fdd804b18d8d9179ecd956d63582c189e95..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/phpunit.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="tests/bootstrap.php">
-    <testsuites>
-        <testsuite name="The project's test suite">
-            <directory>tests/</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./lib</directory>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" />
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
-        <log type="coverage-clover" target="build/logs/clover.xml" />
-    </logging>
-</phpunit>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/psalm.xml
deleted file mode 100644
index 0d86dfe3c1ed28e249d2ee86ed48cfd18b8e982d..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/psalm.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    name="SimpleSAMLphp Authentication Module for Windows Live"
-    useDocblockTypes="true"
-    totallyTyped="false"
->
-    <projectFiles>
-        <directory name="lib" />
-        <directory name="www" />
-    </projectFiles>
-
-    <issueHandlers>
-        <LessSpecificReturnType errorLevel="info" />
-
-        <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives -->
-        <DeprecatedMethod errorLevel="info" />
-
-        <MissingClosureReturnType errorLevel="info" />
-        <MissingReturnType errorLevel="info" />
-        <MissingPropertyType errorLevel="info" />
-        <InvalidDocblock errorLevel="info" />
-        <MisplacedRequiredParam errorLevel="info" />
-
-        <PropertyNotSetInConstructor errorLevel="info" />
-        <MissingConstructor errorLevel="info" />
-        <MissingClosureParamType errorLevel="info" />
-        <MissingParamType errorLevel="info" />
-        <UnusedClass errorLevel="info" />
-        <PossiblyUnusedMethod errorLevel="info" />
-    </issueHandlers>
-</psalm>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/tests/bootstrap.php b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/tests/bootstrap.php
deleted file mode 100644
index 60d182a767e9a61b714ccb93cb6a19312cc80174..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/tests/bootstrap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-$projectRoot = dirname(__DIR__);
-require_once($projectRoot.'/vendor/autoload.php');
-
-// Symlink module into ssp vendor lib so that templates and urls can resolve correctly
-$linkPath = $projectRoot.'/vendor/simplesamlphp/simplesamlphp/modules/simplesamlphp-module-authwindowslive';
-if (file_exists($linkPath) === false) {
-    echo "Linking '$linkPath' to '$projectRoot'\n";
-    symlink($projectRoot, $linkPath);
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/www/linkback.php b/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/www/linkback.php
deleted file mode 100644
index a87c7b09780fe85a16150bdc9855d1103d4b6c08..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/www/linkback.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-/**
- * Handle linkback() response from Windows Live ID.
- */
-
-if (!array_key_exists('state', $_REQUEST)) {
-    throw new \Exception('Lost OAuth Client State');
-}
-$state = \SimpleSAML\Auth\State::loadState(
-    $_REQUEST['state'],
-    \SimpleSAML\Module\authwindowslive\Auth\Source\LiveID::STAGE_INIT
-);
-
-// http://msdn.microsoft.com/en-us/library/ff749771.aspx
-if (array_key_exists('code', $_REQUEST)) {
-    // good
-    $state['authwindowslive:verification_code'] = $_REQUEST['code'];
-
-    if (array_key_exists('exp', $_REQUEST)) {
-        $state['authwindowslive:exp'] = $_REQUEST['exp'];
-    }
-} else {
-    // In the OAuth WRAP service, error_reason = 'user_denied' means user chose
-    // not to login with LiveID. It isn't clear that this is still true in the
-    // newer API, but the parameter name has changed to error. It doesn't hurt
-    // to preserve support for this, so this is left in as a placeholder.
-    // redirect them to their original page so they can choose another auth mechanism
-    if (($_REQUEST['error'] === 'user_denied') && ($state !== null)) {
-        $e = new \SimpleSAML\Error\UserAborted();
-        \SimpleSAML\Auth\State::throwException($state, $e);
-    }
-
-    // error
-    throw new \Exception('Authentication failed: ['.$_REQUEST['error'].'] '.$_REQUEST['error_description']);
-}
-
-assert(array_key_exists(\SimpleSAML\Module\authwindowslive\Auth\Source\LiveID::AUTHID, $state));
-
-// find authentication source
-$sourceId = $state[\SimpleSAML\Module\authwindowslive\Auth\Source\LiveID::AUTHID];
-
-/** @var \SimpleSAML\Module\authwindowslive\Auth\Source\LiveID|null $source */
-$source = \SimpleSAML\Auth\Source::getById($sourceId);
-if ($source === null) {
-    throw new \Exception('Could not find authentication source with id '.$sourceId);
-}
-
-$source->finalStep($state);
-
-\SimpleSAML\Auth\Source::completeAuth($state);
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/.php_cs.dist b/vendor/simplesamlphp/simplesamlphp/modules/cas/.php_cs.dist
deleted file mode 100644
index e7d314696c7e461b645c3d603f3a5d3034082ba5..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/.php_cs.dist
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-$finder = PhpCsFixer\Finder::create()
-    ->in([
-        __DIR__ . '/lib',
-        __DIR__ . '/tests',
-    ])
-;
-return PhpCsFixer\Config::create()
-    ->setRules([
-        '@PSR2' => true,
-        '@PSR4' => true,
-        '@PSR5' => true,
-    ])
-    ->setFinder($finder)
-;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/cas/.travis.yml
deleted file mode 100644
index a090b629439d90419e41ea41034758c0fc8695c1..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/.travis.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-sudo: required
-
-language: php
-
-php:
-  - 5.6
-  - 7.0
-  - 7.1
-  - 7.2
-  - 7.3
-
-env:
-  - SIMPLESAMLPHP_VERSION=1.17.*
-  
-before_script:
-  - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
-  - composer update --no-interaction
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then composer require --dev vimeo/psalm:1.1.9; fi
-
-script:
-  - bin/check-syntax.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
-
-after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/bin/check-syntax.sh b/vendor/simplesamlphp/simplesamlphp/modules/cas/bin/check-syntax.sh
deleted file mode 100755
index db6dc4b0140cb09231c6bf2e756c6a668e8e7cbe..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/bin/check-syntax.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-PHP='/usr/bin/env php'
-RETURN=0
-
-# check PHP files
-for FILE in `find lib tests -name "*.php"`; do
-    $PHP -l $FILE > /dev/null 2>&1
-    if [ $? -ne 0 ]; then
-        echo "Syntax check failed for ${FILE}"
-        RETURN=`expr ${RETURN} + 1`
-    fi
-done
-
-exit $RETURN
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/cas/composer.json
deleted file mode 100644
index 23e4b0943c6cd1085bbfc6e8fe1b1cd02861fdd5..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/composer.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
-    "name": "simplesamlphp/simplesamlphp-module-cas",
-    "description": "A module that provides CAS authentication",
-    "type": "simplesamlphp-module",
-    "keywords": ["simplesamlphp", "cas"],
-    "license": "LGPL-3.0-or-later",
-    "authors": [
-        {
-            "name": "Olav Morken",
-            "email": "olavmrk@gmail.com"
-        }
-    ],
-    "config": {
-        "preferred-install": {
-            "simplesamlphp/simplesamlphp": "source",
-            "*": "dist"
-        }
-    },
-    "autoload": {
-        "psr-4": {
-            "SimpleSAML\\Module\\cas\\": "lib/"
-        }
-    },
-    "autoload-dev": {
-        "psr-4": {
-            "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils"
-        }
-    },
-    "require": {
-        "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1",
-        "simplesamlphp/simplesamlphp-module-ldap": "^0.9",
-        "webmozart/assert": "~1.4"
-    },
-    "require-dev": {
-        "simplesamlphp/simplesamlphp": "^1.17",
-        "phpunit/phpunit": "~5.7"
-    },
-    "support": {
-        "issues": "https://github.com/tvdijen/simplesamlphp-module-cas/issues",
-        "source": "https://github.com/tvdijen/simplesamlphp-module-cas"
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/default-disable b/vendor/simplesamlphp/simplesamlphp/modules/cas/default-disable
deleted file mode 100644
index fa0bd82e2df7bd79d57593d35bc53c1f9d3ef71f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/default-disable
+++ /dev/null
@@ -1,3 +0,0 @@
-This file indicates that the default state of this module
-is disabled. To enable, create a file named enable in the
-same directory as this file.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/docs/cas.md b/vendor/simplesamlphp/simplesamlphp/modules/cas/docs/cas.md
deleted file mode 100644
index c4c6ba72d9350f6d3923c34ee3f628c1c6203b3b..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/docs/cas.md
+++ /dev/null
@@ -1,32 +0,0 @@
-Using the CAS authentication source with SimpleSAMLphp
-==========================================================
-
-This is completely based on the original cas authentication, 
-the only diffrence is this is authentication module and not a script.
-
-Setting up the CAS authentication module
-----------------------------------
-
-Adding a authentication source
-
-example authsource.php
-----------------------------------
-
-	'example-cas' => array(
-		'cas:CAS',
-		'cas' => array(
-			'login' => 'https://cas.example.com/login',
-			'validate' => 'https://cas.example.com/validate',
-			'logout' => 'https://cas.example.com/logout'
-		),
-		'ldap' => array(
-			'servers' => 'ldaps://ldaps.example.be:636/',
-			'enable_tls' => true,
-			'searchbase' => 'ou=people,dc=org,dc=com',
-			'searchattributes' => 'uid',
-			'attributes' => array('uid','cn'),
-			'priv_user_dn' => 'cn=simplesamlphp,ou=applications,dc=org,dc=com',
-			'priv_user_pw' => 'password',
-
-		),
-	),
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/lib/Auth/Source/CAS.php b/vendor/simplesamlphp/simplesamlphp/modules/cas/lib/Auth/Source/CAS.php
deleted file mode 100644
index 0b0d23460ff6f4ff1b70f0791cc26ef142c24d6b..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/lib/Auth/Source/CAS.php
+++ /dev/null
@@ -1,270 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\cas\Auth\Source;
-
-use Webmozart\Assert\Assert;
-
-/**
- * Authenticate using CAS.
- *
- * Based on www/auth/login-cas.php by Mads Freek, RUC.
- *
- * @author Danny Bollaert, UGent.
- * @package SimpleSAMLphp
- */
-
-class CAS extends \SimpleSAML\Auth\Source
-{
-    /**
-     * The string used to identify our states.
-     */
-    const STAGE_INIT = '\SimpleSAML\Module\cas\Auth\Source\CAS.state';
-
-    /**
-     * The key of the AuthId field in the state.
-     */
-    const AUTHID = '\SimpleSAML\Module\cas\Auth\Source\CAS.AuthId';
-
-    /**
-     * @var array with ldap configuration
-     */
-    private $ldapConfig;
-
-    /**
-     * @var array cas configuration
-     */
-    private $casConfig;
-
-    /**
-     * @var string cas chosen validation method
-     */
-
-    private $validationMethod;
-
-    /**
-     * @var string cas login method
-     */
-    private $loginMethod;
-
-    /**
-     * Constructor for this authentication source.
-     *
-     * @param array $info  Information about this authentication source.
-     * @param array $config  Configuration.
-     */
-    public function __construct($info, $config)
-    {
-        Assert::isArray($info);
-        Assert::isArray($config);
-
-        // Call the parent constructor first, as required by the interface
-        parent::__construct($info, $config);
-
-        if (!array_key_exists('cas', $config)) {
-            throw new \Exception('cas authentication source is not properly configured: missing [cas]');
-        }
-
-        if (!array_key_exists('ldap', $config)) {
-            throw new \Exception('ldap authentication source is not properly configured: missing [ldap]');
-        }
-
-        $this->casConfig = $config['cas'];
-        $this->ldapConfig = $config['ldap'];
-
-        if (isset($this->casConfig['serviceValidate'])) {
-            $this->validationMethod = 'serviceValidate';
-        } elseif (isset($this->casConfig['validate'])) {
-            $this->validationMethod = 'validate';
-        } else {
-            throw new \Exception("validate or serviceValidate not specified");
-        }
-
-        if (isset($this->casConfig['login'])) {
-            $this->loginMethod = $this->casConfig['login'];
-        } else {
-            throw new \Exception("cas login URL not specified");
-        }
-    }
-
-
-    /**
-     * This the most simple version of validating, this provides only authentication validation
-     *
-     * @param string $ticket
-     * @param string $service
-     *
-     * @return array username and attributes
-     */
-    private function casValidate($ticket, $service)
-    {
-        $url = \SimpleSAML\Utils\HTTP::addURLParameters($this->casConfig['validate'], [
-            'ticket' => $ticket,
-            'service' => $service,
-        ]);
-        $result = \SimpleSAML\Utils\HTTP::fetch($url);
-
-        /** @var string $result */
-        $res = preg_split("/\r?\n/", $result);
-
-        if (strcmp($res[0], "yes") == 0) {
-            return [$res[1], []];
-        } else {
-            throw new \Exception("Failed to validate CAS service ticket: $ticket");
-        }
-    }
-
-
-    /**
-     * Uses the cas service validate, this provides additional attributes
-     *
-     * @param string $ticket
-     * @param string $service
-     *
-     * @return array username and attributes
-     */
-    private function casServiceValidate($ticket, $service)
-    {
-        $url = \SimpleSAML\Utils\HTTP::addURLParameters(
-            $this->casConfig['serviceValidate'],
-            [
-                'ticket' => $ticket,
-                'service' => $service,
-            ]
-        );
-        $result = \SimpleSAML\Utils\HTTP::fetch($url);
-
-        /** @var string $result */
-        $dom = \SAML2\DOMDocumentFactory::fromString($result);
-        $xPath = new \DOMXpath($dom);
-        $xPath->registerNamespace("cas", 'http://www.yale.edu/tp/cas');
-        $success = $xPath->query("/cas:serviceResponse/cas:authenticationSuccess/cas:user");
-        if ($success->length == 0) {
-            $failure = $xPath->evaluate("/cas:serviceResponse/cas:authenticationFailure");
-            throw new \Exception("Error when validating CAS service ticket: ".$failure->item(0)->textContent);
-        } else {
-            $attributes = [];
-            if ($casattributes = $this->casConfig['attributes']) {
-                // Some has attributes in the xml - attributes is a list of XPath expressions to get them
-                foreach ($casattributes as $name => $query) {
-                    $attrs = $xPath->query($query);
-                    foreach ($attrs as $attrvalue) {
-                        $attributes[$name][] = $attrvalue->textContent;
-                    }
-                }
-            }
-
-            $item = $success->item(0);
-            if (is_null($item)) {
-                throw new \Exception("Error parsing serviceResponse.");
-            }
-            $casusername = $item->textContent;
-
-            return [$casusername, $attributes];
-        }
-    }
-
-
-    /**
-     * Main validation method, redirects to correct method
-     * (keeps finalStep clean)
-     *
-     * @param string $ticket
-     * @param string $service
-     * @return array username and attributes
-     */
-    protected function casValidation($ticket, $service)
-    {
-        switch ($this->validationMethod) {
-            case 'validate':
-                return  $this->casValidate($ticket, $service);
-            case 'serviceValidate':
-                return $this->casServiceValidate($ticket, $service);
-            default:
-                throw new \Exception("validate or serviceValidate not specified");
-        }
-    }
-
-
-    /**
-     * Called by linkback, to finish validate/ finish logging in.
-     * @param array $state
-     * @return void
-     */
-    public function finalStep(&$state)
-    {
-        $ticket = $state['cas:ticket'];
-        $stateID = \SimpleSAML\Auth\State::saveState($state, self::STAGE_INIT);
-        $service = \SimpleSAML\Module::getModuleURL('cas/linkback.php', ['stateID' => $stateID]);
-        list($username, $casattributes) = $this->casValidation($ticket, $service);
-        $ldapattributes = [];
-
-        $config = \SimpleSAML\Configuration::loadFromArray(
-            $this->ldapConfig,
-            'Authentication source '.var_export($this->authId, true)
-        );
-        if ($this->ldapConfig['servers']) {
-            $ldap = new \SimpleSAML\Module\ldap\Auth\Ldap(
-                $config->getString('servers'),
-                $config->getBoolean('enable_tls', false),
-                $config->getBoolean('debug', false),
-                $config->getInteger('timeout', 0),
-                $config->getInteger('port', 389),
-                $config->getBoolean('referrals', true)
-            );
-            $ldapattributes = $ldap->validate($this->ldapConfig, $username);
-            if ($ldapattributes === false) {
-                throw new \Exception("Failed to authenticate against LDAP-server.");
-            }
-        }
-        $attributes = array_merge_recursive($casattributes, $ldapattributes);
-        $state['Attributes'] = $attributes;
-
-        \SimpleSAML\Auth\Source::completeAuth($state);
-    }
-
-
-    /**
-     * Log-in using cas
-     *
-     * @param array &$state  Information about the current authentication.
-     * @return void
-     */
-    public function authenticate(&$state)
-    {
-        Assert::isArray($state);
-
-        // We are going to need the authId in order to retrieve this authentication source later
-        $state[self::AUTHID] = $this->authId;
-
-        $stateID = \SimpleSAML\Auth\State::saveState($state, self::STAGE_INIT);
-
-        $serviceUrl = \SimpleSAML\Module::getModuleURL('cas/linkback.php', ['stateID' => $stateID]);
-
-        \SimpleSAML\Utils\HTTP::redirectTrustedURL($this->loginMethod, ['service' => $serviceUrl]);
-    }
-
-
-    /**
-     * Log out from this authentication source.
-     *
-     * This function should be overridden if the authentication source requires special
-     * steps to complete a logout operation.
-     *
-     * If the logout process requires a redirect, the state should be saved. Once the
-     * logout operation is completed, the state should be restored, and completeLogout
-     * should be called with the state. If this operation can be completed without
-     * showing the user a page, or redirecting, this function should return.
-     *
-     * @param array &$state  Information about the current logout operation.
-     * @return void
-     */
-    public function logout(&$state)
-    {
-        Assert::isArray($state);
-        $logoutUrl = $this->casConfig['logout'];
-
-        \SimpleSAML\Auth\State::deleteState($state);
-        // we want cas to log us out
-        \SimpleSAML\Utils\HTTP::redirectTrustedURL($logoutUrl);
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/cas/phpunit.xml
deleted file mode 100644
index c0985fdd804b18d8d9179ecd956d63582c189e95..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/phpunit.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="tests/bootstrap.php">
-    <testsuites>
-        <testsuite name="The project's test suite">
-            <directory>tests/</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./lib</directory>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" />
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
-        <log type="coverage-clover" target="build/logs/clover.xml" />
-    </logging>
-</phpunit>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/cas/psalm.xml
deleted file mode 100644
index 4340e105df8bfe90a623d444c4b36cd0531cca21..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/psalm.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    name="SimpleSAMLphp CAS module"
-    useDocblockTypes="true"
-    totallyTyped="false"
->
-    <projectFiles>
-        <directory name="lib" />
-    </projectFiles>
-
-    <issueHandlers>
-        <LessSpecificReturnType errorLevel="info" />
-
-        <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives -->
-        <DeprecatedMethod errorLevel="info" />
-
-        <MissingClosureReturnType errorLevel="info" />
-        <MissingReturnType errorLevel="info" />
-        <MissingPropertyType errorLevel="info" />
-        <InvalidDocblock errorLevel="info" />
-        <MisplacedRequiredParam errorLevel="info" />
-
-        <PropertyNotSetInConstructor errorLevel="info" />
-        <MissingConstructor errorLevel="info" />
-        <MissingClosureParamType errorLevel="info" />
-        <MissingParamType errorLevel="info" />
-        <UnusedClass errorLevel="info" />
-        <PossiblyUnusedMethod errorLevel="info" />
-    </issueHandlers>
-</psalm>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/tests/bootstrap.php b/vendor/simplesamlphp/simplesamlphp/modules/cas/tests/bootstrap.php
deleted file mode 100644
index f0c4e8c00af08ab3c490d5520fe4f14b347ba75c..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/tests/bootstrap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-$projectRoot = dirname(__DIR__);
-require_once($projectRoot.'/vendor/autoload.php');
-
-// Symlink module into ssp vendor lib so that templates and urls can resolve correctly
-$linkPath = $projectRoot.'/vendor/simplesamlphp/simplesamlphp/modules/cas';
-if (file_exists($linkPath) === false) {
-    echo "Linking '$linkPath' to '$projectRoot'\n";
-    symlink($projectRoot, $linkPath);
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/www/linkback.php b/vendor/simplesamlphp/simplesamlphp/modules/cas/www/linkback.php
deleted file mode 100644
index 15bae662e70d7d2a5cb08a98bf6bbb37eeeac8f2..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/cas/www/linkback.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-use Webmozart\Assert\Assert;
-
-use \SimpleSAML\Module\cas\Auth\Source\CAS;
-
-/**
- * Handle linkback() response from CAS.
- */
-
-if (!isset($_GET['stateID'])) {
-    throw new \SimpleSAML\Error\BadRequest('Missing stateID parameter.');
-}
-$state = \SimpleSAML\Auth\State::loadState($_GET['stateID'], CAS::STAGE_INIT);
-
-if (!isset($_GET['ticket'])) {
-    throw new \SimpleSAML\Error\BadRequest('Missing ticket parameter.');
-}
-$state['cas:ticket'] = (string) $_GET['ticket'];
-
-// Find authentication source
-Assert::keyExists($state, CAS::AUTHID);
-$sourceId = $state[CAS::AUTHID];
-
-/** @var \SimpleSAML\Module\cas\Auth\Source\CAS|null $source */
-$source = \SimpleSAML\Auth\Source::getById($sourceId);
-if ($source === null) {
-    throw new \Exception('Could not find authentication source with id '.$sourceId);
-}
-
-$source->finalStep($state);
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/cdc/LICENSE
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/LICENSE
rename to vendor/simplesamlphp/simplesamlphp/modules/cdc/LICENSE
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/cdc/codecov.yml
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/codecov.yml
rename to vendor/simplesamlphp/simplesamlphp/modules/cdc/codecov.yml
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cdc/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/cdc/composer.json
index 0a373bebd08ce10eb93ca1a45c12af65839e3cb3..1dfc6a4fc9e3ad01bb56c3c33db160e9744eedca 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/cdc/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/cdc/composer.json
@@ -4,7 +4,7 @@
   "type": "simplesamlphp-module",
   "keywords": [ "SimpleSAMLphp", "CDC"],
   "homepage": "https://simplesamlphp.org/",
-  "license": "LGPL-3.0-or-later",
+  "license": "LGPL-2.1-or-later",
   "authors": [
     {
       "name": "Olav Morken",
@@ -19,6 +19,9 @@
     "preferred-install": {
       "simplesamlphp/simplesamlphp": "source",
       "*": "dist"
+    },
+    "allow-plugins": {
+      "composer/package-versions-deprecated": true
     }
   },
   "autoload": {
@@ -36,7 +39,8 @@
   },
   "require-dev": {
     "simplesamlphp/simplesamlphp": "^1.17",
-    "phpunit/phpunit": "~5.7"
+    "phpunit/phpunit": "~5.7",
+    "webmozart/assert": "<1.7"
   },
   "support": {
     "issues": "https://github.com/simplesamlphp/simplesamlphp-module-cdc/issues",
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/consent/.gitignore b/vendor/simplesamlphp/simplesamlphp/modules/consent/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ce45e2079dfd89a01b30303086b3b2a84f895810
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/consent/.gitignore
@@ -0,0 +1,8 @@
+.phpunit.result.cache
+composer.lock
+composer.phar
+/vendor/
+
+# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
+# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
+# composer.lock
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/consent/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/consent/composer.json
index bde251e4bd90b6e219fd5c5c54f6ab8642a5ec00..5fb61b8327e8b2c3ade000f39cc5362311c8f421 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/consent/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/consent/composer.json
@@ -14,6 +14,9 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true
         }
     },
     "autoload": {
@@ -33,7 +36,7 @@
     "require-dev": {
         "simplesamlphp/simplesamlphp": "^1.17",
         "phpunit/phpunit": "~5.7",
-        "webmozart/assert": "<1.7"
+        "webmozart/assert": "<1.6"
     },
     "support": {
         "issues": "https://github.com/tvdijen/simplesamlphp-module-consent/issues",
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/consent/docs/consent.md b/vendor/simplesamlphp/simplesamlphp/modules/consent/docs/consent.md
index 3725020154b351ccfc569a1391374f8b275d9573..d1274c3e11e7abadc16202529140caa3887fc5f6 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/consent/docs/consent.md
+++ b/vendor/simplesamlphp/simplesamlphp/modules/consent/docs/consent.md
@@ -63,6 +63,21 @@ Example:
 		'store' 	=> 'consent:Cookie', 
 	),
 
+If necessary, you can set the cookie parameters in the config array using the same sematics as other cookies (default values shown):
+
+	90 => array(
+            'class'                => 'consent:Consent',
+            'identifyingAttribute' => 'uid',
+            'store'                => array(
+                'consent:Cookie',
+                'name' => '\SimpleSAML\Module\consent', # prefix for name
+                'lifetime' => 7776000,
+                'path' => '/',
+                'domain' => '',
+                'secure' => true,
+                'samesite' => null,
+            ),
+	),
 
 ### Using a database as storage ###
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/consent/lib/Consent/Store/Cookie.php b/vendor/simplesamlphp/simplesamlphp/modules/consent/lib/Consent/Store/Cookie.php
index f12e7071c46fd33f73bb582539f8095490d22a5f..843148004bd0d3df8f718ddd0de545ebc99ebff7 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/consent/lib/Consent/Store/Cookie.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/consent/lib/Consent/Store/Cookie.php
@@ -24,6 +24,83 @@
 
 class Cookie extends \SimpleSAML\Module\consent\Store
 {
+    /**
+     * @var string Cookie name prefix
+     */
+    private $name;
+
+    /**
+     * @var int Cookie lifetime
+     */
+    private $lifetime;
+
+    /**
+     * @var string Cookie path
+     */
+    private $path;
+
+    /**
+     * @var string Cookie domain
+     */
+    private $domain = '';
+
+    /**
+     * @var bool Cookie secure flag
+     */
+    private $secure;
+
+    /**
+     * @var string|null Cookie samesite flag
+     */
+    private $samesite = null;
+
+    /**
+     * Parse configuration.
+     *
+     * This constructor parses the configuration.
+     *
+     * @param array $config Configuration for database consent store.
+     *
+     * @throws \Exception in case of a configuration error.
+     */
+    public function __construct(array $config)
+    {
+        parent::__construct($config);
+
+        if (array_key_exists('name', $config)) {
+            $this->name = $config['name'];
+        } else {
+            $this->name = '\SimpleSAML\Module\consent';
+        }
+
+        if (array_key_exists('lifetime', $config)) {
+            $this->lifetime = (int) $config['lifetime'];
+        } else {
+            $this->lifetime = 7776000; // (90*24*60*60)
+        }
+
+        if (array_key_exists('path', $config)) {
+            $this->path = $config['path'];
+        } else {
+            $globalConfig = \SimpleSAML\Configuration::getInstance();
+            $this->path = $globalConfig->getBasePath();
+        }
+
+        if (array_key_exists('domain', $config)) {
+            $this->domain = $config['domain'];
+        }
+
+        if (array_key_exists('secure', $config)) {
+            $this->secure = (bool) $config['secure'];
+        } else {
+            $this->secure = \SimpleSAML\Utils\HTTP::isHTTPS();
+        }
+
+        if (array_key_exists('samesite', $config)) {
+            $this->samesite = $config['samesite'];
+        }
+    }
+
     /**
      * Check for consent.
      *
@@ -42,7 +119,7 @@ public function hasConsent($userId, $destinationId, $attributeSet)
         assert(is_string($destinationId));
         assert(is_string($attributeSet));
 
-        $cookieName = self::getCookieName($userId, $destinationId);
+        $cookieName = $this->getCookieName($userId, $destinationId);
 
         $data = $userId.':'.$attributeSet.':'.$destinationId;
 
@@ -97,7 +174,7 @@ public function saveConsent($userId, $destinationId, $attributeSet)
         assert(is_string($destinationId));
         assert(is_string($attributeSet));
 
-        $name = self::getCookieName($userId, $destinationId);
+        $name = $this->getCookieName($userId, $destinationId);
         $value = $userId.':'.$attributeSet.':'.$destinationId;
 
         \SimpleSAML\Logger::debug('Consent cookie - Set ['.$value.']');
@@ -122,7 +199,7 @@ public function deleteConsent($userId, $destinationId)
         assert(is_string($userId));
         assert(is_string($destinationId));
 
-        $name = self::getCookieName($userId, $destinationId);
+        $name = $this->getCookieName($userId, $destinationId);
         $this->setConsentCookie($name, null);
     }
 
@@ -162,7 +239,7 @@ public function getConsents($userId)
 
         $ret = [];
 
-        $cookieNameStart = '\SimpleSAML\Module\consent:';
+        $cookieNameStart = $this->name . ':';
         $cookieNameStartLen = strlen($cookieNameStart);
         foreach ($_COOKIE as $name => $value) {
             if (substr($name, 0, $cookieNameStartLen) !== $cookieNameStart) {
@@ -254,12 +331,12 @@ private static function verify($signedData)
      *
      * @return string The cookie name
      */
-    private static function getCookieName($userId, $destinationId)
+    private function getCookieName($userId, $destinationId)
     {
         assert(is_string($userId));
         assert(is_string($destinationId));
 
-        return '\SimpleSAML\Module\consent:'.sha1($userId.':'.$destinationId);
+        return $this->name . ':' . sha1($userId . ':' . $destinationId);
     }
 
 
@@ -277,11 +354,13 @@ private function setConsentCookie($name, $value)
         assert(is_string($value) || is_null($value));
 
         $globalConfig = \SimpleSAML\Configuration::getInstance();
-        $params = [
-            'lifetime' => 7776000, // (90*24*60*60)
-            'path' => ($globalConfig->getBasePath()),
+	$params = [
+            'lifetime' => $this->lifetime,
+            'path' => $this->path,
+            'domain' => $this->domain,
             'httponly' => true,
-            'secure' => \SimpleSAML\Utils\HTTP::isHTTPS(),
+            'secure' => $this->secure,
+            'samesite' => $this->samesite,
         ];
 
         try {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/consent/www/assets/consent.css b/vendor/simplesamlphp/simplesamlphp/modules/consent/www/assets/consent.css
deleted file mode 100644
index 33bef3d64a6c17123c12518e796453e5c1465dd4..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/consent/www/assets/consent.css
+++ /dev/null
@@ -1,54 +0,0 @@
-fieldset {
-    padding: 0px;
-}
-
-fieldset legend {
-    background: #eee;
-}
-
-h3#attributeheader {
-    margin: 1.5em 0em 0.5em 0em;
-}
-
-table#table_with_attributes .attrname {
-    text-align: right;
-    font-weight: bold;
-}
-
-table#table_with_attributes .attrvalue {
-    padding-left: 1em;
-    margin: 0.5em 0em;
-}
-
-table#table_with_attributes tr:last-child td {
-    border-bottom: none;
-}
-
-table#table_with_attributes img {
-    border: 1px solid #777;
-    margin: 4px;
-}
-
-table#table_with_attributes ul {
-    margin: 0px;
-    padding-left: 1em;
-}
-
-form#consent_yes {
-    display: inline;
-    margin: 0px;
-    padding: 0px;
-}
-
-form#consent_no {
-    display: inline;
-    margin-left: .5em;
-}
-
-.hidden {
-    display: none;
-}
-
-td.td_odd {
-    padding: 2em;
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/.gitignore b/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ce45e2079dfd89a01b30303086b3b2a84f895810
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/.gitignore
@@ -0,0 +1,8 @@
+.phpunit.result.cache
+composer.lock
+composer.phar
+/vendor/
+
+# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
+# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
+# composer.lock
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/LICENSE
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..a345e48d049f9c6756e9364e908b3f26e36c9df1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/LICENSE
+++ b/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/LICENSE
@@ -1,165 +1,459 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
 
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
 Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/codecov.yml
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/statistics/codecov.yml
rename to vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/codecov.yml
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/composer.json
index f83c8b3edda1f9472af4c7ef699637d9d5deb0b2..211ad39b12be972564b3502a554723bc6d0ca330 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/consentAdmin/composer.json
@@ -3,7 +3,7 @@
     "description": "A module that allows users to manage their consent",
     "type": "simplesamlphp-module",
     "keywords": ["simplesamlphp", "consentadmin"],
-    "license": "LGPL-3.0-or-later",
+    "license": "LGPL-2.1-or-later",
     "authors": [
         {
             "name": "Jacob Christiansen",
@@ -18,6 +18,10 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true,
+            "simplesamlphp/composer-module-installer": true
         }
     },
     "autoload-dev": {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/cardinality.translation.json b/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/cardinality.translation.json
index 0a23c76ccbee6483af4ab9ece2d4f4c73453b9ea..a2d8c1b93f558f6b543373fd21d343d4da2f4b89 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/cardinality.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/cardinality.translation.json
@@ -6,6 +6,7 @@
     "no": "Ugyldige atributter",
     "zu": "Izici Ezingalungile",
     "xh": "Iimpawu Ezingachanekanga",
+    "st": "Makgabane a Fosahetseng",
     "ca": "Atributs incorrectes"
   },
   "cardinality_text": {
@@ -15,6 +16,7 @@
     "no": "Én eller flere atributter levert av din identitetsleverandør har ikke så mange verdier som forventes.",
     "zu": "Isici esisodwa noma ngaphezulu esinikezwe umhlinzeki wakho kamazisi asizange siqukathe inani lezinombolo ezilindelwe.",
     "xh": "Uphawu olunye okanye olungakumbi olunikelwe ngumboonelei wesazisi sakho aluqulethanga inani lamaxabiso alindelekileyo.",
+    "st": "E le nngwe kapa ho feta ya makgabane a fanweng ke wena ke mofani wa boitsebiso wa hao ha e na lenane le nepahetseng la dipalo.",
     "ca": "Un o més dels atributs facilitats pel vostre proveïdor d’identitat no contenia el nombre de valors esperat."
   },
   "problematic_attributes": {
@@ -24,6 +26,7 @@
     "no": "De ugyldige atributter er:",
     "zu": "Isici(izici) esiyinkinga sithi:",
     "xh": "Iimpawu eziyingxaki zezi:",
+    "st": "Makgabane a nang le mathata ke:",
     "ca": "Els atributs problemàtics són:"
   },
   "got_want": {
@@ -33,6 +36,7 @@
     "no": "har %GOT% verdier, forventer %WANT%",
     "zu": "uthole amanani angu-%GOT%, ufuna %WANT%",
     "xh": "kukho amaxabiso e-%GOT%, sifuna %WANT%",
+    "st": "o fumane dipalo tse %GOT%, o batla tse %WANT%",
     "ca": "tens %GOT% valors, desitjats %WANT%"
   }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_cookie.translation.json b/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_cookie.translation.json
index 9c13f8c18fa9be8dc45d58ffcb0e72c2be433843..7150fa02e3b1a75725258105c217f39f4e15b719 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_cookie.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_cookie.translation.json
@@ -32,6 +32,7 @@
 		"el": "\u03a0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1\u03c2 cookie",
 		"xh": "Ikhuki engekhoyo",
 		"zu": "Ikhukhi engatholakali",
+		"st": "Khukhi e siyo",
 		"ca": "Falta la cookie"
 	},
 	"description": {
@@ -67,6 +68,7 @@
 		"el": "\u0395\u03bd\u03b4\u03ad\u03c7\u03b5\u03c4\u03b1\u03b9 \u03c4\u03b1 cookie \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03ae\u03c2 \u03c3\u03b1\u03c2 \u03bd\u03b1 \u03ad\u03c7\u03bf\u03c5\u03bd \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03b8\u03b5\u03af. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03b9\u03c2 \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ad\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03ba\u03b1\u03b9 \u03ba\u03b1\u03b9 \u03b4\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac.",
 		"xh": "Ubonakala uzenze azasebenza iikhuki kwibhrawuza yakho. Nceda ujonge iisetingi ezikwibhrawuza yakho, uzame kwakhona.",
 		"zu": "Kubonakala sengathi uyekise amakhukhi kusiphequluli sakho. Sicela uhlole amasethingi kusiphequluli sakho, bese uzame futhi.",
+		"st": "O bonahala o kwetse dikhukhi sebading sa hao. Ka kopo hlahloba disetting sebading sa hao.",
 		"ca": "Sembla que heu desactivat les cookies al vostre navegador. Comproveu la configuració del vostre navegador i torneu-ho a provar."
 	},
 	"retry": {
@@ -102,6 +104,7 @@
 		"el": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac",
 		"zu": "Zama futhi",
 		"xh": "Zama kwakhona",
+		"st": "Khukhi e siyo",
 		"ca": "Torna a provar"
 	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_metadata.translation.json b/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_metadata.translation.json
index f423e027f47eb2216acff5b61023ef7ae9df2886..d80d8c32efa496046c4d8f1fd91ec3429837645f 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_metadata.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_metadata.translation.json
@@ -31,6 +31,7 @@
 		"el": "\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03bc\u03b5\u03c4\u03b1\u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1",
 		"zu": "Imethadatha ayitholakali",
 		"xh": "I-Metadata ayifunyenwanga",
+		"st": "Metadata ha e a fumanwa",
 		"ca": "No s'han trobat les metadades"
 	},
 	"not_found_for": {
@@ -65,6 +66,7 @@
 		"el": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03bd\u03b1 \u03b2\u03c1\u03b5\u03b8\u03bf\u03cd\u03bd \u03bc\u03b5\u03c4\u03b1\u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03bf\u03bd\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1:",
 		"xh": "Asikwazanga ukufumana imetadata ye-entithi:",
 		"zu": "Asikwazanga ukuthola imethadatha yenhlangano:",
+		"st": "Ha re a kgona ho fumana metadata bakeng sa setheo:",
 		"ca": "No hem pogut localitzar les metadades de l’entitat:"
 	},
 	"config_problem": {
@@ -99,6 +101,7 @@
 		"el": "\u0391\u03c5\u03c4\u03cc \u03c5\u03c0\u03bf\u03b4\u03b5\u03b9\u03ba\u03bd\u03cd\u03b5\u03b9 \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03bc\u03b5 \u03c4\u03b9\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03b5\u03af\u03c4\u03b5 \u03c4\u03bf\u03c5 \u03c0\u03b1\u03c1\u03cc\u03c7\u03bf\u03c5 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03b9\u03ce\u03bd \u03b5\u03af\u03c4\u03b5 \u03c4\u03bf\u03c5 \u03c0\u03b1\u03c1\u03cc\u03c7\u03bf\u03c5 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2.",
 		"xh": "Kusenokwenzeka yingxaki yolungiselelo kumboneleli wenkonzo okanye umboneleli wesazisi.",
 		"zu": "Lokhu kungenzeka ukuthi kubangelwa inkinga yomiso yomhlinzeki wesevisi noma umhlinzeki kamazisi.",
+		"st": "Bona ke bothata bo ka kgonahalang ka ho fetisisa ho mofani wa tshebeletso kapa mofani wa tshebeletso.",
 		"ca": "Aquest és probablement un problema de configuració del proveïdor de serveis o del proveïdor d’identitat."
 	},
 	"suggestion_user_link": {
@@ -133,6 +136,7 @@
 		"el": "\u0391\u03bd \u03bb\u03ac\u03b2\u03b1\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03ce\u03bd\u03c4\u03b1\u03c2 \u03ad\u03bd\u03b1\u03bd \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf \u03c3\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf\u03bd \u03b9\u03c3\u03c4\u03cc\u03c4\u03bf\u03c0\u03bf, \u03b8\u03b1 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c4\u03bf \u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c3\u03c4\u03bf\u03bd \u03b9\u03b4\u03b9\u03bf\u03ba\u03c4\u03ae\u03c4\u03b7 \u03c4\u03bf\u03c5 \u03b5\u03bd \u03bb\u03cc\u03b3\u03c9 \u03b9\u03c3\u03c4\u03cc\u03c4\u03bf\u03c0\u03bf\u03c5.",
 		"xh": "Ukuba ngaba ungumsebenzisi ofumene le mpazamo emva kokulandela ilinki kwisayithi, ufanele uchaze le mpazamo kumnini walo sayithi.",
 		"zu": "Uma ungumsebenzisi othole leli phutha ngemva kokulandela ilinki ekusayithi, kufanele ubike leli phutha kumnikazi waleyo sayithi.",
+		"st": "Haeba o le mosebedisi ya fumaneng phoso ena kamora ho latela lehokela le setsing, o tlameha ho tlaleha phoso ena ho monga setsi.",
 		"ca": "Si sou un usuari que ha rebut aquest error després de seguir un enllaç d’un lloc, haureu d’informar d’aquest error al propietari del lloc."
 	},
 	"suggestion_developer": {
@@ -167,6 +171,7 @@
 		"el": "\u0395\u03ac\u03bd \u03b5\u03af\u03c3\u03c4\u03b5 \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c2 \u03c4\u03b7\u03c2 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1\u03c2 \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03b5\u03be\u03bf\u03c5\u03c3\u03b9\u03bf\u03b4\u03cc\u03c4\u03b7\u03c3\u03b7\u03c2, \u03c4\u03cc\u03c4\u03b5 \u03b1\u03bd\u03c4\u03b9\u03bc\u03b5\u03c4\u03c9\u03c0\u03af\u03b6\u03b5\u03c4\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03bc\u03b5 \u03c4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03bc\u03b5\u03c4\u03b1\u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03c4\u03b1 \u03bc\u03b5\u03c4\u03b1\u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03ad\u03c7\u03bf\u03c5\u03bd \u03c1\u03c5\u03b8\u03bc\u03b9\u03c3\u03c4\u03b5\u03af \u03c3\u03c9\u03c3\u03c4\u03ac \u03c4\u03cc\u03c3\u03bf \u03c3\u03c4\u03bf\u03bd \u03c0\u03ac\u03c1\u03bf\u03c7\u03bf \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03cc\u03c3\u03bf \u03ba\u03b1\u03b9 \u03c3\u03c4\u03bf\u03bd \u03c0\u03ac\u03c1\u03bf\u03c7\u03bf \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03b9\u03ce\u03bd.",
 		"xh": "Ukuba ungumvelisi osebenzisa isisombululo sokusayina ungene kanye, unengxaki nolungiselelo lwe-metadata. Qinisekisa ukuba i-metadata ilungiselelwe ngokuchanekileyo kuzo zombini umbonelei wesazisi nomboneleli wenkonzo.",
 		"zu": "Uma ungunjiniyela osebenzisa isixazululo sokusayinela ukungena esisodwa, unenkinga ngomiso lwemethadatha. Qinisekisa ukuthi imethadatha imiswe ngendlela efanele kokubili kumhlinzeki womazisi nomhlinzeki wesevisi.",
+		"st": "Haeba o mohlahisi ya sebedisang tharollo ya ho saena hang, o na le bothata ka phetolo ya metadata. Netefatsa hore metadata e hlophiswe ka ho nepahala ho bobedi mofani wa boitsebiso le mofani wa tshebeletso.",
 		"ca": "Si sou un desenvolupador que està desplegant una solució d'inici de sessió únic, teniu un problema amb la configuració de metadades. Verifiqueu que les metadades estiguin configurades correctament tant al proveïdor d’identitat com al proveïdor de serveis."
 	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_state.translation.json b/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_state.translation.json
index dbf1245c4f32abc0ba680eca166dc47dc31cc02d..a72b32600584a931c09b7c857e57178de20112de 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_state.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/dictionaries/no_state.translation.json
@@ -29,6 +29,7 @@
 		"el": "\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2",
 		"zu": "Ulwazi lwesifunda lulahlekile",
 		"xh": "Inkcazelo yobume ilahlekile",
+		"st": "Tlhahisoleseding ya provense e lahlehile",
 		"ca": "Informació d'estat perduda"
 	},
 	"description": {
@@ -61,6 +62,7 @@
 		"el": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03bd\u03b1 \u03b5\u03bd\u03c4\u03bf\u03c0\u03b9\u03c3\u03c4\u03bf\u03cd\u03bd \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03bf \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd \u03b1\u03af\u03c4\u03b7\u03bc\u03b1.",
 		"xh": "Asikwazanga ukufumana inkcazelo yobume yesicelo sangoku.",
 		"zu": "Asikwazanga ukuthola ulwazi lwesifunda lwesicelo samanje.",
+		"st": "Ha re kgone ho fumana tlhahisoleseding ka provenseng bakeng sa kopo ya ha jwale.",
 		"ca": "No hem pogut localitzar la informació de l’estat per a la sol·licitud actual."
 	},
 	"suggestions": {
@@ -93,6 +95,7 @@
 		"el": "\u03a0\u03c1\u03bf\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b5\u03c0\u03af\u03bb\u03c5\u03c3\u03b7 \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2:",
 		"zu": "Iziphakamiso zokuxazulula le nkinga:",
 		"xh": "Iingcebiso zokulungisa le ngxaki:",
+		"st": "Ditlhahiso bakeng sa ho rarolla bothata bona:",
 		"ca": "Suggeriments per resoldre aquest problema:"
 	},
 	"suggestion_badlink": {
@@ -130,6 +133,7 @@
 		"el": "\u0395\u03c0\u03b9\u03c3\u03c4\u03c1\u03ad\u03c8\u03c4\u03b5 \u03c3\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03ba\u03b1\u03b9 \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03ae\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac.",
 		"zu": "Buyela emuva ekhasini langaphambilini bese uzame futhi.",
 		"xh": "Buyela emva kwikhasi elidlulileyo uzame kwakhona.",
+		"st": "Kgutlela leqepheng le fetileng ebe o leka hape.",
 		"ca": "Torneu a la pàgina anterior i torneu-ho a provar."
 	},
 	"suggestion_closebrowser": {
@@ -162,6 +166,7 @@
 		"el": "\u039a\u03bb\u03b5\u03af\u03c3\u03c4\u03b5 \u03c4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03b9\u03c3\u03c4\u03bf\u03cd (web browser) \u03ba\u03b1\u03b9 \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03ae\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac",
 		"zu": "Vala isiphequluli sewebhu, bese uzame futhi.",
 		"xh": "Vala ibhrawuza yewebhu, uzame kwakhona.",
+		"st": "Kwala sebadi sa webe, ebe o leka hape.",
 		"ca": "Tanqueu el navegador web i torneu-ho a provar."
 	},
 	"causes": {
@@ -194,6 +199,7 @@
 		"el": "\u0391\u03c5\u03c4\u03cc \u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c0\u03c1\u03bf\u03ba\u03cd\u03c8\u03b5\u03b9, \u03b5\u03ac\u03bd:",
 		"zu": "Leli phutha kungenzeka libangelwa ukuthi:",
 		"xh": "Le mpazamo isenokuba ibangelwe:",
+		"st": "Phoso ena e ka bakwa ke:",
 		"ca": "Aquest error pot ser causat per:"
 	},
 	"cause_badlink": {
@@ -231,6 +237,7 @@
 		"el": "\u039c\u03b5\u03c4\u03b1\u03b2\u03ae\u03ba\u03b1\u03c4\u03b5 \u03c0\u03af\u03c3\u03c9 \u03ba\u03b1\u03b9 \u03b5\u03bc\u03c0\u03c1\u03cc\u03c2 \u03c3\u03c4\u03bf \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03cc \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03b9\u03c3\u03c4\u03bf\u03cd.",
 		"zu": "Ukusebenzisa izinkinobho ezithi emuva naphambili kusiphequluli sewebhu.",
 		"xh": "Ukusebenzisa amaqhosha okuya emva naphambili kwibhrawuza yewebhu.",
+		"st": "Ho sebedisa dikonopo tsa pele le morao sebading sa webo.",
 		"ca": "Utilitzant els botons enrere i endavant del navegador web."
 	},
 	"cause_openbrowser": {
@@ -263,6 +270,7 @@
 		"el": "\u0391\u03bd\u03bf\u03af\u03be\u03b1\u03c4\u03b5 \u03c4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03b9\u03c3\u03c4\u03bf\u03cd \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b1\u03c4\u03b5 \u03ba\u03b1\u03c1\u03c4\u03ad\u03bb\u03b5\u03c2 \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7\u03c2 \u03c3\u03c5\u03bd\u03b5\u03b4\u03c1\u03af\u03b1\u03c2.",
 		"xh": "Kuvulwe ibhrawuza yewebhu ngeethebhu eziseyivwe kwiseshoni edlulileyo.",
 		"zu": "Kuvulwe isiphequluli sewebhu ngamathebhu alondolozwe kuseshini yangaphambilini.",
+		"st": "O butse sebadi sa webe ka di-tab tse bolokilweng sesheneng e fetileng.",
 		"ca": "S'ha obert el navegador web amb pestanyes desades de la sessió anterior."
 	},
 	"cause_nocookie": {
@@ -295,6 +303,7 @@
 		"el": "\u0397 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 cookie \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b7 \u03c3\u03c4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03b9\u03c3\u03c4\u03bf\u03cd.",
 		"xh": "Iikhuki zisenokwenziwa zingasebenzi kwibhrawuza yewebhu.",
 		"zu": "Amakhukhi kungenzeka ukuthi ayekisiwe kusiphequluli sewebhu.",
+		"st": "Dikhuki di ka nna tsa kwalwa sebading sa webe.",
 		"ca": "Les cookies poden estar desactivades al navegador web."
 	},
 	"report_header": {
@@ -327,6 +336,7 @@
 		"el": "\u0391\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03bf\u03c2",
 		"xh": "Chaza le mpazamo",
 		"zu": "Bika leli phutha",
+		"st": "Tlaleha phoso ena",
 		"ca": "Informeu d'aquest error"
 	},
 	"report_text": {
@@ -359,6 +369,7 @@
 		"el": "\u0391\u03bd \u03c4\u03bf \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03b5\u03be\u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b5\u03af \u03bd\u03b1 \u03c5\u03c6\u03af\u03c3\u03c4\u03b1\u03c4\u03b1\u03b9, \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c4\u03bf \u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c3\u03c4\u03bf\u03c5\u03c2 \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ad\u03c2 \u03c4\u03bf\u03c5 \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2.",
 		"xh": "Ukuba le ngxaki iyaqhubeka, ungayichaza kubalawuli besistim.",
 		"zu": "Uma le nkinga iphikelela, ungayibika kubalawuli besistimu.",
+		"st": "Haeba bothata bona bo phehella, o ka bo tlaleha ho batsamaisi ba sistimi.",
 		"ca": "Si aquest problema continua, podeu informar als administradors del sistema."
 	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/docs/authproc_targetedid.md b/vendor/simplesamlphp/simplesamlphp/modules/core/docs/authproc_targetedid.md
index f6cea7da7aff57475756832af03995d944d51ecf..f55e4febf96f6a80aaaf80b7a8285371477b411a 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/docs/authproc_targetedid.md
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/docs/authproc_targetedid.md
@@ -10,6 +10,11 @@ Parameters
 ----------
 
 `attributename`
+:   The name of the attribute we should use for the unique user identifier.
+    Optional, will use the attribute set by the `userid.attribute` metadata option by default.
+    *deprecated:* Please use `identifyingAttribute` instead.
+
+`identifyingAttribute`
 :   The name of the attribute we should use for the unique user identifier.
     Optional, will use the attribute set by the `userid.attribute` metadata option by default.
 
@@ -35,7 +40,7 @@ A custom attribute:
     'authproc' => array(
         50 => array(
             'class' => 'core:TargetedID',
-            'attributename' => 'eduPersonPrincipalName'
+            'identifyingAttribute' => 'eduPersonPrincipalName'
         ),
     ),
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/hooks/hook_frontpage.php b/vendor/simplesamlphp/simplesamlphp/modules/core/hooks/hook_frontpage.php
index cbb1469c03a63179cd4d405d0e637b330f90e7f7..d56a7f0ed433496971e21ec1148c893e475b8f8f 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/hooks/hook_frontpage.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/hooks/hook_frontpage.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 /**
  * Hook to add the modinfo module to the frontpage.
  *
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/hooks/hook_sanitycheck.php b/vendor/simplesamlphp/simplesamlphp/modules/core/hooks/hook_sanitycheck.php
index 7e401a0dc5e7abdfb0f8157419b51018d1c00fe1..8ffd9c128a3e9cfb61eeac3c96b481eb8753dd18 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/hooks/hook_sanitycheck.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/hooks/hook_sanitycheck.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 /**
  * Hook to do sanitycheck
  *
@@ -26,7 +28,7 @@ function core_hook_sanitycheck(&$hookinfo)
         $hookinfo['info'][] = '[core] In config.php technicalcontact_email is set properly';
     }
 
-    if (version_compare(phpversion(), '5.6', '>=')) {
+    if (version_compare(phpversion(), '7.1', '>=')) {
         $hookinfo['info'][] = '[core] You are running a PHP version suitable for SimpleSAMLphp.';
     } else {
         $hookinfo['errors'][] = '[core] You are running an old PHP installation. ' .
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/ACL.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/ACL.php
index dac755fe601e98912624f0379b0e5c86590daafd..a952cbe531c80c98584782fcfa885a81201e7542 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/ACL.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/ACL.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core;
 
 use SimpleSAML\Configuration;
@@ -57,10 +59,8 @@ public function __construct($acl)
      * @param string $id  The id of the access control list.
      * @return array  The access control list array.
      */
-    private static function getById($id)
+    private static function getById(string $id): array
     {
-        assert(is_string($id));
-
         $config = Configuration::getOptionalConfig('acl.php');
         if (!$config->hasValue($id)) {
             throw new Error\Exception('No ACL with id ' . var_export($id, true) . ' in config/acl.php.');
@@ -100,7 +100,7 @@ public function allows(array $attributes)
      * @param array $rule  The rule we should check.
      * @return boolean  TRUE if the rule matches, FALSE if not.
      */
-    private static function match(array $attributes, array $rule)
+    private static function match(array $attributes, array $rule): bool
     {
         $op = array_shift($rule);
         if ($op === null) {
@@ -135,7 +135,7 @@ private static function match(array $attributes, array $rule)
      * @param array $rule  The rule we should check.
      * @return boolean  TRUE if the rule matches, FALSE if not.
      */
-    private static function opAnd($attributes, $rule)
+    private static function opAnd(array $attributes, array $rule): bool
     {
         foreach ($rule as $subRule) {
             if (!self::match($attributes, $subRule)) {
@@ -154,7 +154,7 @@ private static function opAnd($attributes, $rule)
      * @param array $rule  The rule we should check.
      * @return boolean  TRUE if the rule matches, FALSE if not.
      */
-    private static function opEquals($attributes, $rule)
+    private static function opEquals(array $attributes, array $rule): bool
     {
         $attributeName = array_shift($rule);
 
@@ -194,7 +194,7 @@ private static function opEquals($attributes, $rule)
      * @param array $rule  The rule we should check.
      * @return boolean  TRUE if the rule matches, FALSE if not.
      */
-    private static function opEqualsPreg($attributes, $rule)
+    private static function opEqualsPreg(array $attributes, array $rule): bool
     {
         $attributeName = array_shift($rule);
 
@@ -235,7 +235,7 @@ private static function opEqualsPreg($attributes, $rule)
      * @param array $rule  The rule we should check.
      * @return boolean  TRUE if the rule matches, FALSE if not.
      */
-    private static function opHas($attributes, $rule)
+    private static function opHas(array $attributes, array $rule): bool
     {
         $attributeName = array_shift($rule);
 
@@ -262,7 +262,7 @@ private static function opHas($attributes, $rule)
      * @param array $rule  The rule we should check.
      * @return boolean  TRUE if the rule matches, FALSE if not.
      */
-    private static function opHasPreg($attributes, $rule)
+    private static function opHasPreg(array $attributes, array $rule): bool
     {
         $attributeName = array_shift($rule);
 
@@ -290,7 +290,7 @@ private static function opHasPreg($attributes, $rule)
      * @param array $rule  The rule we should check.
      * @return boolean  TRUE if the rule matches, FALSE if not.
      */
-    private static function opOr($attributes, $rule)
+    private static function opOr(array $attributes, array $rule): bool
     {
         foreach ($rule as $subRule) {
             if (self::match($attributes, $subRule)) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeAdd.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeAdd.php
index 33f419cd3ded36157df74df2212e440ea00c14f1..116fd8ce4145193d8a1a4fe45e512cb9f9be2621 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeAdd.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeAdd.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeAlter.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeAlter.php
index 710254db6303469a7d1d7c2a945703b0d854f767..2ca333dc896b517d4a0f2f9fc0ffa3f96d6ad5cd 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeAlter.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeAlter.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Error;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeCopy.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeCopy.php
index f6b9a55ae074ebf4c8b8d13869d9d0a7af5aa7f1..29fdd4fe3908287782cf15114bb9fe60ebc7517e 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeCopy.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeCopy.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeLimit.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeLimit.php
index 2767a9555d0ee7ff571ee4f23b44113d49821cd8..c728ba816f2bf32578200fb280afcd3fbbc306f4 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeLimit.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeLimit.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Error;
@@ -68,7 +70,7 @@ public function __construct(&$config, $reserved)
      * @param array &$request  The current request.
      * @return array|null  Array with attribute names, or NULL if no limit is placed.
      */
-    private static function getSPIdPAllowed(array &$request)
+    private static function getSPIdPAllowed(array &$request): ?array
     {
         if (array_key_exists('attributes', $request['Destination'])) {
             // SP Config
@@ -139,7 +141,7 @@ public function process(&$request)
      * @param array $allowedConfigValues The allowed values, and possibly configuration options.
      * @return array The filtered values
      */
-    private function filterAttributeValues(array $values, array $allowedConfigValues)
+    private function filterAttributeValues(array $values, array $allowedConfigValues): array
     {
         if (array_key_exists('regex', $allowedConfigValues) && $allowedConfigValues['regex'] === true) {
             $matchedValues = [];
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeMap.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeMap.php
index 7efdd2f73e77c99e831b0d48c6eaed64d84737d0..ec11b0452933e6bdd8f171496536ff0c459ed601 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeMap.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeMap.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Configuration;
@@ -79,7 +81,7 @@ public function __construct(&$config, $reserved)
      * @throws \Exception If the filter could not load the requested attribute map file.
      * @return void
      */
-    private function loadMapFile($fileName)
+    private function loadMapFile(string $fileName): void
     {
         $config = Configuration::getInstance();
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeRealm.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeRealm.php
index 81a71235d05f2e78af050839f67ecc861e77ae6e..9ca00ffd6e7d738e2d2189a84b26fa424e987ceb 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeRealm.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeRealm.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 /**
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeValueMap.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeValueMap.php
index 7c41cf412db8e473a91b10df8ecf3853e8ab885f..f966fa6e8e5fc4043ed108c77fee529db955fb74 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeValueMap.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/AttributeValueMap.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Error;
@@ -17,13 +19,13 @@ class AttributeValueMap extends \SimpleSAML\Auth\ProcessingFilter
      * The name of the attribute we should assign values to (ie: the target attribute).
      * @var string
      */
-    private $targetattribute;
+    private $targetattribute = '';
 
     /**
      * The name of the attribute we should create values from.
      * @var string
      */
-    private $sourceattribute;
+    private $sourceattribute = '';
 
     /**
      * The required $sourceattribute values and target affiliations.
@@ -91,10 +93,10 @@ public function __construct(&$config, $reserved)
         }
 
         // now validate it
-        if (!is_string($this->sourceattribute)) {
+        if (empty($this->sourceattribute)) {
             throw new Error\Exception("AttributeValueMap: 'sourceattribute' configuration option not set.");
         }
-        if (!is_string($this->targetattribute)) {
+        if (empty($this->targetattribute)) {
             throw new Error\Exception("AttributeValueMap: 'targetattribute' configuration option not set.");
         }
         if (!is_array($this->values)) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/Cardinality.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/Cardinality.php
index 113cc6b622773e766746b3368c8c5aa496ffd013..0ddb1ff8916144a297550e9bcdaec1c29ef75fd1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/Cardinality.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/Cardinality.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Auth;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/CardinalitySingle.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/CardinalitySingle.php
index a9f08001c7779fdb095e2eed9458f60115749d8d..36d0b8bb3631d51a1db1508e5dfefba5be896ec5 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/CardinalitySingle.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/CardinalitySingle.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Auth;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ExtendIdPSession.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ExtendIdPSession.php
index b582561e0ea85730975ebebe56f47b35aa1b383e..ab4e2126b997260016e7200f5cbbb045d9828be2 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ExtendIdPSession.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ExtendIdPSession.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/GenerateGroups.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/GenerateGroups.php
index a6e2257e774b5afa20a09805d8127c1cab756569..cf189839a140a89edfe8a99516c8b1aff76e3725 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/GenerateGroups.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/GenerateGroups.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Logger;
@@ -102,10 +104,8 @@ public function process(&$request)
      * @param array $attributes  The attributes of the user.
      * @return string|null  The realm of the user, or NULL if we are unable to determine the realm.
      */
-    private static function getRealm($attributes)
+    private static function getRealm(array $attributes): ?string
     {
-        assert(is_array($attributes));
-
         if (!array_key_exists('eduPersonPrincipalName', $attributes)) {
             return null;
         }
@@ -136,10 +136,8 @@ private static function getRealm($attributes)
      * @param string $string  The string which should be escaped.
      * @return string  The escaped string.
      */
-    private static function escapeIllegalChars($string)
+    private static function escapeIllegalChars(string $string): string
     {
-        assert(is_string($string));
-
         return preg_replace_callback(
             '/([^a-zA-Z0-9_@=.])/',
             /**
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/LanguageAdaptor.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/LanguageAdaptor.php
index 85271d1659b8b6094b6d7a8be1f00e6e8ff4baf2..45889c068d29a709e368fd5920f5989bf92c6d87 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/LanguageAdaptor.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/LanguageAdaptor.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Locale\Language;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/PHP.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/PHP.php
index fcf6e738aed078620c913b05147df83c6d177a0f..9b79f0988a467c201116e8b192c04b9c8ed3c7ca 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/PHP.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/PHP.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Error;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ScopeAttribute.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ScopeAttribute.php
index bc05f95388c74049428153b1428e9120fdc61d0a..7effc2adbbbfb2d361c9614cb01b7c1b54c9d895 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ScopeAttribute.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ScopeAttribute.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ScopeFromAttribute.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ScopeFromAttribute.php
index cc8411e311849198510d15d1b37325392d6c1ce7..e94acfe33c1e062d06776e0483555fe36e12e6ed 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ScopeFromAttribute.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/ScopeFromAttribute.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/StatisticsWithAttribute.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/StatisticsWithAttribute.php
index 63d0a62d89f4a3af52fdd8a0111c884e11869fed..05f5d92ed88aafc5e95010c1a4f273fbd966bcfe 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/StatisticsWithAttribute.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/StatisticsWithAttribute.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Logger;
@@ -104,7 +106,7 @@ public function process(&$state)
      *
      * @return string
      */
-    private function setIdentifier($direction, $state)
+    private function setIdentifier(string $direction, array $state): string
     {
         if (array_key_exists($direction, $state)) {
             if (isset($state[$direction]['core:statistics-id'])) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/TargetedID.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/TargetedID.php
index 950f02f9ba3a5c8a3420fb6f215546b98f4fba53..e6a804cc8f830b6e3b64e010472fb7c590cb762c 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/TargetedID.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/TargetedID.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SAML2\Constants;
@@ -64,10 +66,15 @@ public function __construct(&$config, $reserved)
 
         assert(is_array($config));
 
-        if (array_key_exists('attributename', $config)) {
+        if (array_key_exists('identifyingAttribute', $config)) {
+            $this->attribute = $config['identifyingAttribute'];
+            if (!is_string($this->attribute)) {
+                throw new \Exception('Invalid `identifyingAttribute` name given to core:TargetedID filter.');
+            }
+        } elseif (array_key_exists('attributename', $config)) {
             $this->attribute = $config['attributename'];
             if (!is_string($this->attribute)) {
-                throw new \Exception('Invalid attribute name given to core:TargetedID filter.');
+                throw new \Exception('Invalid `attributename` given to core:TargetedID filter.');
             }
         }
 
@@ -160,10 +167,8 @@ public function process(&$state)
      * @param array $metadata  The metadata of the entity.
      * @return string  The unique identifier for the entity.
      */
-    private static function getEntityId($metadata)
+    private static function getEntityId(array $metadata): string
     {
-        assert(is_array($metadata));
-
         $id = '';
 
         if (array_key_exists('metadata-set', $metadata)) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/WarnShortSSOInterval.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/WarnShortSSOInterval.php
index 5c5352d1b1bb070837b36b29fea7ac502e1afd1a..7f2005b96ab3315d6b40ee48f9d4fe09bddcc051 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/WarnShortSSOInterval.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Process/WarnShortSSOInterval.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Process;
 
 use SimpleSAML\Auth;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Source/AdminPassword.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Source/AdminPassword.php
index ea03893e75cb9f0a94c49f644ad0834355b1ed14..7875e1a1abe72f12d569ad759901f8ca886708db 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Source/AdminPassword.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/Source/AdminPassword.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth\Source;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/UserPassBase.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/UserPassBase.php
index 90104e5f14d2999a5b0b04f2fccfc3672c62f2fa..703bf6b78527b2791ef558942efe707245603760 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/UserPassBase.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/UserPassBase.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth;
 
 use SAML2\Constants;
@@ -24,12 +26,12 @@ abstract class UserPassBase extends \SimpleSAML\Auth\Source
     /**
      * The string used to identify our states.
      */
-    const STAGEID = '\SimpleSAML\Module\core\Auth\UserPassBase.state';
+    public const STAGEID = '\SimpleSAML\Module\core\Auth\UserPassBase.state';
 
     /**
      * The key of the AuthId field in the state.
      */
-    const AUTHID = '\SimpleSAML\Module\core\Auth\UserPassBase.AuthId';
+    public const AUTHID = '\SimpleSAML\Module\core\Auth\UserPassBase.AuthId';
 
     /**
      * Username we should force.
@@ -47,7 +49,7 @@ abstract class UserPassBase extends \SimpleSAML\Auth\Source
      *
      * @var array
      */
-    protected $loginLinks;
+    protected $loginLinks = [];
 
     /**
      * Storage for authsource config option remember.username.enabled
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/UserPassOrgBase.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/UserPassOrgBase.php
index 8271c8809b14eb5076a7dcdc7651f92b749cef3b..3c2a51f9badd409963d984a14effe462e46ab480 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/UserPassOrgBase.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Auth/UserPassOrgBase.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Auth;
 
 use SimpleSAML\Auth;
@@ -24,20 +26,17 @@ abstract class UserPassOrgBase extends \SimpleSAML\Auth\Source
     /**
      * The string used to identify our states.
      */
-    const STAGEID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.state';
-
+    public const STAGEID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.state';
 
     /**
      * The key of the AuthId field in the state.
      */
-    const AUTHID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.AuthId';
-
+    public const AUTHID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.AuthId';
 
     /**
      * The key of the OrgId field in the state, identifies which org was selected.
      */
-    const ORGID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.SelectedOrg';
-
+    public const ORGID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.SelectedOrg';
 
     /**
      * What way do we handle the organization as part of the username.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller/Exception.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller/Exception.php
new file mode 100644
index 0000000000000000000000000000000000000000..905f8c1164a5ff47ffc932bf27bec284ba540236
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller/Exception.php
@@ -0,0 +1,166 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\core\Controller;
+
+use SimpleSAML\Auth;
+use SimpleSAML\Configuration;
+use SimpleSAML\Error;
+use SimpleSAML\Logger;
+use SimpleSAML\Module;
+use SimpleSAML\Session;
+use SimpleSAML\Utils;
+use SimpleSAML\XHTML\Template;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Controller class for the core module.
+ *
+ * This class serves the different views available in the module.
+ *
+ * @package SimpleSAML\Module\core
+ */
+class Exception
+{
+    /** @var \SimpleSAML\Configuration */
+    protected $config;
+
+    /** @var \SimpleSAML\Session */
+    protected $session;
+
+
+    /**
+     * Controller constructor.
+     *
+     * It initializes the global configuration and auth source configuration for the controllers implemented here.
+     *
+     * @param \SimpleSAML\Configuration              $config The configuration to use by the controllers.
+     * @param \SimpleSAML\Session                    $session The session to use by the controllers.
+     *
+     * @throws \Exception
+     */
+    public function __construct(
+        Configuration $config,
+        Session $session
+    ) {
+        $this->config = $config;
+        $this->session = $session;
+    }
+
+
+    /**
+     * Show cardinality error.
+     *
+     * @param Request $request The request that lead to this login operation.
+     * @throws \SimpleSAML\Error\BadRequest
+     * @return \SimpleSAML\XHTML\Template|\Symfony\Component\HttpFoundation\RedirectResponse
+     *   An HTML template or a redirection if we are not authenticated.
+     */
+    public function cardinality(Request $request): Response
+    {
+        $stateId = $request->get('StateId', false);
+        if ($stateId === false) {
+            throw new Error\BadRequest('Missing required StateId query parameter.');
+        }
+
+        /** @var array $state */
+        $state = Auth\State::loadState($stateId, 'core:cardinality');
+
+        Logger::stats(
+            'core:cardinality:error ' . $state['Destination']['entityid'] . ' ' . $state['saml:sp:IdP'] .
+            ' ' . implode(',', array_keys($state['core:cardinality:errorAttributes']))
+        );
+
+        $t = new Template($this->config, 'core:cardinality_error.tpl.php');
+        $t->data['cardinalityErrorAttributes'] = $state['core:cardinality:errorAttributes'];
+        if (isset($state['Source']['auth'])) {
+            $t->data['LogoutURL'] = Module::getModuleURL(
+                'core/authenticate.php',
+                ['as' => $state['Source']['auth']]
+            ) . "&logout";
+        }
+
+        $t = new Template($this->config, 'core:cardinality_error.twig');
+        $t->data['cardinalityErrorAttributes'] = $state['core:cardinality:errorAttributes'];
+        if (isset($state['Source']['auth'])) {
+            $t->data['LogoutURL'] = Module::getModuleURL(
+                'core/login/' . urlencode($state['Source']['auth'])
+            );
+        }
+
+        $t->setStatusCode(403);
+        return $t;
+    }
+
+
+    /**
+     * Show missing cookie error.
+     *
+     * @param Request $request The request that lead to this login operation.
+     * @return \SimpleSAML\XHTML\Template|\Symfony\Component\HttpFoundation\RedirectResponse
+     *   An HTML template or a redirection if we are not authenticated.
+     */
+    public function nocookie(Request $request): Response
+    {
+        $retryURL = $request->get('retryURL', null);
+        if ($retryURL !== null) {
+            $retryURL = Utils\HTTP::checkURLAllowed(strval($retryURL));
+        }
+
+        $t = new Template($this->config, 'core:no_cookie.twig');
+        $translator = $t->getTranslator();
+
+        /** @var string $header */
+        $header = $translator->t('{core:no_cookie:header}');
+
+        /** @var string $desc */
+        $desc = $translator->t('{core:no_cookie:description}');
+
+        /** @var string $retry */
+        $retry = $translator->t('{core:no_cookie:retry}');
+
+        $t->data['header'] = htmlspecialchars($header);
+        $t->data['description'] = htmlspecialchars($desc);
+        $t->data['retry'] = htmlspecialchars($retry);
+        $t->data['retryURL'] = $retryURL;
+        return $t;
+    }
+
+
+    /**
+     * Show a warning to an user about the SP requesting SSO a short time after
+     * doing it previously.
+     *
+     * @param Request $request The request that lead to this login operation.
+     *
+     * @return \SimpleSAML\XHTML\Template|\SimpleSAML\HTTP\RunnableResponse|\Symfony\Component\HttpFoundation\RedirectResponse
+     * An HTML template, a redirect or a "runnable" response.
+     *
+     * @throws \SimpleSAML\Error\BadRequest
+     */
+    public function shortSsoInterval(Request $request): Response
+    {
+        $stateId = $request->get('StateId', false);
+        if ($stateId === false) {
+            throw new Error\BadRequest('Missing required StateId query parameter.');
+        }
+
+        /** @var array $state */
+        $state = Auth\State::loadState($stateId, 'core:short_sso_interval');
+
+        $continue = $request->get('continue', false);
+        if ($continue !== false) {
+            // The user has pressed the continue/retry-button
+            Auth\ProcessingChain::resumeProcessing($state);
+        }
+
+        $t = new Template($this->config, 'core:short_sso_interval.twig');
+        $translator = $t->getTranslator();
+        $t->data['params'] = ['StateId' => $stateId];
+        $t->data['trackId'] = $this->session->getTrackID();
+        $t->data['autofocus'] = 'contbutton';
+        return $t;
+    }
+}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller/Login.php
similarity index 65%
rename from vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller.php
rename to vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller/Login.php
index a9737edb47cf44ab2cd0930f39cb743d5bddd3de..8bb72df41800a96e0deeadedf22b239eabac7426 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller/Login.php
@@ -1,6 +1,8 @@
 <?php
 
-namespace SimpleSAML\Module\core;
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\core\Controller;
 
 use SimpleSAML\Auth;
 use SimpleSAML\Auth\AuthenticationFactory;
@@ -13,6 +15,8 @@
 use SimpleSAML\XHTML\Template;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Webmozart\Assert\Assert;
 
 /**
  * Controller class for the core module.
@@ -21,7 +25,7 @@
  *
  * @package SimpleSAML\Module\core
  */
-class Controller
+class Login
 {
     /** @var \SimpleSAML\Configuration */
     protected $config;
@@ -64,12 +68,12 @@ public function __construct(
      *
      * @param string $as The identifier of the authentication source.
      *
-     * @return \SimpleSAML\XHTML\Template|RedirectResponse An HTML template or a redirection if we are not
-     * authenticated.
+     * @return \SimpleSAML\XHTML\Template|\Symfony\Component\HttpFoundation\RedirectResponse
+     * An HTML template or a redirection if we are not authenticated.
      *
      * @throws \SimpleSAML\Error\Exception An exception in case the auth source specified is invalid.
      */
-    public function account($as)
+    public function account(string $as): Response
     {
         if (!array_key_exists($as, $this->sources)) {
             throw new Error\Exception('Invalid authentication source');
@@ -82,7 +86,7 @@ public function account($as)
         }
 
         $attributes = $auth->getAttributes();
-        
+
         $session = Session::getSessionFromRequest();
 
         $t = new Template($this->config, 'auth_status.twig', 'attributes');
@@ -112,14 +116,14 @@ public function account($as)
      * @param Request $request The request that lead to this login operation.
      * @param string|null $as The name of the authentication source to use, if any. Optional.
      *
-     * @return \SimpleSAML\XHTML\Template|\SimpleSAML\HTTP\RunnableResponse|RedirectResponse An HTML template, a
-     * redirect or a "runnable" response.
+     * @return \Symfony\Component\HttpFoundation\Response
+     * An HTML template, a redirect or a "runnable" response.
      *
      * @throws \SimpleSAML\Error\Exception
      */
-    public function login(Request $request, $as = null)
+    public function login(Request $request, string $as = null): Response
     {
-        //delete admin
+        // delete admin
         if (isset($this->sources['admin'])) {
             unset($this->sources['admin']);
         }
@@ -128,11 +132,30 @@ public function login(Request $request, $as = null)
             $as = key($this->sources);
         }
 
+        $default = false;
+        if (array_key_exists('default', $this->sources) && is_array($this->sources['default'])) {
+            $default = $this->sources['default'];
+        }
+
         if ($as === null) { // no authentication source specified
-            $t = new Template($this->config, 'core:login.twig');
-            $t->data['loginurl'] = Utils\Auth::getAdminLoginURL();
-            $t->data['sources'] = $this->sources;
-            return $t;
+            if (!$default) {
+                $t = new Template($this->config, 'core:login.twig');
+                $t->data['loginurl'] = Utils\Auth::getAdminLoginURL();
+                $t->data['sources'] = $this->sources;
+                return $t;
+            }
+
+            // we have a default, use that one
+            $as = 'default';
+            foreach ($this->sources as $id => $source) {
+                if ($id === 'default') {
+                    continue;
+                }
+                if ($source === $this->sources['default']) {
+                    $as = $id;
+                    break;
+                }
+            }
         }
 
         // auth source defined, check if valid
@@ -150,7 +173,7 @@ public function login(Request $request, $as = null)
             /** @var array $state */
             $state = Auth\State::loadExceptionState();
 
-            assert(array_key_exists(Auth\State::EXCEPTION_DATA, $state));
+            Assert::keyExists($state, Auth\State::EXCEPTION_DATA);
             $e = $state[Auth\State::EXCEPTION_DATA];
 
             throw $e;
@@ -179,9 +202,47 @@ public function login(Request $request, $as = null)
      *
      * @throws \SimpleSAML\Error\CriticalConfigurationError
      */
-    public function logout($as)
+    public function logout(string $as): Response
     {
         $auth = new Auth\Simple($as);
-        return new RunnableResponse([$auth, 'logout'], [$this->config->getBasePath() . 'logout.php']);
+        return new RunnableResponse(
+            [$auth, 'logout'],
+            [$this->config->getBasePath()]
+        );
+    }
+
+
+    /**
+     * This clears the user's IdP discovery choices.
+     *
+     * @param Request $request The request that lead to this login operation.
+     * @return void
+     */
+    public function cleardiscochoices(Request $request)
+    {
+        // The base path for cookies. This should be the installation directory for SimpleSAMLphp.
+        $cookiePath = $this->config->getBasePath();
+
+        // We delete all cookies which starts with 'idpdisco_'
+        foreach ($request->cookies->all() as $cookieName => $value) {
+            if (substr($cookieName, 0, 9) !== 'idpdisco_') {
+                // Not a idpdisco cookie.
+                continue;
+            }
+
+            Utils\HTTP::setCookie($cookieName, null, ['path' => $cookiePath, 'httponly' => false], false);
+        }
+
+        // Find where we should go now.
+        $returnTo = $request->get('ReturnTo', false);
+        if ($returnTo !== false) {
+            $returnTo = Utils\HTTP::checkURLAllowed($returnTo);
+        } else {
+            // Return to the front page if no other destination is given. This is the same as the base cookie path.
+            $returnTo = $cookiePath;
+        }
+
+        // Redirect to destination.
+        Utils\HTTP::redirectTrustedURL($returnTo);
     }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller/Redirection.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller/Redirection.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa35589c83ba4b4ab30010646a6481f571f47ae5
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Controller/Redirection.php
@@ -0,0 +1,111 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\core\Controller;
+
+use SimpleSAML\Auth;
+use SimpleSAML\Configuration;
+use SimpleSAML\Error;
+use SimpleSAML\Logger;
+use SimpleSAML\Module;
+use SimpleSAML\Session;
+use SimpleSAML\Utils;
+use SimpleSAML\XHTML\Template;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Webmozart\Assert\Assert;
+
+/**
+ * Controller class for the core module.
+ *
+ * This class serves the different views available in the module.
+ *
+ * @package SimpleSAML\Module\core
+ */
+class Redirection
+{
+    /** @var \SimpleSAML\Configuration */
+    protected $config;
+
+    /** @var \SimpleSAML\Session */
+    protected $session;
+
+
+    /**
+     * Controller constructor.
+     *
+     * It initializes the global configuration and auth source configuration for the controllers implemented here.
+     *
+     * @param \SimpleSAML\Configuration              $config The configuration to use by the controllers.
+     * @param \SimpleSAML\Session                    $session The session to use by the controllers.
+     *
+     * @throws \Exception
+     */
+    public function __construct(
+        Configuration $config,
+        Session $session
+    ) {
+        $this->config = $config;
+        $this->session = $session;
+    }
+
+
+    /**
+     * This controller provides a way to create a redirect to a POST request
+     *
+     * @param Request $request The request that lead to this login operation.
+     * @throws \SimpleSAML\Error\BadRequest
+     * @return \SimpleSAML\XHTML\Template|\Symfony\Component\HttpFoundation\RedirectResponse
+     *   An HTML template or a redirection if we are not authenticated.
+     */
+    public function postredirect(Request $request): Response
+    {
+        $redirId = $request->get('RedirId', false);
+        $redirInfo = $request->get('RedirInfo', false);
+        if ($redirId !== false) {
+            $postId = $redirId;
+        } elseif ($redirInfo !== false) {
+            $encData = base64_decode($redirInfo);
+
+            if (empty($encData)) {
+                throw new Error\BadRequest('Invalid RedirInfo data.');
+            }
+
+            list($sessionId, $postId) = explode(':', Utils\Crypto::aesDecrypt($encData));
+
+            if (empty($sessionId) || empty($postId)) {
+                throw new Error\BadRequest('Invalid session info data.');
+            }
+        } else {
+            throw new Error\BadRequest('Missing redirection info parameter.');
+        }
+
+        $session = $this->session;
+        if ($session === null) {
+            throw new \Exception('Unable to load session.');
+        }
+
+        $postData = $session->getData('core_postdatalink', $postId);
+
+        if ($postData === null) {
+            // The post data is missing, probably because it timed out
+            throw new \Exception('The POST data we should restore was lost.');
+        }
+
+        $session->deleteData('core_postdatalink', $postId);
+
+        Assert::isArray($postData);
+        Assert::keyExists($postData, 'url');
+        Assert::keyExists($postData, 'post');
+
+        if (!Utils\HTTP::isValidURL($postData['url'])) {
+            throw new Error\Exception('Invalid destination URL.');
+        }
+
+        $t = new Template($this->config, 'post.twig');
+        $t->data['destination'] = $postData['url'];
+        $t->data['post'] = $postData['post'];
+        return $t;
+    }
+}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Stats/Output/File.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Stats/Output/File.php
index 30a97e1722cfe45f7d204f8053b00efc7f894f9c..77c1cac1f6daa75f032b6c1458c5039dd2d38676 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Stats/Output/File.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Stats/Output/File.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Stats\Output;
 
 use SimpleSAML\Configuration;
@@ -55,10 +57,8 @@ public function __construct(Configuration $config)
      * @param string $date  The date for the log file.
      * @return void
      */
-    private function openLog($date)
+    private function openLog(string $date): void
     {
-        assert(is_string($date));
-
         if ($this->file !== null && $this->file !== false) {
             fclose($this->file);
             $this->file = null;
@@ -89,9 +89,9 @@ public function emit(array $data)
         assert(isset($data['time']));
 
         $time = $data['time'];
-        $milliseconds = (int) (($time - (int) $time) * 1000);
+        $milliseconds = intval((($time - intval($time)) * 1000));
 
-        $timestamp = gmdate('Y-m-d\TH:i:s', $time) . sprintf('.%03dZ', $milliseconds);
+        $timestamp = gmdate('Y-m-d\TH:i:s', intval($time)) . sprintf('.%03dZ', $milliseconds);
 
         $outDate = substr($timestamp, 0, 10); // The date-part of the timstamp
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Stats/Output/Log.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Stats/Output/Log.php
index 0175c2328a9bd5a548cd5531cd4fa6328496f2d9..3886ab09f653548e5611daf7344bc7c92913f980 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Stats/Output/Log.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Stats/Output/Log.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Stats\Output;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Storage/SQLPermanentStorage.php b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Storage/SQLPermanentStorage.php
index 1ff18f8ab344a8ad58879a4b8ebb2e6aa09845d4..04d4599d1a83bbe12c3b47d35dca15a558c0459c 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Storage/SQLPermanentStorage.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/lib/Storage/SQLPermanentStorage.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\core\Storage;
 
 use PDO;
@@ -47,6 +49,7 @@ public function __construct($name, $config = null)
 
         $dbfile = 'sqlite:' . $sqllitedir . $name . '.sqlite';
         if ($this->db = new PDO($dbfile)) {
+            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
             $q = @$this->db->query('SELECT key1 FROM data LIMIT 1');
             if ($q === false) {
                 $this->db->exec('
@@ -70,9 +73,9 @@ public function __construct($name, $config = null)
 
     /**
      * @param string $type
-     * @param mixed $key1
-     * @param mixed $key2
-     * @param mixed $value
+     * @param string $key1
+     * @param string $key2
+     * @param string $value
      * @param int|null $duration
      * @return void
      */
@@ -88,13 +91,13 @@ public function set($type, $key1, $key2, $value, $duration = null)
 
     /**
      * @param string $type
-     * @param mixed $key1
-     * @param mixed $key2
-     * @param mixed $value
+     * @param string $key1
+     * @param string $key2
+     * @param string $value
      * @param int|null $duration
      * @return array
      */
-    private function insert($type, $key1, $key2, $value, $duration = null)
+    private function insert(string $type, string $key1, string $key2, string $value, int $duration = null): array
     {
         $expire = is_null($duration) ? null : (time() + $duration);
 
@@ -114,13 +117,13 @@ private function insert($type, $key1, $key2, $value, $duration = null)
 
     /**
      * @param string $type
-     * @param mixed $key1
-     * @param mixed $key2
-     * @param mixed $value
+     * @param string $key1
+     * @param string $key2
+     * @param string $value
      * @param int|null $duration
      * @return array
      */
-    private function update($type, $key1, $key2, $value, $duration = null)
+    private function update(string $type, string $key1, string $key2, string $value, int $duration = null): array
     {
         $expire = is_null($duration) ? null : (time() + $duration);
 
@@ -139,8 +142,8 @@ private function update($type, $key1, $key2, $value, $duration = null)
 
     /**
      * @param string $type
-     * @param mixed $key1
-     * @param mixed $key2
+     * @param string $key1
+     * @param string $key2
      * @return array|null
      */
     public function get($type = null, $key1 = null, $key2 = null)
@@ -164,8 +167,8 @@ public function get($type = null, $key1 = null, $key2 = null)
      * Return the value directly (not in a container)
      *
      * @param string $type
-     * @param mixed $key1
-     * @param mixed $key2
+     * @param string $key1
+     * @param string $key2
      * @return array|null
      */
     public function getValue($type = null, $key1 = null, $key2 = null)
@@ -180,8 +183,8 @@ public function getValue($type = null, $key1 = null, $key2 = null)
 
     /**
      * @param string $type
-     * @param mixed $key1
-     * @param mixed $key2
+     * @param string $key1
+     * @param string $key2
      * @return bool
      */
     public function exists($type, $key1, $key2)
@@ -197,8 +200,8 @@ public function exists($type, $key1, $key2)
 
     /**
      * @param string $type
-     * @param mixed $key1
-     * @param mixed $key2
+     * @param string $key1
+     * @param string $key2
      * @return array|false
      */
     public function getList($type = null, $key1 = null, $key2 = null)
@@ -222,8 +225,8 @@ public function getList($type = null, $key1 = null, $key2 = null)
 
     /**
      * @param string $type
-     * @param mixed $key1
-     * @param mixed $key2
+     * @param string $key1
+     * @param string $key2
      * @param string $whichKey
      * @throws \Exception
      * @return array|null
@@ -254,8 +257,8 @@ public function getKeys($type = null, $key1 = null, $key2 = null, $whichKey = 't
 
     /**
      * @param string $type
-     * @param mixed $key1
-     * @param mixed $key2
+     * @param string $key1
+     * @param string $key2
      * @return bool
      */
     public function remove($type, $key1, $key2)
@@ -285,11 +288,11 @@ public function removeExpired()
      * Create a SQL condition statement based on parameters
      *
      * @param string $type
-     * @param mixed $key1
-     * @param mixed $key2
+     * @param string $key1
+     * @param string $key2
      * @return string
      */
-    private function getCondition($type = null, $key1 = null, $key2 = null)
+    private function getCondition(string $type = null, string $key1 = null, string $key2 = null): string
     {
         $conditions = [];
         if (!is_null($type)) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/locales/en/LC_MESSAGES/core.po b/vendor/simplesamlphp/simplesamlphp/modules/core/locales/en/LC_MESSAGES/core.po
index b7c59dcf45e2be9c8bc6c74ce8ca5c2e34e7f0db..075de8d917f9ef04798aad613cc3114f105deaa2 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/locales/en/LC_MESSAGES/core.po
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/locales/en/LC_MESSAGES/core.po
@@ -164,7 +164,7 @@ msgstr "Delete my choices of IdP in the IdP discovery services"
 msgid "{core:frontpage:warnings_outdated}"
 msgstr ""
 "You are running an outdated version of SimpleSAMLphp. Please update to <a"
-" href=\"%LATEST_URL%\">the latest version</a> as soon as possible."
+" href=\"https://simplesamlphp.org/download\">the latest version</a> as soon as possible."
 
 msgid "{core:frontpage:loggedin_as_admin}"
 msgstr "You are logged in as administrator"
@@ -374,10 +374,10 @@ msgstr "PHP cURL extension missing. Cannot check for SimpleSAMLphp updates."
 
 msgid ""
 "You are running an outdated version of SimpleSAMLphp. Please update to <a"
-" href=\"%LATEST_URL%\">the latest version</a> as soon as possible."
+" href=\"https://simplesamlphp.org/download\">the latest version</a> as soon as possible."
 msgstr ""
 "You are running an outdated version of SimpleSAMLphp. Please update to <a"
-" href=\"%LATEST_URL%\">the latest version</a> as soon as possible."
+" href=\"https://simplesamlphp.org/download\">the latest version</a> as soon as possible."
 
 msgid "Metadata not found"
 msgstr "Metadata not found"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/locales/es/LC_MESSAGES/core.po b/vendor/simplesamlphp/simplesamlphp/modules/core/locales/es/LC_MESSAGES/core.po
index 44ad5e2ef0255d0c92cc771ca963babdcbb3c277..565f4a89a201acb89c533e84123c0c84e5b4e448 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/locales/es/LC_MESSAGES/core.po
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/locales/es/LC_MESSAGES/core.po
@@ -140,7 +140,7 @@ msgstr "Borrar mis opciones de IdP en los servicios de descubrimiento de IdP"
 msgid "{core:frontpage:warnings_outdated}"
 msgstr ""
 "Su instalaci&oacute;n de SimpleSAMLphp est&aacute; desactualizada. Por "
-"favor, actualice a la <a href=\"%LATEST_URL%\">&uacute;ltima "
+"favor, actualice a la <a href=\"https://simplesamlphp.org/download\">&uacute;ltima "
 "versi&oacute;n</a> lo antes posible."
 
 msgid "{core:frontpage:loggedin_as_admin}"
@@ -352,10 +352,10 @@ msgstr "Usando los botones atrás y adelante de su navegador web."
 
 msgid ""
 "You are running an outdated version of SimpleSAMLphp. Please update to <a"
-" href=\"%LATEST_URL%\">the latest version</a> as soon as possible."
+" href=\"https://simplesamlphp.org/download\">the latest version</a> as soon as possible."
 msgstr ""
 "Su instalaci&oacute;n de SimpleSAMLphp est&aacute; desactualizada. Por "
-"favor, actualice a la <a href=\"%LATEST_URL%\">&uacute;ltima "
+"favor, actualice a la <a href=\"https://simplesamlphp.org/download\">&uacute;ltima "
 "versi&oacute;n</a> lo antes posible."
 
 msgid "Metadata not found"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/locales/ja/LC_MESSAGES/core.po b/vendor/simplesamlphp/simplesamlphp/modules/core/locales/ja/LC_MESSAGES/core.po
index 457a8cc931d9e778b50ecd4253383d8e288bcc32..f2a8558a1de3f8c5a9ff78ff3d1bdd11000321ba 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/locales/ja/LC_MESSAGES/core.po
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/locales/ja/LC_MESSAGES/core.po
@@ -21,6 +21,9 @@ msgstr "PHP info"
 msgid "{core:no_state:report_text}"
 msgstr "この問題が継続して起こる場合、システム管理者に報告してください。"
 
+msgid "{core:no_state:cause_badlink}"
+msgstr "ここにアクセスするために使用するリンクが不正でした、おそらくブックマークに登録されているリンクが原因でしょう。"
+
 msgid "{core:no_state:cause_backforward}"
 msgstr "WEBブラウザの戻るや次へのボタンを使用します。"
 
@@ -34,10 +37,10 @@ msgid "{core:no_state:suggestions}"
 msgstr "この問題を解決する為の提案:"
 
 msgid "{core:frontpage:login_as_admin}"
-msgstr "管理者でログイン"
+msgstr "管理者としてログイン"
 
 msgid "{core:short_sso_interval:warning}"
-msgstr "私たちはたった数秒前にあなたがこのサービスプロバイダに認証されている事を検知しています、従って問題はSPに在ると推測できます。"
+msgstr "このサービスプロバイダで最後に認証されてから数秒しか経過していないことが検出されたため、このSPに問題があると思われます。"
 
 msgid "{core:frontpage:link_doc_sp}"
 msgstr "SimpleSAMLphpをサービスプロバイダとして使用する"
@@ -51,8 +54,35 @@ msgstr "OpenID プロバイダサイト - アルファバージョン (テスト
 msgid "{core:frontpage:link_doc_install}"
 msgstr "SimpleSAMLphpのインストール"
 
+msgid "{core:frontpage:link_consentAdmin}"
+msgstr "Consent Administration"
+
+msgid "{core:frontpage:link_memcacheMonitor}"
+msgstr "MemCache ステータス"
+
+msgid "{core:frontpage:link_oauth}"
+msgstr "OAuth ユーザー登録"
+
+msgid "{core:frontpage:link_cron}"
+msgstr "cronモジュール情報ページ"
+
+msgid "{core:frontpage:link_statistics}"
+msgstr "ステータス情報を表示"
+
+msgid "{core:frontpage:link_statistics_metadata}"
+msgstr "ステータスメタデータを表示"
+
+msgid "{core:frontpage:link_metarefresh}"
+msgstr "Metarefresh: メタデータを取得"
+
+msgid "{core:frontpage:link_sanitycheck}"
+msgstr "SimpleSAMLphpセットアップのサニティーチェック"
+
 msgid "{core:frontpage:link_diagnostics}"
-msgstr "ホストネームやポート、プロトコルを診断"
+msgstr "ホストネームやポート、プロトコルを確認"
+
+msgid "{core:no_state:suggestion_badlink}"
+msgstr "WEBサイトのリンクが正しいことを確認してください。"
 
 msgid "{core:no_state:suggestion_goback}"
 msgstr "前のページに戻り、再度試してください。"
@@ -73,11 +103,16 @@ msgid "{core:frontpage:doc_header}"
 msgstr "ドキュメント"
 
 msgid "{core:frontpage:link_doc_advanced}"
-msgstr "SimpleSAMLphp の高度な機能"
+msgstr "SimpleSAMLphpの高度な機能"
 
 msgid "{core:frontpage:required_ldap}"
 msgstr "LDAPに必要"
 
+msgid "{core:frontpage:warnings_secretsalt}"
+msgstr ""
+"<strong>デフォルトのシークレットソルトが使われています</strong> - プロダクションでsimpleSAMLを使用される場合はデフォルトの「secretsalt」オプションを必ず変更してください。"
+"[<a href=\"https://simplesamlphp.org/docs/stable/simplesamlphp-install\">SimpleSAMLphpの設定についてはこちら</a> ]"
+
 msgid "{core:frontpage:authtest}"
 msgstr "設定されている認証元をテスト"
 
@@ -91,7 +126,7 @@ msgid "{core:frontpage:welcome}"
 msgstr "ようこそ"
 
 msgid "{core:frontpage:link_doc_shibsp}"
-msgstr "SimpleSAMLphp IdP と 連携する Shibboleth SP 1.3 として設定"
+msgstr "SimpleSAMLphp IdPと連携するShibboleth SP 1.3として設定"
 
 msgid "{core:no_state:header}"
 msgstr "状態情報が無くなりました。"
@@ -100,13 +135,13 @@ msgid "{core:frontpage:metadata_header}"
 msgstr "メタデータ"
 
 msgid "{core:frontpage:link_doc_maintenance}"
-msgstr "SimpleSAMLphp のメンテナンスと設定"
+msgstr "SimpleSAMLphpのメンテナンスと設定"
 
 msgid "{core:frontpage:link_configcheck}"
 msgstr "SimpleSAMLphp 設定確認"
 
 msgid "{core:frontpage:page_title}"
-msgstr "SimpleSAMLphp設定ページ"
+msgstr "SimpleSAMLphp 設定ページ"
 
 msgid "{core:no_cookie:header}"
 msgstr "クッキーが見つかりません"
@@ -115,10 +150,13 @@ msgid "{core:frontpage:warnings}"
 msgstr "警告"
 
 msgid "{core:frontpage:link_xmlconvert}"
-msgstr "XML を SimpleSAMLphpメタデータに変換"
+msgstr "XMLをSimpleSAMLphpメタデータに変換"
 
 msgid "{core:frontpage:link_cleardiscochoices}"
-msgstr "IdPディスカバリサービス内のIdpの選択を削除する"
+msgstr "IdPディスカバリサービス内のIdPの選択を削除"
+
+msgid "{core:frontpage:warnings_outdated}"
+msgstr "旧バージョンのSimpleSAMLphpが使われています。できるだけ早く<a href=\"https://simplesamlphp.org/download\">最新バーション</a>にアップロードしてください"
 
 msgid "{core:frontpage:loggedin_as_admin}"
 msgstr "管理者でログインしています"
@@ -126,8 +164,11 @@ msgstr "管理者でログインしています"
 msgid "{core:frontpage:auth}"
 msgstr "認証"
 
+msgid "{core:frontpage:logout}"
+msgstr "ログアウト"
+
 msgid "{core:no_metadata:suggestion_user_link}"
-msgstr "もしあなたがユーザーで以下のリンクのサイトでこのエラーを受け取ったのであれば、あなたはこのエラーをサイトの管理者に報告してください。"
+msgstr "もしあなたがユーザーで以下のリンクのサイトでこのエラーを受け取ったのであれば、このエラーをサイトの管理者に報告してください。"
 
 msgid "{core:no_state:description}"
 msgstr "現在のリクエストから状態情報を特定することが出来ませんでした。"
@@ -143,8 +184,8 @@ msgstr "シングルサインオンイベントの間隔が短すぎます。"
 
 msgid "{core:frontpage:intro}"
 msgstr ""
-"<strong>おめでとう</strong>, あなたは SimpleSAMLphp "
-"のインストールに成功しました。このページは設定を行うためのスタートページです。テスト、診断、メタデータや関連するドキュメントへのリンクを見つけるでしょう。"
+"<strong>おめでとう</strong>、あなたはSimpleSAMLphpのインストールに成功しました。このページは設定を行うためのスタートページです。"
+"テスト、診断、メタデータや関連するドキュメントへのリンクを見つけることができるでしょう。"
 
 msgid "{core:no_metadata:header}"
 msgstr "メタデータが見つかりません"
@@ -167,13 +208,13 @@ msgid "{core:frontpage:warnings_https}"
 msgstr ""
 "<strong>あなたはHTTPS(暗号化通信)を行っていません。</strong>HTTPはテスト環境であれば正常に動作します、しかし製品環境ではHTTPSを使用するべきです。["
 " <a href=\"https://simplesamlphp.org/docs/stable/simplesamlphp-maintenance"
-"\">詳しくは SimpleSAMLphp メンテナンス情報を読んでください。</a> ]"
+"\">詳しくはSimpleSAMLphpメンテナンス情報を読んでください</a> ]"
 
 msgid "{core:frontpage:federation}"
 msgstr "連携"
 
 msgid "{core:frontpage:required_radius}"
-msgstr "Radiusに必要"
+msgstr "Radiusのために必須"
 
 msgid "{core:no_state:cause_openbrowser}"
 msgstr "ブラウザに保存されたタブにより、以前のセッションが開かれました。"
@@ -188,19 +229,17 @@ msgid "{core:no_state:report_header}"
 msgstr "このエラーをレポート"
 
 msgid "{core:frontpage:link_saml2example}"
-msgstr "SAML 2.0 SP example - IdP 経由でテストログイン"
+msgstr "SAML 2.0 SP example - IdP経由でテストログイン"
 
 msgid "{core:no_state:cause_nocookie}"
 msgstr "このWEBブラウザではクッキーが無効化されています。"
 
 msgid "{core:frontpage:about_header}"
-msgstr "SimpleSAMLphp について"
+msgstr "SimpleSAMLphpについて"
 
 msgid "{core:frontpage:about_text}"
 msgstr ""
-"この SimpleSAMLphp は素晴らしいものです。これ以上の説明が在りますか?こちらのリンクで更なる情報を見つけることが出来ます <a "
-"href=\"http://rnd.feide.no/simplesamlphp\">SimpleSAMLphp at the Feide RnD"
-" blog</a>"
+"SimpleSAMLphpは素晴らしいものです。詳細についてお探しですか?<a href=\"http://rnd.feide.no/simplesamlphp\">SimpleSAMLphpのWEBページ</a>で更なる情報を見つけることが出来ます。"
 
 msgid "{core:no_metadata:suggestion_developer}"
 msgstr "もしあなたが開発者でシングルサインオンシステムの構築者である場合、メタデータの設定に問題が有ります。アイデンティティプロバイダとサービスプロバイダの両方にメタデータが正しく設定されているか確認してください。"
@@ -218,7 +257,7 @@ msgid "{core:frontpage:recommended}"
 msgstr "推奨"
 
 msgid "{core:frontpage:link_doc_googleapps}"
-msgstr "SimpleSAMLphp を Google Apps for Education の為のIdPとして設定"
+msgstr "SimpleSAMLphpをGoogle Apps for Educationの為のIdPとして設定"
 
 msgid "{core:frontpage:tools}"
 msgstr "ツール"
@@ -227,10 +266,10 @@ msgid "{core:short_sso_interval:retry}"
 msgstr "ログインを再試行"
 
 msgid "{core:no_cookie:description}"
-msgstr "あなたのブラウザでクッキーが無効化されている様です。ブラウザの設定を確認し、再度試してください。"
+msgstr "ブラウザのクッキーが無効化されている可能性があります。ブラウザの設定を確認し、再度試してください。"
 
 msgid "{core:frontpage:deprecated}"
-msgstr "古い"
+msgstr "非推奨"
 
 msgid "You are logged in as administrator"
 msgstr "管理者でログインしています"
@@ -251,7 +290,7 @@ msgid "Metadata overview for your installation. Diagnose your metadata files"
 msgstr "メタデータの概要。メタデータファイルを診断します。"
 
 msgid "XML to SimpleSAMLphp metadata converter"
-msgstr "XML を SimpleSAMLphpメタデータに変換"
+msgstr "XMLをSimpleSAMLphpメタデータに変換"
 
 msgid "Required"
 msgstr "必須"
@@ -269,7 +308,7 @@ msgid "PHP info"
 msgstr "PHP info"
 
 msgid "About SimpleSAMLphp"
-msgstr "SimpleSAMLphp について"
+msgstr "SimpleSAMLphpについて"
 
 msgid "Hosted SAML 2.0 Service Provider Metadata (automatically generated)"
 msgstr "ホスト SAML 2.0 サービスプロバイダメタデータ(自動生成)"
@@ -278,7 +317,7 @@ msgid "Retry login"
 msgstr "ログインを再試行"
 
 msgid "Required for LDAP"
-msgstr "LDAPに必要"
+msgstr "LDAPのために必須"
 
 msgid "Close the web browser, and try again."
 msgstr "WEBブラウザを閉じて、再度試してください。"
@@ -290,7 +329,7 @@ msgid "We were unable to locate the state information for the current request."
 msgstr "現在のリクエストから状態情報を特定することが出来ませんでした。"
 
 msgid "Delete my choices of IdP in the IdP discovery services"
-msgstr "IdPディスカバリサービス内のIdpの選択を削除する"
+msgstr "IdPディスカバリサービス内のIdPの選択を削除"
 
 msgid ""
 "This is most likely a configuration problem on either the service "
@@ -298,7 +337,7 @@ msgid ""
 msgstr "これは恐らくサービスプロバイダかアイデンティティプロバイダの設定の問題です。"
 
 msgid "Configure Shibboleth 1.3 SP to work with SimpleSAMLphp IdP"
-msgstr "SimpleSAMLphp IdP と 連携する Shibboleth SP 1.3 として設定"
+msgstr "SimpleSAMLphp IdPと連携するShibboleth SP 1.3として設定"
 
 msgid "Using the back and forward buttons in the web browser."
 msgstr "WEBブラウザの戻るや次へのボタンを使用します。"
@@ -324,13 +363,13 @@ msgstr "設定されている認証元をテスト"
 msgid ""
 "You appear to have disabled cookies in your browser. Please check the "
 "settings in your browser, and try again."
-msgstr "あなたのブラウザでクッキーが無効化されている様です。ブラウザの設定を確認し、再度試してください。"
+msgstr "ブラウザのクッキーが無効化されている可能性があります。ブラウザの設定を確認し、再度試してください。"
 
 msgid "Installing SimpleSAMLphp"
 msgstr "SimpleSAMLphpのインストール"
 
 msgid "Deprecated"
-msgstr "古い"
+msgstr "非推奨"
 
 msgid ""
 "<strong>Congratulations</strong>, you have successfully installed "
@@ -338,8 +377,8 @@ msgid ""
 "will find links to test examples, diagnostics, metadata and even links to"
 " relevant documentation."
 msgstr ""
-"<strong>おめでとう</strong>, あなたは SimpleSAMLphp "
-"のインストールに成功しました。このページは設定を行うためのスタートページです。テスト、診断、メタデータや関連するドキュメントへのリンクを見つけるでしょう。"
+"<strong>おめでとう</strong>、あなたはSimpleSAMLphpのインストールに成功しました。このページは設定を行うためのスタートページです。"
+"テスト、診断、メタデータや関連するドキュメントへのリンクを見つけることができるでしょう。"
 
 msgid "This error may be caused by:"
 msgstr "このエラーの原因:"
@@ -353,7 +392,7 @@ msgid ""
 msgstr ""
 "<strong>あなたはHTTPS(暗号化通信)を行っていません。</strong>HTTPはテスト環境であれば正常に動作します、しかし製品環境ではHTTPSを使用するべきです。["
 " <a href=\"https://simplesamlphp.org/docs/stable/simplesamlphp-maintenance"
-"\">詳しくは SimpleSAMLphp メンテナンス情報を読んでください。</a> ]"
+"\">詳しくはSimpleSAMLphpメンテナンス情報を読んでください</a> ]"
 
 msgid "Metadata"
 msgstr "メタデータ"
@@ -362,7 +401,7 @@ msgid "Retry"
 msgstr "再試行"
 
 msgid "SimpleSAMLphp Maintenance and Configuration"
-msgstr "SimpleSAMLphp のメンテナンスと設定"
+msgstr "SimpleSAMLphpのメンテナンスと設定"
 
 msgid "Diagnostics on hostname, port and protocol"
 msgstr "ホストネームやポート、プロトコルを診断"
@@ -370,7 +409,7 @@ msgstr "ホストネームやポート、プロトコルを診断"
 msgid ""
 "If you are an user who received this error after following a link on a "
 "site, you should report this error to the owner of that site."
-msgstr "もしあなたがユーザーで以下のリンクのサイトでこのエラーを受け取ったのであれば、あなたはこのエラーをサイトの管理者に報告してください。"
+msgstr "もしあなたがユーザーで以下のリンクのサイトでこのエラーを受け取ったのであれば、このエラーをサイトの管理者に報告してください。"
 
 msgid "Using SimpleSAMLphp as an Identity Provider"
 msgstr "SimpleSAMLphpをアイデンティティプロバイダとして使用する"
@@ -386,28 +425,25 @@ msgid ""
 "You can find more information about it at the <a "
 "href=\"https://simplesamlphp.org/\">SimpleSAMLphp web page </a> over at "
 "<a href=\"http://uninett.no\">UNINETT</a>."
-msgstr ""
-"この SimpleSAMLphp は素晴らしいものです。これ以上の説明が在りますか?こちらのリンクで更なる情報を見つけることが出来ます <a "
-"href=\"http://rnd.feide.no/simplesamlphp\">SimpleSAMLphp at the Feide RnD"
-" blog</a>"
+msgstr "SimpleSAMLphpは素晴らしいものです。詳細についてお探しですか?<a href=\"http://rnd.feide.no/simplesamlphp\">SimpleSAMLphpのWEBページ</a>で更なる情報を見つけることが出来ます。"
 
 msgid "Shibboleth 1.3 SP example - test logging in through your Shib IdP"
-msgstr "Shibboleth 1.3 SP example - Shib IdP 経由でテストログイン"
+msgstr "Shibboleth 1.3 SP example - Shib IdP経由でテストログイン"
 
 msgid "Authentication"
 msgstr "認証"
 
 msgid "SimpleSAMLphp installation page"
-msgstr "SimpleSAMLphp設定ページ"
+msgstr "SimpleSAMLphp 設定ページ"
 
 msgid "Show metadata"
 msgstr "メタデータを表示"
 
 msgid "SimpleSAMLphp as an IdP for Google Apps for Education"
-msgstr "SimpleSAMLphp を Google Apps for Education の為のIdPとして設定"
+msgstr "SimpleSAMLphpをGoogle Apps for Educationの為のIdPとして設定"
 
 msgid "State information lost"
-msgstr "状態情報が無くなりました。"
+msgstr "状態情報が無くなりました"
 
 msgid "Hosted SAML 2.0 Identity Provider Metadata (automatically generated)"
 msgstr "ホスト SAML 2.0 アイデンティティプロバイダメタデータ(自動生成)"
@@ -416,7 +452,7 @@ msgid "OpenID Provider site - Alpha version (test code)"
 msgstr "OpenID プロバイダサイト - アルファバージョン (テストコード)"
 
 msgid "Required for Radius"
-msgstr "Radiusに必要"
+msgstr "Radiusのために必須"
 
 msgid "We were unable to locate the metadata for the entity:"
 msgstr "メタデータの実体を見つけることが出来ませんでした:"
@@ -431,7 +467,7 @@ msgid ""
 "We have detected that there is only a few seconds since you last "
 "authenticated with this service provider, and therefore assume that there"
 " is a problem with this SP."
-msgstr "私たちはたった数秒前にあなたがこのサービスプロバイダに認証されている事を検知しています、従って問題はSPに在ると推測できます。"
+msgstr "このサービスプロバイダで最後に認証されてから数秒しか経過していないことが検出されたため、このSPに問題があると思われます。"
 
 msgid "Recommended"
 msgstr "推奨"
@@ -440,10 +476,10 @@ msgid ""
 "If you are a developer who is deploying a single sign-on solution, you "
 "have a problem with the metadata configuration. Verify that metadata is "
 "configured correctly on both the identity provider and service provider."
-msgstr "もしあなたが開発者でシングルサインオンシステムの構築者である場合、メタデータの設定に問題が有ります。アイデンティティプロバイダとサービスプロバイダの両方にメタデータが正しく設定されているか確認してください。"
+msgstr "もしあなたが開発者でシングルサインオンシステムの構築者である場合、メタデータの設定に問題があります。アイデンティティプロバイダとサービスプロバイダの両方にメタデータが正しく設定されているか確認してください。"
 
 msgid "SimpleSAMLphp Advanced Features"
-msgstr "SimpleSAMLphp の高度な機能"
+msgstr "SimpleSAMLphpの高度な機能"
 
 msgid "Too short interval between single sign on events."
 msgstr "シングルサインオンイベントの間隔が短すぎます。"
@@ -469,7 +505,7 @@ msgid "Hosted Shibboleth 1.3 Identity Provider Metadata (automatically generated
 msgstr "ホスト Shibboleth 1.3 アイデンティティプロバイダメタデータ (自動生成)"
 
 msgid "Login as administrator"
-msgstr "管理者でログイン"
+msgstr "管理者としてログイン"
 
 msgid "Report this error"
 msgstr "このエラーをレポート"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/locales/nl/LC_MESSAGES/core.po b/vendor/simplesamlphp/simplesamlphp/modules/core/locales/nl/LC_MESSAGES/core.po
index 425e4712d94cdf946746eff05cd7c8329b226908..1a96e5707bc19387d9cddc7b3e93a0a99bd67430 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/locales/nl/LC_MESSAGES/core.po
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/locales/nl/LC_MESSAGES/core.po
@@ -140,7 +140,7 @@ msgstr "Verwijder IDP keuzes uit de IdP discovery service"
 msgid "{core:frontpage:warnings_outdated}"
 msgstr ""
 "Deze installatie van SimpleSAMLphp is verouderd. Het is aan te raden zo "
-"snel mogelijk te upgraden naar <a href=\"%LATEST_URL%\">de meest recente "
+"snel mogelijk te upgraden naar <a href=\"https://simplesamlphp.org/download\">de meest recente "
 "versie</a>."
 
 msgid "{core:frontpage:warnings_curlmissing}"
@@ -358,10 +358,10 @@ msgstr "Gebruik van de 'Volgende'- en 'Terug'-knoppen in de web browser."
 
 msgid ""
 "You are running an outdated version of SimpleSAMLphp. Please update to <a"
-" href=\"%LATEST_URL%\">the latest version</a> as soon as possible."
+" href=\"https://simplesamlphp.org/download\">the latest version</a> as soon as possible."
 msgstr ""
 "Deze installatie van SimpleSAMLphp is verouderd. Het is aan te raden zo "
-"snel mogelijk te upgraden naar <a href=\"%LATEST_URL%\">de meest recente "
+"snel mogelijk te upgraden naar <a href=\"https://simplesamlphp.org/download\">de meest recente "
 "versie</a>."
 
 msgid "Metadata not found"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/locales/st/LC_MESSAGES/core.po b/vendor/simplesamlphp/simplesamlphp/modules/core/locales/st/LC_MESSAGES/core.po
new file mode 100644
index 0000000000000000000000000000000000000000..16fa59be02f516b13820be2608024690a9f266d8
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/locales/st/LC_MESSAGES/core.po
@@ -0,0 +1,192 @@
+
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SimpleSAMLphp 1.15\n"
+"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n"
+"POT-Creation-Date: 2019-12-12 12:32+0200\n"
+"PO-Revision-Date: 2019-12-12 12:32+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
+msgid "{core:no_metadata:config_problem}"
+msgstr ""
+"Bona ke bothata bo ka kgonahalang ka ho fetisisa ho mofani wa tshebeletso"
+" kapa mofani wa tshebeletso."
+
+msgid "{core:no_state:description}"
+msgstr ""
+"Ha re kgone ho fumana tlhahisoleseding ka provenseng bakeng sa kopo ya ha"
+" jwale."
+
+msgid "{core:no_metadata:suggestion_user_link}"
+msgstr ""
+"Haeba o le mosebedisi ya fumaneng phoso ena kamora ho latela lehokela le "
+"setsing, o tlameha ho tlaleha phoso ena ho monga setsi."
+
+msgid "Metadata not found"
+msgstr "Metadata ha e a fumanwa"
+
+msgid "{core:cardinality:cardinality_text}"
+msgstr ""
+"E le nngwe kapa ho feta ya makgabane a fanweng ke wena ke mofani wa "
+"boitsebiso wa hao ha e na lenane le nepahetseng la dipalo."
+
+msgid "This error may be caused by:"
+msgstr "Phoso ena e ka bakwa ke:"
+
+msgid "We were unable to locate the state information for the current request."
+msgstr ""
+"Ha re kgone ho fumana tlhahisoleseding ka provenseng bakeng sa kopo ya ha"
+" jwale."
+
+msgid "Using the back and forward buttons in the web browser."
+msgstr "Ho sebedisa dikonopo tsa pele le morao sebading sa webo."
+
+msgid "{core:no_state:causes}"
+msgstr "Phoso ena e ka bakwa ke:"
+
+msgid ""
+"This is most likely a configuration problem on either the service "
+"provider or identity provider."
+msgstr ""
+"Bona ke bothata bo ka kgonahalang ka ho fetisisa ho mofani wa tshebeletso"
+" kapa mofani wa tshebeletso."
+
+msgid "Opened the web browser with tabs saved from the previous session."
+msgstr "O butse sebadi sa webe ka di-tab tse bolokilweng sesheneng e fetileng."
+
+#, python-format
+msgid "got %GOT% values, want %WANT%"
+msgstr "o fumane dipalo tse %GOT%, o batla tse %WANT%"
+
+msgid ""
+"If you are an user who received this error after following a link on a "
+"site, you should report this error to the owner of that site."
+msgstr ""
+"Haeba o le mosebedisi ya fumaneng phoso ena kamora ho latela lehokela le "
+"setsing, o tlameha ho tlaleha phoso ena ho monga setsi."
+
+msgid "{core:no_state:cause_openbrowser}"
+msgstr "O butse sebadi sa webe ka di-tab tse bolokilweng sesheneng e fetileng."
+
+msgid "{core:no_cookie:description}"
+msgstr ""
+"O bonahala o kwetse dikhukhi sebading sa hao. Ka kopo hlahloba disetting "
+"sebading sa hao."
+
+msgid "{core:no_metadata:not_found_for}"
+msgstr "Ha re a kgona ho fumana metadata bakeng sa setheo:"
+
+msgid "{core:cardinality:cardinality_header}"
+msgstr "Makgabane a Fosahetseng"
+
+msgid "{core:no_state:report_text}"
+msgstr "Haeba bothata bona bo phehella, o ka bo tlaleha ho batsamaisi ba sistimi."
+
+msgid "The problematic attribute(s) are:"
+msgstr "Makgabane a nang le mathata ke:"
+
+msgid "{core:no_state:suggestion_goback}"
+msgstr "Kgutlela leqepheng le fetileng ebe o leka hape."
+
+msgid "Report this error"
+msgstr "Tlaleha phoso ena"
+
+msgid ""
+"You appear to have disabled cookies in your browser. Please check the "
+"settings in your browser, and try again."
+msgstr ""
+"O bonahala o kwetse dikhukhi sebading sa hao. Ka kopo hlahloba disetting "
+"sebading sa hao."
+
+msgid "If this problem persists, you can report it to the system administrators."
+msgstr "Haeba bothata bona bo phehella, o ka bo tlaleha ho batsamaisi ba sistimi."
+
+msgid "{core:no_state:report_header}"
+msgstr "Tlaleha phoso ena"
+
+msgid "{core:no_cookie:header}"
+msgstr "Khukhi e siyo"
+
+msgid "{core:no_metadata:suggestion_developer}"
+msgstr ""
+"Haeba o mohlahisi ya sebedisang tharollo ya ho saena hang, o na le "
+"bothata ka phetolo ya metadata. Netefatsa hore metadata e hlophiswe ka ho"
+" nepahala ho bobedi mofani wa boitsebiso le mofani wa tshebeletso."
+
+msgid "State information lost"
+msgstr "Tlhahisoleseding ya provense e lahlehile"
+
+msgid "{core:no_state:suggestion_closebrowser}"
+msgstr "Kwala sebadi sa webe, ebe o leka hape."
+
+msgid "Incorrect Attributes"
+msgstr "Makgabane a Fosahetseng"
+
+msgid "{core:no_metadata:header}"
+msgstr "Metadata ha e a fumanwa"
+
+msgid "{core:no_state:cause_nocookie}"
+msgstr "Dikhuki di ka nna tsa kwalwa sebading sa webe."
+
+msgid "Close the web browser, and try again."
+msgstr "Kwala sebadi sa webe, ebe o leka hape."
+
+msgid "Go back to the previous page and try again."
+msgstr "Kgutlela leqepheng le fetileng ebe o leka hape."
+
+msgid "{core:no_cookie:retry}"
+msgstr "Khukhi e siyo"
+
+msgid "{core:cardinality:problematic_attributes}"
+msgstr "Makgabane a nang le mathata ke:"
+
+msgid ""
+"If you are a developer who is deploying a single sign-on solution, you "
+"have a problem with the metadata configuration. Verify that metadata is "
+"configured correctly on both the identity provider and service provider."
+msgstr ""
+"Haeba o mohlahisi ya sebedisang tharollo ya ho saena hang, o na le "
+"bothata ka phetolo ya metadata. Netefatsa hore metadata e hlophiswe ka ho"
+" nepahala ho bobedi mofani wa boitsebiso le mofani wa tshebeletso."
+
+msgid "{core:cardinality:got_want}"
+msgstr "o fumane dipalo tse %GOT%, o batla tse %WANT%"
+
+msgid "Retry"
+msgstr "Khukhi e siyo"
+
+msgid "{core:no_state:suggestions}"
+msgstr "Ditlhahiso bakeng sa ho rarolla bothata bona:"
+
+msgid "{core:no_state:cause_backforward}"
+msgstr "Ho sebedisa dikonopo tsa pele le morao sebading sa webo."
+
+msgid "Cookies may be disabled in the web browser."
+msgstr "Dikhuki di ka nna tsa kwalwa sebading sa webe."
+
+msgid "We were unable to locate the metadata for the entity:"
+msgstr "Ha re a kgona ho fumana metadata bakeng sa setheo:"
+
+msgid "{core:no_state:header}"
+msgstr "Tlhahisoleseding ya provense e lahlehile"
+
+msgid "Missing cookie"
+msgstr "Khukhi e siyo"
+
+msgid ""
+"One or more of the attributes supplied by your identity provider did not "
+"contain the expected number of values."
+msgstr ""
+"E le nngwe kapa ho feta ya makgabane a fanweng ke wena ke mofani wa "
+"boitsebiso wa hao ha e na lenane le nepahetseng la dipalo."
+
+msgid "Suggestions for resolving this problem:"
+msgstr "Ditlhahiso bakeng sa ho rarolla bothata bona:"
+
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/routes.yaml b/vendor/simplesamlphp/simplesamlphp/modules/core/routes.yaml
deleted file mode 100644
index 80916d2ab51c7a39b650b5c841983f0ba4a629f2..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/routes.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-core-login:
-    path:       /login/{as}
-    defaults:   { _controller: 'SimpleSAML\Module\core\Controller::login', as: null }
-core-account:
-    path:       /account/{as}
-    defaults:   { _controller: 'SimpleSAML\Module\core\Controller::account' }
-core-logout:
-    path:       /logout/{as}
-    defaults:   { _controller: 'SimpleSAML\Module\core\Controller::logout' }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/routing/routes/routes.yml b/vendor/simplesamlphp/simplesamlphp/modules/core/routing/routes/routes.yml
new file mode 100644
index 0000000000000000000000000000000000000000..12884b024d2a3c05e82a3351498f0b5043b0c64a
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/routing/routes/routes.yml
@@ -0,0 +1,24 @@
+core-account:
+    path:       /account/{as}
+    defaults:   { _controller: 'SimpleSAML\Module\core\Controller\Login:account' }
+core-account-disco-clearchoices:
+    path:       /account/disco/clearchoices
+    defaults:   { _controller: 'SimpleSAML\Module\core\Controller\Login:cleardiscochoices' }
+core-login:
+    path:       /login/{as}
+    defaults:   { _controller: 'SimpleSAML\Module\core\Controller\Login:login', as: null }
+core-logout:
+    path:       /logout/{as}
+    defaults:   { _controller: 'SimpleSAML\Module\core\Controller\Login:logout' }
+core-error-nocookie:
+    path:       /error/nocookie
+    defaults:   { _controller: 'SimpleSAML\Module\core\Controller\Exception:nocookie' }
+core-cardinality:
+    path:       /error/cardinality
+    defaults:   { _controller: 'SimpleSAML\Module\core\Controller\Exception:cardinality' }
+core-warning-shortssointerval:
+    path:       /warning/short_sso_interval
+    defaults:   { _controller: 'SimpleSAML\Module\core\Controller\Exception:shortSsoInterval' }
+core-post-redirect:
+    path:       /postredirect
+    defaults:   { _controller: 'SimpleSAML\Module\core\Controller\Redirection:postredirect' }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/authsource_list.twig b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/authsource_list.twig
index a3654e915d7d3083aa025d15f7fb29cedba5bf10..f653ad138302c418d30e2724bcdfbab39fb1ccc7 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/authsource_list.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/authsource_list.twig
@@ -5,7 +5,7 @@
     <h2>{{ pagetitle }} </h2>
     <ul>
     {% for key, name in sources %}
-        <li><a href="?as={{ name|escape('url') }}">{{ name }}</a></li>
+        <li><a href="{{ moduleURL('core/login/' ~ name|escape('url')) }}">{{ name }}</a></li>
     {% endfor %}
     </ul>
 {% endblock %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/base.twig b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/base.twig
index 96fcc07baeb873b82c4f94a4e6a17a002a40b500..83b2b9a14985e56ffedc9f4b630b7f762d0f4faa 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/base.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/base.twig
@@ -1,8 +1,11 @@
 {% extends "base.twig" %}
 {% block contentwrapper %}
-{% if tabname %}
+
 <div id="portalmenu" class="ui-tabs ui-widget ui-widget-content ui-corner-all">
+
     <ul class="tabset_tabs ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all">
+
+    {% if links is defined %}
     {% for name, link in links %}
     {% if name == pageid %}
         <li class="ui-state-default ui-corner-top ui-tabs-selected ui-state-active">
@@ -14,12 +17,13 @@
         </li>
     {% endif %}
     {% endfor %}
+    {% endif %}
+
     </ul>
     <div id="portalcontent" class="ui-tabs-panel ui-widget-content ui-corner-bottom">
-{% endif %}
+
 {{ block('content') }}
-{% if tabname %}
+
     </div>
 </div>
-{% endif %}
 {% endblock %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_config.tpl.php b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_config.tpl.php
index 8227e8cd0ce23e0a572b21388d5544cf57fc614f..7d0e968b37fe46de373938684bf4099c26e98a54 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_config.tpl.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_config.tpl.php
@@ -56,7 +56,7 @@
 if (array_key_exists('warnings', $this->data) && is_array($this->data['warnings']) && !empty($this->data['warnings'])) {
     echo '<h2>'.$this->t('{core:frontpage:warnings}').'</h2>';
     foreach ($this->data['warnings'] as $warning) {
-        echo '<div class="caution">'.$warning.'</div>';
+        echo '<div class="caution">'.$this->t($warning).'</div>';
     }
 }
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_config.twig b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_config.twig
index c0fb87b95d4002e18b6337e46aafaddd1ccc7126..210a43b585a9322e9f3af287532fc443d4798989 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_config.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_config.twig
@@ -35,7 +35,7 @@
     {% if warnings is defined and warnings is not empty %}
     <h2>{{ '{core:frontpage:warnings}'|trans|escape('html') }}</h2>
     {% for key, warning in warnings %}
-    <div class="caution">{{ warning|raw }}</div>
+    <div class="caution">{{ warning|trans|raw }}</div>
     {% endfor %}
     {% endif %}
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_federation.twig b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_federation.twig
index 35acde2d64bf5db106cee6300d41100a4a0a8483..c3dd71c8e9ff5099ba4f61da2e21d52231194855 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_federation.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/frontpage_federation.twig
@@ -6,6 +6,7 @@
     {% include "@core/_frontpage_menu.twig" %}
 
     {% if metaentries.hosted is iterable and metaentries.hosted is not empty %}
+    <h2>{% trans %}Hosted entities{% endtrans %}</h2>
     <dl>
     {% for key, set in metaentries.hosted %}
         {% set metadataset = attribute(set, 'metadata-set') %}
@@ -32,6 +33,7 @@
     {% endif %}
 
     {% if metaentries.remote is iterable and metaentries.remote is not empty %}
+    <h2>{% trans %}Trusted entities{% endtrans %}</h2>
     {% for key, set in metaentries.remote %}
     <fieldset class="fancyfieldset">
         <legend>{{ mtype[key]|trans }} (Trusted)</legend>
@@ -46,9 +48,9 @@
             {% endif -%}</a>
 
             {%- if entity.expire is defined %}
-            {% if entity.expire > date().timestamp %}
-            <span class="entity-expired"> (expired {{ ((date().timestamp - entity.expire) / 3600) }} hours ago)</span>
-            {% else %} (expires in {{ ((entity.expire - date().timestamp) / 3600) }} hours){% endif -%}{% endif %}
+            {% if ((entity.expire - date().timestamp) < 0) %}
+            <span class="entity-expired"> (expired {{ ((date().timestamp - entity.expire) / 3600) | round(2) }} hours ago)</span>
+            {% else %} (expires in {{ ((entity.expire - date().timestamp) / 3600) | round(2) }} hours){% endif -%}{% endif %}
             </li>
         {% endfor %}
         </ul>
@@ -64,21 +66,19 @@
     </ul>
 
     {% if isadmin %}
-    <fieldset class="fancyfieldset">
-        <legend>Lookup metadata</legend>
-        <form action="{{ metadata_url }}" method="get">
-            <p>Look up metadata for entity:
-                <select name="set">
-                {% if metaentries.remote is defined and metaentries.remote is not empty %}
-                {% for key, set in metaentries.remote %}
-                    <option value="{{ key|escape('html') }}">{{ mtype[key]|trans }}</option>
-                {% endfor %}
-                {% endif %}
-                </select>
-                <input type="text" name="entityid" />
-                <button class="btn" type="submit">Lookup </button>
-            </p>
-        </form>
+    <form action="{{ metadata_url }}" method="get" class="pure-form">
+        <p>Look up metadata for entity:
+            <select name="set">
+            {% if metaentries.remote is defined and metaentries.remote is not empty %}
+            {% for key, set in metaentries.remote %}
+                <option value="{{ key|escape('html') }}">{{ mtype[key]|trans }}</option>
+            {% endfor %}
+            {% endif %}
+            </select>
+            <input type="text" name="entityid" class="edge">
+            <button class="pure-button pure-button-red" type="submit">Lookup</button>
+        </p>
+    </form>
     </fieldset>
     {% endif %}
 {% endblock %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/login.twig b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/login.twig
index be87ded7bfb26f9121b84bc8f88ae8c81ce99b97..70b2ad5623620060b03ad8ad9ee2a8594ca6c499 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/login.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/login.twig
@@ -13,8 +13,12 @@
         <ul class="pure-menu-list auth_methods">
             {% for id, config in sources -%}
                 <li class="pure-menu-item">
-                    <a href="/{{ baseurlpath }}module.php/core/login/{{ id|url_encode }}" class="pure-menu-link">
-                      {{ config.name|translateFromArray|default(id) }}
+                    <a href="{{ moduleURL('core/login/' ~ id|url_encode) }}" class="pure-menu-link">
+                      {% if config.name is defined %}
+                        {{ config.name|translateFromArray|default(id) }}
+                      {% else %}
+                        {{ id }}
+                      {% endif %}
                     </a>
                 </li>
             {% endfor -%}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/loginuserpass.tpl.php b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/loginuserpass.tpl.php
index 7dbeab9ad703dc74e87f2175df9527a64561e612..30c8db5499bd5af0d1a4bf0c827b40498b5c091b 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/loginuserpass.tpl.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/loginuserpass.tpl.php
@@ -54,7 +54,7 @@ class="float-l erroricon" style="margin: 15px" alt=""/>
                 <td><label for="username"><?php echo $this->t('{login:username}'); ?></label></td>
                 <td>
                     <input id="username" <?php echo ($this->data['forceUsername']) ? 'disabled="disabled"' : ''; ?>
-                        type="text" name="username"<?php echo $this->data['forceUsername'] ? '' : ' tabindex="1"'; ?>
+                        type="text" name="username"<?php echo $this->data['forceUsername'] ? '' : ' autocomplete="username" tabindex="1"'; ?>
                         value="<?php echo htmlspecialchars($this->data['username']); ?>" />
                 </td>
             <?php
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/loginuserpass.twig b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/loginuserpass.twig
index 4c383ac1fa4f4d706dd8530d96ece2f7f57d0e03..c2b347ea70f8719d823a15111946fe32a9eb5261 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/loginuserpass.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/loginuserpass.twig
@@ -3,7 +3,7 @@
 {% extends "@core/base.twig" %}
 
 {% block postload %}
-    <script src="/{{baseurlpath}}module.php/core/assets/js/loginuserpass.js"></script>
+    <script src="{{ asset('js/loginuserpass.js', 'core') }}"></script>
 {% endblock %}
 
 {% block content %}
@@ -46,15 +46,15 @@
 
                 <div class="pure-control-group">
                     <label for="username">{{ 'Username'|trans }}</label>
-                    <input id="username" {{ forceUsername ? 'disabled="disabled"' }} placeholder="{{ username }}" type="text" name="username" class="edge"
-            {%- if not forceUsername %} tabindex="1" value="{{ username }}" {% endif %}
-            {%- if not forceUsername and not username %} autofocus {% endif %} />
+                    <input id="username" {{ forceUsername ? 'disabled' }} placeholder="{{ username }}" type="text" name="username" class="edge"
+            {%- if not forceUsername %} tabindex="1" value="{{ username }}" autocomplete="username" {% endif %}
+            {%- if not forceUsername and not username %} autofocus {% endif %} >
                 {% if rememberUsernameEnabled and not forceUsername -%}
                 </div>
                 <div class="pure-controls pure-form-message">
                     <label for="remember_username" class="pure-checkbox">
                         <input id="remember_username" type="checkbox" tabindex="4"
-                                {{ rememberUsernameChecked ? 'checked="checked"' }} name="remember_username" value="Yes"/>
+                                {{ rememberUsernameChecked ? 'checked' }} name="remember_username" value="Yes">
                         <small>{{ 'Remember my username'|trans }}</small>
                     </label>
                 {%- endif %}
@@ -70,7 +70,7 @@
                 <div class="pure-controls pure-form-message">
                     <label for="remember_me" class="pure-checkbox">
                     <input id="remember_me" type="checkbox" tabindex="5"
-                            {{ rememberMeChecked ? 'checked="checked"' }} name="remember_me" value="Yes"/>
+                            {{ rememberMeChecked ? 'checked="checked"' }} name="remember_me" value="Yes">
                         <small>{{ 'Remember me'|trans }}</small>
                     </label>
                 {%- endif %}
@@ -79,7 +79,7 @@
                 <div class="pure-control-group">
                     <label for="organization">{{ 'Organization'|trans }}</label>
                     <div class="pure-select right pure-input-1-2 pure-input-sm-1-1">
-                        <select name="organization" class="selectize" id="organization" tabindex="3">
+                        <select name="organization" id="organization" tabindex="3">
                             {{ selectedOrg ?: null }}
                             {%- for id, orgDesc in organizations -%}
                                 {% if id == selectedOrg -%}
@@ -97,7 +97,7 @@
                     <div class="pure-controls pure-form-message">
                         <label for="remember_organization" class="pure-checkbox">
  	                    <input type="checkbox" id="remember_organization" tabindex="5" name="remember_organization" value="Yes"
-                                {{ rememberOrganizationChecked ? 'checked="checked"' }} />
+                                {{ rememberOrganizationChecked ? 'checked="checked"' }} >
                             <small>{{ 'Remember my organization'|trans }}</small>
                         </label>
                     </div>
@@ -109,7 +109,7 @@
             <br><br>
             {%- for name, value in stateparams %}
 
-            <input type="hidden" name="{{ name }}" value="{{ value }}"/>
+            <input type="hidden" name="{{ name }}" value="{{ value }}">
             {%- endfor %}
 
             <button class="pure-button pure-button-red pure-input-1-2 pure-input-sm-1-1 right" id="submit_button"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/no_cookie.twig b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/no_cookie.twig
index 7205318e2a3a3355de51097c2012bd4e07ea9fda..aaf5f2b573f52b13023bfb05b9195d58b0330df4 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/no_cookie.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/no_cookie.twig
@@ -3,11 +3,11 @@
 {% extends "base.twig" %}
 
 {% block content %}
-    <h2>{{ header }}</h2>
-    <p>{{ description }}</p>
+    <h2>{{ '{core:no_cookie:header}'|trans }}</h2>
+    <p>{{ '{core:no_cookie:description}'|trans }}</p>
     {% if retryURL is not null %}
     <ul>
-        <li><a href="{{ retryURL|escape('html') }}" id="retry">{{ retry }}</a></li>
+        <li><a href="{{ retryURL|escape('html') }}" id="retry">{{ '{core:no_cookie:retry}'|trans }}</a></li>
     </ul>
     {% endif %}
 {% endblock %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/short_sso_interval.twig b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/short_sso_interval.twig
index 542e174c0a9315e54c873bafe4895e17dd5473f6..f0a337851ef6a341ed5d65ff7e61666f38c07fca 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/short_sso_interval.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/short_sso_interval.twig
@@ -2,8 +2,8 @@
 {% extends "base.twig" %}
 
 {% block content %}
-    <h1>{{ header }}</h1>
-    <form style="display: inline; margin: 0px; padding: 0px" action="{{ target|escape('html') }}">
+    <h1>{{ '{core:short_sso_interval:warning_header}'|trans }}</h1>
+    <form style="display: inline; margin: 0px; padding: 0px" action="{{ moduleURL('core/short_sso_interval.php') }}">
         {% for name, value in params %}
             <input type="hidden" name="{{ name|escape('html') }}" value="{{ value|escape('html') }}">
         {% endfor %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/show_metadata.twig b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/show_metadata.twig
index f39aee9fe3e69cd70e0263e1f42b9d5f92530c3a..b747563706e2325f11a72cf6d9c0029366561c23 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/templates/show_metadata.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/templates/show_metadata.twig
@@ -4,7 +4,7 @@
     <div class="code-box">
         <div class="code-box-title">
             <h3>{{ 'Metadata'|trans }}</h3>
-            <button data-clipboard-target="#metadata" id="btn{{ loop.index }}" class="pure-button right clipboard-btn copy">
+            <button data-clipboard-target="#metadata" class="pure-button right clipboard-btn copy">
                 <span class="fa fa-copy"></span>
             </button>
         </div>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/www/frontpage_config.php b/vendor/simplesamlphp/simplesamlphp/modules/core/www/frontpage_config.php
index 2ede138cdccdaa4015e786c938c008857b9d489b..2562ab794bc9d3b470d49f35bfad0c1ee9febce7 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/www/frontpage_config.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/www/frontpage_config.php
@@ -85,10 +85,7 @@
 
         if ($latest && version_compare($current, ltrim($latest['tag_name'], 'v'), 'lt')) {
             $outdated = true;
-            $warnings[] = [
-                '{core:frontpage:warnings_outdated}',
-                ['%LATEST_URL%' => $latest['html_url']]
-            ];
+            $warnings[] = '{core:frontpage:warnings_outdated}';
         }
     }
 }
@@ -123,8 +120,8 @@
 $funcmatrix = [];
 $funcmatrix[] = [
     'required' => 'required',
-    'descr' => 'PHP Version >= 5.6. You run: ' . phpversion(),
-    'enabled' => version_compare(phpversion(), '5.6', '>=')
+    'descr' => 'PHP Version >= 7.1. You run: ' . phpversion(),
+    'enabled' => version_compare(phpversion(), '7.1', '>=')
 ];
 foreach ($functionchecks as $func => $descr) {
     $funcmatrix[] = ['descr' => $descr[1], 'required' => $descr[0], 'enabled' => function_exists($func)];
@@ -168,18 +165,11 @@
 $t = new \SimpleSAML\XHTML\Template($config, 'core:frontpage_config.tpl.php');
 $translator = $t->getTranslator();
 $t->data['pageid'] = 'frontpage_config';
-$t->data['header'] = $translator->t('{core:frontpage:page_title}');
+$t->data['header'] = '{core:frontpage:page_title}';
 $t->data['isadmin'] = $isadmin;
 $t->data['loginurl'] = $loginurl;
 $t->data['logouturl'] = $logouturl;
 
-foreach ($warnings as &$warning) {
-    if (is_array($warning)) {
-        $warning = $translator->t($warning[0], $warning[1]);
-    } else {
-        $warning = $translator->t($warning);
-    }
-}
 $t->data['warnings'] = $warnings;
 
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/www/frontpage_federation.php b/vendor/simplesamlphp/simplesamlphp/modules/core/www/frontpage_federation.php
index 72e98ea8cd39c3d90fce32d384bda90396470210..b4a84ebbc550b7e7e34a02272ec6c8562bf62772 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/www/frontpage_federation.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/www/frontpage_federation.php
@@ -44,7 +44,6 @@
 $metadataHosted = [];
 \SimpleSAML\Module::callHooks('metadata_hosted', $metadataHosted);
 
-
 $metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
 
 $metaentries = ['hosted' => $metadataHosted, 'remote' => []];
@@ -115,26 +114,34 @@
 
 foreach ($metaentries['hosted'] as $index => $entity) {
     foreach ($translators as $old => $new) {
-        if (isset($entity[$old][$language])) {
-            $metaentries['hosted'][$index][$new] = $entity[$old][$language];
-        } elseif (isset($entity[$old][$defaultLanguage])) {
-            $metaentries['hosted'][$index][$new] = $entity[$old][$defaultLanguage];
-        } elseif (isset($entity[$old][$fallbackLanguage])) {
-            $metaentries['hosted'][$index][$new] = $entity[$old][$fallbackLanguage];
+        if (isset($entity[$old])) {
+            if (isset($entity[$old][$language])) {
+                $metaentries['hosted'][$index][$new] = $entity[$old][$language];
+            } elseif (isset($entity[$old][$defaultLanguage])) {
+                $metaentries['hosted'][$index][$new] = $entity[$old][$defaultLanguage];
+            } elseif (isset($entity[$old][$fallbackLanguage])) {
+                $metaentries['hosted'][$index][$new] = $entity[$old][$fallbackLanguage];
+            } elseif (is_array($entity[$old])) {
+                $metaentries['hosted'][$index][$new] = array_values($entity[$old])[0];
+            } else {
+                $metaentries['hosted'][$index][$new] = $entity[$old];
+            }
         }
     }
 }
 foreach ($metaentries['remote'] as $key => $set) {
     foreach ($set as $entityid => $entity) {
         foreach ($translators as $old => $new) {
-            if (isset($entity[$old][$language])) {
-                $metaentries['remote'][$key][$entityid][$new] = $entity[$old][$language];
-            } elseif (isset($entity[$old][$defaultLanguage])) {
-                $metaentries['remote'][$key][$entityid][$new] = $entity[$old][$defaultLanguage];
-            } elseif (isset($entity[$old][$fallbackLanguage])) {
-                $metaentries['remote'][$key][$entityid][$new] = $entity[$old][$fallbackLanguage];
-            } elseif (isset($metaentries['remote'][$key][$entityid][$old])) {
-                $metaentries['remote'][$key][$entityid][$new] = $metaentries['remote'][$key][$entityid][$old];
+            if (isset($entity[$old])) {
+                if (isset($entity[$old][$language])) {
+                    $metaentries['remote'][$key][$entityid][$new] = $entity[$old][$language];
+                } elseif (isset($entity[$old][$defaultLanguage])) {
+                    $metaentries['remote'][$key][$entityid][$new] = $entity[$old][$defaultLanguage];
+                } elseif (isset($entity[$old][$fallbackLanguage])) {
+                    $metaentries['remote'][$key][$entityid][$new] = $entity[$old][$fallbackLanguage];
+                } elseif (isset($metaentries['remote'][$key][$entityid][$old])) {
+                    $metaentries['remote'][$key][$entityid][$new] = $metaentries['remote'][$key][$entityid][$old];
+                }
             }
         }
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/logout-iframe-done.php b/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/logout-iframe-done.php
index 92733d00ad5d692c7b512c674cd57b55506a36fc..ca1618dfcd4e5cef624f9b6e613a7e5424f6cea0 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/logout-iframe-done.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/logout-iframe-done.php
@@ -3,6 +3,8 @@
 if (!isset($_REQUEST['id'])) {
     throw new \SimpleSAML\Error\BadRequest('Missing required parameter: id');
 }
+
+/** @psalm-var array $state */
 $state = \SimpleSAML\Auth\State::loadState($_REQUEST['id'], 'core:Logout-IFrame');
 $idp = \SimpleSAML\IdP::getByState($state);
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/logout-iframe.php b/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/logout-iframe.php
index 8f38c891f3984e3f09fc1879a70467d2cb425358..80f94cca9e12aa2e5e6c5b02e0eb791f36a0e3d3 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/logout-iframe.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/logout-iframe.php
@@ -18,6 +18,7 @@
     \SimpleSAML\Stats::log('core:idp:logout-iframe:page', ['type' => $type]);
 }
 
+/** @psalm-var array $state */
 $state = \SimpleSAML\Auth\State::loadState($_REQUEST['id'], 'core:Logout-IFrame');
 $idp = \SimpleSAML\IdP::getByState($state);
 $mdh = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/resumelogout.php b/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/resumelogout.php
index 3e84b3a4e2a8b78c001ef8db9b810dc221e556c5..5f90c0bca8b2f7cff6b2f265b9cb7e40a7ebc2a9 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/resumelogout.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/www/idp/resumelogout.php
@@ -3,6 +3,8 @@
 if (!isset($_REQUEST['id'])) {
     throw new \SimpleSAML\Error\BadRequest('Missing id-parameter.');
 }
+
+/** @psalm-var array $state */
 $state = \SimpleSAML\Auth\State::loadState($_REQUEST['id'], 'core:Logout:afterbridge');
 $idp = \SimpleSAML\IdP::getByState($state);
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/www/login-admin.php b/vendor/simplesamlphp/simplesamlphp/modules/core/www/login-admin.php
index 59246f6731c6db0c7cbc2bff6dba5f1e5a4e065e..3b6443432b2fac05f4464804856f8be71cd4f9b6 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/www/login-admin.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/www/login-admin.php
@@ -1,7 +1,7 @@
 <?php
 
 /*
- * Helper page for starting a admin login. Can be used as a target for links.
+ * Helper page for starting an admin login. Can be used as a target for links.
  */
 
 if (!array_key_exists('ReturnTo', $_REQUEST)) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/core/www/loginuserpass.php b/vendor/simplesamlphp/simplesamlphp/modules/core/www/loginuserpass.php
index 5db61c91fcb9a52cb2a4ec4764bd51e0c106973b..5655b67cea9ae1b3171044cf8dfe4093a3fff3c3 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/core/www/loginuserpass.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/core/www/loginuserpass.php
@@ -134,4 +134,3 @@
 }
 
 $t->show();
-exit();
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cron/bin/cron.php b/vendor/simplesamlphp/simplesamlphp/modules/cron/bin/cron.php
index 436397fd296f60cc0265ad5c36fe6f460d83cedf..cb85cbe764639138582ceceda7e96947941680c2 100755
--- a/vendor/simplesamlphp/simplesamlphp/modules/cron/bin/cron.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/cron/bin/cron.php
@@ -32,6 +32,7 @@
     exit(2);
 }
 
+/** @psalm-var string $tag */
 $tag = $options['t'];
 $cron = new SimpleSAML\Module\cron\Cron();
 if (!$cron->isValidTag($tag)) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cron/config-templates/module_cron.php b/vendor/simplesamlphp/simplesamlphp/modules/cron/config-templates/module_cron.php
index 29a35d9e9c535cb80e19c1fea2aea89e6ec7ae9f..7b57ede9603d439c6cd2fd52085c674d1c41eaed 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/cron/config-templates/module_cron.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/cron/config-templates/module_cron.php
@@ -1,4 +1,5 @@
 <?php
+
 /*
  * Configuration for the Cron module.
  */
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cron/lib/Controller/Cron.php b/vendor/simplesamlphp/simplesamlphp/modules/cron/lib/Controller/Cron.php
index 19e7fe80bcc0822490fa96943dcf19d96b621690..bca3b3b3b78e9924cda46552cf79cc67a5e80871 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/cron/lib/Controller/Cron.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/cron/lib/Controller/Cron.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\cron\Controller;
 
 use SimpleSAML\Auth;
@@ -40,7 +42,6 @@ class Cron
      * It initializes the global configuration and auth source configuration for the controllers implemented here.
      *
      * @param \SimpleSAML\Configuration              $config The configuration to use by the controllers.
-     * @param \SimpleSAML\Configuration              $moduleConfig The module-configuration to use by the controllers.
      * @param \SimpleSAML\Session                    $session The session to use by the controllers.
      *
      * @throws \Exception
@@ -143,7 +144,7 @@ public function run($tag, $key, $output)
             try {
                 $mail->send();
             } catch (\PHPMailer\PHPMailer\Exception $e) {
-                Logger::warning("Unable to send cron report");
+                Logger::warning("Unable to send cron report; " . $e->getMessage());
             }
         }
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cron/lib/Cron.php b/vendor/simplesamlphp/simplesamlphp/modules/cron/lib/Cron.php
index 7a673ba10f753c5230fcbc02be3793854705f09f..81b3641b69837556652500ff2655e6f8c3920ebe 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/cron/lib/Cron.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/cron/lib/Cron.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\cron;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cron/locales/ja/LC_MESSAGES/cron.po b/vendor/simplesamlphp/simplesamlphp/modules/cron/locales/ja/LC_MESSAGES/cron.po
index 1378d40fc8e674f337da9b1ee96d14bacf0bdb74..55cd938366d1998f03f8d00b7888823209482af4 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/cron/locales/ja/LC_MESSAGES/cron.po
+++ b/vendor/simplesamlphp/simplesamlphp/modules/cron/locales/ja/LC_MESSAGES/cron.po
@@ -16,10 +16,10 @@ msgstr ""
 "Generated-By: Babel 2.3.4\n"
 
 msgid "{cron:cron:cron_report_title}"
-msgstr "Cronレポート"
+msgstr "cronレポート"
 
 msgid "{cron:cron:ran_text}"
-msgstr "Cronを実行した時刻"
+msgstr "cronが実行された時刻"
 
 msgid "{cron:cron:cron_suggestion}"
 msgstr "crontabファイルの提案:"
@@ -31,25 +31,25 @@ msgid "{cron:cron:cron_execution}"
 msgstr "クリックしてcronジョブを実行:"
 
 msgid "{cron:cron:cron_info}"
-msgstr "Cronはunixシステムで定期的に処理を実行します。"
+msgstr "cronはunixシステムで定期的に処理を実行します。"
 
 msgid "{cron:cron:cron_result_title}"
 msgstr "cronジョブの実行結果:"
 
 msgid "{cron:cron:cron_header}"
-msgstr "Cron実行結果ページ"
+msgstr "cron実行結果ページ"
 
 msgid "Cron is a way to run things regularly on unix systems."
-msgstr "Cronはunixシステムで定期的に処理を実行します。"
+msgstr "cronはunixシステムで定期的に処理を実行します。"
 
 msgid "Run cron:"
 msgstr "cronを実行"
 
 msgid "Cron ran at"
-msgstr "Cronを実行した時刻"
+msgstr "cronを実行した時刻"
 
 msgid "Cron report"
-msgstr "Cronレポート"
+msgstr "cronレポート"
 
 msgid "Here is a suggestion for a crontab file:"
 msgstr "crontabファイルの提案:"
@@ -61,5 +61,5 @@ msgid "Here are the result for the cron job execution:"
 msgstr "cronジョブの実行結果:"
 
 msgid "Cron result page"
-msgstr "Cron実行結果ページ"
+msgstr "cron実行結果ページ"
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cron/locales/nl/LC_MESSAGES/cron.po b/vendor/simplesamlphp/simplesamlphp/modules/cron/locales/nl/LC_MESSAGES/cron.po
index ed89db0eac75e07627f8d26a92d1b605b8fba28b..aad3b209805567960f2a4d09dea0cb8a7666c093 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/cron/locales/nl/LC_MESSAGES/cron.po
+++ b/vendor/simplesamlphp/simplesamlphp/modules/cron/locales/nl/LC_MESSAGES/cron.po
@@ -21,7 +21,7 @@ msgid "{cron:cron:ran_text}"
 msgstr "Cron gestart op"
 
 msgid "{cron:cron:cron_suggestion}"
-msgstr "Dit is een suggestie voor een contrab-bestand:"
+msgstr "Dit is een suggestie voor een crontab bestand:"
 
 msgid "{cron:cron:run_text}"
 msgstr "Start cron"
@@ -51,7 +51,7 @@ msgid "Cron report"
 msgstr "Cronmelding"
 
 msgid "Here is a suggestion for a crontab file:"
-msgstr "Dit is een suggestie voor een contrab bestand:"
+msgstr "Dit is een suggestie voor een crontab bestand:"
 
 msgid "Click here to run the cron jobs:"
 msgstr "Klik hier om de crontaken te starten:"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cron/routes.yaml b/vendor/simplesamlphp/simplesamlphp/modules/cron/routing/routes/routes.yaml
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/cron/routes.yaml
rename to vendor/simplesamlphp/simplesamlphp/modules/cron/routing/routes/routes.yaml
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cron/templates/croninfo.twig b/vendor/simplesamlphp/simplesamlphp/modules/cron/templates/croninfo.twig
index 12d9813ffcf9e2137f66ca3412739f067ea0f8ae..d6879ebed88afe84df1f8a8d61ffdb47c742e0a0 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/cron/templates/croninfo.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/cron/templates/croninfo.twig
@@ -2,7 +2,7 @@
 {% extends "base.twig" %}
 
 {% block preload %}
-<link rel="stylesheet" href="/{{ baseurlpath }}module.php/cron/assets/css/cron.css">
+<link rel="stylesheet" href="{{ asset('css/cron.css', 'cron') }}">
 {% endblock %}
 
 {% block content %}
@@ -12,6 +12,7 @@
 
     <div class="code-box code-box-content">
         <code id="cronlist">
+        <br />
         {% for url in urls %}
             # {{ 'Run cron:'|trans }} [{{ url.tag }}]<br />
             {{ url.int }} curl --silent "{{ url.exec_href }}" > /dev/null 2>&amp;1<br />
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cron/www/croninfo.php b/vendor/simplesamlphp/simplesamlphp/modules/cron/www/croninfo.php
index 3f55ac313872eba36ccc0e1741436b05bd9e6450..289dfe2c85a13dfc4ad9b0567810ba53b6fe1ded 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/cron/www/croninfo.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/cron/www/croninfo.php
@@ -9,7 +9,6 @@
 
 use SimpleSAML\Configuration;
 use SimpleSAML\Session;
-use Symfony\Component\HttpFoundation\Request;
 
 $config = Configuration::getInstance();
 $session = Session::getSessionFromRequest();
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/discopower/.gitignore b/vendor/simplesamlphp/simplesamlphp/modules/discopower/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ce45e2079dfd89a01b30303086b3b2a84f895810
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/discopower/.gitignore
@@ -0,0 +1,8 @@
+.phpunit.result.cache
+composer.lock
+composer.phar
+/vendor/
+
+# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
+# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
+# composer.lock
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/discopower/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/discopower/LICENSE
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..a345e48d049f9c6756e9364e908b3f26e36c9df1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/discopower/LICENSE
+++ b/vendor/simplesamlphp/simplesamlphp/modules/discopower/LICENSE
@@ -1,165 +1,459 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
 
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
 Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authtwitter/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/discopower/codecov.yml
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/authtwitter/.codecov.yml
rename to vendor/simplesamlphp/simplesamlphp/modules/discopower/codecov.yml
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/discopower/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/discopower/composer.json
index f254d0436e3a9bd953556bdad853206ac40c9c03..7894f1b32a428b036c1d7a00df7b5737afb4c4b9 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/discopower/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/discopower/composer.json
@@ -3,7 +3,7 @@
     "description": "Fancy tabbed discovery service with filtering capabilities where SPs can have different sets of metadata listed",
     "type": "simplesamlphp-module",
     "keywords": ["simplesamlphp", "discopower", "discovery"],
-    "license": "LGPL-3.0-or-later",
+    "license": "LGPL-2.1-or-later",
     "authors": [
         {
             "name": "Andreas Åkre Solberg",
@@ -27,13 +27,12 @@
         }
     },
     "require": {
-        "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1",
-        "webmozart/assert": "~1.4 <1.6"
+        "php": ">=7.1",
+        "simplesamlphp/composer-module-installer": "~1.1"
     },
     "require-dev": {
-        "simplesamlphp/simplesamlphp": "^1.17",
-        "phpunit/phpunit": "~5.7"
+        "simplesamlphp/simplesamlphp": "^1.19",
+        "simplesamlphp/simplesamlphp-test-framework": "^0.1.2"
     },
     "support": {
         "issues": "https://github.com/tvdijen/simplesamlphp-module-discopower/issues",
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/discopower/lib/PowerIdPDisco.php b/vendor/simplesamlphp/simplesamlphp/modules/discopower/lib/PowerIdPDisco.php
index 713feec1fecdfd0c17e0b000a8d268ffd2182568..d8dbbeb7228130a3c7ed2d13e44388c0c337a9e7 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/discopower/lib/PowerIdPDisco.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/discopower/lib/PowerIdPDisco.php
@@ -275,13 +275,15 @@ public function handleRequest()
             }
         }
 
-        if (!is_null($t->data['faventry'])) {
+        if (isset($t->data['faventry'])) {
             $t->data['autofocus'] = 'favouritesubmit';
         }
 
         /* store the tab list in the session */
         $session = Session::getSessionFromRequest();
-        $session->setData('discopower:tabList', 'faventry', $t->data['faventry']);
+        if (array_key_exists('faventry', $t->data)) {
+            $session->setData('discopower:tabList', 'faventry', $t->data['faventry']);
+        }
         $session->setData('discopower:tabList', 'tabs', array_keys($idpList));
         $session->setData('discopower:tabList', 'defaulttab', $t->data['defaulttab']);
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/discopower/templates/disco.twig b/vendor/simplesamlphp/simplesamlphp/modules/discopower/templates/disco.twig
index a21908ae236332203958775f004a894bdd4ff136..01cd1bbb6170e3ff1891fd5f552b2f116a0d70db 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/discopower/templates/disco.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/discopower/templates/disco.twig
@@ -30,7 +30,8 @@
         <ul class="tabset_tabs">
         {% for tab, idps in idplist %}
             {% if idps is not empty %}
-            <li class="tab-link{% if loop.first %}current{% endif %}" data-tab="{{ tab }}"><a href="#{{ tab }}"><span>{{ tabNames[tab]|trans }}</span></a></li>
+            {# NOTE: pass through raw to allow HTML in tabNames, e.g. Belgi&euml; #}
+            <li class="tab-link{% if loop.first %}current{% endif %}" data-tab="{{ tab }}"><a href="#{{ tab }}"><span>{{ tabNames[tab]|trans|raw }}</span></a></li>
             {% endif %}
         {% endfor %}
         </ul>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/.codecov.yml
deleted file mode 100644
index f7f39e1e93d0ca23383d5ed120442f62f5f15ac9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/.codecov.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-coverage:
-  status:
-    project: yes
-
-comment:
-  layout: "diff"
-  behavior: once
-  require_changes: true
-  require_base: no
-  require_head: yes
-  branches: null
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/.php_cs.dist b/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/.php_cs.dist
deleted file mode 100644
index 9649d08b883c8a661ebabcc8df54c4b748c8973f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/.php_cs.dist
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-$finder = PhpCsFixer\Finder::create()
-    ->in([
-        __DIR__ . '/tests',
-        __DIR__ . '/www',
-    ])
-;
-return PhpCsFixer\Config::create()
-    ->setRules([
-        '@PSR2' => true,
-        '@PSR4' => true,
-        '@PSR5' => true,
-    ])
-    ->setFinder($finder)
-;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/.travis.yml
deleted file mode 100644
index 3c250287a743959883e40e541e22f26fb1dd8635..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/.travis.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-sudo: required
-
-language: php
-
-php:
-  - 5.6
-  - 7.0
-  - 7.1
-  - 7.2
-  - 7.3
-
-env:
-  - SIMPLESAMLPHP_VERSION=1.17.*
-  
-matrix:
-  allow_failures:
-    - php: 7.3
-
-before_script:
-  - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
-  - composer update --no-interaction
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then composer require --dev vimeo/psalm:1.1.9; fi
-
-script:
-  - bin/check-syntax.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
-
-after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/LICENSE
deleted file mode 100644
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/LICENSE
+++ /dev/null
@@ -1,165 +0,0 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/bin/check-syntax.sh b/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/bin/check-syntax.sh
deleted file mode 100755
index 7fc4fcd3da6b1e849ad958ee52e31ef0514963b9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/bin/check-syntax.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-PHP='/usr/bin/env php'
-RETURN=0
-
-# check PHP files
-for FILE in `find tests www -name "*.php"`; do
-    $PHP -l $FILE > /dev/null 2>&1
-    if [ $? -ne 0 ]; then
-        echo "Syntax check failed for ${FILE}"
-        RETURN=`expr ${RETURN} + 1`
-    fi
-done
-
-exit $RETURN
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/composer.json
deleted file mode 100644
index b4c0ff482cbbc7d668c61a9ec1c051bfa74f43ac..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/composer.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-    "name": "simplesamlphp/simplesamlphp-module-exampleattributeserver",
-    "description": "An example for SAML attributes queries",
-    "type": "simplesamlphp-module",
-    "keywords": ["simplesamlphp", "exampleattributeserver"],
-    "license": "LGPL-3.0-or-later",
-    "authors": [
-        {
-            "name": "Olav Morken",
-            "email": "olavmrk@gmail.com"
-        }
-    ],
-    "config": {
-        "preferred-install": {
-            "simplesamlphp/simplesamlphp": "source",
-            "*": "dist"
-        }
-    },
-    "autoload": {
-        "psr-4": {
-            "SimpleSAML\\Module\\exampleattributeserver\\": "lib/"
-        }
-    },
-    "autoload-dev": {
-        "psr-4": {
-            "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils"
-        }
-    },
-    "require": {
-        "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1"
-    },
-    "require-dev": {
-        "simplesamlphp/simplesamlphp": "^1.17",
-        "phpunit/phpunit": "~5.7"
-    },
-    "support": {
-        "issues": "https://github.com/tvdijen/simplesamlphp-module-exampleattributeserver/issues",
-        "source": "https://github.com/tvdijen/simplesamlphp-module-exampleattributeserver"
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/phpunit.xml
deleted file mode 100644
index c0985fdd804b18d8d9179ecd956d63582c189e95..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/phpunit.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="tests/bootstrap.php">
-    <testsuites>
-        <testsuite name="The project's test suite">
-            <directory>tests/</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./lib</directory>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" />
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
-        <log type="coverage-clover" target="build/logs/clover.xml" />
-    </logging>
-</phpunit>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/psalm.xml
deleted file mode 100644
index 9326f7da9c0e9e1ec6bdbb0e019e12c16f8a38c6..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/psalm.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    name="SimpleSAMLphp exampleattributeserver module"
-    useDocblockTypes="true"
-    totallyTyped="false"
->
-    <projectFiles>
-        <directory name="www" />
-    </projectFiles>
-
-    <issueHandlers>
-        <LessSpecificReturnType errorLevel="info" />
-
-        <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives -->
-        <DeprecatedMethod errorLevel="info" />
-
-        <MissingClosureReturnType errorLevel="info" />
-        <MissingReturnType errorLevel="info" />
-        <MissingPropertyType errorLevel="info" />
-        <InvalidDocblock errorLevel="info" />
-        <MisplacedRequiredParam errorLevel="info" />
-
-        <PropertyNotSetInConstructor errorLevel="info" />
-        <MissingConstructor errorLevel="info" />
-        <MissingClosureParamType errorLevel="info" />
-        <MissingParamType errorLevel="info" />
-        <UnusedClass errorLevel="info" />
-        <PossiblyUnusedMethod errorLevel="info" />
-    </issueHandlers>
-</psalm>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/tests/bootstrap.php b/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/tests/bootstrap.php
deleted file mode 100644
index 67beffd16eb162c745130827e836a3f8c6a442fb..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/tests/bootstrap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-$projectRoot = dirname(__DIR__);
-require_once($projectRoot.'/vendor/autoload.php');
-
-// Symlink module into ssp vendor lib so that templates and urls can resolve correctly
-$linkPath = $projectRoot.'/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver';
-if (file_exists($linkPath) === false) {
-    echo "Linking '$linkPath' to '$projectRoot'\n";
-    symlink($projectRoot, $linkPath);
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/www/attributeserver.php b/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/www/attributeserver.php
deleted file mode 100644
index 84aad77dd1204475d4a9d1b908e7c9c32904bb01..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleattributeserver/www/attributeserver.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-
-$metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
-
-$binding = \SAML2\Binding::getCurrentBinding();
-$query = $binding->receive();
-if (!($query instanceof \SAML2\AttributeQuery)) {
-    throw new \SimpleSAML\Error\BadRequest('Invalid message received to AttributeQuery endpoint.');
-}
-
-$idpEntityId = $metadata->getMetaDataCurrentEntityID('saml20-idp-hosted');
-
-$issuer = $query->getIssuer();
-if ($issuer === null) {
-    throw new \SimpleSAML\Error\BadRequest('Missing <saml:Issuer> in <samlp:AttributeQuery>.');
-} elseif (is_string($issuer)) {
-    $spEntityId = $issuer;
-} else {
-    $spEntityId = $issuer->getValue();
-}
-
-$idpMetadata = $metadata->getMetaDataConfig($idpEntityId, 'saml20-idp-hosted');
-$spMetadata = $metadata->getMetaDataConfig($spEntityId, 'saml20-sp-remote');
-
-// The endpoint we should deliver the message to
-$endpoint = $spMetadata->getString('testAttributeEndpoint');
-
-// The attributes we will return
-$attributes = [
-    'name' => ['value1', 'value2', 'value3'],
-    'test' => ['test'],
-];
-
-// The name format of the attributes
-$attributeNameFormat = \SAML2\Constants::NAMEFORMAT_UNSPECIFIED;
-
-// Determine which attributes we will return
-$returnAttributes = array_keys($query->getAttributes());
-if (count($returnAttributes) === 0) {
-    SimpleSAML\Logger::debug('No attributes requested - return all attributes.');
-    $returnAttributes = $attributes;
-} elseif ($query->getAttributeNameFormat() !== $attributeNameFormat) {
-    SimpleSAML\Logger::debug('Requested attributes with wrong NameFormat - no attributes returned.');
-    $returnAttributes = [];
-} else {
-    foreach ($returnAttributes as $name => $values) {
-        /** @var array $values */
-        if (!array_key_exists($name, $attributes)) {
-            // We don't have this attribute
-            unset($returnAttributes[$name]);
-            continue;
-        }
-        if (count($values) === 0) {
-            // Return all attributes
-            $returnAttributes[$name] = $attributes[$name];
-            continue;
-        }
-
-        // Filter which attribute values we should return
-        $returnAttributes[$name] = array_intersect($values, $attributes[$name]);
-    }
-}
-
-// $returnAttributes contains the attributes we should return. Send them
-$assertion = new \SAML2\Assertion();
-$assertion->setIssuer($idpEntityId);
-$assertion->setNameId($query->getNameId());
-$assertion->setNotBefore(time());
-$assertion->setNotOnOrAfter(time() + 300); // 60*5 = 5min
-$assertion->setValidAudiences([$spEntityId]);
-$assertion->setAttributes($returnAttributes);
-$assertion->setAttributeNameFormat($attributeNameFormat);
-
-$sc = new \SAML2\XML\saml\SubjectConfirmation();
-$sc->Method = \SAML2\Constants::CM_BEARER;
-$sc->SubjectConfirmationData = new \SAML2\XML\saml\SubjectConfirmationData();
-$sc->SubjectConfirmationData->setNotOnOrAfter(time() + 300); // 60*5 = 5min
-$sc->SubjectConfirmationData->setRecipient($endpoint);
-$sc->SubjectConfirmationData->setInResponseTo($query->getId());
-$assertion->setSubjectConfirmation([$sc]);
-
-\SimpleSAML\Module\saml\Message::addSign($idpMetadata, $spMetadata, $assertion);
-
-$response = new \SAML2\Response();
-$response->setRelayState($query->getRelayState());
-$response->setDestination($endpoint);
-$response->setIssuer($idpEntityId);
-$response->setInResponseTo($query->getId());
-$response->setAssertions([$assertion]);
-\SimpleSAML\Module\saml\Message::addSign($idpMetadata, $spMetadata, $response);
-
-$binding = new \SAML2\HTTPPost();
-$binding->send($response);
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Process/RedirectTest.php b/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Process/RedirectTest.php
index 2e52b99f81e3f5b28f85f2292b405b5e5e43e4de..50b5ca18142b04e6ad8a1aeef6b3fabd4dba4f71 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Process/RedirectTest.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Process/RedirectTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\exampleauth\Auth\Process;
 
 use SimpleSAML\Auth;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/External.php b/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/External.php
index 60c2ebfef23544c68638c4fd2e1a426b6009db4a..a3b72b437c59286e2df4e3ddb92c6b42b186f29b 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/External.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/External.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\exampleauth\Auth\Source;
 
 use SimpleSAML\Auth;
@@ -32,7 +34,7 @@ class External extends \SimpleSAML\Auth\Source
     /**
      * The key of the AuthId field in the state.
      */
-    const AUTHID = 'SimpleSAML\Module\exampleauth\Auth\Source\External.AuthId';
+    public const AUTHID = 'SimpleSAML\Module\exampleauth\Auth\Source\External.AuthId';
 
 
     /**
@@ -58,7 +60,7 @@ public function __construct($info, $config)
      *
      * @return array|null  The user's attributes, or NULL if the user isn't authenticated.
      */
-    private function getUser()
+    private function getUser(): ?array
     {
         /*
          * In this example we assume that the attributes are
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/StaticSource.php b/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/StaticSource.php
index 8d0dc72e141d0d93e982e2c659489fea4300f0f1..5901d9b67bf0d9217077a57dd4454fb2512e9ceb 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/StaticSource.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/StaticSource.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\exampleauth\Auth\Source;
 
 use SimpleSAML\Utils;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/UserPass.php b/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/UserPass.php
index 30239a6c2943a327d4382199a6aeb83e0f73ebea..4a615881447cc6c5ce935212925b882241a00ec9 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/UserPass.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/exampleauth/lib/Auth/Source/UserPass.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\exampleauth\Auth\Source;
 
 use SimpleSAML\Error;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/.codecov.yml
deleted file mode 100644
index f7f39e1e93d0ca23383d5ed120442f62f5f15ac9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/.codecov.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-coverage:
-  status:
-    project: yes
-
-comment:
-  layout: "diff"
-  behavior: once
-  require_changes: true
-  require_base: no
-  require_head: yes
-  branches: null
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/.travis.yml
index 725b371c663863e6c99a81b99b74a38bef58841c..1e79c514f83141d578a1e3a8ab7c68a04d8b9101 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/.travis.yml
+++ b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/.travis.yml
@@ -19,9 +19,10 @@ matrix:
 before_script:
   - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
   - composer update --no-interaction
+  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then composer require --dev vimeo/psalm:1.1.9; fi
 
 script:
-  - vendor/simplesamlphp/simplesamlphp-test-framework/bin/check-syntax-php.sh
+  - bin/check-syntax.sh
   - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
   - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/LICENSE
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..a345e48d049f9c6756e9364e908b3f26e36c9df1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/LICENSE
+++ b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/LICENSE
@@ -1,165 +1,459 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
 
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
 Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/bin/check-syntax.sh b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/bin/check-syntax.sh
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/adfs/bin/check-syntax.sh
rename to vendor/simplesamlphp/simplesamlphp/modules/expirycheck/bin/check-syntax.sh
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/codecov.yml
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/authwindowslive/.codecov.yml
rename to vendor/simplesamlphp/simplesamlphp/modules/expirycheck/codecov.yml
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/composer.json
index 6d120cec7bddf839c8ebd6aa8e1abcabbc39104d..08ba727d06456ffa6b5ceedc8015029efec72db5 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/composer.json
@@ -3,7 +3,7 @@
     "description": "The expirycheck module validates user's expiry date",
     "type": "simplesamlphp-module",
     "keywords": ["simplesamlphp", "expirycheck"],
-    "license": "LGPL-3.0-or-later",
+    "license": "LGPL-2.1-or-later",
     "authors": [
         {
             "name": "Alex Mihičinac",
@@ -14,6 +14,9 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true
         }
     },
     "autoload": {
@@ -28,15 +31,14 @@
     },
     "require": {
         "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1",
-        "webmozart/assert": "~1.4"
+        "simplesamlphp/composer-module-installer": "~1.1"
     },
     "require-dev": {
         "simplesamlphp/simplesamlphp": "^1.17",
-        "simplesamlphp/simplesamlphp-test-framework": "^0.0.10"
+        "phpunit/phpunit": "~5.7"
     },
     "support": {
-        "issues": "https://github.com/simplesamlphp/simplesamlphp-module-expirycheck/issues",
-        "source": "https://github.com/simplesamlphp/simplesamlphp-module-expirycheck"
+        "issues": "https://github.com/tvdijen/simplesamlphp-module-expirycheck/issues",
+        "source": "https://github.com/tvdijen/simplesamlphp-module-expirycheck"
     }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/adfs/default-disable b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/default-disable
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/adfs/default-disable
rename to vendor/simplesamlphp/simplesamlphp/modules/expirycheck/default-disable
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/default-enable b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/default-enable
deleted file mode 100644
index 25615cb47c350d23033eb9801627ed8330bcc3e9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/default-enable
+++ /dev/null
@@ -1,3 +0,0 @@
-This file indicates that the default state of this module
-is enabled. To disable, create a file named disable in the
-same directory as this file.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/lib/Auth/Process/ExpiryDate.php b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/lib/Auth/Process/ExpiryDate.php
index e95854e164532067330c19370e1c35900c0094d7..a0ae17053fdf604caf4002dbe5e4af8e4b013f05 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/lib/Auth/Process/ExpiryDate.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/lib/Auth/Process/ExpiryDate.php
@@ -2,12 +2,6 @@
 
 namespace SimpleSAML\Module\expirycheck\Auth\Process;
 
-use SimpleSAML\Auth;
-use SimpleSAML\Logger;
-use SimpleSAML\Module;
-use SimpleSAML\Utils;
-use Webmozart\Assert\Assert;
-
 /**
  * Filter which show "about to expire" warning or deny access if netid is expired.
  *
@@ -52,7 +46,7 @@ public function __construct(&$config, $reserved)
     {
         parent::__construct($config, $reserved);
 
-        Assert::isArray($config);
+        assert(is_array($config));
 
         if (array_key_exists('warndaysbefore', $config)) {
             $this->warndaysbefore = $config['warndaysbefore'];
@@ -146,32 +140,32 @@ public function process(&$state)
         $expireOnDate = strtotime($state['Attributes'][$this->expirydate_attr][0]);
 
         if ($this->shWarning($state, $expireOnDate, $this->warndaysbefore)) {
-            Assert::isArray($state);
+            assert(is_array($state));
             if (isset($state['isPassive']) && $state['isPassive'] === true) {
                 // We have a passive request. Skip the warning.
                 return;
             }
 
-            Logger::warning('expirycheck: NetID '.$netId.' is about to expire!');
+            \SimpleSAML\Logger::warning('expirycheck: NetID '.$netId.' is about to expire!');
 
             // Save state and redirect
             $state['expireOnDate'] = date($this->date_format, $expireOnDate);
             $state['netId'] = $netId;
-            $id = Auth\State::saveState($state, 'expirywarning:about2expire');
-            $url = Module::getModuleURL('expirycheck/about2expire.php');
-            Utils\HTTP::redirectTrustedURL($url, ['StateId' => $id]);
+            $id = \SimpleSAML\Auth\State::saveState($state, 'expirywarning:about2expire');
+            $url = \SimpleSAML\Module::getModuleURL('expirycheck/about2expire.php');
+            \SimpleSAML\Utils\HTTP::redirectTrustedURL($url, ['StateId' => $id]);
         }
 
         if (!$this->checkDate($expireOnDate)) {
-            Logger::error('expirycheck: NetID '.$netId.
+            \SimpleSAML\Logger::error('expirycheck: NetID '.$netId.
                 ' has expired ['.date($this->date_format, $expireOnDate).']. Access denied!');
 
             /* Save state and redirect. */
             $state['expireOnDate'] = date($this->date_format, $expireOnDate);
             $state['netId'] = $netId;
-            $id = Auth\State::saveState($state, 'expirywarning:expired');
-            $url = Module::getModuleURL('expirycheck/expired.php');
-            Utils\HTTP::redirectTrustedURL($url, ['StateId' => $id]);
+            $id = \SimpleSAML\Auth\State::saveState($state, 'expirywarning:expired');
+            $url = \SimpleSAML\Module::getModuleURL('expirycheck/expired.php');
+            \SimpleSAML\Utils\HTTP::redirectTrustedURL($url, ['StateId' => $id]);
         }
     }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/phpunit.xml
index 0540658da5d229b7588de0714b999d0aebffe445..c0985fdd804b18d8d9179ecd956d63582c189e95 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/phpunit.xml
+++ b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/phpunit.xml
@@ -2,7 +2,6 @@
 <phpunit bootstrap="tests/bootstrap.php">
     <testsuites>
         <testsuite name="The project's test suite">
-            <directory>./vendor/simplesamlphp/simplesamlphp-test-framework/tests/</directory>
             <directory>tests/</directory>
         </testsuite>
     </testsuites>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/psalm.xml
index 6775b5f4737ebe7615c3ff1cf766a618cb8496cb..6a2816821c797d5d7d9046901232122ac833a9bb 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/psalm.xml
+++ b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/psalm.xml
@@ -28,12 +28,5 @@
         <MissingParamType errorLevel="info" />
         <UnusedClass errorLevel="info" />
         <PossiblyUnusedMethod errorLevel="info" />
-
-        <!-- Ignore InvalidScope on template-scripts - Remove for 2.0 -->
-        <InvalidScope>
-            <errorLevel type="suppress">
-                <file name="templates/*.tpl.php" />
-            </errorLevel>
-        </InvalidScope>
     </issueHandlers>
 </psalm>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/templates/about2expire.tpl.php b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/templates/about2expire.php
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/expirycheck/templates/about2expire.tpl.php
rename to vendor/simplesamlphp/simplesamlphp/modules/expirycheck/templates/about2expire.php
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/templates/expired.tpl.php b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/templates/expired.php
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/expirycheck/templates/expired.tpl.php
rename to vendor/simplesamlphp/simplesamlphp/modules/expirycheck/templates/expired.php
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/www/about2expire.php b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/www/about2expire.php
index 7a3bc22abd0db8e3d2e626175157607ec3177f82..293eefb7b66153530e471ab2ad4f7bd1f0f842af 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/www/about2expire.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/www/about2expire.php
@@ -12,7 +12,6 @@
     throw new \SimpleSAML\Error\BadRequest('Missing required StateId query parameter.');
 }
 $id = $_REQUEST['StateId'];
-/** @psalm-var array $state */
 $state = \SimpleSAML\Auth\State::loadState($id, 'expirywarning:about2expire');
 
 if (array_key_exists('yes', $_REQUEST)) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/www/expired.php b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/www/expired.php
index 95af697a12e89b975f7cbc5f01185e9438927505..2d3d3b3e8d2d1f63dd164b11349183cccf999dbc 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/www/expired.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/expirycheck/www/expired.php
@@ -11,7 +11,6 @@
 if (!array_key_exists('StateId', $_REQUEST)) {
     throw new \SimpleSAML\Error\BadRequest('Missing required StateId query parameter.');
 }
-/** @psalm-var array $state */
 $state = \SimpleSAML\Auth\State::loadState($_REQUEST['StateId'], 'expirywarning:expired');
 
 $globalConfig = \SimpleSAML\Configuration::getInstance();
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/ldap/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/ldap/composer.json
index c994f0750ce2ee778f797d04ba8487eeb15680df..a9bd52b274d8f738913d8c62ece79ddd81d0a429 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/ldap/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/ldap/composer.json
@@ -18,6 +18,10 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true,
+            "simplesamlphp/composer-module-installer": true
         }
     },
     "autoload": {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/ldap/docs/ldap.md b/vendor/simplesamlphp/simplesamlphp/modules/ldap/docs/ldap.md
index fa730f5e19ae6588ef5ba1cff22d6e006e554c22..e5a92059eadaacab9b41edc7ff066c86212080ad 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/ldap/docs/ldap.md
+++ b/vendor/simplesamlphp/simplesamlphp/modules/ldap/docs/ldap.md
@@ -356,188 +356,203 @@ a member of. This can be helpful for other filters to know. Below is
 a listing of all configuration options and their details.
 
 
-	50 => array(
-		'class' => 'ldap:AttributeAddUsersGroups',
-
-
-		/**
-		 * LDAP connection settings can be retrieved from an ldap:LDAP
-		 * authsource. Specify the authsource name here to pull that
-		 * data from the authsources.php file in the config folder.
-		 *
-		 * Note: ldap:LDAPMulti is not supported as the SimpleSAMLphp
-		 *       framework does not pass any information about which
-		 *       LDAP source the user selected.
-		 *
-		 * Default: NULL
-		 * Require: No
-		 */
-		'authsource' => NULL,
-		'authsource' => 'example-ldap',
-
-
-		/**
-		 * This is the attribute name which the users groups will be
-		 * added to. If the attribute exists in the request then the
-		 * filter will attempt to add them.
-		 *
-		 * Default: 'groups'
-		 * Required: No
-		 */
-		'attribute.groups' => 'groups',
-
-
-		/**
-		 * The base DN used to search LDAP. May not be needed if searching
-		 * LDAP using the standard method, meaning that no Product is specified.
-		 * Can be listed as a single string for one base, else an array of
-		 * strings for multiple bases.
-		 *
-		 * Default: ''
-		 * Required: No
-		 * AuthSource: search.base
-		 */
-		'ldap.basedn' => '',
-		'ldap.basedn' => 'DC=example,DC=org',
-		'ldap.basedn' => array(
-			'OU=Staff,DC=example,DC=org',
-			'OU=Students,DC=example,DC=org'
-		),
-
-
-		/**
-		 * Set to TRUE to enable LDAP debug level. Passed to
-		 * the LDAP connection class.
-		 *
-		 * Default: FALSE
-		 * Required: No
-		 * AuthSource: debug
-		 */
-		'ldap.debug' => FALSE,
-		'ldap.debug' => TRUE,
-
-
-		/**
-		 * Set to TRUE to force the LDAP connection to use TLS.
-		 *
-		 * Note: If ldaps:// is specified in the hostname then it
-		 *       will automatically use TLS.
-		 *
-		 * Default: FALSE
-		 * Required: No
-		 * AuthSource: enable_tls
-		 */
-		'ldap.enable_tls' => FALSE,
-		'ldap.enable_tls' => TRUE,
-
-
-		/**
-		 * This is the hostname string of LDAP server(s) to try
-		 * and connect to. It should be the same format as the
-		 * LDAP authsource hostname as it is passed to that class.
-		 *
-		 * Note: Multiple servers are separated by a space.
-		 *
-		 * Default: NULL
-		 * Required: Yes, unless authsource is used
-		 * AuthSource: hostname
-		 */
-		'ldap.hostname' => 'ldap.example.org',
-		'ldap.hostname' => 'ad1.example.org ad2.example.org',
-
-
-		/**
-		 * This is the port where the LDAP server(s) listen for
-		 * connections.
-		 *
-		 * Default: 389
-		 * Required: No
-		 * AuthSource: port
-		 */
-		'ldap.port' => 389,
-
-
-		/**
-		 * This is the password used to bind to LDAP.
-		 *
-		 * Default: NULL
-		 * Required: No, only if required for binding.
-		 * AuthSource: search.password OR priv.password
-		 */
-		'ldap.password' => 'Abc123',
-
-
-		/**
-		 * By specifying the directory service product name, the number
-		 * of LDAP queries can be dramatically reduced. The reason is
-		 * that most products have a special query to recursively search
-		 * group membership.
-		 *
-		 * Note: Only ActiveDirectory is currently supported 
-		 * (OpenLDAP is implemented but not supported, see example below).
-		 *
-		 * Default: ''
-		 * Required: No
-		 */
-		'ldap.product' => '',
-		'ldap.product' => 'ActiveDirectory',
-		'ldap.product' => 'OpenLDAP',
-
-
-		/**
-		 * The LDAP timeout value passed to the LDAP connection class.
-		 *
-		 * Default: 0
-		 * Required: No
-		 * AuthSource: timeout
-		 */
-		'ldap.timeout' => 0,
-		'ldap.timeout' => 30,
-
-
-		/**
-		 * This is the username used to bind to LDAP with.
-		 * More than likely will need to be in the DN of
-		 * user binding to LDAP.
-		 *
-		 * Default: NULL
-		 * Required: No, only if required for binding.
-		 * AuthSource: search.username OR priv.username
-		 */
-		'ldap.username' => 'CN=LDAP User,CN=Users,DC=example,DC=org',
+    50 => [
+        'class' => 'ldap:AttributeAddUsersGroups',
 
 
-		/**
-		 * The following attribute.* and type.* configuration options
-		 * define the LDAP schema and should only be defined/modified
-		 * if the schema has been modified or the LDAP product used
-		 * uses other attribute names. By default, the schema is setup
-		 * for ActiveDirectory.
-		 *
-		 * Defaults: Listed Below
-		 * Required: No
-		 */
-		'attribute.dn' => 'distinguishedName',
-		'attribute.groups' => 'groups', // Also noted above
-		'attribute.member' => 'member',
-		'attribute.memberof' => 'memberOf',
-		'attribute.groupname' => 'name',
-		'attribute.type' => 'objectClass',
-		'attribute.username' => 'sAMAccountName',
+        /**
+         * LDAP connection settings can be retrieved from an ldap:LDAP
+         * authsource. Specify the authsource name here to pull that
+         * data from the authsources.php file in the config folder.
+         *
+         * Note: ldap:LDAPMulti is not supported as the SimpleSAMLphp
+         *       framework does not pass any information about which
+         *       LDAP source the user selected.
+         *
+         * Default: NULL
+         * Require: No
+         */
+        'authsource' => null,
+        'authsource' => 'example-ldap',
+
+
+        /**
+         * This is the attribute name which the users groups will be
+         * added to. If the attribute exists in the request then the
+         * filter will attempt to add them.
+         *
+         * Default: 'groups'
+         * Required: No
+         */
+        'attribute.groups' => 'groups',
+
+
+        /**
+         * The base DN used to search LDAP. May not be needed if searching
+         * LDAP using the standard method, meaning that no Product is specified.
+         * Can be listed as a single string for one base, else an array of
+         * strings for multiple bases.
+         *
+         * Default: ''
+         * Required: No
+         * AuthSource: search.base
+         */
+        'ldap.basedn' => '',
+        'ldap.basedn' => 'DC=example,DC=org',
+        'ldap.basedn' => [
+            'OU=Staff,DC=example,DC=org',
+            'OU=Students,DC=example,DC=org'
+        ],
+
+
+        /**
+         * Set to TRUE to enable LDAP debug level. Passed to
+         * the LDAP connection class.
+         *
+         * Default: FALSE
+         * Required: No
+         * AuthSource: debug
+         */
+        'ldap.debug' => false,
+        'ldap.debug' => true,
+
+
+        /**
+         * Set to TRUE to force the LDAP connection to use TLS.
+         *
+         * Note: If ldaps:// is specified in the hostname then it
+         *       will automatically use TLS.
+         *
+         * Default: FALSE
+         * Required: No
+         * AuthSource: enable_tls
+         */
+        'ldap.enable_tls' => false,
+        'ldap.enable_tls' => true,
+
+
+        /**
+         * This is the hostname string of LDAP server(s) to try
+         * and connect to. It should be the same format as the
+         * LDAP authsource hostname as it is passed to that class.
+         *
+         * Note: Multiple servers are separated by a space.
+         *
+         * Default: NULL
+         * Required: Yes, unless authsource is used
+         * AuthSource: hostname
+         */
+        'ldap.hostname' => 'ldap.example.org',
+        'ldap.hostname' => 'ad1.example.org ad2.example.org',
+
+
+        /**
+         * This is the port where the LDAP server(s) listen for
+         * connections.
+         *
+         * Default: 389
+         * Required: No
+         * AuthSource: port
+         */
+        'ldap.port' => 389,
+
+
+        /**
+         * This is the password used to bind to LDAP.
+         *
+         * Default: NULL
+         * Required: No, only if required for binding.
+         * AuthSource: search.password OR priv.password
+         */
+        'ldap.password' => 'Abc123',
+
+
+        /**
+         * By specifying the directory service product name, the number
+         * of LDAP queries can be dramatically reduced. The reason is
+         * that most products have a special query to recursively search
+         * group membership.
+         *
+         * Note: Only ActiveDirectory is currently supported 
+         * (OpenLDAP is implemented but not supported, see example below).
+         *
+         * Default: ''
+         * Required: No
+         */
+        'ldap.product' => '',
+        'ldap.product' => 'ActiveDirectory',
+        'ldap.product' => 'OpenLDAP',
 
 
-		/**
-		 * As mentioned above, these can be changed if the LDAP schema
-		 * has been modified. These list the Object/Entry Type for a given
-		 * DN, in relation to the 'attribute.type' config option above.
-		 * These are used to determine the type of entry.
-		 *
-		 * Defaults: Listed Below
-		 * Required: No
-		 */
-		'type.group' => 'group',
-		'type.user' => 'user',
-	)
+        /**
+         * The LDAP timeout value passed to the LDAP connection class.
+         *
+         * Default: 0
+         * Required: No
+         * AuthSource: timeout
+         */
+        'ldap.timeout' => 0,
+        'ldap.timeout' => 30,
+
+
+        /**
+         * This is the username used to bind to LDAP with.
+         * More than likely will need to be in the DN of
+         * user binding to LDAP.
+         *
+         * Default: NULL
+         * Required: No, only if required for binding.
+         * AuthSource: search.username OR priv.username
+         */
+        'ldap.username' => 'CN=LDAP User,CN=Users,DC=example,DC=org',
+
+
+        /**
+         * The following attribute.* and type.* configuration options
+         * define the LDAP schema and should only be defined/modified
+         * if the schema has been modified or the LDAP product used
+         * uses other attribute names. By default, the schema is setup
+         * for ActiveDirectory.
+         *
+         * Defaults: Listed Below
+         * Required: No
+         */
+        'attribute.dn' => 'distinguishedName',
+        'attribute.groups' => 'groups', // Also noted above
+        'attribute.member' => 'member',
+        'attribute.memberof' => 'memberOf',
+        'attribute.groupname' => 'name',
+        'attribute.return' => 'distinguishedName',
+        'attribute.type' => 'objectClass',
+        'attribute.username' => 'sAMAccountName',
+
+
+        /**
+         * As mentioned above, these can be changed if the LDAP schema
+         * has been modified. These list the Object/Entry Type for a given
+         * DN, in relation to the 'attribute.type' config option above.
+         * These are used to determine the type of entry.
+         *
+         * Defaults: Listed Below
+         * Required: No
+         */
+        'type.group' => 'group',
+        'type.user' => 'user',
+
+
+        /**
+         * LDAP search filters to be added to the base filters for this authproc-filter.
+         * It's an array of key => value pairs that will be translated to (key=value) in the ldap query.
+         *
+         */
+        'additional_filters' => [],
+
+
+        /**
+         * A flag whether to escape the additional filter values or not. Defaults to TRUE
+         */
+        'escape' => true
+    ]
 
 
 ### Example ###
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/ldap/lib/Auth/Process/AttributeAddUsersGroups.php b/vendor/simplesamlphp/simplesamlphp/modules/ldap/lib/Auth/Process/AttributeAddUsersGroups.php
index 5e3d63bf28c50515faa0295ee24ae7ea09e6a8b0..db0bd5421724fe8681a91f57333ac9ae080c9f51 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/ldap/lib/Auth/Process/AttributeAddUsersGroups.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/ldap/lib/Auth/Process/AttributeAddUsersGroups.php
@@ -2,6 +2,7 @@
 
 namespace SimpleSAML\Module\ldap\Auth\Process;
 
+use SimpleSAML\Logger;
 use SimpleSAML\Utils\Arrays;
 
 /**
@@ -14,6 +15,22 @@
  */
 class AttributeAddUsersGroups extends BaseFilter
 {
+    /**
+     * LDAP search filters to be added to the base filters for this authproc-filter.
+     * It's an array of key => value pairs that will be translated to (key=value) in the ldap query.
+     *
+     * @var array
+     */
+    protected $additional_filters;
+
+    /**
+     * A flag whether to escape the additional filter values or not. Defaults to TRUE
+     *
+     * @var bool
+     */
+    protected $escape;
+
+
     /**
      * This is run when the filter is processed by SimpleSAML.
      * It will attempt to find the current users groups using
@@ -34,6 +51,9 @@ public function process(&$request)
             $this->title.'Attempting to get the users groups...'
         );
 
+        $this->additional_filters = $this->config->getArray('additional_filters', []);
+        $this->escape = $this->config->getBoolean('escape', true);
+
         // Reference the attributes, just to make the names shorter
         $attributes = &$request['Attributes'];
         $map = &$this->attribute_map;
@@ -41,6 +61,11 @@ public function process(&$request)
         // Get the users groups from LDAP
         $groups = $this->getGroups($attributes);
 
+        // If there are none, do not proceed
+        if (empty($groups)) {
+            return;
+        }
+
         // Make the array if it is not set already
         if (!isset($attributes[$map['groups']])) {
             $attributes[$map['groups']] = [];
@@ -164,8 +189,13 @@ protected function getGroupsOpenLdap($attributes)
              */
             $all_groups = $this->getLdap()->searchformultiple(
                 $openldap_base,
-                [$map['memberof'] => $attributes[$map['username']][0]],
-                [$map['member']]
+                array_merge(
+                    [
+                        $map['memberof'] => $attributes[$map['username']][0]
+                    ],
+                    $this->additional_filters
+                ),
+                [$map['return']]
             );
         } catch (\SimpleSAML\Error\UserNotFound $e) {
             return $groups; // if no groups found return with empty (still just initialized) groups array
@@ -173,7 +203,7 @@ protected function getGroupsOpenLdap($attributes)
 
         // run through all groups and add each to our groups array
         foreach ($all_groups as $group_entry) {
-            $groups[] = $group_entry[$map['member']][0];
+            $groups[] = $group_entry[$map['return']][0];
         }
 
         return $groups;
@@ -314,14 +344,15 @@ protected function searchActiveDirectory($dn)
         $map = &$this->attribute_map;
 
         // Log the search
-        \SimpleSAML\Logger::debug(
-            $this->title.'Searching ActiveDirectory group membership.'.
-            ' DN: '.$dn.
-            ' DN Attribute: '.$map['dn'].
-            ' Member Attribute: '.$map['member'].
-            ' Type Attribute: '.$map['type'].
-            ' Type Value: '.$this->type_map['group'].
-            ' Base: '.implode('; ', Arrays::Arrayize($this->base_dn))
+        Logger::debug(
+            $this->title . 'Searching ActiveDirectory group membership.' .
+            ' DN: ' . $dn .
+            ' DN Attribute: ' . $map['dn'] .
+            ' Return Attribute: ' . $map['return'] .
+            ' Member Attribute: ' . $map['member'] .
+            ' Type Attribute: ' . $map['type'] .
+            ' Type Value: ' . $this->type_map['group'] .
+            ' Base: ' . implode('; ', Arrays::arrayize($this->base_dn))
         );
 
         // AD connections should have this set
@@ -331,8 +362,20 @@ protected function searchActiveDirectory($dn)
         try {
             $entries = $this->getLdap()->searchformultiple(
                 $this->base_dn,
-                [$map['type'] => $this->type_map['group'], $map['member'].':1.2.840.113556.1.4.1941:' => $dn],
-                [$map['dn']]
+                array_merge(
+                    $this->getLdap()::escape_filter_value(
+                        [
+                            $map['type'] => $this->type_map['group'],
+                            $map['member'] . ':1.2.840.113556.1.4.1941:' => $dn
+                        ],
+                        false
+                    ),
+                    $this->additional_filters
+                ),
+                [$map['return']], // attributes
+                [], // binary attributes
+                true, // AND
+                $this->escape // escape filter values
             );
 
         // The search may throw an exception if no entries
@@ -347,14 +390,14 @@ protected function searchActiveDirectory($dn)
         // Check each entry..
         foreach ($entries as $entry) {
             // Check for the DN using the original attribute name
-            if (isset($entry[$map['dn']][0])) {
-                $groups[] = $entry[$map['dn']][0];
+            if (isset($entry[$map['return']][0])) {
+                $groups[] = $entry[$map['return']][0];
                 continue;
             }
 
             // Sometimes the returned attribute names are lowercase
-            if (isset($entry[strtolower($map['dn'])][0])) {
-                $groups[] = $entry[strtolower($map['dn'])][0];
+            if (isset($entry[strtolower($map['return'])][0])) {
+                $groups[] = $entry[strtolower($map['return'])][0];
                 continue;
             }
 
@@ -366,9 +409,9 @@ protected function searchActiveDirectory($dn)
 
             // Could not find DN, log and continue
             \SimpleSAML\Logger::notice(
-                $this->title.'The DN attribute ['.
-                implode(', ', [$map['dn'], strtolower($map['dn']), 'dn']).
-                '] could not be found in the entry. '.$this->var_export($entry)
+                $this->title . 'The return attribute [' .
+                implode(', ', [$map['return'], strtolower($map['return'])]) .
+                '] could not be found in the entry. ' . $this->var_export($entry)
             );
         }
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/ldap/lib/Auth/Process/BaseFilter.php b/vendor/simplesamlphp/simplesamlphp/modules/ldap/lib/Auth/Process/BaseFilter.php
index 81f1e18997affdeb097ebfa914048cbba99abec9..90d869090d7519938c5ba3177ab92d0547bdb5db 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/ldap/lib/Auth/Process/BaseFilter.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/ldap/lib/Auth/Process/BaseFilter.php
@@ -230,6 +230,7 @@ public function __construct(&$config, $reserved)
             'member'   => $this->config->getString('attribute.member', 'member'),
             'memberof' => $this->config->getString('attribute.memberof', 'memberOf'),
             'name'     => $this->config->getString('attribute.groupname', 'name'),
+            'return'   => $this->config->getString('attribute.return', 'distinguishedName'),
             'type'     => $this->config->getString('attribute.type', 'objectClass'),
             'username' => $this->config->getString('attribute.username', 'sAMAccountName')
         ];
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcacheMonitor/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/memcacheMonitor/composer.json
index 6d26095160bc6394c256829d7cd9634ad8a30363..d92eda7e2c598d97187e2ba8bb640f9b998cb437 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcacheMonitor/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/memcacheMonitor/composer.json
@@ -18,6 +18,9 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true
         }
     },
     "autoload-dev": {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/.codecov.yml
deleted file mode 100644
index f7f39e1e93d0ca23383d5ed120442f62f5f15ac9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/.codecov.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-coverage:
-  status:
-    project: yes
-
-comment:
-  layout: "diff"
-  behavior: once
-  require_changes: true
-  require_base: no
-  require_head: yes
-  branches: null
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/.travis.yml
deleted file mode 100644
index 69769c6526ba4a6040eddf0fd3dfb4920a68ede8..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/.travis.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-sudo: required
-
-language: php
-
-php:
-  - 5.6
-  - 7.0
-  - 7.1
-  - 7.2
-  - 7.3
-
-env:
-  - SIMPLESAMLPHP_VERSION=1.17.*
-
-before_script:
-  - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
-  - composer update --no-interaction
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then composer require --dev vimeo/psalm:1.1.9; fi
-
-script:
-  - vendor/simplesamlphp/simplesamlphp-test-framework/bin/check-syntax-php.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
-
-after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/README.md b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/README.md
deleted file mode 100644
index cea74f253dcdbd76f4af4103360088a9a1c6ce7d..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/README.md
+++ /dev/null
@@ -1,109 +0,0 @@
-SimpleSAMLphp AuthMemCookie module
-==================================
-
-This module implements [Auth MemCookie](https://zenprojects.github.io/Apache-Authmemcookie-Module/) support for SimpleSAMLphp. This allows
-you to integrate SimpleSAMLphp with web applications written in languages other than PHP.
-
-*AuthMemCookie* works by reading authentication data from a *memcache* server and setting environment variables based on
-the attributes found in this data. It also allows you to use the default **Apache access control** features to restrict
-access to your site.
-
-Requisites
-----------
-
-This module requires you to install and set up the following requirements:
-
-* SimpleSAMLphp running as a [Service Provider](https://simplesamlphp.org/docs/stable/simplesamlphp-sp).
-* A *memcache* server.
-* [Auth MemCookie](https://zenprojects.github.io/Apache-Authmemcookie-Module/) .
-
-Installation
-------------
-
-Once you have installed SimpleSAMLphp, installing this module is very simple. First of all, you will need to [download
-Composer](https://getcomposer.org/) if you haven't already. After installing Composer, just execute the following
-command in the root of your SimpleSAMLphp installation:
-
-```
-./composer.phar require simplesamlphp/simplesamlphp-module-memcookie:dev-master
-```
-
-where `dev-master` instructs Composer to install the `master` branch from the Git repository. See the
-[releases](https://github.com/simplesamlphp/simplesamlphp-module-memcookie/releases) available if you want to use a
-stable version of the module.
-
-The module is enabled by default. If you want to disable the module once installed, you just need to create a file named
-`disable` in the `modules/memcookie` directory inside your SimpleSAMLphp installation.
-
-Configuration
--------------
-
-The first step to use this module is to configure *Auth MemCookie* appropriately. The following example (that you can
-find also in `extra/auth_memcookie.conf`) might be helpful:
-
-```
-<Location />
-    # This is a list of memcache servers which Auth MemCookie
-    # should use. 
-    # Note that this list must list the same servers as the
-    # 'authmemcookie.servers'-option in config.php in the
-    # configuration for simpleSAMLphp.
-    #
-    # The syntax for this option is inherited from: http://docs.libmemcached.org/libmemcached_configuration.html 
-    Auth_memCookie_Memcached_Configuration "--SERVER=127.0.0.1:11211"
-
-    # This must be set to 'on' to enable Auth MemCookie for
-    # this directory.
-    Auth_memCookie_Authoritative on
-
-    # This adjusts the maximum number of data elements in the
-    # session data. The default is 10, which can be to low.
-    Auth_memCookie_SessionTableSize "40"
-
-    # These two commands are required to enable access control
-    # in Apache.
-    AuthType Cookie
-    AuthName "My Login"
-
-    # This command causes apache to redirect to the given
-    # URL when we receive a '401 Authorization Required'
-    # error. We redirect to "/simplesaml/module.php/memcookie/auth.php",
-    # which initializes a login to the IdP.
-    ErrorDocument 401 "/simplesaml/module.php/memcookie/auth.php"
-</Location>
-
-<Location /protected>
-    # This allows all authenticated users to access the
-    # directory. To learn more about the 'Require' command,
-    # please look at:
-    # http://httpd.apache.org/docs/2.0/mod/core.html#require
-    Require valid-user
-</Location>
-```
-
-Once *Auth MemCookie* has been correctly configured, you need to configure the module itself by editing the
-`config/authmemcookie.php` file. Set the `username` configuration option to the name of an attribute that you are sure
-to receive and that will identify the user unambiguously. Read the instructions in the file itself if you need help to
-configure it.
-
-If you already have an *auth source* configured and working in SimpleSAMLphp, and all your memcookie configuration
-options are correct, you are ready to go! Make sure to reload Apache so that it uses the new configuration and *Auth
-MemCookie* is loaded. Then you can point your browser to the location that you have protected in Apache and it should
-redirect you automatically to the IdP for authentication.
-
-In order to see all the environment variables you have available in the protected location, you can drop a PHP script
-like the following in there and access it from your browser after authenticating to your IdP:
-
-```
-<html>
- <body>
-  <table>
-<?php
-    foreach ($_SERVER as $key => $value) {
-        echo "   <tr><td>".htmlspecialchars($key)."</td><td>".htmlspecialchars($value)."</td></tr>\n";
-    }
-?>
-  </table>
- </body>
-</html>
-```
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/composer.json
deleted file mode 100644
index 994b242d1dafe31a0588341e52bc3257008e969f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/composer.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "name": "simplesamlphp/simplesamlphp-module-memcookie",
-  "description": "A SimpleSAMLphp module that allows integration with Auth MemCookie, allowing web applications written in other languages than PHP to integrate with SimpleSAMLphp.",
-  "type": "simplesamlphp-module",
-  "keywords": [ "SimpleSAMLphp", "Auth MemCookie", "apache", "cookies"],
-  "homepage": "https://simplesamlphp.org/",
-  "license": "LGPL-2.1",
-  "authors": [
-    {
-      "name": "Olav Morken",
-      "email": "olav.morken@uninett.no"
-    },
-    {
-      "name": "Jaime Perez Crespo",
-      "email": "jaime.perez@uninett.no"
-    }
-  ],
-  "require": {
-    "php": ">=5.6",
-    "simplesamlphp/composer-module-installer": ">=1.1.6"
-  },
-  "require-dev": {
-    "phpunit/phpunit": "~5.7",
-    "simplesamlphp/simplesamlphp": "^1.17",
-    "simplesamlphp/simplesamlphp-test-framework": "^0.0.6"
-  },
-  "support": {
-    "issues": "https://github.com/simplesamlphp/simplesamlphp-module-memcookie/issues",
-    "source": "https://github.com/simplesamlphp/simplesamlphp-module-memcookie/"
-  }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/config-templates/authmemcookie.php b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/config-templates/authmemcookie.php
deleted file mode 100644
index fac02813814cd56c09cd69ce3b526408d35da4e9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/config-templates/authmemcookie.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-/**
- * This is the configuration file for the Auth MemCookie example.
- */
-
-$config = [
-    /*
-     * The authentication source that should be used.
-     *
-     * This must be one of the authentication sources configured in config/authsources.php.
-     */
-    'authsource' => 'default-sp',
-
-    /*
-     * This is the name of the cookie we should save the session id in. The value of this option must match the
-     * Auth_memCookie_CookieName option in the Auth MemCookie configuration. The default value is 'AuthMemCookie'.
-     *
-     * Default:
-     *  'cookiename' => 'AuthMemCookie',
-     */
-    'cookiename' => 'AuthMemCookie',
-
-    /*
-     * This option specifies the name of the attribute which contains the username of the user. It must be set to
-     * a valid attribute name.
-     *
-     * Examples:
-     *  'username' => 'uid', // LDAP attribute for user id.
-     *  'username' => 'mail', // LDAP attribute for email address.
-     *
-     * Default:
-     *  No default value.
-     */
-    'username' => null,
-
-    /*
-     * This option specifies the name of the attribute which contains the groups of the user. Set this option to
-     * NULL if you don't want to include any groups.
-     *
-     * Example:
-     *  'groups' => 'edupersonaffiliation',
-     *
-     * Default:
-     *  'groups' => null,
-     */
-    'groups' => null,
-
-    /*
-     * This option contains the hostnames or IP addresses of the memcache servers where we should store the
-     * authentication information. Separator is a comma. This option should match the address part of the
-     * Auth_memCookie_Memcached_AddrPort option in the Auth MemCookie configuration.
-     *
-     * Examples:
-     *  'memcache.host' => '192.168.93.52',
-     *  'memcache.host' => 'memcache.example.org',
-     *  'memcache.host' => 'memcache1.example.org,memcache2.example.org'
-     *
-     * Default:
-     *  'memcache.host' => '127.0.0.1',
-     */
-    'memcache.host' => '127.0.0.1',
-
-    /*
-     * This option contains the port number of the memcache server where we should store the
-     * authentication information. This option should match the port part of the
-     * Auth_memCookie_Memcached_AddrPort option in the Auth MemCookie configuration.
-     *
-     * Default:
-     *  'memcache.port' => 11211,
-     */
-    'memcache.port' => 11211,
-];
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/extra/auth_memcookie.conf b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/extra/auth_memcookie.conf
deleted file mode 100644
index a3477a80bdc046a97f053a8118a2ce2681508367..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/extra/auth_memcookie.conf
+++ /dev/null
@@ -1,38 +0,0 @@
-<Location />
-    # This is a list of memcache servers which Auth MemCookie
-    # should use. 
-    # Note that this list must list the same servers as the
-    # 'authmemcookie.servers'-option in config.php in the
-    # configuration for simpleSAMLphp.
-    #
-    # The syntax for this option is inherited from: http://docs.libmemcached.org/libmemcached_configuration.html 
-    Auth_memCookie_Memcached_Configuration "--SERVER=127.0.0.1:11211"
-
-    # This must be set to 'on' to enable Auth MemCookie for
-    # this directory.
-    Auth_memCookie_Authoritative on
-
-    # This adjusts the maximum number of data elements in the
-    # session data. The default is 10, which can be to low.
-    Auth_memCookie_SessionTableSize "40"
-
-    # These two commands are required to enable access control
-    # in Apache.
-    AuthType Cookie
-    AuthName "My Login"
-
-    # This command causes apache to redirect to the given
-    # URL when we receive a '401 Authorization Required'
-    # error. We redirect to "/simplesaml/module.php/memcookie/auth.php",
-    # which initializes a login to the IdP.
-    ErrorDocument 401 "/simplesaml/module.php/memcookie/auth.php"
-</Location>
-
-<Location /protected>
-    # This allows all authenticated users to access the
-    # directory. To learn more about the 'Require' command,
-    # please look at:
-    # http://httpd.apache.org/docs/2.0/mod/core.html#require
-    Require valid-user
-</Location>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/lib/AuthMemCookie.php b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/lib/AuthMemCookie.php
deleted file mode 100644
index d5ecc4d88ab39115d556e5a7f68d192f786e741e..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/lib/AuthMemCookie.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\memcookie;
-
-/**
- * This is a helper class for the Auth MemCookie module.
- * It handles the configuration, and implements the logout handler.
- *
- * @author Olav Morken, UNINETT AS.
- * @package SimpleSAMLphp
- */
-class AuthMemCookie
-{
-    /**
-     * @var AuthMemCookie|null This is the singleton instance of this class.
-     */
-    private static $instance = null;
-
-
-    /**
-     * @var \SimpleSAML\Configuration The configuration for Auth MemCookie.
-     */
-    private $config;
-
-
-    /**
-     * This function is used to retrieve the singleton instance of this class.
-     *
-     * @return AuthMemCookie The singleton instance of this class.
-     */
-    public static function getInstance()
-    {
-        if (self::$instance === null) {
-            self::$instance = new AuthMemCookie();
-        }
-
-        return self::$instance;
-    }
-
-
-    /**
-     * This function implements the constructor for this class. It loads the Auth MemCookie configuration.
-     */
-    private function __construct()
-    {
-        // load AuthMemCookie configuration
-        $this->config = \SimpleSAML\Configuration::getConfig('authmemcookie.php');
-    }
-
-
-    /**
-     * Retrieve the authentication source that should be used to authenticate the user.
-     *
-     * @return string The login type which should be used for Auth MemCookie.
-     */
-    public function getAuthSource()
-    {
-        return $this->config->getString('authsource');
-    }
-
-
-    /**
-     * This function retrieves the name of the cookie from the configuration.
-     *
-     * @return string The name of the cookie.
-     * @throws \Exception If the value of the 'cookiename' configuration option is invalid.
-     */
-    public function getCookieName()
-    {
-        $cookieName = $this->config->getString('cookiename', 'AuthMemCookie');
-        if (!is_string($cookieName) || strlen($cookieName) === 0) {
-            throw new \Exception(
-                "Configuration option 'cookiename' contains an invalid value. This option should be a string."
-            );
-        }
-
-        return $cookieName;
-    }
-
-
-    /**
-     * This function retrieves the name of the attribute which contains the username from the configuration.
-     *
-     * @return string The name of the attribute which contains the username.
-     */
-    public function getUsernameAttr()
-    {
-        $usernameAttr = $this->config->getString('username', null);
-
-        return $usernameAttr;
-    }
-
-
-    /**
-     * This function retrieves the name of the attribute which contains the groups from the configuration.
-     *
-     * @return string|null The name of the attribute which contains the groups.
-     */
-    public function getGroupsAttr()
-    {
-        $groupsAttr = $this->config->getString('groups', null);
-
-        return $groupsAttr;
-    }
-
-
-    /**
-     * This function creates and initializes a Memcache object from our configuration.
-     *
-     * @return \Memcache|\Memcached A Memcache object initialized from our configuration.
-     */
-    public function getMemcache()
-    {
-        $memcacheHost = $this->config->getString('memcache.host', '127.0.0.1');
-        $memcachePort = $this->config->getInteger('memcache.port', 11211);
-
-        $class = class_exists('\Memcache') ? '\Memcache' : (class_exists('\Memcached') ? '\Memcached' : false);
-
-        if (!$class) {
-            throw new \Exception('Missing Memcached implementation. You must install either the Memcache or Memcached extension.');
-        }
-
-        /** @psalm-suppress InvalidStringClass */
-        $memcache = new $class;
-
-        foreach (explode(',', $memcacheHost) as $memcacheHost) {
-            if ($memcache instanceof \Memcached) {
-                $memcache->addServer($memcacheHost, $memcachePort);
-            } else {
-                $memcache->addServer($memcacheHost, $memcachePort, true);
-            }
-        }
-
-        /** @var \Memcache|\Memcached $memcache */
-        return $memcache;
-    }
-
-
-    /**
-     * This function logs the user out by deleting the session information from memcache.
-     * @return void
-     */
-    private function doLogout()
-    {
-        $cookieName = $this->getCookieName();
-
-        // check if we have a valid cookie
-        if (!array_key_exists($cookieName, $_COOKIE)) {
-            return;
-        }
-
-        $sessionID = $_COOKIE[$cookieName];
-
-        // delete the session from memcache
-        $memcache = $this->getMemcache();
-        $memcache->delete($sessionID);
-
-        // delete the session cookie
-        \SimpleSAML\Utils\HTTP::setCookie($cookieName, null);
-    }
-
-
-    /**
-     * This function implements the logout handler. It deletes the information from Memcache.
-     * @return void
-     */
-    public static function logoutHandler()
-    {
-        self::getInstance()->doLogout();
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/phpunit.xml
deleted file mode 100644
index c0985fdd804b18d8d9179ecd956d63582c189e95..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/phpunit.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="tests/bootstrap.php">
-    <testsuites>
-        <testsuite name="The project's test suite">
-            <directory>tests/</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./lib</directory>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" />
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
-        <log type="coverage-clover" target="build/logs/clover.xml" />
-    </logging>
-</phpunit>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/psalm.xml
deleted file mode 100644
index c257963f61a069567bcc606bd24ebb9142297870..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/psalm.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    name="SimpleSAMLphp Memcookie"
-    useDocblockTypes="true"
-    totallyTyped="false"
->
-    <projectFiles>
-        <directory name="config-templates" />
-        <directory name="lib" />
-        <directory name="www" />
-    </projectFiles>
-
-    <issueHandlers>
-        <LessSpecificReturnType errorLevel="info" />
-
-        <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives -->
-        <DeprecatedMethod errorLevel="info" />
-
-        <MissingClosureReturnType errorLevel="info" />
-        <MissingReturnType errorLevel="info" />
-        <MissingPropertyType errorLevel="info" />
-        <InvalidDocblock errorLevel="info" />
-        <MisplacedRequiredParam errorLevel="info" />
-
-        <PropertyNotSetInConstructor errorLevel="info" />
-        <MissingConstructor errorLevel="info" />
-        <MissingClosureParamType errorLevel="info" />
-        <MissingParamType errorLevel="info" />
-        <UnusedClass errorLevel="info" />
-        <PossiblyUnusedMethod errorLevel="info" />
-    </issueHandlers>
-
-    <stubs>
-        <file name="vendor/simplesamlphp/simplesamlphp-test-framework/stubs/memcache.php" />
-        <file name="vendor/simplesamlphp/simplesamlphp-test-framework/stubs/memcached.php" />
-    </stubs>
-</psalm>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/tests/bootstrap.php b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/tests/bootstrap.php
deleted file mode 100644
index 0fda7dc8d5f67a754a4ee1a42d9cf149a22ec487..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/tests/bootstrap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-$projectRoot = dirname(__DIR__);
-require_once($projectRoot.'/vendor/autoload.php');
-
-// Symlink module into ssp vendor lib so that templates and urls can resolve correctly
-$linkPath = $projectRoot.'/vendor/simplesamlphp/simplesamlphp/modules/memcookie';
-if (file_exists($linkPath) === false) {
-    echo "Linking '$linkPath' to '$projectRoot'\n";
-    symlink($projectRoot, $linkPath);
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/www/auth.php b/vendor/simplesamlphp/simplesamlphp/modules/memcookie/www/auth.php
deleted file mode 100644
index 9235245550f507eb650b7d532e02d0f3e9a18468..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/www/auth.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-use SimpleSAML\Utils;
-use SimpleSAML\Module\memcookie\AuthMemCookie;
-
-/**
- * This file implements an script which can be used to authenticate users with Auth MemCookie.
- * See: https://zenprojects.github.io/Apache-Authmemcookie-Module/
- *
- * The configuration for this script is stored in config/authmemcookie.php.
- *
- * The file extra/auth_memcookie.conf contains an example of how Auth Memcookie can be configured
- * to use SimpleSAMLphp.
- */
-
-// load SimpleSAMLphp configuration
-$ssp_cf = \SimpleSAML\Configuration::getInstance();
-
-// load Auth MemCookie configuration
-$amc_cf = AuthMemCookie::getInstance();
-
-$sourceId = $amc_cf->getAuthSource();
-$s = new SimpleSAML\Auth\Simple($sourceId);
-
-// check if the user is authorized. We attempt to authenticate the user if not
-$s->requireAuth();
-
-// generate session id and save it in a cookie
-$sessionID = Utils\Random::generateID();
-$cookieName = $amc_cf->getCookieName();
-Utils\HTTP::setCookie($cookieName, $sessionID);
-
-// generate the authentication information
-$attributes = $s->getAttributes();
-
-$authData = [];
-
-// username
-$usernameAttr = $amc_cf->getUsernameAttr();
-if (!array_key_exists($usernameAttr, $attributes)) {
-    throw new \SimpleSAML\Error\Exception(
-        "The user doesn't have an attribute named '".$usernameAttr.
-        "'. This attribute is expected to contain the username."
-    );
-}
-$authData['UserName'] = $attributes[$usernameAttr];
-
-// groups
-$groupsAttr = $amc_cf->getGroupsAttr();
-if ($groupsAttr !== null) {
-    if (!array_key_exists($groupsAttr, $attributes)) {
-        throw new \SimpleSAML\Error\Exception(
-            "The user doesn't have an attribute named '".$groupsAttr.
-            "'. This attribute is expected to contain the groups the user is a member of."
-        );
-    }
-    $authData['Groups'] = $attributes[$groupsAttr];
-} else {
-    $authData['Groups'] = [];
-}
-
-$authData['RemoteIP'] = $_SERVER['REMOTE_ADDR'];
-
-foreach ($attributes as $n => $v) {
-    $authData['ATTR_'.$n] = $v;
-}
-
-// store the authentication data in the memcache server
-$data = '';
-foreach ($authData as $n => $v) {
-    if (is_array($v)) {
-        $v = implode(':', $v);
-    }
-    $data .= $n.'='.$v."\r\n";
-}
-
-$memcache = $amc_cf->getMemcache();
-$expirationTime = $s->getAuthData('Expire');
-if ($memcache instanceof \Memcached) {
-    $memcache->set($sessionID, $data, $expirationTime);
-} else {
-    $memcache->set($sessionID, $data, 0, $expirationTime);
-}
-
-// register logout handler
-$session = \SimpleSAML\Session::getSessionFromRequest();
-$session->registerLogoutHandler($sourceId, '\SimpleSAML\Module\memcookie\AuthMemCookie', 'logoutHandler');
-
-// redirect the user back to this page to signal that the login is completed
-Utils\HTTP::redirectTrustedURL(Utils\HTTP::getSelfURL());
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/bin/metarefresh.php b/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/bin/metarefresh.php
index 87def0acdc4dec43060ace9914eeda8d68103376..269c92f1550f7f8a2e6885c8ef83b8eed9551109 100755
--- a/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/bin/metarefresh.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/bin/metarefresh.php
@@ -26,7 +26,7 @@
 \SimpleSAML\Configuration::setConfigDir($configdir);
 
 // $outputDir contains the directory we will store the generated metadata in
-$outputDir = $baseDir.'/metadata-generated';
+$outputDir = \SimpleSAML\Utils\System::resolvePath('metadata-generated');
 
 
 /* $toStdOut is a boolean telling us wheter we will print the output to stdout instead
@@ -115,7 +115,7 @@
                 echo 'Please run `'.$progName.' --help` for usage information.'."\n";
                 exit(1);
             }
-            $outputDir = $baseDir.($v[0] == '/' ? $v : '/'.$v);
+            $outputDir = \SimpleSAML\Utils\System::resolvePath($v);
             break;
         case '--stdout':
             $toStdOut = true;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/config-templates/config-metarefresh.php b/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/config-templates/config-metarefresh.php
index 333b75dee3bc31798d354ecb7e82c93bb8db27f5..3aeddd4c107042b0341a3c7c6c71a2f07c915e1f 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/config-templates/config-metarefresh.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/config-templates/config-metarefresh.php
@@ -52,6 +52,12 @@
                         ],
                     ],
 
+                    'regex-template' => [
+                        "#^https://www\.example\.com/sp$#" => [
+                            'assertion.encryption' => false,
+                        ],
+                    ],
+
                     /*
                      * The sets of entities to load, any combination of:
                      *  - 'saml20-idp-remote'
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/docs/simplesamlphp-automated_metadata.md b/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/docs/simplesamlphp-automated_metadata.md
index fdf33ecbeba9abe219fc92c056d30f02a4ffa777..82c76f62566aa71ebeca361724f07add3152866a 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/docs/simplesamlphp-automated_metadata.md
+++ b/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/docs/simplesamlphp-automated_metadata.md
@@ -202,6 +202,12 @@ Each metadata source has the following options:
 :   This is an array which will be combined with the metadata fetched to
     generate the final metadata array.
 
+`regex-template`
+:   This is an array of arrays that allows metadata elements to be added or changed for al entities matching a regular
+    expression. The key of each element is a regular expression that will be matched against all entity IDs in metadata.
+    If the regular expression matches, the value array will be combined with the metadata fetched to generate the final
+    metadata array.
+
 `types`
 :   Same as the option with the same name at the metadata set level. This option has precedence when both are specified,
     allowing a more fine grained configuration for every metadata source.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/lib/MetaLoader.php b/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/lib/MetaLoader.php
index 0f16301b0f74d7115dee007c4ec884d3505d570e..671de5d24c65e428c005ff47da239a608d6934d5 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/lib/MetaLoader.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/lib/MetaLoader.php
@@ -223,6 +223,18 @@ public function loadSource(array $source)
                 $template = $source['template'];
             }
 
+            if (array_key_exists('regex-template', $source)) {
+                foreach ($source['regex-template'] as $e => $t) {
+                    if (preg_match($e, $entity->getEntityID())) {
+                        if (is_array($template)) {
+                            $template = array_merge($template, $t);
+                        } else {
+                            $template = $t;
+                        }
+                    }
+                }
+            }
+
             if (in_array('shib13-sp-remote', $this->types, true)) {
                 $this->addMetadata($source['src'], $entity->getMetadata1xSP(), 'shib13-sp-remote', $template);
             }
@@ -430,7 +442,7 @@ public function writeState()
                 $this->stateFile,
                 "<?php\n/* This file was generated by the metarefresh module at ".$this->getTime().".\n".
                 " Do not update it manually as it will get overwritten. */\n".
-                '$state = '.var_export($this->state, true).";\n?>\n",
+                '$state = '.var_export($this->state, true).";\n\n",
                 0644
             );
         }
@@ -579,8 +591,6 @@ public function writeMetadataFiles($outputDir)
                     $content .= addslashes($entityID).'\'] = '.var_export($m['metadata'], true).';'."\n";
                 }
 
-                $content .= "\n".'?>';
-
                 Utils\System::writeFile($filename, $content, 0644);
             } elseif (is_file($filename)) {
                 if (unlink($filename)) {
@@ -655,7 +665,6 @@ public function writeMetadataSerialize($outputDir)
     private function getTime()
     {
         // The current date, as a string
-        date_default_timezone_set('UTC');
-        return date('Y-m-d\\TH:i:s\\Z');
+        return gmdate('Y-m-d\\TH:i:s\\Z');
     }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/tests/lib/MetaLoaderTest.php b/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/tests/lib/MetaLoaderTest.php
index 886d56ff186a2e1fdf7aee0f86acf7d64d645cff..bfdd7362f439c85ab0f4a90d4868df97bbeebf28 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/tests/lib/MetaLoaderTest.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/metarefresh/tests/lib/MetaLoaderTest.php
@@ -14,6 +14,11 @@ class MetaLoaderTest extends TestCase
     private $source = [
         'outputFormat' => 'flatfile',
         'conditionalGET' => false,
+        'regex-template' => [
+            "#^https://idp\.example\.com/idp/shibboleth$#" => [
+            'tags' => [ 'my-tag' ],
+            ],
+        ],
     ];
     private $expected = [
         'entityid' => 'https://idp.example.com/idp/shibboleth',
@@ -54,6 +59,7 @@ class MetaLoaderTest extends TestCase
             'DisplayName' => ['en' => 'DisplayName',],
             'Description' => ['en' => 'Description',],
         ],
+        'tags' => ['my-tag'],
     ];
 
     protected function setUp()
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/dictionaries/multiauth.translation.json b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/dictionaries/multiauth.translation.json
index fce7afc0c78fdfcaa1c350ad4a9320778483f0c2..646e6da619029998a706610746a45ad3e09dc2cc 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/dictionaries/multiauth.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/dictionaries/multiauth.translation.json
@@ -33,6 +33,7 @@
 		"pl": "Wybierz \u017aród\u0142o autentykacji",
 		"xh": "Khetha umthombo wongqinisiso",
 		"zu": "Khetha umthombo wokuqinisekisa",
+        "st": "Kgetha mohlodi wa netafatso",
 		"ca": "Seleccioneu una font d’autenticació"
 	},
 	"select_source_text": {
@@ -69,6 +70,7 @@
 		"pl": "Wybrane \u017aród\u0142o zostanie u\u017Cyte do autentykacji i stworzenia sesji",
 		"zu": "Umthombo wokuqinisekisa okhethiwe uzosetshenziswa ukuze uqinisekiswe futhi kwakhiwe iseshini esebenzayo.",
 		"xh": "Umthombo wongqinisiso okhethiweyo uza kusetyenziswa ukukungqinisisa nokuyila iseshoni esebenzayo.",
+        "st": "Mohlodi wa netefatso o kgethilweng o tla sebediswa ho netefatsa wena le ho theha seshene e nepahetseng.",
 		"ca": "La font d’autenticació seleccionada s’utilitzarà per autenticar-vos i crear una sessió vàlida."
 	}
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/docs/multiauth.md b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/docs/multiauth.md
index 97ae265feb2724b63d0c4b154b748d75cb6ca979..5b474513a0ed6088e2c0c7a49cf6a361cab7c0de 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/docs/multiauth.md
+++ b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/docs/multiauth.md
@@ -36,12 +36,14 @@ authentication source:
                     'es' => 'Entrar usando un SP SAML',
                 ),
                 'css-class' => 'SAML',
+                'AuthnContextClassRef' => array('urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI', 'urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract'),
             ),
             'example-admin' => array(
                 'text' => array(
                     'en' => 'Log in using the admin password',
                     'es' => 'Entrar usando la contraseña de administrador',
                 ),
+                'AuthnContextClassRef' => 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport',
             ),
         ),
     ),
@@ -77,7 +79,7 @@ compatible fashion so both cases should work.
 
 Each source in the sources array has a key and a value. As
 mentioned above the key is the authsource identifier and the value
-is another array with two optional keys: 'text' and 'css-class'.
+is another array with optional keys: 'text', 'css-class', 'help', and 'AuthnContextClassRef'.
 The text element is another array with localized strings for one
 or more languages. These texts will be shown in the selectsource.php
 view. Note that you should at least enter the text in the default
@@ -87,7 +89,14 @@ the &lt;li> element in the selectsource.php view. By default the
 authtype of the authsource is used as the css class with colons
 replaced by dashes. So in the previous example, the css class used
 in the 'example-admin' authentication source would be
-'core-AdminPassword'.
+'core-AdminPassword'. The help element is another array with localized
+strings for one or more languages. These texts will be shown in the
+selectsource.php view. The AuthnContextClassRef is either a string or
+an array of strings containing [context class ref names](https://docs.oasis-open.org/security/saml/v2.0/saml-authn-context-2.0-os.pdf).
+If an SP sets AuthnContextClassRef the list of authsources will be
+filtered to only those containing context class refs that are part of the list set by the SP.
+If a single authsource results from this filtering the user will be taken directly to the
+authentication page for that source, and will never be shown the multiauth select page.
 
 It is possible to add the parameter `source` to the calling URL, 
 when accessing a service, to allow the user to preselect the
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/lib/Auth/Source/MultiAuth.php b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/lib/Auth/Source/MultiAuth.php
index 85d723588a1aa4743c15af3386ff81d7379324f4..fd6d9dce7a94fa35455960b3ce7759c62af7707b 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/lib/Auth/Source/MultiAuth.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/lib/Auth/Source/MultiAuth.php
@@ -1,13 +1,18 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\multiauth\Auth\Source;
 
+use Exception;
+use SAML2\Constants;
 use SimpleSAML\Auth;
 use SimpleSAML\Configuration;
 use SimpleSAML\Error;
 use SimpleSAML\Module;
 use SimpleSAML\Session;
 use SimpleSAML\Utils;
+use SimpleSAML\Module\saml\Error\NoAuthnContext;
 
 /**
  * Authentication source which let the user chooses among a list of
@@ -21,22 +26,22 @@ class MultiAuth extends \SimpleSAML\Auth\Source
     /**
      * The key of the AuthId field in the state.
      */
-    const AUTHID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.AuthId';
+    public const AUTHID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.AuthId';
 
     /**
      * The string used to identify our states.
      */
-    const STAGEID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.StageId';
+    public const STAGEID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.StageId';
 
     /**
      * The key where the sources is saved in the state.
      */
-    const SOURCESID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.SourceId';
+    public const SOURCESID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.SourceId';
 
     /**
      * The key where the selected source is saved in the session.
      */
-    const SESSION_SOURCE = 'multiauth:selectedSource';
+    public const SESSION_SOURCE = 'multiauth:selectedSource';
 
     /**
      * Array of sources we let the user chooses among.
@@ -65,12 +70,12 @@ public function __construct($info, $config)
         parent::__construct($info, $config);
 
         if (!array_key_exists('sources', $config)) {
-            throw new \Exception('The required "sources" config option was not found');
+            throw new Exception('The required "sources" config option was not found');
         }
 
         if (array_key_exists('preselect', $config) && is_string($config['preselect'])) {
             if (!array_key_exists($config['preselect'], $config['sources'])) {
-                throw new \Exception('The optional "preselect" config option must be present in "sources"');
+                throw new Exception('The optional "preselect" config option must be present in "sources"');
             }
 
             $this->preselect = $config['preselect'];
@@ -80,7 +85,10 @@ public function __construct($info, $config)
         $defaultLanguage = $globalConfiguration->getString('language.default', 'en');
         $authsources = Configuration::getConfig('authsources.php');
         $this->sources = [];
-        foreach ($config['sources'] as $source => $info) {
+
+        /** @psalm-var array $sources */
+        $sources = $config['sources'];
+        foreach ($sources as $source => $info) {
             if (is_int($source)) {
                 // Backwards compatibility
                 $source = $info;
@@ -110,11 +118,22 @@ public function __construct($info, $config)
                 }
             }
 
+            $class_ref = [];
+            if (array_key_exists('AuthnContextClassRef', $info)) {
+                $ref = $info['AuthnContextClassRef'];
+                if (is_string($ref)) {
+                    $class_ref = [$ref];
+                } else {
+                    $class_ref = $ref;
+                }
+            }
+
             $this->sources[] = [
                 'source' => $source,
                 'text' => $text,
                 'help' => $help,
                 'css_class' => $css_class,
+                'AuthnContextClassRef' => $class_ref,
             ];
         }
     }
@@ -144,6 +163,30 @@ public function authenticate(&$state)
             $state['multiauth:preselect'] = $this->preselect;
         }
 
+        if (
+            !is_null($state['saml:RequestedAuthnContext'])
+            && array_key_exists('AuthnContextClassRef', $state['saml:RequestedAuthnContext'])
+        ) {
+            $refs = array_values($state['saml:RequestedAuthnContext']['AuthnContextClassRef']);
+            $new_sources = [];
+            foreach ($this->sources as $source) {
+                if (count(array_intersect($source['AuthnContextClassRef'], $refs)) >= 1) {
+                    $new_sources[] = $source;
+                }
+            }
+            $state[self::SOURCESID] = $new_sources;
+
+            $number_of_sources = count($new_sources);
+            if ($number_of_sources === 0) {
+                throw new NoAuthnContext(
+                    Constants::STATUS_RESPONDER,
+                    'No authentication sources exist for the requested AuthnContextClassRefs: ' . implode(', ', $refs)
+                );
+            } else if ($number_of_sources === 1) {
+                MultiAuth::delegateAuthentication($new_sources[0]['source'], $state);
+            }
+        }
+
         // Save the $state array, so that we can restore if after a redirect
         $id = Auth\State::saveState($state, self::STAGEID);
 
@@ -195,7 +238,7 @@ function ($src) {
             $state[self::SOURCESID]
         );
         if ($as === null || !in_array($authId, $valid_sources, true)) {
-            throw new \Exception('Invalid authentication source: ' . $authId);
+            throw new Exception('Invalid authentication source: ' . $authId);
         }
 
         // Save the selected authentication source for the logout process.
@@ -211,7 +254,7 @@ function ($src) {
             $as->authenticate($state);
         } catch (Error\Exception $e) {
             Auth\State::throwException($state, $e);
-        } catch (\Exception $e) {
+        } catch (Exception $e) {
             $e = new Error\UnserializableException($e);
             Auth\State::throwException($state, $e);
         }
@@ -238,7 +281,7 @@ public function logout(&$state)
 
         $source = Auth\Source::getById($authId);
         if ($source === null) {
-            throw new \Exception('Invalid authentication source during logout: ' . $authId);
+            throw new Exception('Invalid authentication source during logout: ' . $authId);
         }
         // Then, do the logout on it
         $source->logout($state);
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/locales/en/LC_MESSAGES/multiauth.po b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/locales/en/LC_MESSAGES/multiauth.po
index 48e9db678e8b44638ab30484982f3d1d541eb84b..7c0e2108ce16575b08f860201d25e3ea3bcbbc39 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/locales/en/LC_MESSAGES/multiauth.po
+++ b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/locales/en/LC_MESSAGES/multiauth.po
@@ -28,8 +28,8 @@ msgstr "Select an authentication source"
 
 msgid ""
 "The selected authentication source will be used to authenticate you and "
-"and to create a valid session."
+"to create a valid session."
 msgstr ""
 "The selected authentication source will be used to authenticate you and "
-"and to create a valid session."
+"to create a valid session."
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/locales/st/LC_MESSAGES/multiauth.po b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/locales/st/LC_MESSAGES/multiauth.po
new file mode 100644
index 0000000000000000000000000000000000000000..535207bac228f97c5fe802e8dc7a98bf188d500a
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/locales/st/LC_MESSAGES/multiauth.po
@@ -0,0 +1,34 @@
+
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SimpleSAMLphp 1.15\n"
+"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n"
+"POT-Creation-Date: 2019-12-12 12:30+0200\n"
+"PO-Revision-Date: 2019-12-12 12:30+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
+msgid ""
+"The selected authentication source will be used to authenticate you and "
+"and to create a valid session."
+msgstr ""
+"Mohlodi wa netefatso o kgethilweng o tla sebediswa ho netefatsa wena le "
+"ho theha seshene e nepahetseng."
+
+msgid "{multiauth:multiauth:select_source_text}"
+msgstr ""
+"Mohlodi wa netefatso o kgethilweng o tla sebediswa ho netefatsa wena le "
+"ho theha seshene e nepahetseng."
+
+msgid "Select an authentication source"
+msgstr "Kgetha mohlodi wa netafatso"
+
+msgid "{multiauth:multiauth:select_source_header}"
+msgstr "Kgetha mohlodi wa netafatso"
+
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/templates/selectsource.twig b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/templates/selectsource.twig
index 5d1e3793e93dc82d3752390d1ab24013aa6d560b..7b212cbd85858a893ab38085c3d03680a1eb611a 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/multiauth/templates/selectsource.twig
+++ b/vendor/simplesamlphp/simplesamlphp/modules/multiauth/templates/selectsource.twig
@@ -6,7 +6,7 @@
     <p>{{ '{multiauth:multiauth:select_source_text}'| trans }}</p>
 
     <form action="{{ selfUrl|escape('html') }}" method="get">
-        <input type="hidden" name="AuthState" value="{{ authstate|escape('html') }} ">
+        <input type="hidden" name="AuthState" value="{{ authstate|escape('html') }}">
         <ul>
         {% for key, source in sources %}
             {% set name = ('src-' ~ source.source64) %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/negotiate/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/negotiate/composer.json
index 7c70015a9f89234ff369e2d3d7c46fe9c941d397..1fddb70c4eef0a7de2756a9bc0b8493b068d7448 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/negotiate/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/negotiate/composer.json
@@ -14,6 +14,9 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true
         }
     },
     "autoload": {
@@ -43,7 +46,7 @@
         "ext-krb5": "Needed in case the SimpleSAMLphp negotiate module is used"
     },
     "support": {
-        "issues": "https://github.com/tvdijen/simplesamlphp-module-negotiate/issues",
-        "source": "https://github.com/tvdijen/simplesamlphp-module-negotiate"
+        "issues": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate/issues",
+        "source": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate"
     }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/negotiate/lib/Auth/Source/Negotiate.php b/vendor/simplesamlphp/simplesamlphp/modules/negotiate/lib/Auth/Source/Negotiate.php
index d2b04425121d89d0ee467ee1a5fd7f8e335dd4b9..57ba91eec259b0ef35b58fbfcd166d5765fcbf79 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/negotiate/lib/Auth/Source/Negotiate.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/negotiate/lib/Auth/Source/Negotiate.php
@@ -296,9 +296,10 @@ protected function sendNegotiate($params)
 
         $url = htmlspecialchars(\SimpleSAML\Module::getModuleURL('negotiate/backend.php', $params));
 
+        header('HTTP/1.1 401 Unauthorized');
+        header('WWW-Authenticate: Negotiate', false);
+
         $t = new \SimpleSAML\XHTML\Template($config, 'negotiate:redirect.php');
-        $t->setStatusCode(401);
-        $t->headers->set('WWW-Authenticate', 'Negotiate');
         $t->data['baseurlpath'] = \SimpleSAML\Module::getModuleURL('negotiate');
         $t->data['url'] = $url;
         $t->show();
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/oauth/.gitignore b/vendor/simplesamlphp/simplesamlphp/modules/oauth/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ce45e2079dfd89a01b30303086b3b2a84f895810
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/oauth/.gitignore
@@ -0,0 +1,8 @@
+.phpunit.result.cache
+composer.lock
+composer.phar
+/vendor/
+
+# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
+# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
+# composer.lock
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/oauth/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/oauth/composer.json
index 11238008a11b03cae7458331af1f5390d3e8879f..1371e658a675d8ae4b0ea907273adc164aa2ca5e 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/oauth/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/oauth/composer.json
@@ -15,6 +15,11 @@
             "email": "jaime.perez@uninett.no"
         }
     ],
+    "autoload": {
+        "psr-4": {
+            "SimpleSAML\\Module\\oauth\\": "lib/"
+        }
+    },
     "require": {
       "simplesamlphp/composer-module-installer": ">=1.1.6"
     },
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/portal/config-templates/module_portal.php b/vendor/simplesamlphp/simplesamlphp/modules/portal/config-templates/module_portal.php
index 85df6f99ab589004bc09c08671a677d25f66dcd8..c934bf77bd967197c497d1da66976f38ea110be1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/portal/config-templates/module_portal.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/portal/config-templates/module_portal.php
@@ -1,4 +1,5 @@
 <?php
+
 /*
  * Configuration for the module portal.
  */
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/portal/lib/Portal.php b/vendor/simplesamlphp/simplesamlphp/modules/portal/lib/Portal.php
index e7308758f5deda9052c067511433424211a750c1..e116c6e5a5d93aaf967555029c401622f4e68833 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/portal/lib/Portal.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/portal/lib/Portal.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\portal;
 
 use SimpleSAML\Configuration;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/.travis.yml
index 1261f5fd2a4539ccc4e77e062cb10d2756116bf6..abbfb22d3d8cb89e5c17950e64eaa480c099569b 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/.travis.yml
+++ b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/.travis.yml
@@ -3,7 +3,6 @@ sudo: required
 language: php
 
 php:
-  - 5.6
   - 7.0
   - 7.1
   - 7.2
@@ -23,13 +22,8 @@ before_script:
 
 script:
   - bin/check-syntax.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
+  - if [[ "$TRAVIS_PHP_VERSION" == "7.0" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
   - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
 
 after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
+  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/composer.json
index 20f77a7d585d454429d99cc70fe888ef49bf8b5a..b152c9bb10ea33ca085aa5d7ae01c49d8c879837 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/composer.json
@@ -14,6 +14,10 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true,
+            "simplesamlphp/composer-module-installer": true
         }
     },
     "autoload": {
@@ -27,12 +31,12 @@
         }
     },
     "require": {
-        "php": ">=5.6",
+        "php": ">=7.0",
         "simplesamlphp/composer-module-installer": "~1.1"
     },
     "require-dev": {
         "phpunit/phpunit": "~5.7",
-        "simplesamlphp/simplesamlphp": "^1.17",
+        "simplesamlphp/simplesamlphp": "dev-simplesamlphp-1.19",
         "webmozart/assert": "^1.4"
     },
     "support": {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/lib/Controller/PreProdWarning.php b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/lib/Controller/PreProdWarning.php
new file mode 100644
index 0000000000000000000000000000000000000000..a82301393e2de58f2c530d18c230056bb809b209
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/lib/Controller/PreProdWarning.php
@@ -0,0 +1,131 @@
+<?php
+
+namespace SimpleSAML\Module\preprodwarning\Controller;
+
+use SimpleSAML\Auth;
+use SimpleSAML\Configuration;
+use SimpleSAML\Error;
+use SimpleSAML\HTTP\RunnableResponse;
+use SimpleSAML\Logger;
+use SimpleSAML\Module;
+use SimpleSAML\Session;
+use SimpleSAML\XHTML\Template;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Controller class for the preprodwarning module.
+ *
+ * This class serves the different views available in the module.
+ *
+ * @package simplesamlphp/simplesamlphp-module-preprodwarning
+ */
+class PreProdWarning
+{
+    /**
+     * @var \SimpleSAML\Auth\State|string
+     * @psalm-var \SimpleSAML\Auth\State|class-string
+     */
+    protected $authState = Auth\State::class;
+
+    /**
+     * @var \SimpleSAML\Auth\ProcessingChain|string
+     * @psalm-var \SimpleSAML\Auth\ProcessingChain|class-string
+     */
+    protected $procChain = Auth\ProcessingChain::class;
+
+    /**
+     * @var \SimpleSAML\Logger|string
+     * @psalm-var \SimpleSAML\Logger|class-string
+     */
+    protected $logger = Logger::class;
+
+    /** @var \SimpleSAML\Configuration */
+    protected $config;
+
+    /** @var \SimpleSAML\Session */
+    protected $session;
+
+
+    /**
+     * Controller constructor.
+     *
+     * It initializes the global configuration and session for the controllers implemented here.
+     *
+     * @param \SimpleSAML\Configuration $config The configuration to use by the controllers.
+     * @param \SimpleSAML\Session $session The session to use by the controllers.
+     *
+     * @throws \Exception
+     */
+    public function __construct(
+        Configuration $config,
+        Session $session
+    ) {
+        $this->config = $config;
+        $this->session = $session;
+    }
+
+
+    /**
+     * Inject the \SimpleSAML\Auth\State dependency.
+     *
+     * @param \SimpleSAML\Auth\State $authState
+     */
+    public function setAuthState(Auth\State $authState)
+    {
+        $this->authState = $authState;
+    }
+
+
+    /**
+     * Inject the \SimpleSAML\Auth\ProcessingChain dependency.
+     *
+     * @param \SimpleSAML\Auth\ProcessingChain $procChain
+     */
+    public function setProcessingChain(Auth\ProcessingChain $procChain)
+    {
+        $this->procChain = $procChain;
+    }
+
+
+    /**
+     * Inject the \SimpleSAML\Logger dependency.
+     *
+     * @param \SimpleSAML\Logger $logger
+     */
+    public function setLogger(Logger $logger)
+    {
+        $this->logger = $logger;
+    }
+
+
+    /**
+     * Show warning.
+     *
+     * @param \Symfony\Component\HttpFoundation\Request $request
+     * @return \Symfony\Component\HttpFoundation\Response
+     * @throws \Exception
+     */
+    public function main(Request $request)
+    {
+        $this->logger::info('PreProdWarning - Showing warning to user');
+
+        $id = $request->get('StateId', null);
+        if ($id === null) {
+            throw new Error\BadRequest('Missing required StateId query parameter.');
+        }
+
+        /** @psalm-var array $state */
+        $state = $this->authState::loadState($id, 'warning:request');
+
+        if ($request->get('yes')) {
+            // The user has pressed the yes-button
+            return new RunnableResponse([$this->procChain, 'resumeProcessing'], [$state]);
+        }
+
+        $t = new Template($this->config, 'preprodwarning:warning.twig');
+        $t->data['yesTarget'] = Module::getModuleURL('preprodwarning/warning');
+        $t->data['yesData'] = ['StateId' => $id];
+        return $t;
+    }
+}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/routing/routes/routes.yml b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/routing/routes/routes.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f698bc3bb3802db5be1b003901f6e97184bf4927
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/routing/routes/routes.yml
@@ -0,0 +1,7 @@
+preprodwarning-main:
+    path:       /warning
+    defaults:   { _controller: 'SimpleSAML\Module\preprodwarning\Controller\PreProdWarning::main' }
+
+preprodwarning-main-legacy:
+    path:       /showwarning.php
+    defaults:   { _controller: 'SimpleSAML\Module\preprodwarning\Controller\PreProdWarning::main' }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/tests/lib/Controller/PreProdWarningTest.php b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/tests/lib/Controller/PreProdWarningTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c56061a359de84857399bb63d7d7d284014c7537
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/tests/lib/Controller/PreProdWarningTest.php
@@ -0,0 +1,152 @@
+<?php
+
+namespace SimpleSAML\Test\Module\preprodwarning\Controller;
+
+use PHPUnit\Framework\TestCase;
+use SimpleSAML\Auth\State;
+use SimpleSAML\Auth\ProcessingChain;
+use SimpleSAML\Configuration;
+use SimpleSAML\Error;
+use SimpleSAML\HTTP\RunnableResponse;
+use SimpleSAML\Logger;
+use SimpleSAML\Module;
+use SimpleSAML\Module\preprodwarning\Controller;
+use SimpleSAML\Session;
+use SimpleSAML\XHTML\Template;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Set of tests for the controllers in the "preprodwarning" module.
+ *
+ * @package SimpleSAML\Test
+ */
+class PreProdWarningTest extends TestCase
+{
+    /** @var \SimpleSAML\Configuration */
+    protected $config;
+
+    /** @var \SimpleSAML\Logger */
+    protected $logger;
+
+    /** @var \SimpleSAML\Session */
+    protected $session;
+
+    /**
+     * Set up for each test.
+     * @return void
+     */
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $this->config = Configuration::loadFromArray(
+            [
+                'module.enable' => ['preprodwarning' => true],
+            ],
+            '[ARRAY]',
+            'simplesaml'
+        );
+
+        $this->session = Session::getSessionFromRequest();
+
+        Configuration::setPreLoadedConfig($this->config, 'config.php');
+
+        $this->logger = new class () extends Logger {
+            public static function info($str)
+            {
+                // do nothing
+            }
+        };
+    }
+
+
+    /**
+     * Test that a valid requests results in a Twig template
+     * @return void
+     */
+    public function testMissingStateIdThrowsException()
+    {
+        $request = Request::create(
+            '/warning',
+            'GET'
+        );
+
+        $c = new Controller\PreProdWarning($this->config, $this->session);
+        $c->setLogger($this->logger);
+
+        $this->expectException(Error\BadRequest::class);
+        $this->expectExceptionMessage('Missing required StateId query parameter.');
+
+        $c->main($request);
+    }
+
+
+    /**
+     * Test that a valid requests results in a Twig template
+     * @return void
+     */
+    public function testWarning()
+    {
+        $request = Request::create(
+            '/warning',
+            'GET',
+            ['StateId' => 'someStateId']
+        );
+
+        $c = new Controller\PreProdWarning($this->config, $this->session);
+        $c->setLogger($this->logger);
+        $c->setAuthState(new class () extends State {
+            public static function loadState($id, $stage, $allowMissing = false)
+            {
+                return [];
+            }
+        });
+
+        $response = $c->main($request);
+
+        // Validate response
+        $this->assertInstanceOf(Template::class, $response);
+        $this->assertTrue($response->isSuccessful());
+    }
+
+
+    /**
+     * @return void
+     */
+    public function testWarningAccepted()
+    {
+        $request = Request::create(
+            '/warning',
+            'POST',
+            ['StateId' => 'someStateId', 'yes' => 'yes']
+        );
+
+        $c = new Controller\PreProdWarning($this->config, $this->session);
+        $c->setLogger($this->logger);
+        $c->setAuthState(new class () extends State {
+            public static function loadState($id, $stage, $allowMissing = false)
+            {
+                return [
+                    ProcessingChain::FILTERS_INDEX => [],
+                    'ReturnURL' => 'https://example.org'
+                ];
+            }
+        });
+        $c->setProcessingChain(new class () extends ProcessingChain {
+            public function __construct()
+            {
+                // stub
+            }
+
+            public static function resumeProcessing($state): void
+            {
+            }
+        });
+
+        $response = $c->main($request);
+
+        // Validate response
+        $this->assertInstanceOf(RunnableResponse::class, $response);
+        $this->assertTrue($response->isSuccessful());
+    }
+}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/www/showwarning.php b/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/www/showwarning.php
deleted file mode 100644
index 394617d35cab6a1df9f58f5fda76b366b744cc68..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/preprodwarning/www/showwarning.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/**
- * This script displays a page to the user, which requests that the user
- * authorizes the release of attributes.
- *
- * @package SimpleSAMLphp
- */
-
-\SimpleSAML\Logger::info('PreProdWarning - Showing warning to user');
-
-if (!array_key_exists('StateId', $_REQUEST)) {
-    throw new \SimpleSAML\Error\BadRequest('Missing required StateId query parameter.');
-}
-$id = $_REQUEST['StateId'];
-$state = \SimpleSAML\Auth\State::loadState($id, 'warning:request');
-
-if (array_key_exists('yes', $_REQUEST)) {
-    // The user has pressed the yes-button
-    \SimpleSAML\Auth\ProcessingChain::resumeProcessing($state);
-}
-
-$globalConfig = \SimpleSAML\Configuration::getInstance();
-
-$t = new \SimpleSAML\XHTML\Template($globalConfig, 'preprodwarning:warning.php');
-$t->data['yesTarget'] = \SimpleSAML\Module::getModuleURL('preprodwarning/showwarning.php');
-$t->data['yesData'] = ['StateId' => $id];
-$t->show();
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/radius/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/radius/.codecov.yml
deleted file mode 100644
index f7f39e1e93d0ca23383d5ed120442f62f5f15ac9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/radius/.codecov.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-coverage:
-  status:
-    project: yes
-
-comment:
-  layout: "diff"
-  behavior: once
-  require_changes: true
-  require_base: no
-  require_head: yes
-  branches: null
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/radius/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/radius/LICENSE
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..a345e48d049f9c6756e9364e908b3f26e36c9df1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/radius/LICENSE
+++ b/vendor/simplesamlphp/simplesamlphp/modules/radius/LICENSE
@@ -1,165 +1,459 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
 
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
 Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cas/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/radius/codecov.yml
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/cas/.codecov.yml
rename to vendor/simplesamlphp/simplesamlphp/modules/radius/codecov.yml
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/radius/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/radius/composer.json
index f3da12a435fd8889eb1915e78942bba82a890a4d..8f3ab456261d872bee36ca4d48aa6f1041fcd326 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/radius/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/radius/composer.json
@@ -3,7 +3,7 @@
     "description": "A module that is able perform authentication against a RADIUS server",
     "type": "simplesamlphp-module",
     "keywords": ["simplesamlphp", "radius"],
-    "license": "LGPL-3.0-or-later",
+    "license": "LGPL-2.1-or-later",
     "authors": [
         {
             "name": "Olav Morken",
@@ -14,6 +14,9 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true
         }
     },
     "autoload": {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/radius/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/radius/psalm.xml
index b533aeaa54bb5409535560afea4170aeb4eb8f32..61e24f0673597521c11207b8ffda181b5ab79a57 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/radius/psalm.xml
+++ b/vendor/simplesamlphp/simplesamlphp/modules/radius/psalm.xml
@@ -26,6 +26,13 @@
         <MissingParamType errorLevel="info" />
         <UnusedClass errorLevel="info" />
         <PossiblyUnusedMethod errorLevel="info" />
+
+        <!-- Ignore UnresolvableInclude on CLI-scripts -->
+        <UnresolvableInclude>
+            <errorLevel type="suppress">
+                <file name="tests/bootstrap.php" />
+            </errorLevel>
+        </UnresolvableInclude>
     </issueHandlers>
 
     <stubs>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/riak/.codecov.yml
deleted file mode 100644
index f7f39e1e93d0ca23383d5ed120442f62f5f15ac9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/.codecov.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-coverage:
-  status:
-    project: yes
-
-comment:
-  layout: "diff"
-  behavior: once
-  require_changes: true
-  require_base: no
-  require_head: yes
-  branches: null
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/.php_cs.dist b/vendor/simplesamlphp/simplesamlphp/modules/riak/.php_cs.dist
deleted file mode 100644
index 88f0c20358084b7082cfa925993ee61f7d810af0..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/.php_cs.dist
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-$finder = PhpCsFixer\Finder::create()
-    ->in([
-        __DIR__ . '/lib',
-        __DIR__ . '/hooks',
-        __DIR__ . '/tests',
-        __DIR__ . '/config-templates',
-    ])
-;
-return PhpCsFixer\Config::create()
-    ->setRules([
-        '@PSR2' => true,
-        '@PSR4' => true,
-        '@PSR5' => true,
-    ])
-    ->setFinder($finder)
-;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/riak/.travis.yml
deleted file mode 100644
index fec43ab41a5a3b2129c6a4b00802c56325717fe9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/.travis.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-sudo: required
-
-language: php
-
-php:
-  - 5.6
-  - 7.0
-  - 7.1
-  - 7.2
-  - 7.3
-
-env:
-  - SIMPLESAMLPHP_VERSION=1.17.*
-
-before_script:
-  - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
-  - composer update --no-interaction
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then composer require --dev vimeo/psalm:1.1.9; fi
-
-script:
-  - bin/check-syntax.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
-
-after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/riak/LICENSE
deleted file mode 100644
index f288702d2fa16d3cdf0035b15a9fcbc552cd88e7..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<https://www.gnu.org/licenses/>.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/README.md b/vendor/simplesamlphp/simplesamlphp/modules/riak/README.md
deleted file mode 100644
index 08083ca31a2eab5330c6f772fa5b9aadd5555c40..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# simplesamlphp-module-riak
-This module implements the Riak session store
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/bin/check-syntax.sh b/vendor/simplesamlphp/simplesamlphp/modules/riak/bin/check-syntax.sh
deleted file mode 100755
index 6938306b365213de303e7b9cab6cedcad45c8021..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/bin/check-syntax.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-PHP='/usr/bin/env php'
-RETURN=0
-
-# check PHP files
-for FILE in `find config-templates hooks lib tests -name "*.php"`; do
-    $PHP -l $FILE > /dev/null 2>&1
-    if [ $? -ne 0 ]; then
-        echo "Syntax check failed for ${FILE}"
-        RETURN=`expr ${RETURN} + 1`
-    fi
-done
-
-exit $RETURN
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/riak/composer.json
deleted file mode 100644
index 10fc58404c345a80f4a49f68dcf746e1811a3db9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/composer.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-    "name": "simplesamlphp/simplesamlphp-module-riak",
-    "description": "A module that is able to store key/value pairs in a Riak store",
-    "type": "simplesamlphp-module",
-    "keywords": ["simplesamlphp", "riak"],
-    "license": "LGPL-3.0-or-later",
-    "authors": [
-        {
-            "name": "Tim van Dijen",
-            "email": "tvdijen@gmail.com"
-        }
-    ],
-    "config": {
-        "preferred-install": {
-            "simplesamlphp/simplesamlphp": "source",
-            "*": "dist"
-        }
-    },
-    "autoload": {
-        "psr-4": {
-            "SimpleSAML\\Module\\riak\\": "lib/"
-        }
-    },
-    "autoload-dev": {
-        "psr-4": {
-            "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils"
-        }
-    },
-    "require": {
-        "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1",
-        "phpfastcache/riak-client": "^3.4"
-    },
-    "require-dev": {
-        "simplesamlphp/simplesamlphp": "^1.17",
-        "phpunit/phpunit": "~5.7"
-    },
-    "support": {
-        "issues": "https://github.com/tvdijen/simplesamlphp-module-riak/issues",
-        "source": "https://github.com/tvdijen/simplesamlphp-module-riak"
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/config-templates/module_riak.php b/vendor/simplesamlphp/simplesamlphp/modules/riak/config-templates/module_riak.php
deleted file mode 100644
index 355711794fa593b0dbcb48bd8c2ce2e491487f44..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/config-templates/module_riak.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-/**
- * The configuration of the riak Store module
- *
- */
-
-$config = [
-    'host' => 'localhost',
-    'port' => 8098,
-
-    // The name of the store
-    'bucket' => 'SimpleSAMLphp',
-];
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/default-disable b/vendor/simplesamlphp/simplesamlphp/modules/riak/default-disable
deleted file mode 100644
index fa0bd82e2df7bd79d57593d35bc53c1f9d3ef71f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/default-disable
+++ /dev/null
@@ -1,3 +0,0 @@
-This file indicates that the default state of this module
-is disabled. To enable, create a file named enable in the
-same directory as this file.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/docs/simplesamlphp-riak.md b/vendor/simplesamlphp/simplesamlphp/modules/riak/docs/simplesamlphp-riak.md
deleted file mode 100644
index 1598d8a4e47141397d0129f9993536b84cb8be55..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/docs/simplesamlphp-riak.md
+++ /dev/null
@@ -1,113 +0,0 @@
-Riak Store module
-=================
-
-<!--
-	This file is written in Markdown syntax.
-	For more information about how to use the Markdown syntax, read here:
-	http://daringfireball.net/projects/markdown/syntax
--->
-
-
-<!-- {{TOC}} -->
-
-Introduction
-------------
-
-The riak module implements a Store that can be used as a backend
-for SimpleSAMLphp session data like the phpsession, sql, or memcache
-backends.
-
-Preparations
-------------
-
-The obvious first step for using Riak as a backend is to install
-and configure a Riak cluster for SimpleSAMLphp to use. Please refer
-to the Riak documentation for this.
-
-This module requires the use of a Riak backend that supports secondary
-indexes. Refer to the Riak documentation on how to enable an
-appropriate backend for use by this module. Currently the only
-storage backend that supports secondary indexes is leveldb.
-
-Finally, you need to config SimpleSAMLphp to use the riak Store by
-enabling the following modules:
-
- 1. cron
- 2. riak
-
-The cron module allows you to do tasks regularly by setting up a
-cronjob that calls hooks in SimpleSAMLphp. This is required by the
-riak module to remove expired entries in the store.
-
-Enabling the riak module allows it to be loaded and used as a storage
-backend.
-
-You also need to copy the `config-templates` files from the cron
-module above into the global `config/` directory.
-
-	$ cd /var/simplesamlphp
-	$ touch modules/cron/enable
-	$ cp modules/cron/config-templates/*.php config/
-	$ touch modules/riak/enable
-	$ cp modules/riak/config-templates/*.php config/
-
-
-Configuring the cron module
----------------------------
-
-At `/var/simplesamlphp/config`
-
-	$ vi module_cron.php
-
-edit:
-
-	$config = array (
-		'key' => 'secret',
-		'allowed_tags' => array('daily', 'hourly', 'frequent'),
-		'debug_message' => TRUE,
-		'sendemail' => TRUE,
-	);
-
-Then: With your browser go to => https://simplesamlphp_machine/simplesaml/module.php/cron/croninfo.php
-
-And copy the cron's sugestion:
-
-	-------------------------------------------------------------------------------------------------------------------
-	Cron is a way to run things regularly on unix systems.
-
-	Here is a suggestion for a crontab file:
-
-	# Run cron [daily]
-	02 0 * * * curl --silent "https://simplesamlphp_machine/simplesaml/module.php/cron/cron.php?key=secret&tag=daily" > /dev/null 2>&1
-	# Run cron [hourly]
-	01 * * * * curl --silent "https://simplesamlphp_machine/simplesaml/module.php/cron/cron.php?key=secret&tag=hourly" > /dev/null 2>&1
-	# Run cron [frequent]
-	XXXXXXXXXX curl --silent "https://simplesamlphp_machine/simplesaml/module.php/cron/cron.php?key=secret&tag=frequent" > /dev/null 2>&1
-		Click here to run the cron jobs:
-
-	Run cron [daily]
-	Run cron [hourly]
-	Run cron [frequent]
-	-------------------------------------------------------------------------------------------------------------------
-
-Add to CRON with
-
-	# crontab -e
-
-Configuring the riak module
----------------------------
-
-The riak module uses the following configuration options specified
-in `config/module_riak.php`. The defaults are listed:
-
-	$config = [
-		'host' => 'localhost',
-		'port' => 8098,
-		'bucket' => 'SimpleSAMLphp',
-	];
-
-Finally, the module can be specified as the Store in `config/config.php`
-with the following setting:
-
-		'store.type' => 'riak:Riak',
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/hooks/hook_cron.php b/vendor/simplesamlphp/simplesamlphp/modules/riak/hooks/hook_cron.php
deleted file mode 100644
index 63d7099808d0975ee5a8109cbbf0fa31a279987e..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/hooks/hook_cron.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-/*
- * Copyright (c) 2012 The University of Queensland
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * Written by David Gwynne <dlg@uq.edu.au> as part of the IT
- * Infrastructure Group in the Faculty of Engineering, Architecture
- * and Information Technology.
- */
-
-/**
- * Hook to run a cron job.
- *
- * @param array &$croninfo  Output
- * @return void
- */
-function riak_hook_cron(&$croninfo)
-{
-    assert(is_array($croninfo));
-    assert(array_key_exists('summary', $croninfo));
-    assert(array_key_exists('tag', $croninfo));
-
-    if ($croninfo['tag'] !== 'hourly') {
-        return;
-    }
-
-    try {
-        $store = new \SimpleSAML\Module\riak\Store\Riak();
-        $result = $store->getExpired();
-
-        if ($result === null) {
-            $result = [];
-        } else {
-            foreach ($result as $key) {
-                $store->delete('session', $key);
-            }
-        }
-
-        \SimpleSAML\Logger::info(
-            sprintf("deleted %s riak key%s", sizeof($result), sizeof($result) == 1 ? '' : 's')
-        );
-    } catch (\Exception $e) {
-        $message = 'riak threw exception: ' . $e->getMessage();
-        \SimpleSAML\Logger::warning($message);
-        $croninfo['summary'][] = $message;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/lib/Store/Riak.php b/vendor/simplesamlphp/simplesamlphp/modules/riak/lib/Store/Riak.php
deleted file mode 100644
index 94aa1c63fcec8765fcb0b6674ab9c8aaf9c1d060..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/lib/Store/Riak.php
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php
-
-/*
- * Copyright (c) 2012 The University of Queensland
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Written by David Gwynne <dlg@uq.edu.au> as part of the IT
- * Infrastructure Group in the Faculty of Engineering, Architecture
- * and Information Technology.
- *
- * @package SimpleSAMLphp
- * Rewriten by Tim van Dijen for SimpleSAMLphp
- */
-
-namespace SimpleSAML\Module\riak\Store;
-
-use Basho\Riak\Bucket;
-use Basho\Riak\Command\Builder\DeleteObject;
-use Basho\Riak\Command\Builder\FetchObject;
-use Basho\Riak\Command\Builder\StoreObject;
-use Basho\Riak\Command\Builder\QueryIndex;
-use Basho\Riak\Location;
-use Basho\Riak\Node;
-use Basho\Riak\DataObject;
-use Basho\Riak as RiakClient;
-use SimpleSAML\Configuration;
-use SimpleSAML\Error\CriticalConfigurationError;
-use Webmozart\Assert\Assert;
-
-class Riak extends \SimpleSAML\Store
-{
-    /** @var \Basho\Riak */
-    protected $client;
-
-    /** @var string */
-    protected $bucket_name;
-
-    /** @var \Basho\Riak\Bucket */
-    protected $bucket;
-
-    /** @var \Basho\Riak\Location|null */
-    protected $location = null;
-
-
-    public function __construct()
-    {
-        $config = Configuration::getConfig('module_riak.php');
-
-        $host = $config->getString('host', 'localhost');
-        $port = $config->getInteger('port', 8098);
-
-        $node = (new Node\Builder())
-            ->atHost($host)
-            ->onPort($port)
-            ->build();
-
-        $this->client = new RiakClient([$node]);
-        $this->bucket_name = $config->getString('bucket', 'simpleSAMLphp');
-
-        $this->bucket = new Bucket($this->bucket_name);
-    }
-
-
-    /**
-     * Retrieve a value from the datastore.
-     *
-     * @param string $type The datatype.
-     * @param string $key The key.
-     * @return mixed|null The value.
-     */
-    public function get($type, $key)
-    {
-        assert(is_string($type));
-        assert(is_string($key));
-
-        $key = 'key_' . $key;
-        $this->location = new Location($key, $this->bucket);
-
-        $response = (new FetchObject($this->client))
-            ->atLocation($this->location)
-            ->build()
-            ->execute();
-
-        if ($response->getObject() === null) {
-            return null;
-        }
-
-        $data = $response->getObject()->getData();
-        $data_decoded = unserialize(json_decode($data, true));
-
-        return $data_decoded[$key];
-    }
-
-
-    /**
-     * Save a value to the datastore.
-     *
-     * @param string $type The datatype.
-     * @param string $key The key.
-     * @param mixed $value The value.
-     * @param int|null $expire The expiration time (unix timestamp), or NULL if it never expires.
-     * @return void
-     */
-    public function set($type, $key, $value, $expire = null)
-    {
-        assert(is_string($type));
-        assert(is_string($key));
-        assert(is_null($expire) || is_int($expire));
-        assert($expire > 2592000);
-
-        $key = 'key_' . $key;
-        $this->location = new Location($key, $this->bucket);
-
-        $data = serialize([$key => $value]);
-        if (is_null($expire)) {
-            $object = new DataObject(json_encode($data), ['Content-type' => 'application/json']);
-        } else {
-            $object = (new DataObject(json_encode($data), ['Content-type' => 'application/json']))
-              ->addValueToIndex('expire_int', time() + $expire);
-        }
-
-        $storecmd = (new StoreObject($this->client))
-            ->withObject($object)
-            ->atLocation($this->location)
-            ->build();
-        $storecmd->execute();
-    }
-
-
-    /**
-     * @return array|null
-     */
-    public function getExpired()
-    {
-        $results = (new QueryIndex($this->client))
-          ->inBucket($this->bucket)
-          ->withIndexName('expire_int')
-          ->withRangeValue(0, time())
-          ->build()
-          ->execute()
-          ->getResults();
-
-        return $results;
-    }
-
-
-    /**
-     * Delete a value from the datastore.
-     *
-     * @param string $type The datatype.
-     * @param string $key The key.
-     * @return void
-     */
-    public function delete($type, $key)
-    {
-        assert(is_string($type));
-        assert(is_string($key));
-
-        $key = 'key_' . $key;
-        $this->location = new Location($key, $this->bucket);
-
-        (new DeleteObject($this->client))->atLocation($this->location)->build()->execute();
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/riak/phpunit.xml
deleted file mode 100644
index c0985fdd804b18d8d9179ecd956d63582c189e95..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/phpunit.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="tests/bootstrap.php">
-    <testsuites>
-        <testsuite name="The project's test suite">
-            <directory>tests/</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./lib</directory>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" />
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
-        <log type="coverage-clover" target="build/logs/clover.xml" />
-    </logging>
-</phpunit>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/riak/psalm.xml
deleted file mode 100644
index 84f09c7494aebfdc7b331406fe0fab93bac1f06e..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/psalm.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    name="SimpleSAMLphp Riak"
-    useDocblockTypes="true"
-    totallyTyped="false"
->
-    <projectFiles>
-        <directory name="config-templates" />
-        <directory name="lib" />
-        <directory name="hooks" />
-    </projectFiles>
-
-    <issueHandlers>
-        <LessSpecificReturnType errorLevel="info" />
-
-        <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives -->
-        <DeprecatedMethod errorLevel="info" />
-
-        <MissingClosureReturnType errorLevel="info" />
-        <MissingReturnType errorLevel="info" />
-        <MissingPropertyType errorLevel="info" />
-        <InvalidDocblock errorLevel="info" />
-        <MisplacedRequiredParam errorLevel="info" />
-
-        <PropertyNotSetInConstructor errorLevel="info" />
-        <MissingConstructor errorLevel="info" />
-        <MissingClosureParamType errorLevel="info" />
-        <MissingParamType errorLevel="info" />
-        <UnusedClass errorLevel="info" />
-        <PossiblyUnusedMethod errorLevel="info" />
-    </issueHandlers>
-</psalm>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/riak/tests/bootstrap.php b/vendor/simplesamlphp/simplesamlphp/modules/riak/tests/bootstrap.php
deleted file mode 100644
index 2e7ccd2f95ed133a57511d8289e2130326aa889b..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/riak/tests/bootstrap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-$projectRoot = dirname(__DIR__);
-require_once($projectRoot . '/vendor/autoload.php');
-
-// Symlink module into ssp vendor lib so that templates and urls can resolve correctly
-$linkPath = $projectRoot . '/vendor/simplesamlphp/simplesamlphp/modules/riak';
-if (file_exists($linkPath) === false) {
-    echo "Linking '$linkPath' to '$projectRoot'\n";
-    symlink($projectRoot, $linkPath);
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/dictionaries/proxy.translation.json b/vendor/simplesamlphp/simplesamlphp/modules/saml/dictionaries/proxy.translation.json
index 040f7ee3b205b33b36f0d11cf738a08c948d24f8..f5ea600541b89a47fa8a5d06596285a625cbaf5f 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/dictionaries/proxy.translation.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/dictionaries/proxy.translation.json
@@ -1,16 +1,18 @@
 {
   "invalid_idp": {
-    "zh-tw": "\u7121\u6548\u7684\u9a57\u8b49\u63d0\u4f9b\u8005",
-    "es": "Proveedor de Identidad inválido",
-    "zu": "Umhlinzeki Kamazisi Ongalungile",
-    "xh": "Isiboneleli Sesazisi Esingasebenziyo",
-    "ca": "Proveïdor d’identitat no vàlid"
+	"zh-tw": "\u7121\u6548\u7684\u9a57\u8b49\u63d0\u4f9b\u8005",
+	"es": "Proveedor de Identidad inválido",
+	"zu": "Umhlinzeki Kamazisi Ongalungile",
+	"xh": "Isiboneleli Sesazisi Esingasebenziyo",
+	"st": "Mofani wa Boitsebiso ha Nepahala",
+	"ca": "Proveïdor d’identitat no vàlid"
   },
   "invalid_idp_description": {
-    "zh-tw": "\u60a8\u5df2\u7d93\u64c1\u6709\u4e00\u500b\u9a57\u8b49\u63d0\u4f9b\u8005 (<em>%IDP%</em>) \u7684\u6709\u6548\u7684\u9023\u7dda\uff0c\u4f46\u8a72\u9023\u7dda\u7121\u6cd5\u88ab <em>%SP%</em> \u6240\u63a5\u53d7\u3002\u60a8\u662f\u5426\u60f3\u8981\u767b\u51fa\u65e2\u6709\u7684\u9023\u7dda\u4e26\u91cd\u65b0\u7531\u5176\u4ed6\u9a57\u8b49\u63d0\u4f9b\u8005\u9032\u884c\u767b\u5165\uff1f",
-    "es": "Ya existe una sesión válida con un proveedor de identidad (<em>%IDP%</em>) que <em>%SP%</em> no acepta. ¿Desea cerrar su sesión actual e iniciar una nueva con otro proveedor de identidad?",
-    "zu": "Kakade uneseshini evumelekile nomhlinzeki kamazisi (<em>%IDP%</em>) engamukelwa okuthi <em>%SP%</em>. Ungathanda ukuphuma kuseshini yakho ekhona kakade futhi uphinde ungene ngomunye umhlinzeki kamazisi?",
-    "xh": "Sele unayo iseshoni esebenzayo nomboneleli wesazisi (<em>%IDP%</em>) engamkelwanga yi-<em>%SP%</em>. Ingaba ungathanda ukuphuma kwiseshoni yakho esele ikho uze ungene kwakhona ngomnye umboneleli wesazisi?",
-    "ca": "Ja teniu una sessió vàlida amb un proveïdor d’identitats (<em>%IDP%</em>) que no es acceptada per <em>%SP%</em>. Voleu sortir de la sessió existent i tornar a iniciar sessió amb un altre proveïdor d’identitat?"
+	"zh-tw": "\u60a8\u5df2\u7d93\u64c1\u6709\u4e00\u500b\u9a57\u8b49\u63d0\u4f9b\u8005 (<em>%IDP%</em>) \u7684\u6709\u6548\u7684\u9023\u7dda\uff0c\u4f46\u8a72\u9023\u7dda\u7121\u6cd5\u88ab <em>%SP%</em> \u6240\u63a5\u53d7\u3002\u60a8\u662f\u5426\u60f3\u8981\u767b\u51fa\u65e2\u6709\u7684\u9023\u7dda\u4e26\u91cd\u65b0\u7531\u5176\u4ed6\u9a57\u8b49\u63d0\u4f9b\u8005\u9032\u884c\u767b\u5165\uff1f",
+	"es": "Ya existe una sesión válida con un proveedor de identidad (<em>%IDP%</em>) que <em>%SP%</em> no acepta. ¿Desea cerrar su sesión actual e iniciar una nueva con otro proveedor de identidad?",
+	"zu": "Kakade uneseshini evumelekile nomhlinzeki kamazisi (<em>%IDP%</em>) engamukelwa okuthi <em>%SP%</em>. Ungathanda ukuphuma kuseshini yakho ekhona kakade futhi uphinde ungene ngomunye umhlinzeki kamazisi?",
+	"xh": "Sele unayo iseshoni esebenzayo nomboneleli wesazisi (<em>%IDP%</em>) engamkelwanga yi-<em>%SP%</em>. Ingaba ungathanda ukuphuma kwiseshoni yakho esele ikho uze ungene kwakhona ngomnye umboneleli wesazisi?",
+	"st": "O se ntse o na le seshene e sebetsang ho mofani wa boitsebiso (<em>%IDP%</em>) ya sa amohelweng ke<em>%SP%</em>. Na o ka lakatsa ho tswa sesheneng ya hao e teng mme o kene ka mofani wa boitsebiso e mong?",
+	"ca": "Ja teniu una sessió vàlida amb un proveïdor d’identitats (<em>%IDP%</em>) que no es acceptada per <em>%SP%</em>. Voleu sortir de la sessió existent i tornar a iniciar sessió amb un altre proveïdor d’identitat?"
   }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/filterscopes.md b/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/filterscopes.md
index e930244d82c13ad339fdbd5663eb1a13c8bbb626..3f17db73897fca519d8311b961bc02746b635294 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/filterscopes.md
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/filterscopes.md
@@ -41,7 +41,7 @@ Basic configuration:
         90 => [
             'class' => 'saml:FilterScopes',
         ],
-    [,
+    ],
 ```
 
 Specify `mail` and `eduPersonPrincipalName` as scoped attributes:
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/keyrollover.md b/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/keyrollover.md
index 0fd99fc82dc7520674812acc8e041e43c4637a8c..e72e25896c5338649194b0b1ada3fd601daa5150 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/keyrollover.md
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/keyrollover.md
@@ -22,7 +22,7 @@ If you are doing key rollover for a service provider, the new key must be added
 To do key rollover for an identity provider, you must add the new key to `metadata/saml20-idp-hosted.php` and/or `metadata/shib13-idp-hosted.php`.
 If you are changing the keys for both an service provider and identity provider at the same time, you must update both locations.
 
-The new certificate and key is added to the configuration with the prefix `new_`:
+The new certificate, private key and private key passphrase are added to the configuration with the prefix `new_`:
 
 When the new key is added, SimpleSAMLphp will attempt to use both the new key and the old key for decryption of messages, but only the old key will be used for signing messages.
 The metadata will be updated to list the new key for signing and encryption, and the old key will no longer listed as available for encryption.
@@ -37,8 +37,13 @@ In `config/authsources.php`:
         'saml:SP',
         'privatekey' => 'old.pem',
         'certificate' => 'old.crt',
+        // When private key is passphrase protected.
+        'privatekey_pass' => '<old-secret>',
+
         'new_privatekey' => 'new.pem',
         'new_certificate' => 'new.crt',
+        // When new private key is passphrase protected.
+        'new_privatekey_pass' => '<new-secret>',
     ),
 
 In `metadata/saml20-idp-hosted.php`:
@@ -48,8 +53,13 @@ In `metadata/saml20-idp-hosted.php`:
         'auth' => 'example-userpass',
         'privatekey' => 'old.pem',
         'certificate' => 'old.crt',
+        // When private key is passphrase protected.
+        'privatekey_pass' => '<old-secret>',
+
         'new_privatekey' => 'new.pem',
         'new_certificate' => 'new.crt',
+        // When new private key is passphrase protected.
+        'new_privatekey_pass' => '<new-secret>',
     );
 
 
@@ -69,7 +79,7 @@ Remove the old key
 ------------------
 
 Once you are certain that all your peers are using the new metadata, you must remove the old key.
-Replace the existing `privatekey` and `certificate` options in your configuration with the `new_privatekey` and `new_certificate` options.
+Replace the existing `privatekey`, `privatekey_pass` and `certificate` options in your configuration with the `new_privatekey`, `new_privatekey_pass` and `new_certificate` options.
 This will cause your old key to be removed from your metadata.
 
 ### Examples
@@ -78,8 +88,10 @@ In `config/authsources.php`:
 
     'default-sp' => array(
         'saml:SP',
-        'privatekey' => 'new.pem',
         'certificate' => 'new.crt',
+        'privatekey' => 'new.pem',
+        // When private key is passphrase protected.
+        'privatekey_pass' => '<new-secret>',
     ),
 
 In `metadata/saml20-idp-hosted.php`:
@@ -87,8 +99,10 @@ In `metadata/saml20-idp-hosted.php`:
     $metadata['__DYNAMIC:1__'] = array(
         'host' => '__DEFAULT__',
         'auth' => 'example-userpass',
-        'privatekey' => 'new.pem',
         'certificate' => 'new.crt',
+        'privatekey' => 'new.pem',
+        // When private key is passphrase protected.
+        'privatekey_pass' => '<new-secret>',
     );
 
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/sp.md b/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/sp.md
index 45da3fb1afd5b382ab3dda1fb015c18cabf3cf09..2d6fd129aa5e57ae03f487759ae70e2740dda545 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/sp.md
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/docs/sp.md
@@ -94,7 +94,7 @@ The following attributes are available:
 
 `saml:sp:NameID`
 :   The NameID the user was issued by the IdP.
-    This is an associative array with the various fields from the NameID.
+    This is a \SAML2\XML\saml\NameID object with the various fields from the NameID.
 
 `saml:sp:SessionIndex`
 :   The SessionIndex we received from the IdP.
@@ -124,7 +124,12 @@ Options
 `AssertionConsumerService`
 :   List of Assertion Consumer Services in the generated metadata. Specified in the array of
     arrays format as seen in the [Metadata endpoints](./simplesamlphp-metadata-endpoints)
-    documentation.
+    documentation. Note: you must ensure that you set the `acs.Bindings` option to the set
+    of bindings that you use here if it is different from the default.
+
+`AssertionConsumerServiceIndex`
+:   The Assertion Consumer Service Index to be used in the AuthnRequest in place of the Assertion
+    Service Consumer URL.
 
 `attributes`
 :   List of attributes this SP requests from the IdP.
@@ -326,6 +331,11 @@ Options
 
 :   *Note*: SAML 2 specific.
 
+`ProviderName`
+:   Human readable name of the local SP sent with the authentication request.
+
+:   *Note*: SAML 2 specific.
+
 `ProtocolBinding`
 :   The binding that should be used for SAML2 authentication responses.
     This option controls the binding that is requested through the AuthnRequest message to the IdP.
@@ -409,12 +419,12 @@ Options
     * `http://www.w3.org/2001/04/xmldsig-more#rsa-sha512`
 
 `SingleLogoutServiceBinding`
-:	List of SingleLogoutService bindings the IdP will claim support for.
+:	List of SingleLogoutService bindings the SP will claim support for (can be empty).
 :	Possible values:
 
     * `urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect`
     * `urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST`
-	* `urn:oasis:names:tc:SAML:2.0:bindings:SOAP`
+    * `urn:oasis:names:tc:SAML:2.0:bindings:SOAP`
 
 `SingleLogoutServiceLocation`
 :   The Single Logout Service URL published in the generated metadata.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/AttributeNameID.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/AttributeNameID.php
index d0b4393bf0ddf844ac1a94053a681bcdbace68d2..51e7d8739817639983396ca776c3d667aa11188e 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/AttributeNameID.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/AttributeNameID.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\Auth\Process;
 
 use SimpleSAML\Error;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/AuthnContextClassRef.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/AuthnContextClassRef.php
index b2e6eb35880575b3d492bc9c79ce6fcdad94f277..407e08de35fa1f60d18436a809cecf2e2dd71024 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/AuthnContextClassRef.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/AuthnContextClassRef.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\Auth\Process;
 
 use SimpleSAML\Error;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/ExpectedAuthnContextClassRef.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/ExpectedAuthnContextClassRef.php
index 7e6259c5892f769af03dd689a01371fe281b0eb1..7b0fd991cc296df664feb7bb171ca9f93d8a44f1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/ExpectedAuthnContextClassRef.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/ExpectedAuthnContextClassRef.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\Auth\Process;
 
 use SimpleSAML\Auth;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/FilterScopes.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/FilterScopes.php
index fd4089b925fba011e24b3de0010848d2b2129ba5..8965e843732e51b0da9038ca5f0bf1bced2240cd 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/FilterScopes.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/FilterScopes.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\Auth\Process;
 
 use SimpleSAML\Logger;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/NameIDAttribute.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/NameIDAttribute.php
index f8fd748b78028b314126de3baa6f566a486a45c0..acebdf17f425ab399c190fdb3880f88181a40fb6 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/NameIDAttribute.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/NameIDAttribute.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\Auth\Process;
 
 use SAML2\Constants;
@@ -64,10 +66,8 @@ public function __construct($config, $reserved)
      *
      * @throws \SimpleSAML\Error\Exception if the replacement is invalid.
      */
-    private static function parseFormat($format)
+    private static function parseFormat(string $format): array
     {
-        assert(is_string($format));
-
         $ret = [];
         $pos = 0;
         while (($next = strpos($format, '%', $pos)) !== false) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/PersistentNameID.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/PersistentNameID.php
index a98a0212ace8789fbe4146716e0bcf9a79132fa7..f5c568e9aee55c2d484b62a93a5670c478d4aedd 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/PersistentNameID.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/PersistentNameID.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\Auth\Process;
 
 use SAML2\Constants;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/PersistentNameID2TargetedID.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/PersistentNameID2TargetedID.php
index 284162462684075bf7a86533b71bd04fa15f2dd4..24399d6596c87a81332a822224ea37c5b1a6e092 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/PersistentNameID2TargetedID.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/PersistentNameID2TargetedID.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\Auth\Process;
 
 use SAML2\Constants;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/SQLPersistentNameID.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/SQLPersistentNameID.php
index b6c0f48cdcbe908a3809572fcee8e4f635739225..c8550368f21fa0a4bc0676b5dec2c0f377413850 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/SQLPersistentNameID.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/SQLPersistentNameID.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\Auth\Process;
 
 use SAML2\Constants;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/TransientNameID.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/TransientNameID.php
index 8b069f491435f8412cb78f5acfb2d4577d18f334..7ab4fec76ae37069590f9e76955cf61c339808bf 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/TransientNameID.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Process/TransientNameID.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\Auth\Process;
 
 use SAML2\Constants;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Source/SP.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Source/SP.php
index 4dd06c044dd70d429a350fce090ac9a29ae77e40..8e47e64e335a7e1046881bdda3bb1b510b42e422 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Source/SP.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Auth/Source/SP.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\Auth\Source;
 
 use SAML2\AuthnRequest;
@@ -58,7 +60,7 @@ class SP extends \SimpleSAML\Auth\Source
     /**
      * A list of supported protocols.
      *
-     * @var array
+     * @var string[]
      */
     private $protocols = [];
 
@@ -138,7 +140,7 @@ public function getHostedMetadata()
         ];
 
         // add NameIDPolicy
-        if ($this->metadata->hasValue('NameIDValue')) {
+        if ($this->metadata->hasValue('NameIDPolicy')) {
             $format = $this->metadata->getValue('NameIDPolicy');
             if (is_array($format)) {
                 $metadata['NameIDFormat'] = Configuration::loadFromArray($format)->getString(
@@ -189,7 +191,7 @@ public function getHostedMetadata()
         }
 
         // add contacts
-        $contacts = $this->metadata->getArray('contact', []);
+        $contacts = $this->metadata->getArray('contacts', []);
         foreach ($contacts as $contact) {
             $metadata['contacts'][] = Utils\Config\Metadata::getContact($contact);
         }
@@ -265,7 +267,7 @@ public function getHostedMetadata()
         }
 
         // add signature options
-        if ($this->metadata->hasValue('WantAssertiosnsSigned')) {
+        if ($this->metadata->hasValue('WantAssertionsSigned')) {
             $metadata['saml20.sign.assertion'] = $this->metadata->getBoolean('WantAssertionsSigned');
         }
         if ($this->metadata->hasValue('redirect.sign')) {
@@ -345,8 +347,13 @@ public function getSupportedProtocols()
      * @return array
      * @throws \Exception
      */
-    private function getACSEndpoints()
+    private function getACSEndpoints(): array
     {
+        // If a list of endpoints is specified in config, take that at face value
+        if ($this->metadata->hasValue('AssertionConsumerService')) {
+            return $this->metadata->getArray('AssertionConsumerService');
+        }
+
         $endpoints = [];
         $default = [
             Constants::BINDING_HTTP_POST,
@@ -427,7 +434,7 @@ private function getACSEndpoints()
      * @return array
      * @throws \SimpleSAML\Error\CriticalConfigurationError
      */
-    private function getSLOEndpoints()
+    private function getSLOEndpoints(): array
     {
         $store = Store::getInstance();
         $bindings = $this->metadata->getArray(
@@ -437,7 +444,8 @@ private function getSLOEndpoints()
                 Constants::BINDING_SOAP,
             ]
         );
-        $location = Module::getModuleURL('saml/sp/saml2-logout.php/' . $this->getAuthId());
+        $defaultLocation = Module::getModuleURL('saml/sp/saml2-logout.php/' . $this->getAuthId());
+        $location = $this->metadata->getString('SingleLogoutServiceLocation', $defaultLocation);
 
         $endpoints = [];
         foreach ($bindings as $binding) {
@@ -462,7 +470,7 @@ private function getSLOEndpoints()
      * @return void
      * @deprecated will be removed in a future version
      */
-    private function startSSO1(Configuration $idpMetadata, array $state)
+    private function startSSO1(Configuration $idpMetadata, array $state): void
     {
         $idpEntityId = $idpMetadata->getString('entityid');
 
@@ -500,7 +508,7 @@ private function startSSO1(Configuration $idpMetadata, array $state)
      * @param array $state  The state array for the current authentication.
      * @return void
      */
-    private function startSSO2(Configuration $idpMetadata, array $state)
+    private function startSSO2(Configuration $idpMetadata, array $state): void
     {
         if (isset($state['saml:ProxyCount']) && $state['saml:ProxyCount'] < 0) {
             Auth\State::throwException(
@@ -646,10 +654,20 @@ private function startSSO2(Configuration $idpMetadata, array $state)
 
         $ar->setRequesterID($requesterID);
 
-        if (isset($state['saml:Extensions'])) {
+        // If the downstream SP has set extensions then use them.
+        // Otherwise use extensions that might be defined in the local SP (only makes sense in a proxy scenario)
+        if (isset($state['saml:Extensions']) && count($state['saml:Extensions']) > 0) {
             $ar->setExtensions($state['saml:Extensions']);
+        } else if ($this->metadata->getArray('saml:Extensions', null) !== null) {
+            $ar->setExtensions($this->metadata->getArray('saml:Extensions'));
         }
 
+        $providerName = $this->metadata->getString("ProviderName", null);
+        if ($providerName !== null) {
+            $ar->setProviderName($providerName);
+        }
+
+
         // save IdP entity ID as part of the state
         $state['ExpectedIssuer'] = $idpMetadata->getString('entityid');
 
@@ -740,7 +758,7 @@ public function startSSO($idp, array $state)
      * @param array $state  The state array.
      * @return void
      */
-    private function startDisco(array $state)
+    private function startDisco(array $state): void
     {
         $id = Auth\State::saveState($state, 'saml:sp:sso');
 
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/BaseNameIDGenerator.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/BaseNameIDGenerator.php
index d199f28f97dd6918b5fbc73dd0995716ebd9ac61..04f4e4e22e5f54d50b981c0981e0cb90158d7438 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/BaseNameIDGenerator.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/BaseNameIDGenerator.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml;
 
 use SAML2\XML\saml\NameID;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error.php
index 50604b39ffbe82300be17666ba8c41792ddf2111..11a2645474e7caa1909642964e053d0cb27ef142 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error.php
@@ -1,8 +1,11 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml;
 
 use SAML2\Constants;
+use Throwable;
 
 /**
  * Class for representing a SAML 2 error.
@@ -42,14 +45,14 @@ class Error extends \SimpleSAML\Error\Exception
      * Can be NULL, in which case there is no second-level status code.
      * @param string|null $statusMessage  The status message.
      * Can be NULL, in which case there is no status message.
-     * @param \Exception|null $cause  The cause of this exception. Can be NULL.
+     * @param \Throwable|null $cause  The cause of this exception. Can be NULL.
      */
-    public function __construct($status, $subStatus = null, $statusMessage = null, \Exception $cause = null)
-    {
-        assert(is_string($status));
-        assert($subStatus === null || is_string($subStatus));
-        assert($statusMessage === null || is_string($statusMessage));
-
+    public function __construct(
+        string $status,
+        string $subStatus = null,
+        string $statusMessage = null,
+        Throwable $cause = null
+    ) {
         $st = self::shortStatus($status);
         if ($subStatus !== null) {
             $st .= '/' . self::shortStatus($subStatus);
@@ -104,10 +107,10 @@ public function getStatusMessage()
      * This function attempts to create a SAML2 error with the appropriate
      * status codes from an arbitrary exception.
      *
-     * @param \Exception $exception  The original exception.
-     * @return \SimpleSAML\Module\saml\Error  The new exception.
+     * @param \Throwable $exception  The original exception.
+     * @return \SimpleSAML\Error\Exception  The new exception.
      */
-    public static function fromException(\Exception $exception)
+    public static function fromException(Throwable $exception): \SimpleSAML\Error\Exception
     {
         if ($exception instanceof \SimpleSAML\Module\saml\Error) {
             // Return the original exception unchanged
@@ -187,10 +190,8 @@ public function toException()
      * @param string $status  The status code.
      * @return string  A shorter version of the status code.
      */
-    private static function shortStatus($status)
+    private static function shortStatus(string $status): string
     {
-        assert(is_string($status));
-
         $t = 'urn:oasis:names:tc:SAML:2.0:status:';
         if (substr($status, 0, strlen($t)) === $t) {
             return substr($status, strlen($t));
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoAuthnContext.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoAuthnContext.php
index c1b47f88cc6939d7ebcf51a2ca857269b0d53040..100951540f2e882511a4c37e4f0568abdd893929 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoAuthnContext.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoAuthnContext.php
@@ -1,16 +1,18 @@
 <?php
 
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\saml\Error;
+
+use SAML2\Constants;
+use Throwable;
+
 /**
  * A SAML error indicating that none of the requested Authentication Contexts can be used.
  *
  * @author Jaime Pérez Crespo, UNINETT AS <jaime.perez@uninett.no>
  * @package SimpleSAMLphp
  */
-
-namespace SimpleSAML\Module\saml\Error;
-
-use SAML2\Constants;
-
 class NoAuthnContext extends \SimpleSAML\Module\saml\Error
 {
     /**
@@ -20,9 +22,9 @@ class NoAuthnContext extends \SimpleSAML\Module\saml\Error
      *   - \SAML2\Constants::STATUS_RESPONDER: in case the error is caused by this SAML responder.
      *   - \SAML2\Constants::STATUS_REQUESTER: in case the error is caused by the SAML requester.
      * @param string|null $message A short message explaining why this error happened.
-     * @param \Exception|null $cause An exception that caused this error.
+     * @param \Throwable|null $cause An exception that caused this error.
      */
-    public function __construct($responsible, $message = null, \Exception $cause = null)
+    public function __construct(string $responsible, string $message = null, Throwable $cause = null)
     {
         parent::__construct($responsible, Constants::STATUS_NO_AUTHN_CONTEXT, $message, $cause);
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoAvailableIDP.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoAvailableIDP.php
index 3f024c0d0ef57a1985aebfdb7c16b6e778dbb2c2..5b6900092dd866e10fd2fcf32dd67852a36c7b14 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoAvailableIDP.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoAvailableIDP.php
@@ -1,16 +1,18 @@
 <?php
 
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\saml\Error;
+
+use SAML2\Constants;
+use Throwable;
+
 /**
  * A SAML error indicating that none of the requested IdPs can be used.
  *
  * @author Jaime Pérez Crespo, UNINETT AS <jaime.perez@uninett.no>
  * @package SimpleSAMLphp
  */
-
-namespace SimpleSAML\Module\saml\Error;
-
-use SAML2\Constants;
-
 class NoAvailableIDP extends \SimpleSAML\Module\saml\Error
 {
     /**
@@ -20,9 +22,9 @@ class NoAvailableIDP extends \SimpleSAML\Module\saml\Error
      *   - \SAML2\Constants::STATUS_RESPONDER: in case the error is caused by this SAML responder.
      *   - \SAML2\Constants::STATUS_REQUESTER: in case the error is caused by the SAML requester.
      * @param string|null $message A short message explaining why this error happened.
-     * @param \Exception|null $cause An exception that caused this error.
+     * @param \Throwable|null $cause An exception that caused this error.
      */
-    public function __construct($responsible, $message = null, \Exception $cause = null)
+    public function __construct(string $responsible, string $message = null, Throwable $cause = null)
     {
         parent::__construct($responsible, Constants::STATUS_NO_AVAILABLE_IDP, $message, $cause);
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoPassive.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoPassive.php
index 1a5a8d5c18be534dc708207dbd471f604778ee2a..f6e8f72514282cd633086adc11c7c7e99ffc11b4 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoPassive.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoPassive.php
@@ -1,16 +1,18 @@
 <?php
 
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\saml\Error;
+
+use SAML2\Constants;
+use Throwable;
+
 /**
  * A SAML error indicating that passive authentication cannot be used.
  *
  * @author Jaime Pérez Crespo, UNINETT AS <jaime.perez@uninett.no>
  * @package SimpleSAMLphp
  */
-
-namespace SimpleSAML\Module\saml\Error;
-
-use SAML2\Constants;
-
 class NoPassive extends \SimpleSAML\Module\saml\Error
 {
     /**
@@ -20,9 +22,9 @@ class NoPassive extends \SimpleSAML\Module\saml\Error
      *   - \SAML2\Constants::STATUS_RESPONDER: in case the error is caused by this SAML responder.
      *   - \SAML2\Constants::STATUS_REQUESTER: in case the error is caused by the SAML requester.
      * @param string|null $message A short message explaining why this error happened.
-     * @param \Exception|null $cause An exception that caused this error.
+     * @param \Throwable|null $cause An exception that caused this error.
      */
-    public function __construct($responsible, $message = null, \Exception $cause = null)
+    public function __construct(string $responsible, string $message = null, Throwable $cause = null)
     {
         parent::__construct($responsible, Constants::STATUS_NO_PASSIVE, $message, $cause);
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoSupportedIDP.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoSupportedIDP.php
index 429ddf538ca888175978eb5caa1cf5ab313b9fe0..13fa5c391db99ff4f8a257df9c078e85ee555fc8 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoSupportedIDP.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/NoSupportedIDP.php
@@ -1,16 +1,18 @@
 <?php
 
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\saml\Error;
+
+use SAML2\Constants;
+use Throwable;
+
 /**
  * A SAML error indicating that none of the IdPs requested are supported.
  *
  * @author Jaime Pérez Crespo, UNINETT AS <jaime.perez@uninett.no>
  * @package SimpleSAMLphp
  */
-
-namespace SimpleSAML\Module\saml\Error;
-
-use SAML2\Constants;
-
 class NoSupportedIDP extends \SimpleSAML\Module\saml\Error
 {
     /**
@@ -20,9 +22,9 @@ class NoSupportedIDP extends \SimpleSAML\Module\saml\Error
      *   - \SAML2\Constants::STATUS_RESPONDER: in case the error is caused by this SAML responder.
      *   - \SAML2\Constants::STATUS_REQUESTER: in case the error is caused by the SAML requester.
      * @param string|null $message A short message explaining why this error happened.
-     * @param \Exception|null $cause An exception that caused this error.
+     * @param \Throwable|null $cause An exception that caused this error.
      */
-    public function __construct($responsible, $message = null, \Exception $cause = null)
+    public function __construct(string $responsible, string $message = null, Throwable $cause = null)
     {
         parent::__construct($responsible, Constants::STATUS_NO_SUPPORTED_IDP, $message, $cause);
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/ProxyCountExceeded.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/ProxyCountExceeded.php
index 99e40182c1fc0df2de25415e47bc22682e865b92..e078c803b03600827e585c1af7c4755e455917d9 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/ProxyCountExceeded.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Error/ProxyCountExceeded.php
@@ -1,16 +1,18 @@
 <?php
 
+declare(strict_types=1);
+
+namespace SimpleSAML\Module\saml\Error;
+
+use SAML2\Constants;
+use Throwable;
+
 /**
  * A SAML error indicating that the maximum amount of proxies traversed has been reached.
  *
  * @author Jaime Pérez Crespo, UNINETT AS <jaime.perez@uninett.no>
  * @package SimpleSAMLphp
  */
-
-namespace SimpleSAML\Module\saml\Error;
-
-use SAML2\Constants;
-
 class ProxyCountExceeded extends \SimpleSAML\Module\saml\Error
 {
     /**
@@ -20,9 +22,9 @@ class ProxyCountExceeded extends \SimpleSAML\Module\saml\Error
      *   - \SAML2\Constants::STATUS_RESPONDER: in case the error is caused by this SAML responder.
      *   - \SAML2\Constants::STATUS_REQUESTER: in case the error is caused by the SAML requester.
      * @param string|null $message A short message explaining why this error happened.
-     * @param \Exception|null $cause An exception that caused this error.
+     * @param \Throwable|null $cause An exception that caused this error.
      */
-    public function __construct($responsible, $message = null, \Exception $cause = null)
+    public function __construct(string $responsible, string $message = null, Throwable $cause = null)
     {
         parent::__construct($responsible, Constants::STATUS_PROXY_COUNT_EXCEEDED, $message, $cause);
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SAML1.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SAML1.php
index d0a3d8c9ace90abc1afef4cb6c24de88c8869b55..861f9612ba964de1fe62de598d00bd78db6ab7ba 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SAML1.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SAML1.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\IdP;
 
 use SimpleSAML\Auth;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SAML2.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SAML2.php
index eca7ad6e8949d38dcb516956829eec04eab87714..ffd8da8f2a05252a97f9919bdff3ebd3d3c83e95 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SAML2.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SAML2.php
@@ -1,7 +1,10 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\IdP;
 
+use Exception;
 use DOMNodeList;
 use RobRichards\XMLSecLibs\XMLSecurityKey;
 use SAML2\Assertion;
@@ -13,6 +16,7 @@
 use SAML2\HTTPRedirect;
 use SAML2\LogoutRequest;
 use SAML2\LogoutResponse;
+use SAML2\Response;
 use SAML2\SOAP;
 use SAML2\XML\ds\X509Certificate;
 use SAML2\XML\ds\X509Data;
@@ -123,7 +127,7 @@ public static function sendResponse(array $state)
      * @param array $state The error state.
      * @return void
      */
-    public static function handleAuthError(\SimpleSAML\Error\Exception $exception, array $state)
+    public static function handleAuthError(Error\Exception $exception, array $state)
     {
         assert(isset($state['SPMetadata']));
         assert(isset($state['saml:ConsumerURL']));
@@ -192,14 +196,10 @@ public static function handleAuthError(\SimpleSAML\Error\Exception $exception, a
     private static function getAssertionConsumerService(
         array $supportedBindings,
         Configuration $spMetadata,
-        $AssertionConsumerServiceURL,
-        $ProtocolBinding,
-        $AssertionConsumerServiceIndex
-    ) {
-        assert(is_string($AssertionConsumerServiceURL) || $AssertionConsumerServiceURL === null);
-        assert(is_string($ProtocolBinding) || $ProtocolBinding === null);
-        assert(is_int($AssertionConsumerServiceIndex) || $AssertionConsumerServiceIndex === null);
-
+        string $AssertionConsumerServiceURL = null,
+        string $ProtocolBinding = null,
+        int $AssertionConsumerServiceIndex = null
+    ): ?array {
         /* We want to pick the best matching endpoint in the case where for example
          * only the ProtocolBinding is given. We therefore pick endpoints with the
          * following priority:
@@ -354,7 +354,12 @@ public static function receiveAuthnRequest(\SimpleSAML\IdP $idp)
                 'SAML2.0 - IdP.SSOService: IdP initiated authentication: ' . var_export($spEntityId, true)
             );
         } else {
-            $binding = Binding::getCurrentBinding();
+            try {
+                $binding = Binding::getCurrentBinding();
+            } catch (Exception $e) {
+                header($_SERVER["SERVER_PROTOCOL"]." 405 Method Not Allowed", true, 405);
+                exit;
+            }
             $request = $binding->receive();
 
             if (!($request instanceof AuthnRequest)) {
@@ -363,12 +368,14 @@ public static function receiveAuthnRequest(\SimpleSAML\IdP $idp)
                 );
             }
 
+            /** @psalm-var null|string|\SAML2\XML\saml\Issuer $issuer   Remove in SSP 2.0 */
             $issuer = $request->getIssuer();
             if ($issuer === null) {
                 throw new Error\BadRequest(
                     'Received message on authentication request endpoint without issuer.'
                 );
             } elseif ($issuer instanceof Issuer) {
+                /** @psalm-var string|null $spEntityId */
                 $spEntityId = $issuer->getValue();
                 if ($spEntityId === null) {
                     /* Without an issuer we have no way to respond to the message. */
@@ -434,7 +441,7 @@ public static function receiveAuthnRequest(\SimpleSAML\IdP $idp)
             $consumerIndex
         );
         if ($acsEndpoint === null) {
-            throw new \Exception('Unable to use any of the ACS endpoints found for SP \'' . $spEntityId . '\'');
+            throw new Exception('Unable to use any of the ACS endpoints found for SP \'' . $spEntityId . '\'');
         }
 
         $IDPList = array_unique(array_merge($IDPList, $spMetadata->getArrayizeString('IDPList', [])));
@@ -604,11 +611,13 @@ public static function receiveLogoutMessage(IdP $idp)
         $binding = Binding::getCurrentBinding();
         $message = $binding->receive();
 
+        /** @psalm-var null|string|\SAML2\XML\saml\Issuer  Remove in SSP 2.0 */
         $issuer = $message->getIssuer();
         if ($issuer === null) {
             /* Without an issuer we have no way to respond to the message. */
             throw new Error\BadRequest('Received message on logout endpoint without issuer.');
         } elseif ($issuer instanceof Issuer) {
+            /** @psalm-var string|null $spEntityId */
             $spEntityId = $issuer->getValue();
             if ($spEntityId === null) {
                 /* Without an issuer we have no way to respond to the message. */
@@ -728,7 +737,7 @@ public static function getAssociationConfig(IdP $idp, array $association)
         $metadata = MetaDataStorageHandler::getMetadataHandler();
         try {
             return $metadata->getMetaDataConfig($association['saml:entityID'], 'saml20-sp-remote');
-        } catch (\Exception $e) {
+        } catch (Exception $e) {
             return Configuration::loadFromArray([], 'Unknown SAML 2 entity.');
         }
     }
@@ -947,8 +956,7 @@ private static function generateNameIdValue(
         Configuration $idpMetadata,
         Configuration $spMetadata,
         array &$state
-    ) {
-
+    ): ?string {
         $attribute = $spMetadata->getString('simplesaml.nameidattribute', null);
         if ($attribute === null) {
             $attribute = $idpMetadata->getString('simplesaml.nameidattribute', null);
@@ -999,7 +1007,7 @@ private static function encodeAttributes(
         Configuration $idpMetadata,
         Configuration $spMetadata,
         array $attributes
-    ) {
+    ): array {
         $base64Attributes = $spMetadata->getBoolean('base64attributes', null);
         if ($base64Attributes === null) {
             $base64Attributes = $idpMetadata->getBoolean('base64attributes', false);
@@ -1038,6 +1046,7 @@ private static function encodeAttributes(
 
                 $attrval = $value;
                 if ($value instanceof DOMNodeList) {
+                    /** @psalm-suppress PossiblyNullPropertyFetch */
                     $attrval = new AttributeValue($value->item(0)->parentNode);
                 }
 
@@ -1078,7 +1087,7 @@ private static function encodeAttributes(
     private static function getAttributeNameFormat(
         Configuration $idpMetadata,
         Configuration $spMetadata
-    ) {
+    ): string {
         // try SP metadata first
         $attributeNameFormat = $spMetadata->getString('attributes.NameFormat', null);
         if ($attributeNameFormat !== null) {
@@ -1119,7 +1128,7 @@ private static function buildAssertion(
         Configuration $idpMetadata,
         Configuration $spMetadata,
         array &$state
-    ) {
+    ): Assertion {
         assert(isset($state['Attributes']));
         assert(isset($state['saml:ConsumerURL']));
 
@@ -1141,7 +1150,9 @@ private static function buildAssertion(
         $issuer->setValue($idpMetadata->getString('entityid'));
         $issuer->setFormat(Constants::NAMEID_ENTITY);
         $a->setIssuer($issuer);
-        $a->setValidAudiences([$spMetadata->getString('entityid')]);
+
+        $audience = array_merge([$spMetadata->getString('entityid')], $spMetadata->getArray('audience', []));
+        $a->setValidAudiences($audience);
 
         $a->setNotBefore($now - 30);
 
@@ -1328,7 +1339,12 @@ private static function encryptAssertion(
 
         $sharedKey = $spMetadata->getString('sharedkey', null);
         if ($sharedKey !== null) {
-            $key = new XMLSecurityKey(XMLSecurityKey::AES128_CBC);
+            $algo = $spMetadata->getString('sharedkey_algorithm', null);
+            if ($algo === null) {
+                $algo = $idpMetadata->getString('sharedkey_algorithm');
+            }
+
+            $key = new XMLSecurityKey($algo);
             $key->loadKey($sharedKey);
         } else {
             $keys = $spMetadata->getPublicKeys('encryption', true);
@@ -1376,8 +1392,8 @@ private static function buildLogoutRequest(
         Configuration $idpMetadata,
         Configuration $spMetadata,
         array $association,
-        $relayState
-    ) {
+        string $relayState = null
+    ): LogoutRequest {
         $lr = \SimpleSAML\Module\saml\Message::buildLogoutRequest($idpMetadata, $spMetadata);
         $lr->setRelayState($relayState);
         $lr->setSessionIndex($association['saml:SessionIndex']);
@@ -1413,14 +1429,14 @@ private static function buildLogoutRequest(
     private static function buildResponse(
         Configuration $idpMetadata,
         Configuration $spMetadata,
-        $consumerURL
-    ) {
+        string $consumerURL
+    ): Response {
         $signResponse = $spMetadata->getBoolean('saml20.sign.response', null);
         if ($signResponse === null) {
             $signResponse = $idpMetadata->getBoolean('saml20.sign.response', true);
         }
 
-        $r = new \SAML2\Response();
+        $r = new Response();
         $issuer = new Issuer();
         $issuer->setValue($idpMetadata->getString('entityid'));
         $issuer->setFormat(Constants::NAMEID_ENTITY);
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SQLNameID.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SQLNameID.php
index d4f91d9d3f3d0528bdbda5b3cdfd4d6162cc3fc2..03498ca09ed16e07080fe7e5599c2b842cf1f64f 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SQLNameID.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/IdP/SQLNameID.php
@@ -1,8 +1,11 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\IdP;
 
 use PDO;
+use PDOStatement;
 use SimpleSAML\Error;
 use SimpleSAML\Store;
 use SimpleSAML\Database;
@@ -15,9 +18,9 @@
  */
 class SQLNameID
 {
-    const TABLE_VERSION = 1;
-    const DEFAULT_TABLE_PREFIX = '';
-    const TABLE_SUFFIX = '_saml_PersistentNameID';
+    public const TABLE_VERSION = 1;
+    public const DEFAULT_TABLE_PREFIX = '';
+    public const TABLE_SUFFIX = '_saml_PersistentNameID';
 
 
     /**
@@ -26,7 +29,7 @@ class SQLNameID
      * @param array $config
      * @return \PDOStatement object
      */
-    private static function read($query, array $params = [], array $config = [])
+    private static function read(string $query, array $params = [], array $config = []): PDOStatement
     {
         if (!empty($config)) {
             $database = Database::getInstance(Configuration::loadFromArray($config));
@@ -46,7 +49,7 @@ private static function read($query, array $params = [], array $config = [])
      * @param array $config
      * @return int|false The number of rows affected by the query or false on error.
      */
-    private static function write($query, array $params = [], array $config = [])
+    private static function write(string $query, array $params = [], array $config = [])
     {
         if (!empty($config)) {
             $database = Database::getInstance(Configuration::loadFromArray($config));
@@ -67,7 +70,7 @@ private static function write($query, array $params = [], array $config = [])
      * @param array $config
      * @return string
      */
-    private static function tableName(array $config = [])
+    private static function tableName(array $config = []): string
     {
         $store = empty($config) ? self::getStore() : null;
         $prefix = $store === null ? self::DEFAULT_TABLE_PREFIX : $store->prefix;
@@ -79,7 +82,7 @@ private static function tableName(array $config = [])
      * @param array $config
      * @return void
      */
-    private static function create(array $config = [])
+    private static function create(array $config = []): void
     {
         $store = empty($config) ? self::getStore() : null;
         $table = self::tableName($config);
@@ -102,7 +105,7 @@ private static function create(array $config = [])
      * @param array $config
      * @return \PDOStatement
      */
-    private static function createAndRead($query, array $params = [], array $config = [])
+    private static function createAndRead(string $query, array $params = [], array $config = []): PDOStatement
     {
         self::create($config);
         return self::read($query, $params, $config);
@@ -115,7 +118,7 @@ private static function createAndRead($query, array $params = [], array $config
      * @param array $config
      * @return int|false The number of rows affected by the query or false on error.
      */
-    private static function createAndWrite($query, array $params = [], array $config = [])
+    private static function createAndWrite(string $query, array $params = [], array $config = [])
     {
         self::create($config);
         return self::write($query, $params, $config);
@@ -129,7 +132,7 @@ private static function createAndWrite($query, array $params = [], array $config
      * @param array $config
      * @return void
      */
-    private static function createTable($table, array $config = [])
+    private static function createTable(string $table, array $config = []): void
     {
         $query = 'CREATE TABLE ' . $table . ' (
             _idp VARCHAR(256) NOT NULL,
@@ -151,7 +154,7 @@ private static function createTable($table, array $config = [])
      *
      * @return \SimpleSAML\Store\SQL  SQL datastore.
      */
-    private static function getStore()
+    private static function getStore(): Store\SQL
     {
         $store = Store::getInstance();
         if (!($store instanceof Store\SQL)) {
@@ -174,13 +177,13 @@ private static function getStore()
      * @param array $config
      * @return void
      */
-    public static function add($idpEntityId, $spEntityId, $user, $value, array $config = [])
-    {
-        assert(is_string($idpEntityId));
-        assert(is_string($spEntityId));
-        assert(is_string($user));
-        assert(is_string($value));
-
+    public static function add(
+        string $idpEntityId,
+        string $spEntityId,
+        string $user,
+        string $value,
+        array $config = []
+    ): void {
         $params = [
             '_idp' => $idpEntityId,
             '_sp' => $spEntityId,
@@ -280,7 +283,9 @@ public static function getIdentities($idpEntityId, $spEntityId, array $config =
 
         $res = [];
         while (($row = $query->fetch(PDO::FETCH_ASSOC)) !== false) {
-            $res[$row['_user']] = $row['_value'];
+            $user = strval($row['_user']);
+            $value = strval($row['_value']);
+            $res[$user] = $value;
         }
 
         return $res;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Message.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Message.php
index ca15e50130b8089b1e65c4a5e35cf3e5c0f4bb23..7af3be74b3dfd76c5190aad8ad9244451f41797c 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Message.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/Message.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml;
 
 use RobRichards\XMLSecLibs\XMLSecurityKey;
@@ -92,7 +94,7 @@ private static function addRedirectSign(
         Configuration $srcMetadata,
         Configuration $dstMetadata,
         \SAML2\Message $message
-    ) {
+    ): void {
 
         $signingEnabled = null;
         if ($message instanceof LogoutRequest || $message instanceof LogoutResponse) {
@@ -133,7 +135,7 @@ private static function addRedirectSign(
      *
      * @throws \SimpleSAML\Error\Exception if we cannot find the certificate matching the fingerprint.
      */
-    private static function findCertificate(array $certFingerprints, array $certificates)
+    private static function findCertificate(array $certFingerprints, array $certificates): string
     {
         $candidates = [];
 
@@ -168,7 +170,7 @@ private static function findCertificate(array $certFingerprints, array $certific
      * @throws \SimpleSAML\Error\Exception if there is not certificate in the metadata for the entity.
      * @throws \Exception if the signature validation fails with an exception.
      */
-    public static function checkSign(Configuration $srcMetadata, SignedElement $element)
+    public static function checkSign(Configuration $srcMetadata, SignedElement $element): bool
     {
         // find the public key that should verify signatures by this entity
         $keys = $srcMetadata->getPublicKeys('signing');
@@ -298,16 +300,28 @@ public static function validateMessage(
      *
      * @param \SimpleSAML\Configuration $srcMetadata The metadata of the sender (IdP).
      * @param \SimpleSAML\Configuration $dstMetadata The metadata of the recipient (SP).
+     * @psalm-suppress UndefinedDocblockClass  This can be removed after upgrading to saml2v5
+     * @param \SimpleSAML\SAML2\XML\xenc\EncryptionMethod|null $encryptionMethod The EncryptionMethod from the assertion.
      *
      * @return array Array of decryption keys.
      */
     public static function getDecryptionKeys(
         Configuration $srcMetadata,
-        Configuration $dstMetadata
+        Configuration $dstMetadata,
+        $encryptionMethod = null
     ) {
         $sharedKey = $srcMetadata->getString('sharedkey', null);
         if ($sharedKey !== null) {
-            $key = new XMLSecurityKey(XMLSecurityKey::AES128_CBC);
+            if ($encryptionMethod !== null) {
+                $algo = $encryptionMethod->getAlgorithm();
+            } else {
+                $algo = $srcMetadata->getString('sharedkey_algorithm', null);
+                if ($algo === null) {
+                    $algo = $dstMetadata->getString('sharedkey_algorithm');
+                }
+            }
+
+            $key = new XMLSecurityKey($algo);
             $key->loadKey($sharedKey);
             return [$key];
         }
@@ -381,7 +395,7 @@ private static function decryptAssertion(
         Configuration $srcMetadata,
         Configuration $dstMetadata,
         $assertion
-    ) {
+    ): Assertion {
         assert($assertion instanceof Assertion || $assertion instanceof EncryptedAssertion);
 
         if ($assertion instanceof Assertion) {
@@ -398,7 +412,12 @@ private static function decryptAssertion(
         }
 
         try {
-            $keys = self::getDecryptionKeys($srcMetadata, $dstMetadata);
+            // @todo Enable this code for saml2v5 to automatically determine encryption algorithm
+            //$encryptionMethod = $assertion->getEncryptedData()->getEncryptionMethod();
+            //$keys = self::getDecryptionKeys($srcMetadata, $dstMetadata, $encryptionMethod);
+
+            $encryptionMethod = null;
+            $keys = self::getDecryptionKeys($srcMetadata, $dstMetadata, $encryptionMethod);
         } catch (\Exception $e) {
             throw new SSP_Error\Exception('Error decrypting assertion: ' . $e->getMessage());
         }
@@ -441,7 +460,7 @@ private static function decryptAttributes(
         Configuration $srcMetadata,
         Configuration $dstMetadata,
         Assertion &$assertion
-    ) {
+    ): void {
         if (!$assertion->hasEncryptedAttributes()) {
             return;
         }
@@ -665,10 +684,9 @@ private static function processAssertion(
         Configuration $idpMetadata,
         Response $response,
         $assertion,
-        $responseSigned
-    ) {
+        bool $responseSigned
+    ): Assertion {
         assert($assertion instanceof Assertion || $assertion instanceof EncryptedAssertion);
-        assert(is_bool($responseSigned));
 
         $assertion = self::decryptAssertion($idpMetadata, $spMetadata, $assertion);
         self::decryptAttributes($idpMetadata, $spMetadata, $assertion);
@@ -911,7 +929,6 @@ private static function processAssertion(
      */
     public static function getEncryptionKey(Configuration $metadata)
     {
-
         $sharedKey = $metadata->getString('sharedkey', null);
         if ($sharedKey !== null) {
             $key = new XMLSecurityKey(XMLSecurityKey::AES128_CBC);
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/SP/LogoutStore.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/SP/LogoutStore.php
index b29b5040ee101ea8dbdc74f91b053afa447c2b9c..e64b745c4520062d329dfe54b344a8bce81f16d6 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/SP/LogoutStore.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/lib/SP/LogoutStore.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Module\saml\SP;
 
 use PDO;
@@ -23,7 +25,7 @@ class LogoutStore
      * @param \SimpleSAML\Store\SQL $store  The datastore.
      * @return void
      */
-    private static function createLogoutTable(Store\SQL $store)
+    private static function createLogoutTable(Store\SQL $store): void
     {
         $tableVer = $store->getTableVersion('saml_LogoutStore');
         if ($tableVer === 4) {
@@ -40,6 +42,11 @@ private static function createLogoutTable(Store\SQL $store)
                         'ALTER TABLE ' . $store->prefix . '_saml_LogoutStore ALTER COLUMN _expire TYPE TIMESTAMP'
                     ];
                     break;
+                case 'sqlsrv':
+                    $update = [
+                        'ALTER TABLE ' . $store->prefix . '_saml_LogoutStore ALTER COLUMN _expire DATETIME NOT NULL'
+                    ];
+                    break;
                 case 'sqlite':
                     /**
                      * Because SQLite does not support field alterations, the approach is to:
@@ -117,6 +124,11 @@ private static function createLogoutTable(Store\SQL $store)
                         'ALTER TABLE ' . $store->prefix .
                         '_saml_LogoutStore ALTER COLUMN _authSource TYPE VARCHAR(255)'];
                     break;
+               case 'sqlsrv':
+                    $update = [
+                        'ALTER TABLE ' . $store->prefix . '_saml_LogoutStore ALTER COLUMN _authSource VARCHAR(255) NOT NULL'
+                    ];
+                    break;
                 case 'sqlite':
                     /**
                      * Because SQLite does not support field alterations, the approach is to:
@@ -198,7 +210,7 @@ private static function createLogoutTable(Store\SQL $store)
      * @param \SimpleSAML\Store\SQL $store  The datastore.
      * @return void
      */
-    private static function cleanLogoutStore(Store\SQL $store)
+    private static function cleanLogoutStore(Store\SQL $store): void
     {
         Logger::debug('saml.LogoutStore: Cleaning logout store.');
 
@@ -223,18 +235,12 @@ private static function cleanLogoutStore(Store\SQL $store)
      */
     private static function addSessionSQL(
         Store\SQL $store,
-        $authId,
-        $nameId,
-        $sessionIndex,
-        $expire,
-        $sessionId
-    ) {
-        assert(is_string($authId));
-        assert(is_string($nameId));
-        assert(is_string($sessionIndex));
-        assert(is_int($expire));
-        assert(is_string($sessionId));
-
+        string $authId,
+        string $nameId,
+        string $sessionIndex,
+        int $expire,
+        string $sessionId
+    ): void {
         self::createLogoutTable($store);
 
         if (rand(0, 1000) < 10) {
@@ -264,11 +270,8 @@ private static function addSessionSQL(
      * @param string $nameId  The hash of the users NameID.
      * @return array  Associative array of SessionIndex =>  SessionId.
      */
-    private static function getSessionsSQL(Store\SQL $store, $authId, $nameId)
+    private static function getSessionsSQL(Store\SQL $store, string $authId, string $nameId): array
     {
-        assert(is_string($authId));
-        assert(is_string($nameId));
-
         self::createLogoutTable($store);
 
         $params = [
@@ -301,11 +304,12 @@ private static function getSessionsSQL(Store\SQL $store, $authId, $nameId)
      * @param array $sessionIndexes  The session indexes.
      * @return array  Associative array of SessionIndex =>  SessionId.
      */
-    private static function getSessionsStore(Store $store, $authId, $nameId, array $sessionIndexes)
-    {
-        assert(is_string($authId));
-        assert(is_string($nameId));
-
+    private static function getSessionsStore(
+        Store $store,
+        string $authId,
+        string $nameId,
+        array $sessionIndexes
+    ): array {
         $res = [];
         foreach ($sessionIndexes as $sessionIndex) {
             $sessionId = $store->get('saml.LogoutStore', $nameId . ':' . $sessionIndex);
@@ -365,6 +369,7 @@ public static function addSession($authId, $nameId, $sessionIndex, $expire)
         // serialize and anonymize the NameID
         // TODO: remove this conditional statement
         if (is_array($nameId)) {
+            /** @psalm-suppress UndefinedMethod */
             $nameId = NameID::fromArray($nameId);
         }
         $strNameId = serialize($nameId);
@@ -407,6 +412,7 @@ public static function logoutSessions($authId, $nameId, array $sessionIndexes)
         // serialize and anonymize the NameID
         // TODO: remove this conditional statement
         if (is_array($nameId)) {
+            /** @psalm-suppress UndefinedMethod */
             $nameId = NameID::fromArray($nameId);
         }
         $strNameId = serialize($nameId);
@@ -425,10 +431,11 @@ public static function logoutSessions($authId, $nameId, array $sessionIndexes)
 
         if ($store instanceof Store\SQL) {
             $sessions = self::getSessionsSQL($store, $authId, $strNameId);
-        } elseif (empty($sessionIndexes)) {
-            // We cannot fetch all sessions without a SQL store
-            return false;
         } else {
+            if (empty($sessionIndexes)) {
+                // We cannot fetch all sessions without a SQL store
+                return false;
+            }
             /** @var array $sessions At this point the store cannot be false */
             $sessions = self::getSessionsStore($store, $authId, $strNameId, $sessionIndexes);
         }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/locales/st/LC_MESSAGES/saml.po b/vendor/simplesamlphp/simplesamlphp/modules/saml/locales/st/LC_MESSAGES/saml.po
new file mode 100644
index 0000000000000000000000000000000000000000..2be6a3e5942c71ff21c27ed8ffc6bf30ff0f4b38
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/locales/st/LC_MESSAGES/saml.po
@@ -0,0 +1,38 @@
+
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SimpleSAMLphp 1.15\n"
+"Report-Msgid-Bugs-To: simplesamlphp-translation@googlegroups.com\n"
+"POT-Creation-Date: 2019-12-12 13:23+0200\n"
+"PO-Revision-Date: 2019-12-12 13:23+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
+msgid ""
+"You already have a valid session with an identity provider "
+"(<em>%IDP%</em>) that is not accepted by <em>%SP%</em>. Would you like to"
+" log out from your existing session and log in again with another "
+"identity provider?"
+msgstr ""
+"O se ntse o na le seshene e sebetsang ho mofani wa boitsebiso "
+"(<em>%IDP%</em>) ya sa amohelweng ke<em>%SP%</em>. Na o ka lakatsa ho "
+"tswa sesheneng ya hao e teng mme o kene ka mofani wa boitsebiso e mong?"
+
+msgid "{saml:proxy:invalid_idp_description}"
+msgstr ""
+"O se ntse o na le seshene e sebetsang ho mofani wa boitsebiso "
+"(<em>%IDP%</em>) ya sa amohelweng ke<em>%SP%</em>. Na o ka lakatsa ho "
+"tswa sesheneng ya hao e teng mme o kene ka mofani wa boitsebiso e mong?"
+
+msgid "Invalid Identity Provider"
+msgstr "Mofani wa Boitsebiso ha Nepahala"
+
+msgid "{saml:proxy:invalid_idp}"
+msgstr "Mofani wa Boitsebiso ha Nepahala"
+
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/metadata.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/metadata.php
index b13d86fed33df9cadcc69736232f554d5e5b9adb..e90815d15dd9b68eadb7bb660eb81425598acff5 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/metadata.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/metadata.php
@@ -1,5 +1,7 @@
 <?php
 
+use Symfony\Component\VarExporter\VarExporter;
+
 if (!array_key_exists('PATH_INFO', $_SERVER)) {
     throw new \SimpleSAML\Error\BadRequest('Missing authentication source id in metadata URL');
 }
@@ -279,7 +281,7 @@
     $t->data['headerString'] = \SimpleSAML\Locale\Translate::noop('metadata_saml20-sp');
     $t->data['metadata'] = htmlspecialchars($xml);
     $t->data['metadataflat'] = '$metadata[' . var_export($entityId, true)
-        . '] = ' . var_export($metaArray20, true) . ';';
+        . '] = ' . VarExporter::export($metaArray20) . ';';
     $t->data['metaurl'] = $source->getMetadataURL();
     $t->show();
 } else {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml1-acs.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml1-acs.php
index 6b981774ce113d96c7e72748fab7c3c4874f5a83..df606644a455740e2c311053ba3fb9a93e166d9f 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml1-acs.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml1-acs.php
@@ -35,6 +35,7 @@
         'saml:sp:AuthId' => $sourceId,
         'saml:sp:RelayState' => \SimpleSAML\Utils\HTTP::checkURLAllowed($target),
     ];
+    $deprecated_extra = '';
 } else {
     /** @var array $state  State can never be null without a third argument */
     $state = \SimpleSAML\Auth\State::loadState($_REQUEST['TARGET'], 'saml:sp:sso');
@@ -48,8 +49,11 @@
     }
 
     assert(isset($state['saml:idp']));
+    $deprecated_extra = " IdP: {$state['saml:idp']}";
 }
 
+SimpleSAML\Logger::notice('SAML1 support is deprecated and will be removed in SimpleSAMLphp 2.0'. $deprecated_extra);
+
 $spMetadata = $source->getMetadata();
 
 if (array_key_exists('SAMLart', $_REQUEST)) {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml2-acs.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml2-acs.php
index 4d05bf2b8ecf0fe4defa5d0fc2a0598c1c126ced..eef3433bc4deb1171955b5a55c999a4470df7015 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml2-acs.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml2-acs.php
@@ -37,6 +37,7 @@
     throw new \SimpleSAML\Error\BadRequest('Invalid message received to AssertionConsumerService endpoint.');
 }
 
+/** @psalm-var null|string|\SAML2\XML\saml\Issuer $issuer   Remove in SSP 2.0 */
 $issuer = $response->getIssuer();
 if ($issuer === null) {
     // no Issuer in the response. Look for an unencrypted assertion with an issuer
@@ -47,6 +48,7 @@
             break;
         }
     }
+    /** @psalm-var string|null $issuer  Remove in SSP 2.0 */
     if ($issuer === null) {
         // no issuer found in the assertions
         throw new Exception('Missing <saml:Issuer> in message delivered to AssertionConsumerService.');
@@ -54,6 +56,7 @@
 }
 
 if ($issuer instanceof \SAML2\XML\saml\Issuer) {
+    /** @psalm-var string|null $issuer */
     $issuer = $issuer->getValue();
     if ($issuer === null) {
         // no issuer found in the assertions
@@ -63,6 +66,7 @@
 
 $session = \SimpleSAML\Session::getSessionFromRequest();
 $prevAuth = $session->getAuthData($sourceId, 'saml:sp:prevAuth');
+/** @psalm-var string $issuer */
 if ($prevAuth !== null && $prevAuth['id'] === $response->getId() && $prevAuth['issuer'] === $issuer) {
     /* OK, it looks like this message has the same issuer
      * and ID as the SP session we already have active. We
@@ -119,15 +123,11 @@
     }
 } else {
     // this is an unsolicited response
+    $relaystate = $spMetadata->getString('RelayState', $response->getRelayState());
     $state = [
         'saml:sp:isUnsolicited' => true,
         'saml:sp:AuthId'        => $sourceId,
-        'saml:sp:RelayState'    => \SimpleSAML\Utils\HTTP::checkURLAllowed(
-            $spMetadata->getString(
-                'RelayState',
-                $response->getRelayState()
-            )
-        ),
+        'saml:sp:RelayState'    => $relaystate === null ? null : \SimpleSAML\Utils\HTTP::checkURLAllowed($relaystate),
     ];
 }
 
@@ -257,6 +257,7 @@
 $state['saml:sp:prevAuth'] = [
     'id'     => $response->getId(),
     'issuer' => $issuer,
+    'inResponseTo' => $response->getInResponseTo(),
 ];
 if (isset($state['\SimpleSAML\Auth\Source.ReturnURL'])) {
     $state['saml:sp:prevAuth']['redirect'] = $state['\SimpleSAML\Auth\Source.ReturnURL'];
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml2-logout.php b/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml2-logout.php
index 61950a71e17664bee2945037254192de434040ae..9b756d8d61e5fdffa09c6eee42a6880d008d2cc6 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml2-logout.php
+++ b/vendor/simplesamlphp/simplesamlphp/modules/saml/www/sp/saml2-logout.php
@@ -109,6 +109,7 @@
     $nameId = $message->getNameId();
     $sessionIndexes = $message->getSessionIndexes();
 
+    /** @psalm-suppress PossiblyNullArgument  This will be fixed in saml2 5.0 */
     $numLoggedOut = \SimpleSAML\Module\saml\SP\LogoutStore::logoutSessions($sourceId, $nameId, $sessionIndexes);
     if ($numLoggedOut === false) {
         // This type of logout was unsupported. Use the old method
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/.php_cs.dist b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/.php_cs.dist
deleted file mode 100644
index 084410f1da100a54a5061274f899839a5b3a91e1..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/.php_cs.dist
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-$finder = PhpCsFixer\Finder::create()
-    ->in([
-        __DIR__ . '/config-templates',
-        __DIR__ . '/hooks',
-        __DIR__ . '/templates',
-        __DIR__ . '/tests',
-        __DIR__ . '/www',
-    ])
-;
-return PhpCsFixer\Config::create()
-    ->setRules([
-        '@PSR2' => true,
-        '@PSR4' => true,
-        '@PSR5' => true,
-    ])
-    ->setFinder($finder)
-;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/.travis.yml
deleted file mode 100644
index 3c250287a743959883e40e541e22f26fb1dd8635..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/.travis.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-sudo: required
-
-language: php
-
-php:
-  - 5.6
-  - 7.0
-  - 7.1
-  - 7.2
-  - 7.3
-
-env:
-  - SIMPLESAMLPHP_VERSION=1.17.*
-  
-matrix:
-  allow_failures:
-    - php: 7.3
-
-before_script:
-  - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
-  - composer update --no-interaction
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then composer require --dev vimeo/psalm:1.1.9; fi
-
-script:
-  - bin/check-syntax.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
-
-after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/bin/check-syntax.sh b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/bin/check-syntax.sh
deleted file mode 100755
index 75a810c21842c5c381392a13daa1d742adadd44c..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/bin/check-syntax.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-PHP='/usr/bin/env php'
-RETURN=0
-
-# check PHP files
-for FILE in `find config-templates hooks templates tests www -name "*.php"`; do
-    $PHP -l $FILE > /dev/null 2>&1
-    if [ $? -ne 0 ]; then
-        echo "Syntax check failed for ${FILE}"
-        RETURN=`expr ${RETURN} + 1`
-    fi
-done
-
-exit $RETURN
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/composer.json
deleted file mode 100644
index 20073b1e75dcddaa275ba2be50a5b2e4ad551ef1..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/composer.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-    "name": "simplesamlphp/simplesamlphp-module-sanitycheck",
-    "description": "Perform sanity checks on configuration",
-    "type": "simplesamlphp-module",
-    "keywords": ["simplesamlphp", "sanitycheck"],
-    "license": "LGPL-2.1-or-later",
-    "authors": [
-        {
-            "name": "Andreas Åkre Solberg",
-            "email": "andreas.solberg@uninett.no"
-        }
-    ],
-    "config": {
-        "preferred-install": {
-            "simplesamlphp/simplesamlphp": "source",
-            "*": "dist"
-        }
-    },
-    "autoload": {
-        "psr-4": {
-            "SimpleSAML\\Module\\sanitycheck\\": "lib/"
-        }
-    },
-    "autoload-dev": {
-        "psr-4": {
-            "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils"
-        }
-    },
-    "require": {
-        "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1",
-        "webmozart/assert": "~1.4"
-    },
-    "require-dev": {
-        "simplesamlphp/simplesamlphp": "^1.17",
-        "phpunit/phpunit": "~5.7"
-    },
-    "support": {
-        "issues": "https://github.com/tvdijen/simplesamlphp-module-sanitycheck/issues",
-        "source": "https://github.com/tvdijen/simplesamlphp-module-sanitycheck"
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/config-templates/config-sanitycheck.php b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/config-templates/config-sanitycheck.php
deleted file mode 100644
index d9b45bb8af9fb724067659284eb3a0d67116d642..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/config-templates/config-sanitycheck.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-/*
- * The configuration of SimpleSAMLphp sanitycheck package
- */
-
-$config = [
-    /*
-     * Do you want to generate statistics using the cron module? If so, specify which cron tag to use.
-     * Examples: daily, weekly
-     * To not run statistics in cron, set value to
-     *     'cron_tag' => null,
-     */
-    'cron_tag' => 'hourly',
-];
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/default-enable b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/default-enable
deleted file mode 100644
index 25615cb47c350d23033eb9801627ed8330bcc3e9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/default-enable
+++ /dev/null
@@ -1,3 +0,0 @@
-This file indicates that the default state of this module
-is enabled. To disable, create a file named disable in the
-same directory as this file.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/dictionaries/strings.definition.json b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/dictionaries/strings.definition.json
deleted file mode 100644
index 38aa732b32daec72c0ebecc77b37441802b93186..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/dictionaries/strings.definition.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "link_sanitycheck": {
-    "en": "Sanity check of your SimpleSAMLphp setup"
-  }
-}
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/dictionaries/strings.translation.json b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/dictionaries/strings.translation.json
deleted file mode 100644
index 802fe912c7271d1099e12cbb05fb30dbc4f8430f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/dictionaries/strings.translation.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "link_sanitycheck": {
-    "es": "Comprobaciones básicas de la instalación",
-    "no": "Sjekk din installasjon",
-    "nn": "Sjekk din installasjon",
-    "ca": "Comprovació de la validesa de la vostra configuració de SimpleSAMLphp"
-  }
-}
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_configpage.php b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_configpage.php
deleted file mode 100644
index 68856b9305f72040d8c14a372ee18d1fb908a074..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_configpage.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-/**
- * Hook to add the sanitycheck link to the config page.
- *
- * @param \SimpleSAML\XHTML\Template $template The template that we should alter in this hook.
- * @return void
- */
-function sanitycheck_hook_configpage(\SimpleSAML\XHTML\Template &$template)
-{
-    $template->data['links']['sanitycheck'] = [
-        'href' => SimpleSAML\Module::getModuleURL('sanitycheck/index.php'),
-        'text' => \SimpleSAML\Locale\Translate::noop('Sanity check of your SimpleSAMLphp setup'),
-    ];
-    $template->getLocalization()->addModuleDomain('sanitycheck');
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_cron.php b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_cron.php
deleted file mode 100644
index 0ab1a6604666aaa381e6334644c1fbd40954377d..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_cron.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * Hook to run a cron job.
- *
- * @param array &$croninfo  Output
- * @return void
- */
-function sanitycheck_hook_cron(&$croninfo)
-{
-    assert(is_array($croninfo));
-    assert(array_key_exists('summary', $croninfo));
-    assert(array_key_exists('tag', $croninfo));
-
-    \SimpleSAML\Logger::info('cron [sanitycheck]: Running cron in cron tag ['.$croninfo['tag'].'] ');
-
-    try {
-        $sconfig = \SimpleSAML\Configuration::getOptionalConfig('config-sanitycheck.php');
-
-        $cronTag = $sconfig->getString('cron_tag', null);
-        if ($cronTag === null || $cronTag !== $croninfo['tag']) {
-            return;
-        }
-
-        $info = [];
-        $errors = [];
-        $hookinfo = [
-            'info' => &$info,
-            'errors' => &$errors,
-        ];
-
-        SimpleSAML\Module::callHooks('sanitycheck', $hookinfo);
-
-        if (count($errors) > 0) {
-            foreach ($errors as $err) {
-                $croninfo['summary'][] = 'Sanitycheck error: '.$err;
-            }
-        }
-    } catch (\Exception $e) {
-        $croninfo['summary'][] = 'Error executing sanity check: '.$e->getMessage();
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_frontpage.php b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_frontpage.php
deleted file mode 100644
index e1b1a126d9c94b0df8816ac3f87d11fe6b03e268..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_frontpage.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-/**
- * Hook to add the modinfo module to the frontpage.
- *
- * @param array &$links  The links on the frontpage, split into sections.
- * @return void
- */
-function sanitycheck_hook_frontpage(&$links)
-{
-    assert(is_array($links));
-    assert(array_key_exists('links', $links));
-
-    $links['config']['sanitycheck'] = [
-        'href' => SimpleSAML\Module::getModuleURL('sanitycheck/index.php'),
-        'text' => '{sanitycheck:strings:link_sanitycheck}',
-    ];
-}
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_moduleinfo.php b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_moduleinfo.php
deleted file mode 100644
index d0eb684e1f3ab7ba9455a77dbae25a0a4a1a76ab..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_moduleinfo.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-/**
- * This hook lets the module describe itself.
- *
- * @param array &$moduleinfo  The links on the frontpage, split into sections.
- * @return void
- */
-function sanitycheck_hook_moduleinfo(&$moduleinfo)
-{
-    assert(is_array($moduleinfo));
-    assert(array_key_exists('info', $moduleinfo));
-
-    $moduleinfo['info']['sanitycheck'] = [
-        'name' => ['en' => 'Sanity check'],
-        'description' => ['en' => 'This module adds functionality for other modules to provide sanity checks.'],
-
-        'dependencies' => ['core'],
-        'uses' => ['cron'],
-    ];
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_sanitycheck.php b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_sanitycheck.php
deleted file mode 100644
index 6288c1be69767b617bec3e5ee13dd9cbf6bade7f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/hooks/hook_sanitycheck.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-/**
- * Hook to add the modinfo module to the frontpage.
- *
- * @param array &$hookinfo  hookinfo
- * @return void
- */
-function sanitycheck_hook_sanitycheck(&$hookinfo)
-{
-    assert(is_array($hookinfo));
-    assert(array_key_exists('errors', $hookinfo));
-    assert(array_key_exists('info', $hookinfo));
-
-    $hookinfo['info'][] = '[sanitycheck] At least the sanity check itself is working :)';
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/en/LC_MESSAGES/sanitycheck.po b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/en/LC_MESSAGES/sanitycheck.po
deleted file mode 100644
index 140725668de0b59cdd3866c9f099602c0d179f5d..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/en/LC_MESSAGES/sanitycheck.po
+++ /dev/null
@@ -1,11 +0,0 @@
-msgid "These checks failed:"
-msgstr "These checks failed:"
-
-msgid "These checks succeeded:"
-msgstr "These checks succeeded:"
-
-msgid "{sanitycheck:strings:link_sanitycheck}"
-msgstr "Sanity check of your SimpleSAMLphp setup"
-
-msgid "Sanity check of your SimpleSAMLphp setup"
-msgstr "Sanity check of your SimpleSAMLphp setup"
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/es/LC_MESSAGES/sanitycheck.po b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/es/LC_MESSAGES/sanitycheck.po
deleted file mode 100644
index 8ccf3453db844db2aa394de45e7da54cb4b6da83..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/es/LC_MESSAGES/sanitycheck.po
+++ /dev/null
@@ -1,11 +0,0 @@
-msgid "These checks failed:"
-msgstr "Las siguientes comprobaciones han fallado:"
-
-msgid "These checks succeeded:"
-msgstr "Las siguientes comprobaciones fueron satisfactorias:"
-
-msgid "{sanitycheck:strings:link_sanitycheck}"
-msgstr "Comprobaciones básicas de la instalación"
-
-msgid "Sanity check of your SimpleSAMLphp setup"
-msgstr "Comprobaciones básicas de la instalación"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/it/LC_MESSAGES/sanitycheck.po b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/it/LC_MESSAGES/sanitycheck.po
deleted file mode 100644
index 558b243e066a7ab4408a5223ad3529b804efc737..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/it/LC_MESSAGES/sanitycheck.po
+++ /dev/null
@@ -1,6 +0,0 @@
-msgid "These checks failed:"
-msgstr "I seguenti controlli hanno riscontrato dei problemi:"
-
-msgid "These checks succeeded:"
-msgstr "I seguenti controlli sono stati eseguiti con successo:"
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/nb/LC_MESSAGES/sanitycheck.po b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/nb/LC_MESSAGES/sanitycheck.po
deleted file mode 100644
index eed8799443a3aaf137c3fb919507338934461357..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/nb/LC_MESSAGES/sanitycheck.po
+++ /dev/null
@@ -1,11 +0,0 @@
-msgid "These checks failed:"
-msgstr "Disse sjekkene har feila:"
-
-msgid "These checks succeeded:"
-msgstr "Disse sjekkene var suksessfulle:"
-
-msgid "{sanitycheck:strings:link_sanitycheck}"
-msgstr "Sjekk din installasjon"
-
-msgid "Sanity check of your SimpleSAMLphp setup"
-msgstr "Sjekk din installasjon"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/nl/LC_MESSAGES/sanitycheck.po b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/nl/LC_MESSAGES/sanitycheck.po
deleted file mode 100644
index e6c41cc5748cdf3f3988b6b778cf1873f296f438..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/nl/LC_MESSAGES/sanitycheck.po
+++ /dev/null
@@ -1,11 +0,0 @@
-msgid "These checks failed:"
-msgstr "De volgende controles zijn mislukt:"
-
-msgid "These checks succeeded:"
-msgstr "De volgende controles zijn geslaagd:"
-
-msgid "{sanitycheck:strings:link_sanitycheck}"
-msgstr "Sanity check van je SimpleSAMLphp setup"
-
-msgid "Sanity check of your SimpleSAMLphp setup"
-msgstr "Sanity check van je SimpleSAMLphp setup"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/nn/LC_MESSAGES/sanitycheck.po b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/nn/LC_MESSAGES/sanitycheck.po
deleted file mode 100644
index e3e4c989f91924dfcc967c6eb6365f954a370855..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/locales/nn/LC_MESSAGES/sanitycheck.po
+++ /dev/null
@@ -1,11 +0,0 @@
-msgid "These checks failed:"
-msgstr "These checks failed:"
-
-msgid "These checks succeeded:"
-msgstr "Desse sjekkane var suksessfulle:"
-
-msgid "{sanitycheck:strings:link_sanitycheck}"
-msgstr "Sjekk din installasjon"
-
-msgid "Sanity check of your SimpleSAMLphp setup"
-msgstr "Sjekk din installasjon"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/phpunit.xml
deleted file mode 100644
index c0985fdd804b18d8d9179ecd956d63582c189e95..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/phpunit.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="tests/bootstrap.php">
-    <testsuites>
-        <testsuite name="The project's test suite">
-            <directory>tests/</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./lib</directory>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" />
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
-        <log type="coverage-clover" target="build/logs/clover.xml" />
-    </logging>
-</phpunit>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/psalm.xml
deleted file mode 100644
index ce1e5b4b8d5ba91c858e191bfb138c847069d3ac..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/psalm.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    name="SimpleSAMLphp sanitycheck module"
-    useDocblockTypes="true"
-    totallyTyped="false"
->
-    <projectFiles>
-        <directory name="config-templates" />
-        <directory name="hooks" />
-        <directory name="templates" />
-        <directory name="www" />
-    </projectFiles>
-
-    <issueHandlers>
-        <LessSpecificReturnType errorLevel="info" />
-
-        <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives -->
-        <DeprecatedMethod errorLevel="info" />
-
-        <MissingClosureReturnType errorLevel="info" />
-        <MissingReturnType errorLevel="info" />
-        <MissingPropertyType errorLevel="info" />
-        <InvalidDocblock errorLevel="info" />
-        <MisplacedRequiredParam errorLevel="info" />
-
-        <PropertyNotSetInConstructor errorLevel="info" />
-        <MissingConstructor errorLevel="info" />
-        <MissingClosureParamType errorLevel="info" />
-        <MissingParamType errorLevel="info" />
-        <UnusedClass errorLevel="info" />
-        <PossiblyUnusedMethod errorLevel="info" />
-    </issueHandlers>
-</psalm>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/templates/check.tpl.php b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/templates/check.tpl.php
deleted file mode 100644
index 2dba59166b643198863c604c2774eca9629fecba..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/templates/check.tpl.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-$this->data['header'] = 'Sanity check';
-$this->includeAtTemplateBase('includes/header.php');
-
-echo '<h2>'.$this->data['header'].'</h2>';
-if (count($this->data['errors']) > 0) {
-    echo '<div style="border: 1px solid #800; background: #caa; margin: 1em; padding: .5em">';
-    echo '<p><img class="float-r" src="/'.$this->data['baseurlpath'].
-        'resources/icons/silk/delete.png" alt="Failed" />These checks failed:</p>';
-    echo '<ul>';
-    foreach ($this->data['errors'] as $err) {
-        echo '<li>'.$err.'</li>';
-    }
-    echo '</ul></div>';
-}
-
-if (count($this->data['info']) > 0) {
-    echo '<div style="border: 1px solid #ccc; background: #eee; margin: 1em; padding: .5em">';
-    echo '<p><img class="float-r" src="/'.$this->data['baseurlpath'].
-        'resources/icons/silk/accept.png" alt="OK" />These checks succeeded:</p>';
-    echo '<ul>';
-    foreach ($this->data['info'] as $i) {
-        echo '<li>'.$i.'</li>';
-    }
-}
-echo '</ul></div>';
-$this->includeAtTemplateBase('includes/footer.php');
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/templates/check.twig b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/templates/check.twig
deleted file mode 100644
index fe51f41809cade804ccfcb83bdd5eb9b3dccfa8a..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/templates/check.twig
+++ /dev/null
@@ -1,46 +0,0 @@
-{% extends "base.twig" %}
-{% set pagetitle = 'Sanity check' %}
-{% block content %}
-
-<h2>{{ pagetitle }}</h2>
-
-{% if errors %}
-
-<div class="message-box error">
-    <div class="pure-g">
-        <div class="pure-u-1-12">
-            <span class="fa fa-times-circle fa-2x"></span>
-        </div>
-        <div class="pure-u-11-12">
-            <p>{{ 'These checks failed:'|trans }}</p>
-
-            <ul class="error-list">
-            {% for err in errors %}
-                <li>{{ err }}</li>
-            {% endfor %}
-            </ul>
-        </div>
-    </div>
-</div>
-{% endif %}
-
-{% if info %}
-<div class="message-box success">
-    <div class="pure-g">
-        <div class="pure-u-1-12">
-            <span class="fa fa-check fa-2x"> </span>
-        </div>
-        <div class="pure-u-11-12">
-            <p>{{ 'These checks succeeded:'|trans }}</p>
-
-            <ul>
-            {% for i in info %}
-                <li>{{ i }}</li>
-            {% endfor %}
-            </ul>
-        </div>
-    </div>
-</div>
-{% endif %}
-
-{% endblock %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/tests/bootstrap.php b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/tests/bootstrap.php
deleted file mode 100644
index 57fcb7dd392498da7eaea23c370e811186306ccd..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/tests/bootstrap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-$projectRoot = dirname(__DIR__);
-require_once($projectRoot.'/vendor/autoload.php');
-
-// Symlink module into ssp vendor lib so that templates and urls can resolve correctly
-$linkPath = $projectRoot.'/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck';
-if (file_exists($linkPath) === false) {
-    echo "Linking '$linkPath' to '$projectRoot'\n";
-    symlink($projectRoot, $linkPath);
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/www/index.php b/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/www/index.php
deleted file mode 100644
index 8946bad073f5ca56a7107056c5343ec8acefda21..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sanitycheck/www/index.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-$config = \SimpleSAML\Configuration::getInstance();
-
-$info = [];
-$errors = [];
-$hookinfo = [
-    'info' => &$info,
-    'errors' => &$errors,
-];
-\SimpleSAML\Module::callHooks('sanitycheck', $hookinfo);
-
-if (isset($_REQUEST['output']) && $_REQUEST['output'] == 'text') {
-    if (count($errors) === 0) {
-        echo 'OK';
-    } else {
-        echo 'FAIL';
-    }
-    exit;
-}
-
-$t = new \SimpleSAML\XHTML\Template($config, 'sanitycheck:check.tpl.php');
-$t->data['pageid'] = 'sanitycheck';
-$t->data['errors'] = $errors;
-$t->data['info'] = $info;
-$t->show();
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/.codecov.yml
deleted file mode 100644
index f7f39e1e93d0ca23383d5ed120442f62f5f15ac9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/.codecov.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-coverage:
-  status:
-    project: yes
-
-comment:
-  layout: "diff"
-  behavior: once
-  require_changes: true
-  require_base: no
-  require_head: yes
-  branches: null
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/LICENSE
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..a345e48d049f9c6756e9364e908b3f26e36c9df1 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/LICENSE
+++ b/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/LICENSE
@@ -1,165 +1,459 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
 
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
 Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/cdc/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/codecov.yml
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/cdc/.codecov.yml
rename to vendor/simplesamlphp/simplesamlphp/modules/smartattributes/codecov.yml
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/composer.json
index 6585c7601a836786881612e32d9d672dc0a2c3da..662341f88d00e83a8caddca21d11655384bef6fa 100644
--- a/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/composer.json
+++ b/vendor/simplesamlphp/simplesamlphp/modules/smartattributes/composer.json
@@ -3,7 +3,7 @@
     "description": "The SmartAttributes module provides additional authentication processing filters to manipulate attributes.",
     "type": "simplesamlphp-module",
     "keywords": ["simplesamlphp", "smartattributes"],
-    "license": "LGPL-3.0-or-later",
+    "license": "LGPL-2.1-or-later",
     "authors": [
         {
             "name": "Andreas Åkre Solberg",
@@ -14,6 +14,9 @@
         "preferred-install": {
             "simplesamlphp/simplesamlphp": "source",
             "*": "dist"
+        },
+        "allow-plugins": {
+            "composer/package-versions-deprecated": true
         }
     },
     "autoload": {
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.codecov.yml
deleted file mode 100644
index f7f39e1e93d0ca23383d5ed120442f62f5f15ac9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.codecov.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-coverage:
-  status:
-    project: yes
-
-comment:
-  layout: "diff"
-  behavior: once
-  require_changes: true
-  require_base: no
-  require_head: yes
-  branches: null
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.travis.yml
deleted file mode 100644
index fec43ab41a5a3b2129c6a4b00802c56325717fe9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.travis.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-sudo: required
-
-language: php
-
-php:
-  - 5.6
-  - 7.0
-  - 7.1
-  - 7.2
-  - 7.3
-
-env:
-  - SIMPLESAMLPHP_VERSION=1.17.*
-
-before_script:
-  - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
-  - composer update --no-interaction
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then composer require --dev vimeo/psalm:1.1.9; fi
-
-script:
-  - bin/check-syntax.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
-
-after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/LICENSE
deleted file mode 100644
index 0a041280bd00a9d068f503b8ee7ce35214bd24a1..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/LICENSE
+++ /dev/null
@@ -1,165 +0,0 @@
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/bin/check-syntax.sh b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/bin/check-syntax.sh
deleted file mode 100755
index db6dc4b0140cb09231c6bf2e756c6a668e8e7cbe..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/bin/check-syntax.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-PHP='/usr/bin/env php'
-RETURN=0
-
-# check PHP files
-for FILE in `find lib tests -name "*.php"`; do
-    $PHP -l $FILE > /dev/null 2>&1
-    if [ $? -ne 0 ]; then
-        echo "Syntax check failed for ${FILE}"
-        RETURN=`expr ${RETURN} + 1`
-    fi
-done
-
-exit $RETURN
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/composer.json
deleted file mode 100644
index b4f110242987935f26763ad6963df0bcbf23c585..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/composer.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-    "name": "simplesamlphp/simplesamlphp-module-sqlauth",
-    "description": "This is a authentication module for authenticating a user against a SQL database",
-    "type": "simplesamlphp-module",
-    "keywords": ["simplesamlphp", "sqlauth"],
-    "license": "LGPL-3.0-or-later",
-    "authors": [
-        {
-            "name": "Olav Morken",
-            "email": "olavmrk@gmail.com"
-        }
-    ],
-    "config": {
-        "preferred-install": {
-            "simplesamlphp/simplesamlphp": "source",
-            "*": "dist"
-        }
-    },
-    "autoload": {
-        "psr-4": {
-            "SimpleSAML\\Module\\sqlauth\\": "lib/"
-        }
-    },
-    "autoload-dev": {
-        "psr-4": {
-            "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils"
-        }
-    },
-    "require": {
-        "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1"
-    },
-    "require-dev": {
-        "phpunit/phpunit": "~5.7",
-        "simplesamlphp/simplesamlphp": "^1.17",
-        "webmozart/assert": "^1.4"
-    },
-    "support": {
-        "issues": "https://github.com/tvdijen/simplesamlphp-module-sqlauth/issues",
-        "source": "https://github.com/tvdijen/simplesamlphp-module-sqlauth"
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/default-disable b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/default-disable
deleted file mode 100644
index fa0bd82e2df7bd79d57593d35bc53c1f9d3ef71f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/default-disable
+++ /dev/null
@@ -1,3 +0,0 @@
-This file indicates that the default state of this module
-is disabled. To enable, create a file named enable in the
-same directory as this file.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/docs/sql.md b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/docs/sql.md
deleted file mode 100644
index 310b47eb17d971c63a4881e58065c29c25271074..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/docs/sql.md
+++ /dev/null
@@ -1,100 +0,0 @@
-`sqlauth:SQL`
-=============
-
-This is a authentication module for authenticating a user against a SQL database.
-
-
-Options
--------
-
-`dsn`
-:   The DSN which should be used to connect to the database server.
-    Check the various database drivers in the [PHP documentation](http://php.net/manual/en/pdo.drivers.php) for a description of the various DSN formats.
-
-`username`
-:   The username which should be used when connecting to the database server.
-
-
-`password`
-:   The password which should be used when connecting to the database server.
-
-`query`
-:   The SQL query which should be used to retrieve the user.
-    The parameters :username and :password are available.
-    If the username/password is incorrect, the query should return no rows.
-    The name of the columns in resultset will be used as attribute names.
-    If the query returns multiple rows, they will be merged into the attributes.
-    Duplicate values and NULL values will be removed.
-
-
-Examples
---------
-
-Database layout used in some of the examples:
-
-    CREATE TABLE users (
-      uid VARCHAR(30) NOT NULL PRIMARY KEY,
-      password TEXT NOT NULL,
-      salt TEXT NOT NULL,
-      givenName TEXT NOT NULL,
-      email TEXT NOT NULL,
-      eduPersonPrincipalName TEXT NOT NULL
-    );
-    CREATE TABLE usergroups (
-      uid VARCHAR(30) NOT NULL REFERENCES users (uid) ON DELETE CASCADE ON UPDATE CASCADE,
-      groupname VARCHAR(30) NOT NULL,
-      UNIQUE(uid, groupname)
-    );
-
-Example query - SHA256 of salt + password, with the salt stored in an independent column, MySQL server:
-
-    SELECT uid, givenName, email, eduPersonPrincipalName
-    FROM users
-    WHERE uid = :username
-    AND PASSWORD = SHA2(
-        CONCAT(
-            (SELECT salt FROM users WHERE uid = :username),
-            :password
-        ),
-        256
-    )
-
-Example query - SHA256 of salt + password, with the salt stored in an independent column. Multiple groups, MySQL server:
-
-    SELECT users.uid, givenName, email, eduPersonPrincipalName, groupname AS groups
-    FROM users LEFT JOIN usergroups ON users.uid = usergroups.username
-    WHERE users.uid = :username
-    AND PASSWORD = SHA2(
-        CONCAT(
-            (SELECT salt FROM users WHERE uid = :username),
-            :password
-        ),
-        256
-    )
-
-Example query - SHA512 of salt + password, stored as salt (32 bytes) + sha256(salt + password) in password-field, PostgreSQL server:
-
-    SELECT uid, givenName, email, eduPersonPrincipalName
-    FROM users
-    WHERE username = :username
-    AND SUBSTRING(
-        password FROM LENGTH(password) - 31
-    ) = SHA2(
-        CONCAT(
-            SUBSTRING(password FROM 1 FOR LENGTH(password) - 32),
-            :password
-        ),
-        512
-    )
-
-Security considerations
------------------------
-
-Please never store passwords in plaintext in a database. You should always hash your passwords with a secure one-way
-function like the ones in the SHA2 family. Use randomly generated salts with a length at least equal to the hash of the
-password itself. Salts should be per-password, that meaning every time a password changes, the salt must change, and
-therefore salts must be stored in the database alongside the passwords they were used for. Application-wide salts can
-be used (by just concatenating them to the input of the hash function), but should never replace per-password salts,
-used instead as an additional security measure.
-
-One way hashing algorithms like MD5 or SHA1 are considered insecure and should therefore be avoided.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php
deleted file mode 100644
index b820a6a3e44dc818969bd46d300b059cc777c21e..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php
+++ /dev/null
@@ -1,199 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\sqlauth\Auth\Source;
-
-/**
- * Simple SQL authentication source
- *
- * This class is an example authentication source which authenticates an user
- * against a SQL database.
- *
- * @package SimpleSAMLphp
- */
-
-class SQL extends \SimpleSAML\Module\core\Auth\UserPassBase
-{
-    /**
-     * The DSN we should connect to.
-     */
-    private $dsn;
-
-    /**
-     * The username we should connect to the database with.
-     */
-    private $username;
-
-    /**
-     * The password we should connect to the database with.
-     */
-    private $password;
-
-    /**
-     * The options that we should connect to the database with.
-     */
-    private $options;
-
-    /**
-     * The query we should use to retrieve the attributes for the user.
-     *
-     * The username and password will be available as :username and :password.
-     */
-    private $query;
-
-    /**
-     * Constructor for this authentication source.
-     *
-     * @param array $info  Information about this authentication source.
-     * @param array $config  Configuration.
-     */
-    public function __construct($info, $config)
-    {
-        assert(is_array($info));
-        assert(is_array($config));
-
-        // Call the parent constructor first, as required by the interface
-        parent::__construct($info, $config);
-
-        // Make sure that all required parameters are present.
-        foreach (['dsn', 'username', 'password', 'query'] as $param) {
-            if (!array_key_exists($param, $config)) {
-                throw new \Exception('Missing required attribute \''.$param.
-                    '\' for authentication source '.$this->authId);
-            }
-
-            if (!is_string($config[$param])) {
-                throw new \Exception('Expected parameter \''.$param.
-                    '\' for authentication source '.$this->authId.
-                    ' to be a string. Instead it was: '.
-                    var_export($config[$param], true));
-            }
-        }
-
-        $this->dsn = $config['dsn'];
-        $this->username = $config['username'];
-        $this->password = $config['password'];
-        $this->query = $config['query'];
-        if (isset($config['options'])) {
-            $this->options = $config['options'];
-        }
-    }
-
-
-    /**
-     * Create a database connection.
-     *
-     * @return \PDO  The database connection.
-     */
-    private function connect()
-    {
-        try {
-            $db = new \PDO($this->dsn, $this->username, $this->password, $this->options);
-        } catch (\PDOException $e) {
-            throw new \Exception('sqlauth:'.$this->authId.': - Failed to connect to \''.
-                $this->dsn.'\': '.$e->getMessage());
-        }
-
-        $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
-
-        $driver = explode(':', $this->dsn, 2);
-        $driver = strtolower($driver[0]);
-
-        // Driver specific initialization
-        switch ($driver) {
-            case 'mysql':
-                // Use UTF-8
-                $db->exec("SET NAMES 'utf8mb4'");
-                break;
-            case 'pgsql':
-                // Use UTF-8
-                $db->exec("SET NAMES 'UTF8'");
-                break;
-        }
-
-        return $db;
-    }
-
-
-    /**
-     * Attempt to log in using the given username and password.
-     *
-     * On a successful login, this function should return the users attributes. On failure,
-     * it should throw an exception. If the error was caused by the user entering the wrong
-     * username or password, a \SimpleSAML\Error\Error('WRONGUSERPASS') should be thrown.
-     *
-     * Note that both the username and the password are UTF-8 encoded.
-     *
-     * @param string $username  The username the user wrote.
-     * @param string $password  The password the user wrote.
-     * @return array  Associative array with the users attributes.
-     */
-    protected function login($username, $password)
-    {
-        assert(is_string($username));
-        assert(is_string($password));
-
-        $db = $this->connect();
-
-        try {
-            $sth = $db->prepare($this->query);
-        } catch (\PDOException $e) {
-            throw new \Exception('sqlauth:'.$this->authId.
-                ': - Failed to prepare query: '.$e->getMessage());
-        }
-
-        try {
-            $sth->execute(['username' => $username, 'password' => $password]);
-        } catch (\PDOException $e) {
-            throw new \Exception('sqlauth:'.$this->authId.
-                ': - Failed to execute query: '.$e->getMessage());
-        }
-
-        try {
-            $data = $sth->fetchAll(\PDO::FETCH_ASSOC);
-        } catch (\PDOException $e) {
-            throw new \Exception('sqlauth:'.$this->authId.
-                ': - Failed to fetch result set: '.$e->getMessage());
-        }
-
-        \SimpleSAML\Logger::info('sqlauth:'.$this->authId.': Got '.count($data).
-            ' rows from database');
-
-        if (count($data) === 0) {
-            // No rows returned - invalid username/password
-            \SimpleSAML\Logger::error('sqlauth:'.$this->authId.
-                ': No rows in result set. Probably wrong username/password.');
-            throw new \SimpleSAML\Error\Error('WRONGUSERPASS');
-        }
-
-        /* Extract attributes. We allow the resultset to consist of multiple rows. Attributes
-         * which are present in more than one row will become multivalued. null values and
-         * duplicate values will be skipped. All values will be converted to strings.
-         */
-        $attributes = [];
-        foreach ($data as $row) {
-            foreach ($row as $name => $value) {
-                if ($value === null) {
-                    continue;
-                }
-
-                $value = (string) $value;
-
-                if (!array_key_exists($name, $attributes)) {
-                    $attributes[$name] = [];
-                }
-
-                if (in_array($value, $attributes[$name], true)) {
-                    // Value already exists in attribute
-                    continue;
-                }
-
-                $attributes[$name][] = $value;
-            }
-        }
-
-        \SimpleSAML\Logger::info('sqlauth:'.$this->authId.': Attributes: '.
-            implode(',', array_keys($attributes)));
-
-        return $attributes;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/phpunit.xml
deleted file mode 100644
index c0985fdd804b18d8d9179ecd956d63582c189e95..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/phpunit.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="tests/bootstrap.php">
-    <testsuites>
-        <testsuite name="The project's test suite">
-            <directory>tests/</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./lib</directory>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" />
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
-        <log type="coverage-clover" target="build/logs/clover.xml" />
-    </logging>
-</phpunit>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/psalm.xml
deleted file mode 100644
index a9cae34101aeb861353a1647059bb37ed40e205a..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/psalm.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    name="The SimpleSAMLphp sqlauth module"
-    useDocblockTypes="true"
-    totallyTyped="false"
->
-    <projectFiles>
-        <directory name="lib" />
-    </projectFiles>
-
-    <issueHandlers>
-        <LessSpecificReturnType errorLevel="info" />
-
-        <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives -->
-        <DeprecatedMethod errorLevel="info" />
-
-        <MissingClosureReturnType errorLevel="info" />
-        <MissingReturnType errorLevel="info" />
-        <MissingPropertyType errorLevel="info" />
-        <InvalidDocblock errorLevel="info" />
-        <MisplacedRequiredParam errorLevel="info" />
-
-        <PropertyNotSetInConstructor errorLevel="info" />
-        <MissingConstructor errorLevel="info" />
-        <MissingClosureParamType errorLevel="info" />
-        <MissingParamType errorLevel="info" />
-        <UnusedClass errorLevel="info" />
-        <PossiblyUnusedMethod errorLevel="info" />
-    </issueHandlers>
-</psalm>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/tests/bootstrap.php b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/tests/bootstrap.php
deleted file mode 100644
index 28efee11df1f5b3ff515ddffd584f632b7d78c83..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/tests/bootstrap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-$projectRoot = dirname(__DIR__);
-require_once($projectRoot.'/vendor/autoload.php');
-
-// Symlink module into ssp vendor lib so that templates and urls can resolve correctly
-$linkPath = $projectRoot.'/vendor/simplesamlphp/simplesamlphp/modules/sqlauth';
-if (file_exists($linkPath) === false) {
-    echo "Linking '$linkPath' to '$projectRoot'\n";
-    symlink($projectRoot, $linkPath);
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/.php_cs.dist b/vendor/simplesamlphp/simplesamlphp/modules/statistics/.php_cs.dist
deleted file mode 100644
index 33467ebed8fd85e1f86baae2dc2f5b75cbe7143f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/.php_cs.dist
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-$finder = PhpCsFixer\Finder::create()
-    ->in([
-        __DIR__ . '/lib',
-        __DIR__ . '/tests',
-        __DIR__ . '/www',
-    ])
-;
-return PhpCsFixer\Config::create()
-    ->setRules([
-        '@PSR2' => true,
-        '@PSR4' => true,
-        '@PSR5' => true,
-    ])
-    ->setFinder($finder)
-;
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/statistics/.travis.yml
deleted file mode 100644
index 208a6d6c78faaea8f1720aff7a6a2a756d266ab3..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/.travis.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-sudo: required
-
-language: php
-
-php:
-  - 5.6
-  - 7.0
-  - 7.1
-  - 7.2
-  - 7.3
-
-env:
-  - SIMPLESAMLPHP_VERSION=1.17.*
-
-before_script:
-  - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update
-  - composer update --no-interaction
-
-script:
-  - vendor/simplesamlphp/simplesamlphp-test-framework/bin/check-syntax-php.sh
-  - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi
-  - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi
-
-after_success:
-  # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved
-  - curl -s https://codecov.io/bash > .codecov
-  - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov
-  - chmod +x .codecov
-  - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi
-# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/bin/loganalyzer.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/bin/loganalyzer.php
deleted file mode 100755
index 830d0d74be863093b66f378706ee7b409957525c..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/bin/loganalyzer.php
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-// This is the base directory of the SimpleSAMLphp installation
-$baseDir = dirname(dirname(dirname(dirname(__FILE__))));
-
-// Add library autoloader.
-require_once($baseDir . '/lib/_autoload.php');
-
-// Initialize the configuration.
-$configdir = \SimpleSAML\Utils\Config::getConfigDir();
-\SimpleSAML\Configuration::setConfigDir($configdir);
-\SimpleSAML\Utils\Time::initTimezone();
-
-$progName = array_shift($argv);
-$debug = false;
-$dryrun = false;
-
-foreach ($argv as $a) {
-    if (strlen($a) === 0) {
-        continue;
-    }
-    if (strpos($a, '=') !== false) {
-        $p = strpos($a, '=');
-        $v = substr($a, $p + 1);
-        $a = substr($a, 0, $p);
-    } else {
-        $v = null;
-    }
-
-    // Map short options to long options.
-    $shortOptMap = ['-d' => '--debug'];
-    if (array_key_exists($a, $shortOptMap)) {
-        $a = $shortOptMap[$a];
-    }
-    switch ($a) {
-        case '--help':
-            printHelp();
-            exit(0);
-        case '--debug':
-            $debug = true;
-            break;
-        case '--dry-run':
-            $dryrun = true;
-            break;
-        default:
-            echo 'Unknown option: ' . $a . "\n";
-            echo 'Please run `' . $progName . ' --help` for usage information.' . "\n";
-            exit(1);
-    }
-}
-
-$aggregator = new \SimpleSAML\Module\statistics\Aggregator(true);
-$aggregator->dumpConfig();
-$aggregator->debugInfo();
-$results = $aggregator->aggregate($debug);
-$aggregator->debugInfo();
-
-if (!$dryrun) {
-    $aggregator->store($results);
-}
-
-foreach ($results as $slot => $val) {
-    foreach ($val as $sp => $no) {
-        echo $sp . " " . count($no) . " - ";
-    }
-    echo "\n";
-}
-
-
-/**
- * This function prints the help output.
- * @return void
- */
-function printHelp()
-{
-    global $progName;
-
-    echo <<<END
-Usage: $progName [options]
-
-This program parses and aggregates SimpleSAMLphp log files.
-
-Options:
- -d, --debug			Used when configuring the log file syntax. See doc.
- --dry-run			Aggregate but do not store the results.
-END;
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/bin/logcleaner.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/bin/logcleaner.php
deleted file mode 100755
index 45afa1b09d80264f8f5d7866776bd4f24011c24e..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/bin/logcleaner.php
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-// This is the base directory of the SimpleSAMLphp installation
-$baseDir = dirname(dirname(dirname(dirname(__FILE__))));
-
-// Add library autoloader.
-require_once($baseDir . '/lib/_autoload.php');
-
-// Initialize the configuration.
-$configdir = \SimpleSAML\Utils\Config::getConfigDir();
-\SimpleSAML\Configuration::setConfigDir($configdir);
-
-$progName = array_shift($argv);
-$debug = false;
-$dryrun = false;
-$output = '/tmp/simplesamlphp-new.log';
-$infile = null;
-
-foreach ($argv as $a) {
-    if (strlen($a) === 0) {
-        continue;
-    }
-    if (strpos($a, '=') !== false) {
-        $p = strpos($a, '=');
-        $v = substr($a, $p + 1);
-        $a = substr($a, 0, $p);
-    } else {
-        $v = null;
-    }
-
-    // Map short options to long options.
-    $shortOptMap = ['-d' => '--debug'];
-    if (array_key_exists($a, $shortOptMap)) {
-        $a = $shortOptMap[$a];
-    }
-
-    switch ($a) {
-        case '--help':
-            printHelp();
-            exit(0);
-        case '--debug':
-            $debug = true;
-            break;
-        case '--dry-run':
-            $dryrun = true;
-            break;
-        case '--infile':
-            $infile = $v;
-            break;
-        case '--outfile':
-            $output = $v;
-            break;
-        default:
-            echo 'Unknown option: ' . $a . "\n";
-            echo 'Please run `' . $progName . ' --help` for usage information.' . "\n";
-            exit(1);
-    }
-}
-
-$cleaner = new \SimpleSAML\Module\statistics\LogCleaner($infile);
-$cleaner->dumpConfig();
-$todelete = $cleaner->clean($debug);
-
-echo "Cleaning these trackIDs: " . join(', ', $todelete) . "\n";
-
-if (!$dryrun) {
-    $cleaner->store($todelete, $output);
-}
-
-/**
- * This function prints the help output.
- * @return void
- */
-function printHelp()
-{
-    global $progName;
-
-    echo <<<END
-Usage: $progName [options]
-
-This program cleans logs. This script is experimental. Do not run it unless you have talked to Andreas about it. 
-The script deletes log lines related to sessions that produce more than 200 lines.
-
-Options:
-	-d, --debug			Used when configuring the log file syntax. See doc.
-	--dry-run			Aggregate but do not store the results.
-	--infile			File input.
-	--outfile			File to output the results.
-
-END;
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/statistics/composer.json
deleted file mode 100644
index 10ddc9c7fad447f98674d06420e4f47150620c48..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/composer.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
-    "name": "simplesamlphp/simplesamlphp-module-statistics",
-    "description": "The SimpleSAMLphp statistics module",
-    "type": "simplesamlphp-module",
-    "keywords": ["simplesamlphp", "statistics"],
-    "license": "LGPL-2.1-or-later",
-    "authors": [
-        {
-            "name": "Andreas Åkre Solberg",
-            "email": "andreas.solberg@uninett.no"
-        }
-    ],
-    "config": {
-        "preferred-install": {
-            "simplesamlphp/simplesamlphp": "source",
-            "*": "dist"
-        }
-    },
-    "autoload": {
-        "psr-4": {
-            "SimpleSAML\\Module\\statistics\\": "lib/"
-        }
-    },
-    "autoload-dev": {
-        "psr-4": {
-            "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils"
-        }
-    },
-    "require": {
-        "php": ">=5.6",
-        "simplesamlphp/composer-module-installer": "~1.1",
-        "webmozart/assert": "^1.4"
-    },
-    "require-dev": {
-        "phpunit/phpunit": "~5.7",
-        "simplesamlphp/simplesamlphp": "^1.17",
-        "simplesamlphp/simplesamlphp-test-framework": "^0.0.12"
-    },
-    "support": {
-        "issues": "https://github.com/simplesamlphp/simplesamlphp-module-statistics/issues",
-        "source": "https://github.com/simplesamlphp/simplesamlphp-module-statistics"
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/config-templates/module_statistics.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/config-templates/module_statistics.php
deleted file mode 100644
index ccc119548da5319e4ec5e7fd8adc30d92348047b..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/config-templates/module_statistics.php
+++ /dev/null
@@ -1,190 +0,0 @@
-<?php
-/*
- * The configuration of SimpleSAMLphp statistics package
- */
-
-$config = [
-    // Authentication & authorization for statistics
-
-    // Whether the statistics require authentication before use.
-    'protected' => false,
-
-    // The authentication source that should be used.
-    'auth' => 'admin',
-
-    // Alternative 1: List of allowed users.
-    //'useridattr' => 'eduPersonPrincipalName',
-    //'allowedUsers' => array('andreas@uninett.no', 'ola.normann@sp.example.org'),
-
-    // Alternative 2: External ACL list.
-    //'acl' => 'adminlist',
-
-    'default' => 'sso',
-
-    'statdir' => '/tmp/stats/',
-    'inputfile' => '/var/log/simplesamlphp.stat',
-    'offset' => 60 * 60 * 2 + 60 * 60 * 24 * 3, // Two hours offset to match epoch and norwegian winter time.
-
-    'datestart' => 1,
-    'datelength' => 15,
-    'offsetspan' => 21,
-
-    // Dimensions on graph from Google Charts in pixels...
-    'dimension.x' => 800,
-    'dimension.y' => 350,
-
-    /*
-     * Do you want to generate statistics using the cron module? If so, specify which cron tag to use.
-     * Examples: daily, weekly
-     * To not run statistics in cron, set value to
-     *     'cron_tag' => null,
-     */
-    'cron_tag' => 'daily',
-
-    /*
-     * Set max running time for this script. This is also controlled by max_execution_time in php.ini
-     * and is set to 30 sec by default. Your web server can have other timeout configurations that may
-     * also interrupt PHP execution. Apache has a Timeout directive and IIS has a
-     * CGI timeout function. Both default to 300 seconds.
-     */
-    'time_limit' => 300,
-
-    'timeres' => [
-        'day' => [
-            'name' => 'Day',
-            'slot'              => 60 * 15, // Slots of 15 minutes
-            'fileslot'          => 60 * 60 * 24, // One day (24 hours) file slots
-            'axislabelint'      => 6 * 4, // Number of slots per label. 4 per hour *6 = 6 hours
-            'dateformat-period' => 'j. M', //  4. Mars
-            'dateformat-intra'  => 'j. M H:i', //  4. Mars 12:30
-        ],
-        'week' => [
-            'name' => 'Week',
-            'slot'              => 60 * 60, // Slots of one hour
-            'fileslot'          => 60 * 60 * 24 * 7, // 7 days of data in each file
-            'axislabelint'      => 24, // Number of slots per label. 24 is one each day
-            'dateformat-period' => 'j. M', //  4. Mars
-            'dateformat-intra'  => 'j. M H:i', //  4. Mars 12:30
-        ],
-        'month' => [
-            'name' => 'Month',
-            'slot'              => 60 * 60 * 24, // Slots of one day
-            'fileslot'          => 60 * 60 * 24 * 30, // 30 days of data in each file
-            'axislabelint'      => 7, // Number of slots per label. 7 days => 1 week
-            'dateformat-period' => 'j. M Y H:i', //  4. Mars 12:30
-            'dateformat-intra'  => 'j. M', //  4. Mars
-        ],
-        'monthaligned' => [
-            'name'              => 'AlignedMonth',
-            'slot'              => 60 * 60 * 24, // Slots of one day
-            'fileslot'          => null, // 30 days of data in each file
-            'customDateHandler' => 'month',
-            'axislabelint'      => 7, // Number of slots per label. 7 days => 1 week
-            'dateformat-period' => 'j. M Y H:i', //  4. Mars 12:30
-            'dateformat-intra'  => 'j. M', //  4. Mars
-        ],
-        'days180' => [
-            'name'              => '180 days',
-            'slot'              => 60 * 60 * 24, // Slots of 1 day (24 hours)
-            'fileslot'          => 60 * 60 * 24 * 180, // 80 days of data in each file
-            'axislabelint'      => 30, // Number of slots per label. 7 days => 1 week
-            'dateformat-period' => 'j. M', //  4. Mars
-            'dateformat-intra'  => 'j. M', //  4. Mars
-        ],
-    ],
-
-    'statrules' => [
-        'sloratio' => [
-            'name'         => 'SLO to SSO ratio',
-            'descr'        => 'Comparison of the number of Single Log-Out compared to Single Sign-On.' .
-                ' Graph shows how many logouts where initiated for each Single Sign-On.',
-            'type'         => 'calculated',
-            'presenter'    => 'statistics:Ratio',
-            'ref'          => ['slo', 'sso'],
-            'fieldPresentation' => [
-                'class'    => 'statistics:Entity',
-                'config'   => 'saml20-sp-remote',
-            ],
-        ],
-        'ssomulti' => [
-            'name'         => 'Requests per session',
-            'descr'        => 'Number of SSO request pairs exchanged between IdP and SP within the same IdP session.' .
-                ' A high number indicates that the session at the SP is timing out faster than at the IdP.',
-            'type'         => 'calculated',
-            'presenter'    => 'statistics:Ratio',
-            'ref'          => ['sso', 'ssofirst'],
-            'fieldPresentation' => [
-                'class'    => 'statistics:Entity',
-                'config'   => 'saml20-sp-remote',
-            ],
-        ],
-        'sso' => [
-            'name'         => 'SSO to service',
-            'descr'        => 'The number of logins at a Service Provider.',
-            'action'       => 'saml20-idp-SSO',
-            'col'          => 6, // Service Provider EntityID
-            'fieldPresentation' => [
-                'class'    => 'statistics:Entity',
-                'config'   => 'saml20-sp-remote',
-            ],
-        ],
-        'ssofirst' => [
-            'name'         => 'SSO-first to service',
-            'descr'        => 'The number of logins at a Service Provider.',
-            'action'       => 'saml20-idp-SSO-first',
-            'col'          => 6, // Service Provider EntityID
-            'fieldPresentation' => [
-                'class'    => 'statistics:Entity',
-                'config'   => 'saml20-sp-remote',
-            ],
-        ],
-        'slo' => [
-            'name'         => 'SLO initiated from service',
-            'descr'        => 'The number of initated Sinlge Logout from each of the service providers.',
-            'action'       => 'saml20-idp-SLO',
-            'col'          => 7, // Service Provider EntityID that initiated the logout.
-            'fieldPresentation' => [
-                'class'    => 'statistics:Entity',
-                'config'   => 'saml20-sp-remote',
-            ],
-        ],
-        'consent' => [
-            'name'         => 'Consent',
-            'descr'        => 'Consent statistics. Everytime a user logs in to a service an entry is logged for' .
-                ' one of three states: consent was found, consent was not found or consent storage was not available.',
-            'action'       => 'consent',
-            'col'          => 6,
-            'fieldPresentation' => [
-                'class'    => 'statistics:Entity',
-                'config'   => 'saml20-sp-remote',
-            ],
-        ],
-        'consentresponse' => [
-            'name'         => 'Consent response',
-            'descr'        => 'Consent response statistics. Everytime a user accepts consent,' .
-                ' it is logged whether the user selected to remember the consent to next time.',
-            'action'       => 'consentResponse',
-            'col'          => 6,
-            'fieldPresentation' => [
-                'class'    => 'statistics:Entity',
-                'config'   => 'saml20-sp-remote',
-            ],
-        ],
-        'slopages' => [
-            'name'         => 'SLO iframe pages',
-            'descr'        => 'The varioust IFrame SLO pages a user visits',
-            'action'       => 'slo-iframe',
-            'col'          => 6, // Page the user visits.
-        ],
-        'slofail' => [
-            'name'         => 'Failed iframe IdP-init SLOs',
-            'descr'        => 'The number of logout failures from various SPs',
-            'action'       => 'slo-iframe-fail',
-            'col'          => 6, // Service Provider EntityID that wasn't logged out.
-            'fieldPresentation' => [
-                'class'    => 'statistics:Entity',
-                'config'   => 'saml20-sp-remote',
-            ],
-        ],
-    ],
-];
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/default-disable b/vendor/simplesamlphp/simplesamlphp/modules/statistics/default-disable
deleted file mode 100644
index fa0bd82e2df7bd79d57593d35bc53c1f9d3ef71f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/default-disable
+++ /dev/null
@@ -1,3 +0,0 @@
-This file indicates that the default state of this module
-is disabled. To enable, create a file named enable in the
-same directory as this file.
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/dictionaries/statistics.definition.json b/vendor/simplesamlphp/simplesamlphp/modules/statistics/dictionaries/statistics.definition.json
deleted file mode 100644
index 065b7b4d386391ae247300b09bd6c249172ea039..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/dictionaries/statistics.definition.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "link_statistics": {
-    "en": "Show statistics"
-  },
-  "link_statistics_metadata": {
-    "en": "Show statistics metadata"
-  }
-}
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/dictionaries/statistics.translation.json b/vendor/simplesamlphp/simplesamlphp/modules/statistics/dictionaries/statistics.translation.json
deleted file mode 100644
index 7a4adb1eac0e76cc9c663a958a925be135ca316f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/dictionaries/statistics.translation.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "link_statistics": {
-    "es": "Mostrar estadísticas",
-    "no": "Vis statistikker",
-    "nn": "Vis statistikkar",
-    "ca": "Mostra les estadístiques"
-  },
-  "link_statistics_metadata": {
-    "es": "Mostrar metadatos de las estadísticas",
-    "no": "Vis metadata om statistikker",
-    "nn": "Vis metadata om statistikkar",
-    "ca": "Mostra les estadístiques de les metadades"
-  }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/docs/statistics.md b/vendor/simplesamlphp/simplesamlphp/modules/statistics/docs/statistics.md
deleted file mode 100644
index 07d7e40c44f997347b688da3fb30a36e70a6d907..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/docs/statistics.md
+++ /dev/null
@@ -1,129 +0,0 @@
-The SimpleSAMLphp statistics module
-===================================
-
-
-<!-- 
-	This file is written in Markdown syntax. 
-	For more information about how to use the Markdown syntax, read here:
-	http://daringfireball.net/projects/markdown/syntax
--->
-
-  * Andreas Åkre Solberg <andreas.solberg@uninett.no>
-
-
-## Configure your logs
-
-It's recommended to use syslog for logging, then a separate log level is
-dedicated to statistics. You need to get all statistics log entries
-in one log file. Here is how I do it in syslog.conf:
-
-    # SimpleSAMLphp logging
-    local5.*                        /var/log/simplesamlphp.log
-    # Notice level is reserved for statistics only...
-    local5.=notice                  /var/log/simplesamlphp.stat
-
-Then make sure you have configured this correctly such that you
-have one log file like this:
-
-    # ls -la /var/log/simplesamlphp.stat
-    -rw-r--r-- 1 root root 76740 Nov 15 13:37 /var/log/simplesamlphp.stat
-
-With content that looks like this:
-
-    # tail /var/log/simplesamlphp.stat
-    Nov 15 12:01:49 www1 simplesamlphp-foodle[31960]: 5 STAT [77013b4b6e] saml20-sp-SSO urn:mace:feide.no:services:no.feide.foodle sam.feide.no andreas@uninett.no
-    Nov 15 13:01:14 www1 simplesamlphp-openwiki[2247]: 5 STAT [50292b9d04] saml20-sp-SSO urn:mace:feide.no:services:no.feide.openwikicore sam.feide.no NA
-    Nov 15 13:16:39 www1 simplesamlphp-openwiki[2125]: 5 STAT [3493d5d87f] saml20-sp-SSO urn:mace:feide.no:services:no.feide.openwikicore sam.feide.no NA
-    Nov 15 13:37:27 www1 simplesamlphp-foodle[3146]: 5 STAT [77013b4b6e] AUTH-login-admin OK
-
-Here you can see that I collect statistics in one file for several installations. You could easily separate each instance of SimpleSAMLphp into separate files (your preference).
-
-## Configure the statistics module
-
-First enable the statistics module, as you enable any other module:
-
-    cd modules/statistics
-    touch enable
-
-Then take the configuration template:
-
-    cp modules/statistics/config-templates/*.php config/
-
-Configure the path of the log file:
-
-    'inputfile' => '/var/log/simplesamlphp.stat',
-
-Make sure the stat dir is writable. SimpleSAMLphp will write data here:
-
-    'statdir' => '/var/lib/simplesamlphp/stats/',
-
-### Configuring the syntax of the logfile
-
-Syslog uses different date formats on different environments, so you need to do some manual tweaking to make sure that SimpleSAMLphp knows how to interpret the logs.
-
-There are three parameter values you need to make sure are correct.
-
-	'datestart'  => 1,
-	'datelength' => 15,
-	'offsetspan' => 21,
-
-The first `datestart` is 1 when the date starts from the beginning of the line. The `datelength` parameter tells how many characters long the date is.
-
-The `offsetspan` parameter shows on which character the first column starts, such that the STAT keyword becomes column number 3.
-
-Use the `loganalyzer` script with the `--debug` parameter to debug whether your configuration is correct. If not, then it easy to see what is wrong, for example if the STAT keyword is not in column 3.
-
-Here is some example output:
-
-
-	$ cd modules/statistics/bin
-	$ ./loganalyzer.php --debug
-	Statistics directory   : /var/lib/simplesamlphp/stats/
-	Input file             : /Users/andreas/Desktop/simplesamlphp.log
-	Offset                 : 4237200
-	----------------------------------------
-	Log line: Feb 11 11:32:57 moria-app1 syslog_moria-app1[6630]: 5 STAT [2d41ee3f1e] AUTH-login-admin Failed
-	Date parse [Feb 11 11:32:57] to [Wed, 11 Feb 09 11:32:57 +0100]
-	Array
-	(
-		[0] => moria-app1
-		[1] => syslog_moria-app1[6630]:
-		[2] => 5
-		[3] => STAT
-		[4] => [2d41ee3f1e]
-		[5] => AUTH-login-admin
-		[6] => Failed
-	)
-
-In the debug output, please verify four things:
-
- 1. That the first field in the date parse line contains all the characters that are part of the timestamp, compared with the log line on the line above.
- 2. Verify that the second field in the date parse line is correct: corresponding to the input timestamp.
- 3. That the first `[0]` field contains all the characters from the first column.
- 4. That column `[3]` is STAT.
-
-
-### Setup cron
-
-You also should setup the cron module:
-
-    cd modules/cron
-    touch enable
-
-### Alternative to using the cron module
-
-As an alternative to using the cron module you can run the
-script `statistics/bin/loganalyzer.php` manually.
-
-## Presentation of the statistics
-
-At the Installation page there will be a link "show statistics", go there and if SimpleSAMLphp finds the statistics files in the `statdir` generated from cron or the script you will see statistics. Enjoy.
-
-Support
--------
-
-If you need help to make this work, or want to discuss SimpleSAMLphp with other users of the software, you are fortunate: Around SimpleSAMLphp there is a great Open source community, and you are welcome to join! The forums are open for you to ask questions, contribute answers other further questions, request improvements or contribute with code or plugins of your own.
-
--  [SimpleSAMLphp homepage](http://simplesamlphp.org)
--  [List of all available SimpleSAMLphp documentation](http://simplesamlphp.org/docs/stable/)
--  [Join the SimpleSAMLphp user's mailing list](http://simplesamlphp.org/lists)
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_configpage.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_configpage.php
deleted file mode 100644
index 36853ed2d1f986e979fced5601c7f01c9c2eada3..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_configpage.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-/**
- * Hook to add the statistics module to the config page.
- *
- * @param \SimpleSAML\XHTML\Template &$template The template that we should alter in this hook.
- * @return void
- */
-function statistics_hook_configpage(\SimpleSAML\XHTML\Template &$template)
-{
-    $template->data['links']['statistics'] = [
-        'href' => SimpleSAML\Module::getModuleURL('statistics/showstats.php'),
-        'text' => \SimpleSAML\Locale\Translate::noop('Show statistics'),
-    ];
-    $template->data['links']['statisticsmeta'] = [
-        'href' => SimpleSAML\Module::getModuleURL('statistics/statmeta.php'),
-        'text' => \SimpleSAML\Locale\Translate::noop('Show statistics metadata'),
-    ];
-    $template->getLocalization()->addModuleDomain('statistics');
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_cron.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_cron.php
deleted file mode 100644
index 8a22028ee0ff6c41fde3bd86c735a70a3af365ae..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_cron.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * Hook to run a cron job.
- *
- * @param array &$croninfo  Output
- * @return void
- */
-function statistics_hook_cron(&$croninfo)
-{
-    assert(is_array($croninfo));
-    assert(array_key_exists('summary', $croninfo));
-    assert(array_key_exists('tag', $croninfo));
-
-    $statconfig = \SimpleSAML\Configuration::getConfig('module_statistics.php');
-
-    if (is_null($statconfig->getValue('cron_tag', null))) {
-        return;
-    }
-    if ($statconfig->getValue('cron_tag', null) !== $croninfo['tag']) {
-        return;
-    }
-
-    $maxtime = $statconfig->getInteger('time_limit', null);
-    if ($maxtime) {
-        set_time_limit($maxtime);
-    }
-
-    try {
-        $aggregator = new \SimpleSAML\Module\statistics\Aggregator();
-        $results = $aggregator->aggregate();
-        if (empty($results)) {
-            \SimpleSAML\Logger::notice('Output from statistics aggregator was empty.');
-        } else {
-            $aggregator->store($results);
-        }
-    } catch (\Exception $e) {
-        $message = 'Loganalyzer threw exception: ' . $e->getMessage();
-        \SimpleSAML\Logger::warning($message);
-        $croninfo['summary'][] = $message;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_frontpage.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_frontpage.php
deleted file mode 100644
index 268f06746c1126f7af74982804fd81f2475b642d..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_frontpage.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-/**
- * Hook to add the modinfo module to the frontpage.
- *
- * @param array &$links  The links on the frontpage, split into sections.
- * @return void
- */
-function statistics_hook_frontpage(&$links)
-{
-    assert(is_array($links));
-    assert(array_key_exists('links', $links));
-
-    $links['config']['statistics'] = [
-        'href' => SimpleSAML\Module::getModuleURL('statistics/showstats.php'),
-        'text' => '{statistics:statistics:link_statistics}',
-    ];
-    $links['config']['statisticsmeta'] = [
-        'href' => SimpleSAML\Module::getModuleURL('statistics/statmeta.php'),
-        'text' => '{statistics:statistics:link_statistics_metadata}',
-        'shorttext' => ['en' => 'Statistics metadata', 'no' => 'Statistikk metadata'],
-    ];
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_sanitycheck.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_sanitycheck.php
deleted file mode 100644
index 8450ffa49a61f54ca89cbbfe7171ac3dfdbd43a4..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/hooks/hook_sanitycheck.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/**
- * Hook to do sanity checks
- *
- * @param array &$hookinfo  hookinfo
- * @return void
- */
-function statistics_hook_sanitycheck(&$hookinfo)
-{
-    assert(is_array($hookinfo));
-    assert(array_key_exists('errors', $hookinfo));
-    assert(array_key_exists('info', $hookinfo));
-
-    try {
-        $statconfig = \SimpleSAML\Configuration::getConfig('module_statistics.php');
-    } catch (Exception $e) {
-        $hookinfo['errors'][] = '[statistics] Could not get configuration: ' . $e->getMessage();
-        return;
-    }
-
-    $statdir = $statconfig->getValue('statdir');
-    $inputfile = $statconfig->getValue('inputfile');
-
-    if (file_exists($statdir)) {
-        $hookinfo['info'][] = '[statistics] Statistics dir [' . $statdir . '] exists';
-        if (is_writable($statdir)) {
-            $hookinfo['info'][] = '[statistics] Statistics dir [' . $statdir . '] is writable';
-        } else {
-            $hookinfo['errors'][] = '[statistics] Statistics dir [' . $statdir . '] is not writable';
-        }
-    } else {
-        $hookinfo['errors'][] = '[statistics] Statistics dir [' . $statdir . '] does not exist';
-    }
-
-    if (file_exists($inputfile)) {
-        $hookinfo['info'][] = '[statistics] Input file [' . $inputfile . '] exists';
-    } else {
-        $hookinfo['errors'][] = '[statistics] Input file [' . $inputfile . '] does not exist';
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/AccessCheck.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/AccessCheck.php
deleted file mode 100644
index fb2fbe0cdc3024f0a82e8001a257a662a58202c6..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/AccessCheck.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-use SimpleSAML\Configuration;
-use SimpleSAML\Logger;
-use SimpleSAML\Utils\Auth;
-
-/**
- * Class implementing the access checker function for the statistics module.
- *
- * @package SimpleSAMLphp
- */
-class AccessCheck
-{
-    /**
-     * Check that the user has access to the statistics.
-     * If the user doesn't have access, send the user to the login page.
-     *
-     * @param \SimpleSAML\Configuration $statconfig
-     * @return void
-     * @throws \Exception
-     * @throws \SimpleSAML\Error\Exception
-     */
-    public static function checkAccess(Configuration $statconfig)
-    {
-        $protected = $statconfig->getBoolean('protected', false);
-        $authsource = $statconfig->getString('auth', null);
-        $allowedusers = $statconfig->getValue('allowedUsers', null);
-        $useridattr = $statconfig->getString('useridattr', 'eduPersonPrincipalName');
-
-        $acl = $statconfig->getValue('acl', null);
-        if ($acl !== null && !is_string($acl) && !is_array($acl)) {
-            throw new \SimpleSAML\Error\Exception('Invalid value for \'acl\'-option. Should be an array or a string.');
-        }
-
-        if (!$protected) {
-            return;
-        }
-
-        if (Auth::isAdmin()) {
-            // User logged in as admin. OK.
-            Logger::debug('Statistics auth - logged in as admin, access granted');
-            return;
-        }
-
-        if (!isset($authsource)) {
-            // If authsource is not defined, init admin login.
-            Auth::requireAdmin();
-        }
-
-        // We are using an authsource for login.
-
-        $as = new \SimpleSAML\Auth\Simple($authsource);
-        $as->requireAuth();
-
-        // User logged in with auth source.
-        Logger::debug('Statistics auth - valid login with auth source [' . $authsource . ']');
-
-        // Retrieving attributes
-        $attributes = $as->getAttributes();
-
-        if (!empty($allowedusers)) {
-            // Check if userid exists
-            if (!isset($attributes[$useridattr][0])) {
-                throw new \Exception('User ID is missing');
-            }
-
-            // Check if userid is allowed access..
-            if (in_array($attributes[$useridattr][0], $allowedusers, true)) {
-                Logger::debug(
-                    'Statistics auth - User granted access by user ID [' . $attributes[$useridattr][0] . ']'
-                );
-                return;
-            }
-            Logger::debug(
-                'Statistics auth - User denied access by user ID [' . $attributes[$useridattr][0] . ']'
-            );
-        } else {
-            Logger::debug('Statistics auth - no allowedUsers list.');
-        }
-
-        if (!is_null($acl)) {
-            $acl = new \SimpleSAML\Module\core\ACL($acl);
-            if ($acl->allows($attributes)) {
-                Logger::debug('Statistics auth - allowed access by ACL.');
-                return;
-            }
-            Logger::debug('Statistics auth - denied access by ACL.');
-        } else {
-            Logger::debug('Statistics auth - no ACL configured.');
-        }
-        throw new \SimpleSAML\Error\Exception('Access denied to the current user.');
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Aggregator.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Aggregator.php
deleted file mode 100644
index c69090d0bb3e54d72d901edd12bb4740f73889c8..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Aggregator.php
+++ /dev/null
@@ -1,377 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-use SimpleSAML\Configuration;
-
-/**
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class Aggregator
-{
-    /** @var \SimpleSAML\Configuration */
-    private $statconfig;
-
-    /** @var string */
-    private $statdir;
-
-    /** @var string */
-    private $inputfile;
-
-    /** @var array */
-    private $statrules;
-
-    /** @var int */
-    private $offset;
-
-    /** @var array|null */
-    private $metadata = null;
-
-    /** @var bool */
-    private $fromcmdline;
-
-    /** @var int */
-    private $starttime;
-
-    /** @var array */
-    private $timeres;
-
-
-    /**
-     * Constructor
-     *
-     * @param bool $fromcmdline
-     */
-    public function __construct($fromcmdline = false)
-    {
-        $this->fromcmdline = $fromcmdline;
-        $this->statconfig = Configuration::getConfig('module_statistics.php');
-
-        $this->statdir = $this->statconfig->getValue('statdir');
-        $this->inputfile = $this->statconfig->getValue('inputfile');
-        $this->statrules = $this->statconfig->getValue('statrules');
-        $this->timeres = $this->statconfig->getValue('timeres');
-        $this->offset = $this->statconfig->getValue('offset', 0);
-
-        $this->starttime = time();
-    }
-
-
-    /**
-     * @return void
-     */
-    public function dumpConfig()
-    {
-        echo 'Statistics directory   : ' . $this->statdir . "\n";
-        echo 'Input file             : ' . $this->inputfile . "\n";
-        echo 'Offset                 : ' . $this->offset . "\n";
-    }
-
-
-    /**
-     * @return void
-     */
-    public function debugInfo()
-    {
-        // 1024*1024=1048576
-        echo 'Memory usage           : ' . number_format(memory_get_usage() / 1048576, 2) . " MB\n";
-    }
-
-
-    /**
-     * @return void
-     */
-    public function loadMetadata()
-    {
-        $filename = $this->statdir . '/.stat.metadata';
-        $metadata = null;
-        if (file_exists($filename)) {
-            $metadata = unserialize(file_get_contents($filename));
-        }
-        $this->metadata = $metadata;
-    }
-
-
-    /**
-     * @return array|null
-     */
-    public function getMetadata()
-    {
-        return $this->metadata;
-    }
-
-
-    /**
-     * @return void
-     */
-    public function saveMetadata()
-    {
-        $this->metadata['time'] = time() - $this->starttime;
-        $this->metadata['memory'] = memory_get_usage();
-        $this->metadata['lastrun'] = time();
-
-        $filename = $this->statdir . '/.stat.metadata';
-        file_put_contents($filename, serialize($this->metadata), LOCK_EX);
-    }
-
-
-    /**
-     * @param bool $debug
-     * @return array
-     * @throws \Exception
-     */
-    public function aggregate($debug = false)
-    {
-        $this->loadMetadata();
-
-        if (!is_dir($this->statdir)) {
-            throw new \Exception('Statistics module: output dir do not exists [' . $this->statdir . ']');
-        }
-
-        if (!file_exists($this->inputfile)) {
-            throw new \Exception('Statistics module: input file do not exists [' . $this->inputfile . ']');
-        }
-
-        $file = fopen($this->inputfile, 'r');
-
-        if ($file === false) {
-            throw new \Exception('Statistics module: unable to open file [' . $this->inputfile . ']');
-        }
-
-        $logparser = new LogParser(
-            $this->statconfig->getValue('datestart', 0),
-            $this->statconfig->getValue('datelength', 15),
-            $this->statconfig->getValue('offsetspan', 44)
-        );
-        $datehandler = [
-            'default' => new DateHandler($this->offset),
-            'month' => new  DateHandlerMonth($this->offset),
-        ];
-
-        $notBefore = 0;
-        $lastRead = 0;
-        $lastlinehash = '-';
-
-        if (isset($this->metadata)) {
-            $notBefore = $this->metadata['notBefore'];
-            $lastlinehash = $this->metadata['lastlinehash'];
-        }
-
-        $lastlogline = 'sdfsdf';
-        $lastlineflip = false;
-        $results = [];
-
-        $i = 0;
-        // Parse through log file, line by line
-        while (!feof($file)) {
-            $logline = fgets($file, 4096);
-
-            // Continue if STAT is not found on line
-            if (!preg_match('/STAT/', $logline)) {
-                continue;
-            }
-
-            $i++;
-            $lastlogline = $logline;
-
-            // Parse log, and extract epoch time and rest of content.
-            $epoch = $logparser->parseEpoch($logline);
-            $content = $logparser->parseContent($logline);
-            $action = trim($content[5]);
-
-            if ($this->fromcmdline && ($i % 10000) == 0) {
-                echo "Read line " . $i . "\n";
-            }
-
-            if ($debug) {
-                echo "----------------------------------------\n";
-                echo 'Log line: ' . $logline . "\n";
-                echo 'Date parse [' . substr($logline, 0, $this->statconfig->getValue('datelength', 15)) .
-                    '] to [' . date(DATE_RFC822, $epoch) . ']' . "\n";
-                /** @var string $ret */
-                $ret = print_r($content, true);
-                echo htmlentities($ret);
-                if ($i >= 13) {
-                    exit;
-                }
-            }
-
-            if ($epoch > $lastRead) {
-                $lastRead = $epoch;
-            }
-
-            if ($epoch === $notBefore) {
-                if (!$lastlineflip) {
-                    if (sha1($logline) === $lastlinehash) {
-                        $lastlineflip = true;
-                    }
-                    continue;
-                }
-            }
-
-            if ($epoch < $notBefore) {
-                continue;
-            }
-
-            // Iterate all the statrules from config.
-            foreach ($this->statrules as $rulename => $rule) {
-                $type = 'aggregate';
-
-                if (array_key_exists('type', $rule)) {
-                    $type = $rule['type'];
-                }
-
-                if ($type !== 'aggregate') {
-                    continue;
-                }
-
-                foreach ($this->timeres as $tres => $tresconfig) {
-                    $dh = 'default';
-                    if (isset($tresconfig['customDateHandler'])) {
-                        $dh = $tresconfig['customDateHandler'];
-                    }
-
-                    $timeslot = $datehandler['default']->toSlot($epoch, $tresconfig['slot']);
-                    $fileslot = $datehandler[$dh]->toSlot($epoch, $tresconfig['fileslot']);
-
-                    if (isset($rule['action']) && ($action !== $rule['action'])) {
-                        continue;
-                    }
-
-                    $difcol = self::getDifCol($content, $rule['col']);
-
-                    if (!isset($results[$rulename][$tres][$fileslot][$timeslot]['_'])) {
-                        $results[$rulename][$tres][$fileslot][$timeslot]['_'] = 0;
-                    }
-                    if (!isset($results[$rulename][$tres][$fileslot][$timeslot][$difcol])) {
-                        $results[$rulename][$tres][$fileslot][$timeslot][$difcol] = 0;
-                    }
-
-                    $results[$rulename][$tres][$fileslot][$timeslot]['_']++;
-                    $results[$rulename][$tres][$fileslot][$timeslot][$difcol]++;
-                }
-            }
-        }
-        $this->metadata['notBefore'] = $lastRead;
-        $this->metadata['lastline'] = $lastlogline;
-        $this->metadata['lastlinehash'] = sha1($lastlogline);
-        return $results;
-    }
-
-
-    /**
-     * @param array $content
-     * @param mixed $colrule
-     * @return string
-     */
-    private static function getDifCol($content, $colrule)
-    {
-        if (is_int($colrule)) {
-            return trim($content[$colrule]);
-        } elseif (is_array($colrule)) {
-            $difcols = [];
-            foreach ($colrule as $cr) {
-                $difcols[] = trim($content[$cr]);
-            }
-            return join('|', $difcols);
-        } else {
-            return 'NA';
-        }
-    }
-
-
-    /**
-     * @param mixed $previous
-     * @param array $newdata
-     * @return array
-     */
-    private function cummulateData($previous, $newdata)
-    {
-        $dataset = [];
-        foreach (func_get_args() as $item) {
-            foreach ($item as $slot => $dataarray) {
-                if (!array_key_exists($slot, $dataset)) {
-                    $dataset[$slot] = [];
-                }
-                foreach ($dataarray as $key => $data) {
-                    if (!array_key_exists($key, $dataset[$slot])) {
-                        $dataset[$slot][$key] = 0;
-                    }
-                    $dataset[$slot][$key] += $data;
-                }
-            }
-        }
-        return $dataset;
-    }
-
-
-    /**
-     * @param array $results
-     * @return void
-     */
-    public function store($results)
-    {
-        $datehandler = [
-            'default' => new DateHandler($this->offset),
-            'month' => new DateHandlerMonth($this->offset),
-        ];
-
-        // Iterate the first level of results, which is per rule, as defined in the config.
-        foreach ($results as $rulename => $timeresdata) {
-            // Iterate over time resolutions
-            foreach ($timeresdata as $tres => $resres) {
-                $dh = 'default';
-                if (isset($this->timeres[$tres]['customDateHandler'])) {
-                    $dh = $this->timeres[$tres]['customDateHandler'];
-                }
-
-                $filenos = array_keys($resres);
-                $lastfile = $filenos[count($filenos) - 1];
-
-                // Iterate the second level of results, which is the fileslot.
-                foreach ($resres as $fileno => $fileres) {
-                    // Slots that have data.
-                    $slotlist = array_keys($fileres);
-
-                    // The last slot.
-                    $maxslot = $slotlist[count($slotlist) - 1];
-
-                    // Get start and end slot number within the file, based on the fileslot.
-                    $start = (int) $datehandler['default']->toSlot(
-                        $datehandler[$dh]->fromSlot($fileno, $this->timeres[$tres]['fileslot']),
-                        $this->timeres[$tres]['slot']
-                    );
-                    $end = (int) $datehandler['default']->toSlot(
-                        $datehandler[$dh]->fromSlot($fileno + 1, $this->timeres[$tres]['fileslot']),
-                        $this->timeres[$tres]['slot']
-                    );
-
-                    // Fill in missing entries and sort file results
-                    $filledresult = [];
-                    for ($slot = $start; $slot < $end; $slot++) {
-                        if (array_key_exists($slot, $fileres)) {
-                            $filledresult[$slot] = $fileres[$slot];
-                        } else {
-                            if ($lastfile == $fileno && $slot > $maxslot) {
-                                $filledresult[$slot] = ['_' => null];
-                            } else {
-                                $filledresult[$slot] = ['_' => 0];
-                            }
-                        }
-                    }
-
-                    $filename = $this->statdir . '/' . $rulename . '-' . $tres . '-' . $fileno . '.stat';
-                    if (file_exists($filename)) {
-                        $previousData = unserialize(file_get_contents($filename));
-                        $filledresult = $this->cummulateData($previousData, $filledresult);
-                    }
-
-                    // store file
-                    file_put_contents($filename, serialize($filledresult), LOCK_EX);
-                }
-            }
-        }
-        $this->saveMetadata();
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandler.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandler.php
deleted file mode 100644
index 032ff4ce7c51b6ed59f05d84c421fa2a81429704..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandler.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-/**
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class DateHandler
-{
-    /** @var int */
-    protected $offset;
-
-
-    /**
-     * Constructor
-     *
-     * @param int $offset Date offset
-     */
-    public function __construct($offset)
-    {
-        $this->offset = $offset;
-    }
-
-
-    /**
-     * @param int $timestamp
-     * @return int
-     */
-    protected function getDST($timestamp)
-    {
-        if (idate('I', $timestamp)) {
-            return 3600;
-        }
-        return 0;
-    }
-
-
-    /**
-     * @param int $epoch
-     * @param int $slotsize
-     * @return float
-     */
-    public function toSlot($epoch, $slotsize)
-    {
-        $dst = $this->getDST($epoch);
-        return floor(($epoch + $this->offset + $dst) / $slotsize);
-    }
-
-
-    /**
-     * @param int $slot
-     * @param int $slotsize
-     * @return int
-     */
-    public function fromSlot($slot, $slotsize)
-    {
-        $temp = $slot * $slotsize - $this->offset;
-        $dst = $this->getDST($temp);
-        return $slot * $slotsize - $this->offset - $dst;
-    }
-
-
-    /**
-     * @param int $epoch
-     * @param string $dateformat
-     * @return string
-     */
-    public function prettyDateEpoch($epoch, $dateformat)
-    {
-        return date($dateformat, $epoch);
-    }
-
-
-    /**
-     * @param int $slot
-     * @param int $slotsize
-     * @param string $dateformat
-     * @return string
-     */
-    public function prettyDateSlot($slot, $slotsize, $dateformat)
-    {
-        return $this->prettyDateEpoch($this->fromSlot($slot, $slotsize), $dateformat);
-    }
-
-
-    /**
-     * @param int $from
-     * @param int $to
-     * @param int $slotsize
-     * @param string $dateformat
-     * @return string
-     */
-    public function prettyHeader($from, $to, $slotsize, $dateformat)
-    {
-        $text = $this->prettyDateSlot($from, $slotsize, $dateformat);
-        $text .= ' to ';
-        $text .= $this->prettyDateSlot($to, $slotsize, $dateformat);
-        return $text;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandlerMonth.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandlerMonth.php
deleted file mode 100644
index f0168cc43a1ddbbe7c24ca273b75368e2754d9b4..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandlerMonth.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-/**
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class DateHandlerMonth extends DateHandler
-{
-    /**
-     * Constructor
-     *
-     * @param integer $offset Date offset
-     */
-    public function __construct($offset)
-    {
-        $this->offset = $offset;
-    }
-
-
-    /**
-     * @param int $epoch
-     * @param int $slotsize
-     * @return int
-     */
-    public function toSlot($epoch, $slotsize)
-    {
-        $dsttime = $this->getDST($epoch) + $epoch;
-        $parsed = getdate($dsttime);
-        $slot = (($parsed['year'] - 2000) * 12) + $parsed['mon'] - 1;
-        return $slot;
-    }
-
-
-    /**
-     * @param int $slot
-     * @param int $slotsize
-     * @return int
-     */
-    public function fromSlot($slot, $slotsize)
-    {
-        $month = ($slot % 12);
-        $year = 2000 + intval(floor($slot / 12));
-        return mktime(0, 0, 0, $month + 1, 1, $year);
-    }
-
-
-    /**
-     * @param int $from
-     * @param int $to
-     * @param int $slotsize
-     * @param string $dateformat
-     * @return string
-     */
-    public function prettyHeader($from, $to, $slotsize, $dateformat)
-    {
-        $month = ($from % 12) + 1;
-        $year = 2000 + intval(floor($from / 12));
-        return $year . '-' . $month;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Graph/GoogleCharts.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Graph/GoogleCharts.php
deleted file mode 100644
index 15d5223f915f81da7e6a3c047fc11ff79f274006..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Graph/GoogleCharts.php
+++ /dev/null
@@ -1,196 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics\Graph;
-
-/**
- * \SimpleSAML\Module\statistics\Graph\GoogleCharts will help you to create a Google Chart
- * using the Google Charts API.
- *
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class GoogleCharts
-{
-    /** @var integer */
-    private $x;
-
-    /** @var integer */
-    private $y;
-
-
-    /**
-     * Constructor.
-     *
-     * Takes dimension of graph as parameters. X and Y.
-     *
-     * @param integer $x    X dimension. Default 800.
-     * @param integer $y    Y dimension. Default 350.
-     */
-    public function __construct($x = 800, $y = 350)
-    {
-        $this->x = $x;
-        $this->y = $y;
-    }
-
-
-    /**
-     * @param array $axis
-     * @return string
-     */
-    private function encodeaxis(array $axis)
-    {
-        return join('|', $axis);
-    }
-
-    /**
-     * t:10.0,58.0,95.0
-     * @param array $datasets
-     * @return string
-     */
-    private function encodedata(array $datasets)
-    {
-        $setstr = [];
-        foreach ($datasets as $dataset) {
-            $setstr[] = self::extEncode($dataset);
-        }
-        return 'e:' . join(',', $setstr);
-    }
-
-
-    /**
-     * @param array $values
-     * @return string
-     */
-    public static function extEncode(array $values) // $max = 4095, $min = 0
-    {
-        $extended_table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.';
-        $chardata = '';
-        $delta = 4095;
-        $size = strlen($extended_table);
-
-        foreach ($values as $k => $v) {
-            if ($v >= 0 && $v <= 100) {
-                $first = substr($extended_table, intval(($delta * $v / 100) / $size), 1);
-                $second = substr($extended_table, intval(($delta * $v / 100) % $size), 1);
-                $chardata .= "$first$second";
-            } else {
-                $chardata .= '__'; // Value out of max range;
-            }
-        }
-        return $chardata;
-    }
-
-
-    /**
-     * Generate a Google Charts URL which points to a generated image.
-     * More documentation on Google Charts here:
-     *   http://code.google.com/apis/chart/
-     *
-     * @param array $axis        Axis
-     * @param array $axispos     Axis positions
-     * @param array $datasets    Datasets values
-     * @param array $maxes       Max value. Will be the topmost value on the Y-axis.
-     * @return string
-     */
-    public function show(array $axis, array $axispos, array $datasets, array $maxes)
-    {
-        $labeld = '&chxt=x,y' . '&chxr=0,0,1|1,0,' . $maxes[0];
-        if (count($datasets) > 1) {
-            if (count($datasets) !== count($maxes)) {
-                throw new \Exception('Incorrect number of max calculations for graph plotting.');
-            }
-            $labeld = '&chxt=x,y,r' . '&chxr=0,0,1|1,0,' . $maxes[0] . '|2,0,' . $maxes[1];
-        }
-
-        $url = 'https://chart.apis.google.com/chart?' .
-            // Dimension of graph. Default is 800x350
-            'chs=' . $this->x . 'x' . $this->y .
-
-            // Dateset values
-            '&chd=' . $this->encodedata($datasets) .
-
-            // Fill area...
-            '&chco=ff5c00,cca600' .
-            '&chls=1,1,0|1,6,3' .
-
-            // chart type is linechart
-            '&cht=lc' .
-            $labeld .
-            '&chxl=0:|' . $this->encodeaxis($axis) . #.$'|1:||top' .
-            '&chxp=0,' . join(',', $axispos) .
-            '&chg=' . (2400 / (count($datasets[0]) - 1)) . ',-1,3,3'; // lines
-
-        return $url;
-    }
-
-
-    /**
-     * @param array $axis
-     * @param array $datasets
-     * @return string
-     */
-    public function showPie(array $axis, array $datasets)
-    {
-        $url = 'https://chart.apis.google.com/chart?' .
-
-        // Dimension of graph. Default is 800x350
-        'chs=' . $this->x . 'x' . $this->y .
-
-        // Dateset values.
-        '&chd=' . $this->encodedata([$datasets]) .
-
-        // chart type is linechart
-        '&cht=p' .
-
-        '&chl=' . $this->encodeaxis($axis);
-
-        return $url;
-    }
-
-
-    /**
-     * Takes a input value, and generates a value that suits better as a max
-     * value on the Y-axis. In example 37.6 will not make a good max value, instead
-     * it will return 40. It will always return an equal or larger number than it gets
-     * as input.
-     *
-     * Here is some test code:
-     * <code>
-     *      $foo = array(
-     *          0, 2, 2.3, 2.6, 6, 10, 15, 98, 198, 256, 487, 563, 763, 801, 899, 999, 987, 198234.485, 283746
-     *      );
-     *      foreach ($foo as $f) {
-     *          echo '<p>'.$f.' => '.\SimpleSAML\Module\statistics\Graph\GoogleCharts::roof($f);
-     *      }
-     * </code>
-     *
-     * @param int $max    Input value.
-     * @return int
-     */
-    public static function roof($max)
-    {
-        $mul = 1;
-
-        if ($max < 1) {
-            return 1;
-        }
-
-        $t = intval(ceil($max));
-        while ($t > 100) {
-            $t /= 10;
-            $mul *= 10;
-        }
-
-        $maxGridLines = 10;
-        $candidates = [1, 2, 5, 10, 20, 25, 50, 100];
-
-        foreach ($candidates as $c) {
-            if ($t / $c < $maxGridLines) {
-                $tick_y = $c * $mul;
-                $target_top = intval(ceil($max / $tick_y) * $tick_y);
-                return $target_top;
-            }
-        }
-        return 1;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/LogCleaner.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/LogCleaner.php
deleted file mode 100644
index 04ce2da4074aac7b02b531ce0457dcc6f9a4e76e..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/LogCleaner.php
+++ /dev/null
@@ -1,205 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-use SimpleSAML\Configuration;
-
-/**
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class LogCleaner
-{
-    /** @var \SimpleSAML\Configuration */
-    private $statconfig;
-
-    /** @var string */
-    private $statdir;
-
-    /** @var string */
-    private $inputfile;
-
-    /** @var array */
-    private $statrules;
-
-    /** @var int */
-    private $offset;
-
-
-    /**
-     * Constructor
-     *
-     * @param string|null $inputfile
-     */
-    public function __construct($inputfile = null)
-    {
-        $this->statconfig = Configuration::getConfig('module_statistics.php');
-
-        $this->statdir = $this->statconfig->getValue('statdir');
-        $this->inputfile = $this->statconfig->getValue('inputfile');
-        $this->statrules = $this->statconfig->getValue('statrules');
-        $this->offset = $this->statconfig->getValue('offset', 0);
-
-        if (isset($inputfile)) {
-            $this->inputfile = $inputfile;
-        }
-    }
-
-
-    /**
-     * @return void
-     */
-    public function dumpConfig()
-    {
-        echo 'Statistics directory   : ' . $this->statdir . "\n";
-        echo 'Input file             : ' . $this->inputfile . "\n";
-        echo 'Offset                 : ' . $this->offset . "\n";
-    }
-
-
-    /**
-     * @param bool $debug
-     * @return array
-     * @throws \Exception
-     */
-    public function clean($debug = false)
-    {
-        if (!is_dir($this->statdir)) {
-            throw new \Exception('Statistics module: output dir do not exists [' . $this->statdir . ']');
-        }
-
-        if (!file_exists($this->inputfile)) {
-            throw new \Exception('Statistics module: input file do not exists [' . $this->inputfile . ']');
-        }
-
-        $file = fopen($this->inputfile, 'r');
-
-        $logparser = new LogParser(
-            $this->statconfig->getValue('datestart', 0),
-            $this->statconfig->getValue('datelength', 15),
-            $this->statconfig->getValue('offsetspan', 44)
-        );
-
-        $sessioncounter = [];
-
-        $i = 0;
-        // Parse through log file, line by line
-        while (!feof($file)) {
-            $logline = fgets($file, 4096);
-
-            // Continue if STAT is not found on line
-            if (!preg_match('/STAT/', $logline)) {
-                continue;
-            }
-            $i++;
-
-            // Parse log, and extract epoch time and rest of content.
-            $epoch = $logparser->parseEpoch($logline);
-            $content = $logparser->parseContent($logline);
-
-            if (($i % 10000) == 0) {
-                echo "Read line " . $i . "\n";
-            }
-
-            $trackid = $content[4];
-
-            if (!isset($sessioncounter[$trackid])) {
-                $sessioncounter[$trackid] = 0;
-            }
-            $sessioncounter[$trackid]++;
-
-            if ($debug) {
-                echo "----------------------------------------\n";
-                echo 'Log line: ' . $logline . "\n";
-                echo 'Date parse [' . substr($logline, 0, $this->statconfig->getValue('datelength', 15)) .
-                    '] to [' . date(DATE_RFC822, $epoch) . ']' . "\n";
-                /** @var string $ret */
-                $ret = print_r($content, true);
-                echo htmlentities($ret);
-                if ($i >= 13) {
-                    exit;
-                }
-            }
-        }
-
-        $histogram = [];
-        foreach ($sessioncounter as $trackid => $sc) {
-            if (!isset($histogram[$sc])) {
-                $histogram[$sc] = 0;
-            }
-            $histogram[$sc]++;
-        }
-        ksort($histogram);
-
-        $todelete = [];
-        foreach ($sessioncounter as $trackid => $sc) {
-            if ($sc > 200) {
-                $todelete[] = $trackid;
-            }
-        }
-
-        return $todelete;
-    }
-
-
-    /**
-     * @param array $todelete
-     * @param string $outputfile
-     * @return void
-     * @throws \Exceeption
-     */
-    public function store(array $todelete, $outputfile)
-    {
-        echo "Preparing to delete [" . count($todelete) . "] trackids\n";
-
-        if (!is_dir($this->statdir)) {
-            throw new \Exception('Statistics module: output dir do not exists [' . $this->statdir . ']');
-        }
-
-        if (!file_exists($this->inputfile)) {
-            throw new \Exception('Statistics module: input file do not exists [' . $this->inputfile . ']');
-        }
-
-        $file = fopen($this->inputfile, 'r');
-
-        // Open the output file in a way that guarantees that we will not overwrite a random file.
-        if (file_exists($outputfile)) {
-            // Delete existing output file.
-            unlink($outputfile);
-        }
-        $outfile = fopen($outputfile, 'x'); // Create the output file
-
-        $logparser = new LogParser(
-            $this->statconfig->getValue('datestart', 0),
-            $this->statconfig->getValue('datelength', 15),
-            $this->statconfig->getValue('offsetspan', 44)
-        );
-
-        $i = 0;
-        // Parse through log file, line by line
-        while (!feof($file)) {
-            $logline = fgets($file, 4096);
-
-            // Continue if STAT is not found on line.
-            if (!preg_match('/STAT/', $logline)) {
-                continue;
-            }
-            $i++;
-
-            $content = $logparser->parseContent($logline);
-
-            if (($i % 10000) == 0) {
-                echo "Read line " . $i . "\n";
-            }
-
-            $trackid = $content[4];
-            if (in_array($trackid, $todelete, true)) {
-                continue;
-            }
-
-            fputs($outfile, $logline);
-        }
-        fclose($file);
-        fclose($outfile);
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/LogParser.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/LogParser.php
deleted file mode 100644
index aeb4fa646c83ce6605e5720315d52993f2759820..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/LogParser.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-/**
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class LogParser
-{
-    /** @var integer */
-    private $datestart;
-
-    /** @var integer */
-    private $datelength;
-
-    /** @var integer */
-    private $offset;
-
-
-    /**
-     * Constructor
-     *
-     * @param integer $datestart   At which char is the date starting
-     * @param integer $datelength  How many characters is the date (on the b
-     * @param integer $offset      At which char is the rest of the entries starting
-     */
-    public function __construct($datestart, $datelength, $offset)
-    {
-        $this->datestart = $datestart;
-        $this->datelength = $datelength;
-        $this->offset = $offset;
-    }
-
-
-    /**
-     * @param string $line
-     *
-     * @return integer
-     */
-    public function parseEpoch($line)
-    {
-        $epoch = strtotime(substr($line, 0, $this->datelength));
-        if ($epoch > time() + 2678400) { // 60 * 60 * 24 * 31 = 2678400
-            /**
-             * More than a month in the future - probably caused by
-             * the log files missing the year.
-             * We will therefore subtrackt one year.
-             */
-            $hour = intval(gmdate('H', $epoch));
-            $minute = intval(gmdate('i', $epoch));
-            $second = intval(gmdate('s', $epoch));
-            $month = intval(gmdate('n', $epoch));
-            $day = intval(gmdate('j', $epoch));
-            $year = intval(gmdate('Y', $epoch)) - 1;
-            $epoch = gmmktime($hour, $minute, $second, $month, $day, $year);
-        }
-        return $epoch;
-    }
-
-
-    /**
-     * @param string $line
-     *
-     * @return array
-     */
-    public function parseContent($line)
-    {
-        $contentstr = substr($line, $this->offset);
-        $content = explode(' ', $contentstr);
-        return $content;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/RatioDataset.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/RatioDataset.php
deleted file mode 100644
index 810dfcd53676d4b0d840dc9bb1edccfb1f7d5955..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/RatioDataset.php
+++ /dev/null
@@ -1,122 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-use SimpleSAML\Configuration;
-
-/**
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class RatioDataset extends StatDataset
-{
-    /**
-     * Constructor
-     *
-     * @param \SimpleSAML\Configuration $statconfig
-     * @param \SimpleSAML\Configuration $ruleconfig
-     * @param string $ruleid
-     * @param string $timeres
-     * @param int $fileslot
-     */
-    public function __construct(Configuration $statconfig, Configuration $ruleconfig, $ruleid, $timeres, $fileslot)
-    {
-        parent::__construct($statconfig, $ruleconfig, $ruleid, $timeres, $fileslot);
-    }
-
-
-    /**
-     * @return void
-     */
-    public function aggregateSummary()
-    {
-        /**
-         * Aggregate summary table from dataset. To be used in the table view.
-         */
-        $this->summary = [];
-        $noofvalues = [];
-        foreach ($this->results as $slot => $res) {
-            foreach ($res as $key => $value) {
-                if (array_key_exists($key, $this->summary)) {
-                    $this->summary[$key] += $value;
-                    if ($value > 0) {
-                        $noofvalues[$key]++;
-                    }
-                } else {
-                    $this->summary[$key] = $value;
-                    if ($value > 0) {
-                        $noofvalues[$key] = 1;
-                    } else {
-                        $noofvalues[$key] = 0;
-                    }
-                }
-            }
-        }
-
-        foreach ($this->summary as $key => $val) {
-            $this->summary[$key] = $this->divide($this->summary[$key], $noofvalues[$key]);
-        }
-
-        asort($this->summary);
-        $this->summary = array_reverse($this->summary, true);
-    }
-
-
-    /**
-     * @param string $k
-     * @param array $a
-     * @return int
-     */
-    private function ag($k, array $a)
-    {
-        if (array_key_exists($k, $a)) {
-            return $a[$k];
-        }
-        return 0;
-    }
-
-
-    /**
-     * @param int $v1
-     * @param int $v2
-     * @return int|float
-     */
-    private function divide($v1, $v2)
-    {
-        if ($v2 == 0) {
-            return 0;
-        }
-        return ($v1 / $v2);
-    }
-
-
-    /**
-     * @param array $result1
-     * @param array $result2
-     * @return array
-     */
-    public function combine(array $result1, array $result2)
-    {
-        $combined = [];
-
-        foreach ($result2 as $tick => $val) {
-            $combined[$tick] = [];
-            foreach ($val as $index => $num) {
-                $combined[$tick][$index] = $this->divide(
-                    $this->ag($index, $result1[$tick]),
-                    $this->ag($index, $result2[$tick])
-                );
-            }
-        }
-        return $combined;
-    }
-
-
-    /**
-     * @return array
-     */
-    public function getPieData()
-    {
-        return [];
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Ruleset.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Ruleset.php
deleted file mode 100644
index d392fdacf262b3b4e5e76d3517faa818ae3b379d..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Ruleset.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-use SimpleSAML\Configuration;
-
-/**
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class Ruleset
-{
-    /** \SimpleSAML\Configuration */
-    private $statconfig;
-
-    /** @var array */
-    private $availrulenames;
-
-    /** @var array */
-    private $availrules;
-
-    /** @var array */
-    private $available;
-
-
-    /**
-     * Constructor
-     *
-     * @param \SimpleSAML\Configuration $statconfig
-     */
-    public function __construct(Configuration $statconfig)
-    {
-        $this->statconfig = $statconfig;
-        $this->init();
-    }
-
-
-    /**
-     * @return void
-     */
-    private function init()
-    {
-        $statdir = $this->statconfig->getValue('statdir');
-        $statrules = $this->statconfig->getValue('statrules');
-        $timeres = $this->statconfig->getValue('timeres');
-
-        /*
-         * Walk through file lists, and get available [rule][fileslot]...
-         */
-        if (!is_dir($statdir)) {
-            throw new \Exception('Statisics output directory [' . $statdir . '] does not exist.');
-        }
-        $filelist = scandir($statdir);
-        $this->available = [];
-        foreach ($filelist as $file) {
-            if (preg_match('/([a-z0-9_]+)-([a-z0-9_]+)-([0-9]+)\.stat/', $file, $matches)) {
-                if (array_key_exists($matches[1], $statrules)) {
-                    if (array_key_exists($matches[2], $timeres)) {
-                        $this->available[$matches[1]][$matches[2]][] = $matches[3];
-                    }
-                }
-            }
-        }
-        if (empty($this->available)) {
-            throw new \Exception('No aggregated statistics files found in [' . $statdir . ']');
-        }
-
-        /**
-         * Create array with information about available rules..
-         */
-        $this->availrules = array_keys($statrules);
-        $available_rules = [];
-        foreach ($this->availrules as $key) {
-            $available_rules[$key] = ['name' => $statrules[$key]['name'], 'descr' => $statrules[$key]['descr']];
-        }
-        $this->availrulenames = $available_rules;
-    }
-
-
-    /**
-     * @return array
-     */
-    public function availableRules()
-    {
-        return $this->availrules;
-    }
-
-
-    /**
-     * @return array
-     */
-    public function availableRulesNames()
-    {
-        return $this->availrulenames;
-    }
-
-
-    /**
-     * Resolve which rule is selected. Taking user preference and checks if it exists.
-     *
-     * @param string|null $preferRule
-     * @return string|null
-     */
-    private function resolveSelectedRule($preferRule = null)
-    {
-        $rule = $this->statconfig->getString('default', $this->availrules[0]);
-        if (!empty($preferRule)) {
-            if (in_array($preferRule, $this->availrules, true)) {
-                $rule = $preferRule;
-            }
-        }
-        return $rule;
-    }
-
-
-    /**
-     * @param string|null $preferRule
-     * @return \SimpleSAML\Module\statistics\Statistics\Rulesets\BaseRule
-     */
-    public function getRule($preferRule = null)
-    {
-        $rule = $this->resolveSelectedRule($preferRule);
-        $statrulesConfig = $this->statconfig->getConfigItem('statrules');
-        $statruleConfig = $statrulesConfig->getConfigItem($rule);
-
-        $presenterClass = \SimpleSAML\Module::resolveClass(
-            $statruleConfig->getValue('presenter', 'statistics:BaseRule'),
-            'Statistics\Rulesets'
-        );
-
-        /** @psalm-suppress InvalidStringClass */
-        $statrule = new $presenterClass($this->statconfig, $statruleConfig, $rule, $this->available);
-
-        /** @var \SimpleSAML\Module\statistics\Statistics\Rulesets\BaseRule $statrule */
-        return $statrule;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/StatDataset.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/StatDataset.php
deleted file mode 100644
index 1351aa3a3bac395c9d6fd47f1231ae78655d396f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/StatDataset.php
+++ /dev/null
@@ -1,422 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-use SimpleSAML\Configuration;
-use SimpleSAML\Module;
-use SimpleSAML\Utils\Arrays;
-use SimpleSAML\XHTML\Template;
-
-/**
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class StatDataset
-{
-    /** @var \SimpleSAML\Configuration */
-    protected $statconfig;
-
-    /** @var \SimpleSAML\Configuration */
-    protected $ruleconfig;
-
-    /** @var \SimpleSAML\Configuration */
-    protected $timeresconfig;
-
-    /** @var string */
-    protected $ruleid;
-
-    /** @var int */
-    protected $fileslot;
-
-    /** @var string */
-    protected $timeres;
-
-    /** @var string */
-    protected $delimiter;
-
-    /** @var array */
-    protected $results;
-
-    /** @var array */
-    protected $summary;
-
-    /** @var int */
-    protected $max;
-
-    /** @var \SimpleSAML\Module\statistics\DateHandler */
-    protected $datehandlerFile;
-
-    /** @var \SimpleSAML\Module\statistics\DateHandler */
-    protected $datehandlerTick;
-
-
-    /**
-     * Constructor
-     *
-     * @param \SimpleSAML\Configuration $statconfig
-     * @param \SimpleSAML\Configuration $ruleconfig
-     * @param string $ruleid
-     * @param string $timeres
-     * @param int $fileslot
-     */
-    public function __construct(Configuration $statconfig, Configuration $ruleconfig, $ruleid, $timeres, $fileslot)
-    {
-        $this->statconfig = $statconfig;
-        $this->ruleconfig = $ruleconfig;
-
-        $timeresconfigs = $statconfig->getConfigItem('timeres');
-        $this->timeresconfig = $timeresconfigs->getConfigItem($timeres);
-
-        $this->ruleid = $ruleid;
-        $this->fileslot = $fileslot;
-        $this->timeres = $timeres;
-
-        $this->delimiter = '_';
-        $this->max = 0;
-        $this->results = [];
-        $this->summary = [];
-
-        $this->datehandlerTick = new DateHandler($this->statconfig->getValue('offset', 0));
-        if ($this->timeresconfig->getValue('customDateHandler', 'default') === 'month') {
-            $this->datehandlerFile = new DateHandlerMonth(0);
-        } else {
-            $this->datehandlerFile = $this->datehandlerTick;
-        }
-
-        $this->loadData();
-    }
-
-
-    /**
-     * @return int
-     */
-    public function getFileSlot()
-    {
-        return $this->fileslot;
-    }
-
-
-    /**
-     * @return string
-     */
-    public function getTimeRes()
-    {
-        return $this->timeres;
-    }
-
-
-    /**
-     * @param string $delimiter
-     * @return void
-     */
-    public function setDelimiter($delimiter = '_')
-    {
-        if (empty($delimiter)) {
-            $delimiter = '_';
-        }
-        $this->delimiter = $delimiter;
-    }
-
-
-    /**
-     * @return string|null
-     */
-    public function getDelimiter()
-    {
-        if ($this->delimiter === '_') {
-            return null;
-        }
-        return $this->delimiter;
-    }
-
-
-    /**
-     * @return void
-     */
-    public function calculateMax()
-    {
-        $maxvalue = 0;
-        foreach ($this->results as $slot => &$res) {
-            if (!array_key_exists($this->delimiter, $res)) {
-                $res[$this->delimiter] = 0;
-            }
-            $maxvalue = max($res[$this->delimiter], $maxvalue);
-        }
-        $this->max = Graph\GoogleCharts::roof($maxvalue);
-    }
-
-
-    /**
-     * @return array
-     */
-    public function getDebugData()
-    {
-        $debugdata = [];
-
-        $slotsize = $this->timeresconfig->getValue('slot');
-        $dateformat_intra = $this->timeresconfig->getValue('dateformat-intra');
-
-        foreach ($this->results as $slot => &$res) {
-            $debugdata[$slot] = [
-                $this->datehandlerTick->prettyDateSlot($slot, $slotsize, $dateformat_intra),
-                $res[$this->delimiter]
-            ];
-        }
-        return $debugdata;
-    }
-
-
-    /**
-     * @return void
-     */
-    public function aggregateSummary()
-    {
-        // aggregate summary table from dataset. To be used in the table view
-        $this->summary = [];
-        foreach ($this->results as $slot => $res) {
-            foreach ($res as $key => $value) {
-                if (array_key_exists($key, $this->summary)) {
-                    $this->summary[$key] += $value;
-                } else {
-                    $this->summary[$key] = $value;
-                }
-            }
-        }
-        asort($this->summary);
-        $this->summary = array_reverse($this->summary, true);
-    }
-
-
-    /**
-     * @return array
-     */
-    public function getTopDelimiters()
-    {
-        // create a list of delimiter keys that has the highest total summary in this period
-        $topdelimiters = [];
-        $maxdelimiters = 4;
-        $i = 0;
-        foreach ($this->summary as $key => $value) {
-            if ($key !== '_') {
-                $topdelimiters[] = $key;
-            }
-            if ($i++ >= $maxdelimiters) {
-                break;
-            }
-        }
-        return $topdelimiters;
-    }
-
-
-    /**
-     * @return array
-     */
-    public function availDelimiters()
-    {
-        $availDelimiters = [];
-        foreach ($this->summary as $key => $value) {
-            $availDelimiters[$key] = 1;
-        }
-        return array_keys($availDelimiters);
-    }
-
-
-    /**
-     * @return array
-     */
-    public function getPieData()
-    {
-        $piedata = [];
-        $sum = 0;
-        $topdelimiters = $this->getTopDelimiters();
-
-        foreach ($topdelimiters as $td) {
-            $sum += $this->summary[$td];
-            $piedata[] = number_format(100 * $this->summary[$td] / $this->summary['_'], 2);
-        }
-        $piedata[] = number_format(100 - 100 * ($sum / $this->summary['_']), 2);
-        return $piedata;
-    }
-
-
-    /**
-     * @return int
-     */
-    public function getMax()
-    {
-        return $this->max;
-    }
-
-
-    /**
-     * @return array
-     */
-    public function getSummary()
-    {
-        return $this->summary;
-    }
-
-
-    /**
-     * @return array
-     */
-    public function getResults()
-    {
-        return $this->results;
-    }
-
-
-    /**
-     * @return array
-     */
-    public function getAxis()
-    {
-        $slotsize = $this->timeresconfig->getValue('slot');
-        $dateformat_intra = $this->timeresconfig->getValue('dateformat-intra');
-        $axislabelint = $this->timeresconfig->getValue('axislabelint');
-
-        $axis = [];
-        $axispos = [];
-        $xentries = count($this->results);
-        $lastslot = 0;
-        $i = 0;
-
-        foreach ($this->results as $slot => $res) {
-            $slot = intval($slot);
-
-            // check if there should be an axis here...
-            if ($slot % $axislabelint == 0) {
-                $axis[] = $this->datehandlerTick->prettyDateSlot($slot, $slotsize, $dateformat_intra);
-                $axispos[] = (($i) / ($xentries - 1));
-            }
-
-            $lastslot = $slot;
-            $i++;
-        }
-
-        $axis[] = $this->datehandlerTick->prettyDateSlot($lastslot + 1, $slotsize, $dateformat_intra);
-
-        return ['axis' => $axis, 'axispos' => $axispos];
-    }
-
-
-    /**
-     * Walk through dataset to get percent values from max into dataset[].
-     * @return array
-     */
-    public function getPercentValues()
-    {
-        $i = 0;
-        $dataset = [];
-        foreach ($this->results as $slot => $res) {
-            if (array_key_exists($this->delimiter, $res)) {
-                if ($res[$this->delimiter] === null) {
-                    $dataset[] = -1;
-                } else {
-                    $dataset[] = number_format(100 * $res[$this->delimiter] / $this->max, 2);
-                }
-            } else {
-                $dataset[] = '0';
-            }
-            $i++;
-        }
-
-        return $dataset;
-    }
-
-
-    /**
-     * @return array
-     * @throws \Exception
-     */
-    public function getDelimiterPresentation()
-    {
-        $config = Configuration::getInstance();
-        $t = new Template($config, 'statistics:statistics.tpl.php');
-
-        $availdelimiters = $this->availDelimiters();
-
-        // create a delimiter presentation filter for this rule...
-        if ($this->ruleconfig->hasValue('fieldPresentation')) {
-            $fieldpresConfig = $this->ruleconfig->getConfigItem('fieldPresentation');
-            $classname = Module::resolveClass(
-                $fieldpresConfig->getValue('class'),
-                'Statistics\FieldPresentation'
-            );
-            if (!class_exists($classname)) {
-                throw new \Exception('Could not find field presentation plugin [' . $classname . ']: No class found');
-            }
-            $presentationHandler = new $classname($availdelimiters, $fieldpresConfig->getValue('config'), $t);
-
-            return $presentationHandler->getPresentation();
-        }
-
-        return [];
-    }
-
-
-    /**
-     * @return array
-     */
-    public function getDelimiterPresentationPie()
-    {
-        $topdelimiters = $this->getTopDelimiters();
-        $delimiterPresentation = $this->getDelimiterPresentation();
-
-        $pieaxis = [];
-        foreach ($topdelimiters as $key) {
-            $keyName = $key;
-            if (array_key_exists($key, $delimiterPresentation)) {
-                $keyName = $delimiterPresentation[$key];
-            }
-            $pieaxis[] = $keyName;
-        }
-        $pieaxis[] = 'Others';
-        return $pieaxis;
-    }
-
-
-    /**
-     * @return void
-     */
-    public function loadData()
-    {
-        $statdir = $this->statconfig->getValue('statdir');
-        $resarray = [];
-        $rules = Arrays::arrayize($this->ruleid);
-        foreach ($rules as $rule) {
-            // Get file and extract results.
-            $resultFileName = $statdir . '/' . $rule . '-' . $this->timeres . '-' . $this->fileslot . '.stat';
-            if (!file_exists($resultFileName)) {
-                throw new \Exception('Aggregated statitics file [' . $resultFileName . '] not found.');
-            }
-            if (!is_readable($resultFileName)) {
-                throw new \Exception('Could not read statitics file [' . $resultFileName . ']. Bad file permissions?');
-            }
-            $resultfile = file_get_contents($resultFileName);
-            $newres = unserialize($resultfile);
-            if (empty($newres)) {
-                throw new \Exception('Aggregated statistics in file [' . $resultFileName . '] was empty.');
-            }
-            $resarray[] = $newres;
-        }
-
-        $combined = $resarray[0];
-        $count = count($resarray);
-        if ($count > 1) {
-            for ($i = 1; $i < $count; $i++) {
-                $combined = $this->combine($combined, $resarray[$i]);
-            }
-        }
-        $this->results = $combined;
-    }
-
-
-    /**
-     * @return array
-     */
-    public function combine(array $combined, array $resarray)
-    {
-        return array_merge($combined, $resarray);
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/FieldPresentation/Base.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/FieldPresentation/Base.php
deleted file mode 100644
index cb102787d205a2e7e0ddb3293ae6d57c5769d5c8..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/FieldPresentation/Base.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics\Statistics\FieldPresentation;
-
-class Base
-{
-    /** @var array */
-    protected $fields;
-
-    /** @var \SimpleSAML\XHTML\Template */
-    protected $template;
-
-    /** @var \SimpleSAML\Locale\Translate */
-    protected $translator;
-
-    /** @var string */
-    protected $config;
-
-
-    /**
-     * @param array $fields
-     * @param string $config
-     * @param \SimpleSAML\XHTML\Template $template
-     */
-    public function __construct(array $fields, $config, $template)
-    {
-        $this->config = $config;
-        $this->fields = $fields;
-        $this->template = $template;
-        $this->translator = $template->getTranslator();
-    }
-
-
-    /**
-     * @return array
-     */
-    public function getPresentation()
-    {
-        return ['_' => 'Total'];
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/FieldPresentation/Entity.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/FieldPresentation/Entity.php
deleted file mode 100644
index e8841c6eef8d15128ae5ffd1d3f69135b73fd0f9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/FieldPresentation/Entity.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics\Statistics\FieldPresentation;
-
-use SimpleSAML\Metadata\MetaDataStorageHandler;
-
-class Entity extends Base
-{
-    /**
-     * @return array
-     */
-    public function getPresentation()
-    {
-        $mh = MetaDataStorageHandler::getMetadataHandler();
-        $metadata = $mh->getList($this->config);
-
-        $translation = ['_' => 'All services'];
-        foreach ($this->fields as $field) {
-            if (array_key_exists($field, $metadata)) {
-                if (array_key_exists('name', $metadata[$field])) {
-                    $translation[$field] = $this->translator->t($metadata[$field]['name']);
-                }
-            }
-        }
-        return $translation;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/Rulesets/BaseRule.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/Rulesets/BaseRule.php
deleted file mode 100644
index e6eeb77983dd137ead2d075b74a5ed8e96e0f53e..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/Rulesets/BaseRule.php
+++ /dev/null
@@ -1,184 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics\Statistics\Rulesets;
-
-use SimpleSAML\Configuration;
-use SimpleSAML\Module\statistics\DateHandler;
-use SimpleSAML\Module\statistics\DateHandlerMonth;
-use SimpleSAML\Module\statistics\StatDataset;
-
-/**
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class BaseRule
-{
-    /** @var \SimpleSAML\Configuration */
-    protected $statconfig;
-
-    /** @var \SimpleSAML\Configuration */
-    protected $ruleconfig;
-
-    /** @var string */
-    protected $ruleid = '';
-
-    /** @var array */
-    protected $available = [];
-
-
-    /**
-     * Constructor
-     *
-     * @param \SimpleSAML\Configuration $statconfig
-     * @param \SimpleSAML\Configuration $ruleconfig
-     * @param string $ruleid
-     * @param array $available
-     */
-    public function __construct(Configuration $statconfig, Configuration $ruleconfig, $ruleid, array $available)
-    {
-        $this->statconfig = $statconfig;
-        $this->ruleconfig = $ruleconfig;
-        $this->ruleid = $ruleid;
-
-        if (array_key_exists($ruleid, $available)) {
-            $this->available = $available[$ruleid];
-        }
-    }
-
-
-    /**
-     * @return string
-     */
-    public function getRuleID()
-    {
-        return $this->ruleid;
-    }
-
-
-    /**
-     * @return array
-     */
-    public function availableTimeRes()
-    {
-        $timeresConfigs = $this->statconfig->getValue('timeres');
-        $available_times = [];
-        foreach ($timeresConfigs as $tres => $tresconfig) {
-            if (array_key_exists($tres, $this->available)) {
-                $available_times[$tres] = $tresconfig['name'];
-            }
-        }
-        return $available_times;
-    }
-
-
-    /**
-     * @param string $timeres
-     * @return array
-     */
-    public function availableFileSlots($timeres)
-    {
-        $timeresConfigs = $this->statconfig->getValue('timeres');
-        $timeresConfig = $timeresConfigs[$timeres];
-
-        if (isset($timeresConfig['customDateHandler']) && $timeresConfig['customDateHandler'] == 'month') {
-            $datehandler = new DateHandlerMonth(0);
-        } else {
-            $datehandler = new DateHandler($this->statconfig->getValue('offset', 0));
-        }
-
-        /*
-         * Get list of avaiable times in current file (rule)
-         */
-        $available_times = [];
-        foreach ($this->available[$timeres] as $slot) {
-            $available_times[$slot] = $datehandler->prettyHeader(
-                $slot,
-                $slot + 1,
-                $timeresConfig['fileslot'],
-                $timeresConfig['dateformat-period']
-            );
-        }
-        return $available_times;
-    }
-
-
-    /**
-     * @param string $preferTimeRes
-     * @return string
-     */
-    protected function resolveTimeRes($preferTimeRes)
-    {
-        $timeresavailable = array_keys($this->available);
-        $timeres = $timeresavailable[0];
-
-        // Then check if the user have provided one that is valid
-        if (in_array($preferTimeRes, $timeresavailable, true)) {
-            $timeres = $preferTimeRes;
-        }
-        return $timeres;
-    }
-
-
-    /**
-     * @param string $timeres
-     * @param string $preferTime
-     * @return int
-     */
-    protected function resolveFileSlot($timeres, $preferTime)
-    {
-        // Get which time (fileslot) to use.. First get a default, which is the most recent one.
-        $fileslot = $this->available[$timeres][count($this->available[$timeres]) - 1];
-        // Then check if the user have provided one.
-        if (in_array($preferTime, $this->available[$timeres], true)) {
-            $fileslot = $preferTime;
-        }
-        return $fileslot;
-    }
-
-
-    /**
-     * @param string $timeres
-     * @param string $preferTime
-     * @return array
-     */
-    public function getTimeNavigation($timeres, $preferTime)
-    {
-        $fileslot = $this->resolveFileSlot($timeres, $preferTime);
-
-        // Extract previous and next time slots...
-        $available_times_prev = null;
-        $available_times_next = null;
-
-        $timeslots = array_values($this->available[$timeres]);
-        sort($timeslots, SORT_NUMERIC);
-        $timeslotindex = array_flip($timeslots);
-
-        if ($timeslotindex[$fileslot] > 0) {
-            $available_times_prev = $timeslots[$timeslotindex[$fileslot] - 1];
-        }
-        if ($timeslotindex[$fileslot] < (count($timeslotindex) - 1)) {
-            $available_times_next = $timeslots[$timeslotindex[$fileslot] + 1];
-        }
-        return ['prev' => $available_times_prev, 'next' => $available_times_next];
-    }
-
-
-    /**
-     * @param string $preferTimeRes
-     * @param string $preferTime
-     * @return \SimpleSAML\Module\statistics\StatDataset
-     */
-    public function getDataSet($preferTimeRes, $preferTime)
-    {
-        $timeres = $this->resolveTimeRes($preferTimeRes);
-        $fileslot = $this->resolveFileSlot($timeres, $preferTime);
-        $dataset = new StatDataset(
-            $this->statconfig,
-            $this->ruleconfig,
-            $this->ruleid,
-            $timeres,
-            $fileslot
-        );
-        return $dataset;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/Rulesets/Ratio.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/Rulesets/Ratio.php
deleted file mode 100644
index 492064331f1be01972dcb8f5bfa83b6f53ec3974..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/Statistics/Rulesets/Ratio.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics\Statistics\Rulesets;
-
-use SimpleSAML\Configuration;
-use SimpleSAML\Module\statistics\RatioDataset;
-
-/**
- * @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
- * @package SimpleSAMLphp
- */
-class Ratio extends BaseRule
-{
-    /** @var \SimpleSAML\Module\statistics\Statistics\Rulesets\BaseRule $refrule1 */
-    protected $refrule1;
-
-    /** @var \SimpleSAML\Module\statistics\Statistics\Rulesets\BaseRule $refrule2 */
-    protected $refrule2;
-
-
-    /**
-     * Constructor
-     *
-     * @param \SimpleSAML\Configuration $statconfig
-     * @param \SimpleSAML\Configuration $ruleconfig
-     * @param string $ruleid
-     * @param array $available
-     */
-    public function __construct(Configuration $statconfig, Configuration $ruleconfig, $ruleid, array $available)
-    {
-        parent::__construct($statconfig, $ruleconfig, $ruleid, $available);
-
-        $refNames = $this->ruleconfig->getArray('ref');
-
-        $statrulesConfig = $this->statconfig->getConfigItem('statrules');
-
-        $statruleConfig1 = $statrulesConfig->getConfigItem($refNames[0]);
-        $statruleConfig2 = $statrulesConfig->getConfigItem($refNames[1]);
-
-        $this->refrule1 = new BaseRule($this->statconfig, $statruleConfig1, $refNames[0], $available);
-        $this->refrule2 = new BaseRule($this->statconfig, $statruleConfig2, $refNames[1], $available);
-    }
-
-
-    /**
-     * @return array
-     */
-    public function availableTimeRes()
-    {
-        return $this->refrule1->availableTimeRes();
-    }
-
-
-    /**
-     * @param string $timeres
-     * @return array
-     */
-    public function availableFileSlots($timeres)
-    {
-        return $this->refrule1->availableFileSlots($timeres);
-    }
-
-
-    /**
-     * @param string $preferTimeRes
-     * @return string
-     */
-    protected function resolveTimeRes($preferTimeRes)
-    {
-        return $this->refrule1->resolveTimeRes($preferTimeRes);
-    }
-
-
-    /**
-     * @param string $timeres
-     * @param string $preferTime
-     * @return int
-     */
-    protected function resolveFileSlot($timeres, $preferTime)
-    {
-        return $this->refrule1->resolveFileSlot($timeres, $preferTime);
-    }
-
-
-    /**
-     * @param string $timeres
-     * @param string $preferTime
-     * @return array
-     */
-    public function getTimeNavigation($timeres, $preferTime)
-    {
-        return $this->refrule1->getTimeNavigation($timeres, $preferTime);
-    }
-
-
-    /**
-     * @param string $preferTimeRes
-     * @param string $preferTime
-     * @return \SimpleSAML\Module\statistics\RatioDataset
-     */
-    public function getDataSet($preferTimeRes, $preferTime)
-    {
-        $timeres = $this->resolveTimeRes($preferTimeRes);
-        $fileslot = $this->resolveFileSlot($timeres, $preferTime);
-
-        $refNames = $this->ruleconfig->getArray('ref');
-
-        $dataset = new RatioDataset(
-            $this->statconfig,
-            $this->ruleconfig,
-            $refNames,
-            $timeres,
-            $fileslot
-        );
-        return $dataset;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/StatisticsController.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/StatisticsController.php
deleted file mode 100644
index 3de1fd0e18cee3f7cdcd5a00c230c89aebafc85a..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/lib/StatisticsController.php
+++ /dev/null
@@ -1,244 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-use SimpleSAML\Configuration;
-use SimpleSAML\HTTP\RunnableResponse;
-use SimpleSAML\Locale\Translate;
-use SimpleSAML\Module;
-use SimpleSAML\Session;
-use SimpleSAML\Utils\HTTP;
-use SimpleSAML\XHTML\Template;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Controller class for the statistics module.
- *
- * This class serves the statistics views available in the module.
- *
- * @package SimpleSAML\Module\admin
- */
-class StatisticsController
-{
-    /** @var \SimpleSAML\Configuration */
-    protected $config;
-
-    /** @var \SimpleSAML\Configuration */
-    protected $moduleConfig;
-
-    /** @var \SimpleSAML\Session */
-    protected $session;
-
-
-    /**
-     * StatisticsController constructor.
-     *
-     * @param \SimpleSAML\Configuration $config The configuration to use.
-     * @param \SimpleSAML\Session $session The current user session.
-     */
-    public function __construct(Configuration $config, Session $session)
-    {
-        $this->config = $config;
-        $this->moduleConfig = Configuration::getConfig('module_statistics.php');
-        $this->session = $session;
-    }
-
-
-    /**
-     * Display statistics metadata.
-     *
-     * @param Request $request The current request.
-     *
-     * @return \SimpleSAML\XHTML\Template
-     */
-    public function metadata(Request $request)
-    {
-        AccessCheck::checkAccess($this->moduleConfig);
-
-        $aggr = new Aggregator();
-        $aggr->loadMetadata();
-        $metadata = $aggr->getMetadata();
-
-        if ($metadata !== null) {
-            if (in_array('lastrun', $metadata, true)) {
-                $metadata['lastrun'] = date('l jS \of F Y H:i:s', $metadata['lastrun']);
-            }
-            if (in_array('notBefore', $metadata, true)) {
-                $metadata['notBefore'] = date('l jS \of F Y H:i:s', $metadata['notBefore']);
-            }
-            if (in_array('memory', $metadata, true)) {
-                $metadata['memory'] = number_format($metadata['memory'] / (1024 * 1024), 2);
-            }
-        }
-
-        $t = new Template($this->config, 'statistics:statmeta.tpl.php');
-        $t->data = [
-            'metadata' => $metadata,
-        ];
-
-        return $t;
-    }
-
-
-    /**
-     * Display the main admin page.
-     *
-     * @return \SimpleSAML\XHTML\Template
-     */
-    public function main(Request $request)
-    {
-        AccessCheck::checkAccess($this->moduleConfig);
-
-        /**
-         * Check input parameters
-         */
-        $preferRule = $request->query->get('rule');
-        $preferRule2 = $request->query->get('rule2');
-        if ($preferRule2 === '_') {
-            $preferRule2 = null;
-        }
-
-        $preferTime = $request->query->get('time');
-        $preferTimeRes = $request->query->get('res');
-        $delimiter = $request->query->get('delimiler');
-
-        /**
-         * Create statistics data.
-         */
-        $ruleset = new Ruleset($this->moduleConfig);
-        $statrule = $ruleset->getRule($preferRule);
-        $rule = $statrule->getRuleID();
-
-        /**
-         * Prepare template.
-         */
-        $t = new Template($this->config, 'statistics:statistics.tpl.php');
-        $t->data = [
-            'delimiter' => $delimiter,
-            'pageid' => 'statistics',
-            'header' => 'stat',
-            'available_rules' => $ruleset->availableRulesNames(),
-            'selected_rule' => $rule,
-            'selected_rule2' => $preferRule2,
-        ];
-
-        try {
-            $dataset = $statrule->getDataset($preferTimeRes, $preferTime);
-            $dataset->setDelimiter($delimiter);
-            $dataset->aggregateSummary();
-            $dataset->calculateMax();
-        } catch (\Exception $e) {
-            $t->data['error'] = "No data available";
-            return $t;
-        }
-
-        $delimiter = $dataset->getDelimiter();
-        $timeres = $dataset->getTimeRes();
-        $fileslot = $dataset->getFileslot();
-        $timeNavigation = $statrule->getTimeNavigation($timeres, $preferTime);
-        $piedata = $dataset->getPieData();
-        $datasets = [$dataset->getPercentValues()];
-        $axis = $dataset->getAxis();
-        $maxes = [$dataset->getMax()];
-
-        $t->data['selected_rule'] = $rule;
-        $t->data['selected_time'] = $fileslot;
-        $t->data['selected_timeres'] = $timeres;
-        $t->data['post_d'] = $this->getBaseURL($t, 'post', 'd');
-        if (isset($preferRule2)) {
-            $statrule = $ruleset->getRule($preferRule2);
-            try {
-                $dataset2 = $statrule->getDataset($preferTimeRes, $preferTime);
-                $dataset2->aggregateSummary();
-                $dataset2->calculateMax();
-                $datasets[] = $dataset2->getPercentValues();
-                $maxes[] = $dataset2->getMax();
-
-                if ($request->query->get('format') === 'csv') {
-                    header('Content-type: text/csv');
-                    header('Content-Disposition: attachment; filename="simplesamlphp-data.csv"');
-                    $data = $dataset->getDebugData();
-                    foreach ($data as $de) {
-                        if (isset($de[1])) {
-                            echo '"' . $de[0] . '",' . $de[1] . "\n";
-                        }
-                    }
-                    exit;
-                } else {
-                    $t->data['error'] = 'Export format not supported';
-                    return $t;
-                }
-            } catch (\Exception $e) {
-                $t->data['error'] = "No data available to compare";
-                return $t;
-            }
-        }
-
-        $dimx = $this->moduleConfig->getValue('dimension.x', 800);
-        $dimy = $this->moduleConfig->getValue('dimension.y', 350);
-        $grapher = new Graph\GoogleCharts($dimx, $dimy);
-        $t->data['imgurl'] = $grapher->show($axis['axis'], $axis['axispos'], $datasets, $maxes);
-
-        if (!empty($piedata)) {
-            $t->data['pieimgurl'] = $grapher->showPie($dataset->getDelimiterPresentationPie(), $piedata);
-        }
-
-        $t->data['available_rules'] = $ruleset->availableRulesNames();
-        $t->data['available_times'] = $statrule->availableFileSlots($timeres);
-        $t->data['available_timeres'] = $statrule->availableTimeRes();
-        $t->data['available_times_prev'] = $timeNavigation['prev'];
-        $t->data['available_times_next'] = $timeNavigation['next'];
-        $t->data['current_rule'] = $t->data['available_rules'][$rule];
-        $t->data['selected_rule2'] = $preferRule2;
-        $t->data['selected_delimiter'] = $delimiter;
-        $t->data['debugdata'] = $dataset->getDebugData();
-        $t->data['results'] = $dataset->getResults();
-        $t->data['summaryDataset'] = $dataset->getSummary();
-        $t->data['topdelimiters'] = $dataset->getTopDelimiters();
-        $t->data['post_rule'] = $this->getBaseURL($t, 'post', 'rule');
-        $t->data['post_rule2'] = $this->getBaseURL($t, 'post', 'rule2');
-        $t->data['post_res'] = $this->getBaseURL($t, 'post', 'res');
-        $t->data['post_time'] = $this->getBaseURL($t, 'post', 'time');
-        $t->data['get_times_prev'] = $this->getBaseURL($t, 'get', 'time', $t->data['available_times_prev']);
-        $t->data['get_times_next'] = $this->getBaseURL($t, 'get', 'time', $t->data['available_times_next']);
-        $t->data['availdelimiters'] = $dataset->availDelimiters();
-        $t->data['delimiterPresentation'] = $dataset->getDelimiterPresentation();
-
-        return $t;
-    }
-
-
-    /**
-     * @param \SimpleSAML\XHTML\Template $t
-     * @param string $type
-     * @param string|null $key
-     * @param string|null $value
-     * @return string|array
-     */
-    private function getBaseURL(Template $t, $type = 'get', $key = null, $value = null)
-    {
-        $vars = [
-            'rule' => $t->data['selected_rule'],
-            'time' => $t->data['selected_time'],
-            'res' => $t->data['selected_timeres'],
-        ];
-        if (isset($t->data['selected_delimiter'])) {
-            $vars['d'] = $t->data['selected_delimiter'];
-        }
-        if (!empty($t->data['selected_rule2']) && $t->data['selected_rule2'] !== '_') {
-            $vars['rule2'] = $t->data['selected_rule2'];
-        }
-        if (isset($key)) {
-            if (isset($vars[$key])) {
-                unset($vars[$key]);
-            }
-            if (isset($value)) {
-                $vars[$key] = $value;
-            }
-        }
-        if ($type === 'get') {
-            return Module::getModuleURL("statistics/showstats.php") . '?' . http_build_query($vars, '', '&');
-        }
-        return $vars;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/en/LC_MESSAGES/statistics.po b/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/en/LC_MESSAGES/statistics.po
deleted file mode 100644
index 8dee6fd55264775750189843f14e237e88acbaad..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/en/LC_MESSAGES/statistics.po
+++ /dev/null
@@ -1,11 +0,0 @@
-msgid "{statistics:statistics:link_statistics"
-msgstr "Show statistics"
-
-msgid "{statistics:statistics:link_statistics_metadata"
-msgstr "Show statistics metadata"
-
-msgid "Show statistics"
-msgstr "Show statistics"
-
-msgid "Show statistics metadata"
-msgstr "Show statistics metadata"
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/es/LC_MESSAGES/statistics.po b/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/es/LC_MESSAGES/statistics.po
deleted file mode 100644
index 871d8251855b584a8b9cd1ca95dbefa1d609d383..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/es/LC_MESSAGES/statistics.po
+++ /dev/null
@@ -1,11 +0,0 @@
-msgid "{statistics:statistics:link_statistics"
-msgstr "Mostrar estadísticas"
-
-msgid "{statistics:statistics:link_statistics_metadata"
-msgstr "Mostrar metadatos de las estadísticas"
-
-msgid "Show statistics"
-msgstr "Mostrar estadísticas"
-
-msgid "Show statistics metadata"
-msgstr "Mostrar metadatos de las estadísticas"
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/nb/LC_MESSAGES/statistics.po b/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/nb/LC_MESSAGES/statistics.po
deleted file mode 100644
index f6704778553d62d21ebc32a90d3c96a3593b49e4..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/nb/LC_MESSAGES/statistics.po
+++ /dev/null
@@ -1,11 +0,0 @@
-msgid "{statistics:statistics:link_statistics"
-msgstr "Vis statistikker"
-
-msgid "{statistics:statistics:link_statistics_metadata"
-msgstr "Vis metadata om statistikker"
-
-msgid "Show statistics"
-msgstr "Vis statistikker"
-
-msgid "Show statistics metadata"
-msgstr "Vis metadata om statistikker"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/nn/LC_MESSAGES/statistics.po b/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/nn/LC_MESSAGES/statistics.po
deleted file mode 100644
index 6fb2e3bf4f2e2957a2d28865fd8edc67d895de9e..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/locales/nn/LC_MESSAGES/statistics.po
+++ /dev/null
@@ -1,11 +0,0 @@
-msgid "{statistics:statistics:link_statistics"
-msgstr "Vis statistikkar"
-
-msgid "{statistics:statistics:link_statistics_metadata"
-msgstr "Vis metadata om statistikkar"
-
-msgid "Show statistics"
-msgstr "Vis statistikkar"
-
-msgid "Show statistics metadata"
-msgstr "Vis metadata om statistikkar"
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/statistics/phpunit.xml
deleted file mode 100644
index 0540658da5d229b7588de0714b999d0aebffe445..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/phpunit.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<phpunit bootstrap="tests/bootstrap.php">
-    <testsuites>
-        <testsuite name="The project's test suite">
-            <directory>./vendor/simplesamlphp/simplesamlphp-test-framework/tests/</directory>
-            <directory>tests/</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./lib</directory>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" />
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" />
-        <log type="coverage-clover" target="build/logs/clover.xml" />
-    </logging>
-</phpunit>
-
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/statistics/psalm.xml
deleted file mode 100644
index 1dba560190e7d1034eb9d1c3f4a06eeaf96f9c15..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/psalm.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    name="The SimpleSAMLphp statistics module"
-    useDocblockTypes="true"
-    totallyTyped="false"
->
-    <projectFiles>
-        <directory name="lib" />
-        <directory name="www" />
-    </projectFiles>
-
-    <issueHandlers>
-        <LessSpecificReturnType errorLevel="info" />
-
-        <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives -->
-        <DeprecatedMethod errorLevel="info" />
-
-        <MissingClosureReturnType errorLevel="info" />
-        <MissingReturnType errorLevel="info" />
-        <MissingPropertyType errorLevel="info" />
-        <InvalidDocblock errorLevel="info" />
-        <MisplacedRequiredParam errorLevel="info" />
-
-        <PropertyNotSetInConstructor errorLevel="info" />
-        <MissingConstructor errorLevel="info" />
-        <MissingClosureParamType errorLevel="info" />
-        <MissingParamType errorLevel="info" />
-        <UnusedClass errorLevel="info" />
-        <PossiblyUnusedMethod errorLevel="info" />
-    </issueHandlers>
-</psalm>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/routes.yaml b/vendor/simplesamlphp/simplesamlphp/modules/statistics/routes.yaml
deleted file mode 100644
index e0fa51ae9eb9da5b20f34cd9c79824bad3d14bf1..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/routes.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-statistics-main:
-    path:       /
-    defaults:   { _controller: 'SimpleSAML\Module\statistics\StatisticsController::main' }
-statistics-metadata:
-    path:       /metadata
-    defaults:   { _controller: 'SimpleSAML\Module\statistics\StatisticsController::metadata' }
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statistics.tpl.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statistics.tpl.php
deleted file mode 100644
index 3a3e6cdd50f789b7f378211a5fd3d9bb2e3cf99c..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statistics.tpl.php
+++ /dev/null
@@ -1,238 +0,0 @@
-<?php
-$this->data['header'] = 'SimpleSAMLphp Statistics';
-
-$this->data['head'] = '<link rel="stylesheet" type="text/css" href="'.
-    SimpleSAML\Module::getModuleURL("statistics/assets/css/statistics.css").'" />'."\n";
-$this->data['head'] .= '<link rel="stylesheet" media="screen" href="'.
-    SimpleSAML\Module::getModuleURL("statistics/assets/css/uitheme1.12.1/jquery-ui.min.css").'" />'."\n";
-
-$this->includeAtTemplateBase('includes/header.php');
-
-$this->data['htmlinject']['htmlContentPost'][] = '<script src="'.
-    SimpleSAML\Module::getModuleURL("statistics/assets/js/jquery-1.12.4.min.js").'"></script>'."\n";
-$this->data['htmlinject']['htmlContentPost'][] = '<script src="'.
-    SimpleSAML\Module::getModuleURL("statistics/assets/js/jquery-ui-1.12.1.min.js").'"></script>'."\n";
-$this->data['htmlinject']['htmlContentPost'][] = '<script type="text/javascript" src="'.
-    SimpleSAML\Module::getModuleURL("statistics/assets/js/statistics.js").'"></script>'."\n";
-
-echo '<h1>'.$this->data['available_rules'][$this->data['selected_rule']]['name'].'</h1>';
-echo '<p>'.$this->data['available_rules'][$this->data['selected_rule']]['descr'].'</p>';
-
-// Report settings
-echo '<table class="selecttime">';
-echo '<tr><td class="selecttime_icon"><img src="'.SimpleSAML\Utils\HTTP::getBaseURL().
-    'resources/icons/crystal_project/kchart.32x32.png" alt="Report settings" /></td>';
-
-// Select report
-echo '<td>';
-echo '<form action="#">';
-
-foreach ($this->data['post_rule'] as $k => $v) {
-    echo '<input type="hidden" name="'.$k.'" value="'.htmlspecialchars($v).'" />'."\n";
-}
-
-if (!empty($this->data['available_rules'])) {
-    echo '<select name="rule">';
-    foreach ($this->data['available_rules'] as $key => $rule) {
-        if ($key === $this->data['selected_rule']) {
-            echo '<option selected="selected" value="'.$key.'">'.$rule['name'].'</option>';
-        } else {
-            echo '<option value="'.$key.'">'.$rule['name'].'</option>';
-        }
-    }
-    echo '</select>';
-}
-echo '</form></td>';
-
-// Select delimiter
-echo '<td class="td_right">';
-echo '<form action="#">';
-
-foreach ($this->data['post_d'] as $k => $v) {
-    echo '<input type="hidden" name="'.$k.'" value="'.htmlspecialchars($v).'" />'."\n";
-}
-
-if (!empty($this->data['availdelimiters'])) {
-    echo '<select name="d">';
-    foreach ($this->data['availdelimiters'] as $key => $delim) {
-        $delimName = $delim;
-        if (array_key_exists($delim, $this->data['delimiterPresentation'])) {
-            $delimName = $this->data['delimiterPresentation'][$delim];
-        }
-
-        if ($key == '_') {
-            echo '<option value="_">Total</option>';
-        } elseif (isset($_REQUEST['d']) && $delim == $_REQUEST['d']) {
-            echo '<option selected="selected" value="'.htmlspecialchars($delim).'">'.
-                htmlspecialchars($delimName).'</option>';
-        } else {
-            echo '<option  value="'.htmlspecialchars($delim).'">'.htmlspecialchars($delimName).'</option>';
-        }
-    }
-    echo '</select>';
-}
-echo '</form></td></tr>';
-
-echo '</table>';
-
-// End report settings
-
-
-// Select time and date
-echo '<table class="selecttime">';
-echo '<tr><td class="selecttime_icon"><img src="'.SimpleSAML\Utils\HTTP::getBaseURL().
-    'resources/icons/crystal_project/date.32x32.png" alt="Select date and time" /></td>';
-
-if (isset($this->data['available_times_prev'])) {
-    echo '<td><a href="'.$this->data['get_times_prev'].'">« Previous</a></td>';
-} else {
-    echo '<td class="selecttime_link_grey">« Previous</td>';
-}
-
-echo '<td class="td_right">';
-echo '<form action="#">';
-
-foreach ($this->data['post_res'] as $k => $v) {
-    echo '<input type="hidden" name="'.$k.'" value="'.htmlspecialchars($v).'" />'."\n";
-}
-
-if (!empty($this->data['available_timeres'])) {
-    echo '<select name="res">';
-    foreach ($this->data['available_timeres'] as $key => $timeresname) {
-        if ($key == $this->data['selected_timeres']) {
-            echo '<option selected="selected" value="'.$key.'">'.$timeresname.'</option>';
-        } else {
-            echo '<option  value="'.$key.'">'.$timeresname.'</option>';
-        }
-    }
-    echo '</select>';
-}
-echo '</form></td>';
-
-echo '<td class="td_left">';
-echo '<form action="#">';
-
-foreach ($this->data['post_time'] as $k => $v) {
-    echo '<input type="hidden" name="'.$k.'" value="'.htmlspecialchars($v).'" />'."\n";
-}
-
-if (!empty($this->data['available_times'])) {
-    echo '<select name="time">';
-    foreach ($this->data['available_times'] as $key => $timedescr) {
-        if ($key == $this->data['selected_time']) {
-            echo '<option selected="selected" value="'.$key.'">'.$timedescr.'</option>';
-        } else {
-            echo '<option  value="'.$key.'">'.$timedescr.'</option>';
-        }
-    }
-    echo '</select>';
-}
-echo '</form></td>';
-
-if (isset($this->data['available_times_next'])) {
-    echo '<td class="td_right td_next_right"><a href="'.$this->data['get_times_next'].'">Next »</a></td>';
-} else {
-    echo '<td class="td_right selecttime_link_grey td_next_right">Next »</td>';
-}
-
-echo '</tr></table>';
-echo '<div id="tabdiv">';
-if (!empty($this->data['results'])) {
-    echo '<ul class="tabset_tabs">
-       <li><a href="#graph">Graph</a></li>
-       <li><a href="#table">Summary table</a></li>
-       <li><a href="#debug">Time serie</a></li>
-    </ul>';
-    echo '
-
-    <div id="graph" class="tabset_content">';
-
-    echo '<img src="'.htmlspecialchars($this->data['imgurl']).'" alt="Graph" />';
-
-    echo '<form action="#">';
-    echo '<p class="p_right">Compare with total from this dataset ';
-
-    foreach ($this->data['post_rule2'] as $k => $v) {
-        echo '<input type="hidden" name="'.$k.'" value="'.htmlspecialchars($v).'" />'."\n";
-    }
-
-    echo '<select name="rule2">';
-    echo '	<option value="_">None</option>';
-    foreach ($this->data['available_rules'] as $key => $rule) {
-        if ($key === $this->data['selected_rule2']) {
-            echo '<option selected="selected" value="'.$key.'">'.$rule['name'].'</option>';
-        } else {
-            echo '<option value="'.$key.'">'.$rule['name'].'</option>';
-        }
-    }
-    echo '</select></p></form>';
-
-    echo '</div>'; // end graph content.
-
-    /**
-     * Handle table view - - - - - -
-     */
-    $classint = ['odd', 'even'];
-    $i = 0;
-    echo '<div id="table" class="tabset_content">';
-
-    if (isset($this->data['pieimgurl'])) {
-        echo '<img src="'.$this->data['pieimgurl'].'" alt="Pie chart" />';
-    }
-    echo '<table class="tableview"><tr><th class="value">Value</th><th class="category">Data range</th></tr>';
-
-    foreach ($this->data['summaryDataset'] as $key => $value) {
-        $clint = $classint[$i++ % 2];
-
-        $keyName = $key;
-        if (array_key_exists($key, $this->data['delimiterPresentation'])) {
-            $keyName = $this->data['delimiterPresentation'][$key];
-        }
-
-        if ($key === '_') {
-            echo '<tr class="total '.$clint.'"><td  class="value">'.
-                $value.'</td><td class="category">'.$keyName.'</td></tr>';
-        } else {
-            echo '<tr class="'.$clint.'"><td  class="value">'.$value.
-                '</td><td class="category">'.$keyName.'</td></tr>';
-        }
-    }
-
-    echo '</table></div>';
-    //  - - - - - - - End table view - - - - - - -
-
-    echo '<div id="debug" >';
-    echo '<table class="timeseries">';
-    echo '<tr><th>Time</th><th>Total</th>';
-    foreach ($this->data['topdelimiters'] as $key) {
-        $keyName = $key;
-        if (array_key_exists($key, $this->data['delimiterPresentation'])) {
-            $keyName = $this->data['delimiterPresentation'][$key];
-        }
-        echo'<th>'.$keyName.'</th>';
-    }
-    echo '</tr>';
-
-    $i = 0;
-    foreach ($this->data['debugdata'] as $slot => $dd) {
-        echo '<tr class="'.((++$i % 2) == 0 ? 'odd' : 'even').'">';
-        echo '<td>'.$dd[0].'</td>';
-        echo '<td class="datacontent">'.$dd[1].'</td>';
-
-        foreach ($this->data['topdelimiters'] as $key) {
-            echo '<td class="datacontent">'.(array_key_exists($key, $this->data['results'][$slot]) ?
-                $this->data['results'][$slot][$key] : '&nbsp;').'</td>';
-        }
-        echo '</tr>';
-    }
-    echo '</table>';
-
-
-    echo '</div>'; // End debug tab content
-} else {
-    echo '<h4 align="center">'.$this->data['error'].'</h4>';
-    echo '<p align="center"><a href="showstats.php">Clear selection</a></p>';
-}
-echo '</div>'; // End tab div
-
-$this->includeAtTemplateBase('includes/footer.php');
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statistics.twig b/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statistics.twig
deleted file mode 100644
index 975d0f96165c79e298700813178bb88320e8c956..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statistics.twig
+++ /dev/null
@@ -1,225 +0,0 @@
-{% set pagetitle = 'SimpleSAMLphp Statistics'|trans %}
-{% extends "base.twig" %}
-
-{% block preload %}
-    <link href="/{{ baseurlpath }}module.php/statistics/assets/css/statistics.css" rel="stylesheet">
-    <link rel="stylesheet" media="screen" href="/{{ baseurlpath }}module.php/statistics/assets/css/uitheme1.12.1/jquery-ui.min.css">
-{% endblock %}
-
-{% block postload %}
-<script src="/{{ baseurlpath }}module.php/statistics/assets/js/jquery-ui-1.12.1.min.js"></script>
-<script src="/{{ baseurlpath }}module.php/statistics/assets/js/statistics.js"></script>
-{% endblock %}
-
-{% block content %}
-    <h1>{{ current_rule.name }}</h1>
-    <p>{{ current_rule.descr }}</p>
-
-    <table class="selecttime">
-        <tr>
-            <td class="selecttime_icon">
-                <i class="fa fa-pie-chart"></i>
-            </td>
-            <td>
-                <form action="#">
-                    {% for key, value in post_rule %}
-                    <input type="hidden" name="{{ key|escape('html') }}" value="{{ value|escape('html') }}">
-                    {% endfor %}
-                    <select name="rule">
-                    {% for key, rule in available_rules %}
-                        {% if key == selected_rule %}
-                        <option selected="selected" value="{{ key }}">{{ rule.name }}</option>
-                        {% else %}
-                        <option value="{{ key }}">{{ rule.name }}</option>
-                        {% endif %}
-                    {% endfor %}
-                    </select>
-                </form>
-            </td>
-            <td class="td_right">
-                <form action="#">
-                    {% for key, value in post_d %}
-                    <input type="hidden" name="{{ key|escape('html') }}" value="{{ value|escape('html') }}">
-                    {% endfor %}
-                    {% if availdelimiters %}
-                    <select name="d">
-                    {% for key, delim in availdelimiters %}
-                        {% set delimName = delim %}
-
-                        {% if delimiterPresentation[delim] is defined %}
-                        {% set delimName = delimiterPresentation[delim] %}
-                        {% endif %}
-
-                        {% if key == "_" %}
-                        <option value="_">Total</option>
-                        {% elseif request_d is defined and delim == request_d %}
-                        <option selected="selected" value="{{ delim|escape('html') }}">{{ delimName|escape('html') }}</option>
-                        {% else %}
-                        <option value="{{ delim|escape('html') }}">{{ delimName|escape('html') }}</option>
-                        {% endif %}
-                    {% endfor %}
-                    </select>
-                    {% endif %}
-                </form>
-            </td>
-        </tr>
-    </table>
-
-    <table class="selecttime">
-        <tr>
-            <td class="selecttime_icon">
-                <i class="fa fa-calendar"></i>
-            </td>
-            {% if available_times_prev %}
-            <td><a href="{{ get_times_prev }}">&laquo; Previous</a></td>
-            {% else %}
-            <td class="selecttime_link_grey">&laquo; Previous</td>
-            {% endif %}
-            <td class="td_right">
-                <form action="#">
-                    {% for key, value in post_res %}
-                    <input type="hidden" name="{{ key|escape('html') }}" value="{{ value|escape('html') }}">
-                    {% endfor %}
-                    {% if available_timeres %}
-                    <select name="res">
-                    {% for key, timeresname in available_timeres %}
-                        {% if key == selected_timeres %}
-                        <option selected="selected" value="{{ key }}">{{ timeresname }}</option>
-                        {% else %}
-                        <option value="{{ key }}">{{ timeresname }}</option>
-                        {% endif %}
-                    {% endfor %}
-                    </select>
-                    {% endif %}
-                </form>
-            </td>
-            <td class="td_left">
-                <form action="#">
-                    {% for key, value in post_time %}
-                    <input type="hidden" name="{{ key|escape('html') }}" value="{{ value|escape('html') }}">
-                    {% endfor %}
-                    {% if available_times %}
-                    <select name="time">
-                    {% for key, timedescr in available_times %}
-                        {% if key == selected_time %}
-                        <option selected="selected" value="{{ key }}">{{ timedescr }}</option>
-                        {% else %}
-                        <option value="{{ key }}">{{ timedescr }}</option>
-                        {% endif%}
-                    {% endfor %}
-                    </select>
-                    {% endif %}
-                </form>
-            </td>
-            {% if available_times_next %}
-                <td class="td_right td_next_right"><a href="{{ get_times_next }}">Next &raquo;</a></td>
-            {% else %}
-                <td class="td_right selecttime_link_grey">Next &raquo;</td>
-            {% endif %}
-        </tr>
-    </table>
-
-    <div id="tabdiv">
-    {% if results %}
-        <ul class="tabset_tabs">
-            <li class="tab-link current" data-tab="graph"><a href="#graph">Graph</a></li>
-            <li class="tab-link" data-tab="table"><a href="#table">Summary table</a></li>
-            <li class="tab-link" data-tab="debug"><a href="#debug">Time serie</a></li>
-        </ul>
-
-        <div id="graph" class="tabset_content current">
-            <img src="{{ imgurl }}" alt="Graph" />
-            <form action="#">
-                <p class="p_right">Compare with total from this dataset
-                <select name="rule2">
-                    <option value="_">None</option>
-                    {% for key, rule in available_rules %}
-                    {% if key == selected_rule2 %}
-                    <option selected="selected" value="{{ key }}">{{ rule.name }}</option>
-                    {% else %}
-                    <option value="{{ key }}">{{ rule.name }}</option>
-                    {% endif %}
-                    {% endfor %}
-                </select>
-                </p>
-            </form>
-        </div>
-
-        <div id="table" class="tabset_content">
-            {% if pieimgurl is defined %}
-            <img src="{{ pieimgurl }}" alt="Pie chart" />
-            {% endif %}
-
-            <table class="tableview">
-                <tr>
-                    <th class="value">Value</th>
-                    <th class="category">Data range</th>
-                </tr>
-                {% for key, value in summaryDataset %}
-                {% if loop.index0 is even %}
-                    {% set class = 'even' %}
-                {% else %}
-                    {% set class = 'odd' %}
-                {% endif %}
-
-                {% set keyName = key %}
-                {% if delimiterPresentation[key] is defined %}
-                {% set keyName = delimiterPresentation[key] %}
-                {% endif %}
-
-                {% if key == "_" %}
-                <tr class="total {{ class }}">
-                    <td class="value">{{ value }}</td>
-                    <td class="category">{{ keyName }}</td>
-                </tr>
-                {% else %}
-                <tr class="{{ class }}">
-                    <td class="value">{{ value }}</td>
-                    <td class="category">{{ keyName }}</td>
-                </tr>
-                {% endif %}
-                {% endfor %}
-            </table>
-        </div>
-
-        <div id="debug" class="tabset_content">
-            <table class="timeseries">
-                <tr>
-                    <th>Time</th>
-                    <th>Total</th>
-                    {% for key, value in topdelimiters %}
-                    {% set keyName = value %}
-                    {% if delimiterPresentation[value] is defined %}
-                        {% set keyName = delimiterPresentation[value] %}
-                    {% endif %}
-                    <th>{{ keyName }}</th>
-                    {% endfor %}
-                </tr>
-                {% for slot, dd in debugdata %}
-
-                {% if loop.index0 is even %}
-                    {% set class = 'even' %}
-                {% else %}
-                    {% set class = 'odd' %}
-                {% endif %}
-
-                <tr class="{{ class }}">
-                    <td>{{ dd[0] }}</td>
-                    <td class="datacontent">{{ dd[1] }}</td>
-                    {% for key, value in topdelimiters %}
-                    {% if results[slot] is defined and value == '_' %}
-                    <td class="datacontent">{{ results[slot][value] }}</td>
-                    {% else %}
-                    <td class="datacontent">&nbsp;</td>
-                    {% endif %}
-                    {% endfor %}
-                </tr>
-                {% endfor %}
-            </table>
-        </div>
-    {% else %}
-        <h4 align="center">{{ error }}</h4>
-        <p align="center"><a href="showstats.php">Clear selection</a></p>
-    {% endif %}
-    </div>
-{% endblock %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statmeta.tpl.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statmeta.tpl.php
deleted file mode 100644
index 324b4e0c5c2ad26a0abf5e3b3c2ee82d98ec3a0b..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statmeta.tpl.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-$this->data['header'] = 'SimpleSAMLphp Statistics Metadata';
-$this->data['head'] = '<link rel="stylesheet" type="text/css" href="'.
-    SimpleSAML\Module::getModuleURL("statistics/assets/css/statistics.css").'" />';
-$this->includeAtTemplateBase('includes/header.php');
-
-echo '<table id="statmeta">' ;
-
-if (isset($this->data['metadata'])) {
-    $metadata = $this->data['metadata'];
-
-    if (isset($metadata['lastrun'])) {
-        echo '<tr><td>Aggregator last run at</td><td>'.$metadata['lastrun'].'</td></tr>';
-    }
-
-    if (isset($metadata['notBefore'])) {
-        echo '<tr><td>Aggregated data until</td><td>'.$metadata['notBefore'].'</td></tr>';
-    }
-
-    if (isset($metadata['memory'])) {
-        echo '<tr><td>Memory usage</td><td>'.$metadata['memory'].' MB'.'</td></tr>';
-    }
-
-    if (isset($metadata['time'])) {
-        echo '<tr><td>Execution time</td><td>'.$metadata['time'].' seconds'.'</td></tr>';
-    }
-
-    if (isset($metadata['lastlinehash'])) {
-        echo '<tr><td>SHA1 of last processed logline</td><td>'.$metadata['lastlinehash'].'</td></tr>';
-    }
-
-    if (isset($metadata['lastline'])) {
-        echo '<tr><td>Last processed logline</td><td>'.$metadata['lastline'].'</td></tr>';
-    }
-} else {
-    echo '<tr><td>No metadata found</td></tr>';
-}
-
-echo '</table>';
-echo '<p>[ <a href="'.SimpleSAML\Module::getModuleURL("statistics/showstats.php").'">Show statistics</a> ] </p>';
-
-$this->includeAtTemplateBase('includes/footer.php');
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statmeta.twig b/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statmeta.twig
deleted file mode 100644
index 100a8c886c134e64200ac56ce1382b1f0674821b..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/templates/statmeta.twig
+++ /dev/null
@@ -1,40 +0,0 @@
-{% set pagetitle = 'SimpleSAMLphp Statistics Metadata'|trans %}
-{% extends "base.twig" %}
-
-{% block preload %}
-    <link href="/{{ baseurlpath }}modules.php/statistics/assets/css/statistics.css" rel="stylesheet">
-{% endblock %}
-
-{% block content %}
-    <h2>{{ pagetitle }}</h2>
-    <table id="statmeta">
-    {% if metadata is defined %}
-        {% if metadata.lastrun is defined %}
-            <tr><td>Aggregator last run at</td><td>{{ metadata.lastrun|date }}</td></tr>
-        {% endif %}
-
-        {% if metadata.notBefore is defined %}
-            <tr><td>Aggregated data until</td><td>{{ metadata.notBefore|date }}</td></tr>
-        {% endif %}
-
-        {% if metadata.memory is defined %}
-            <tr><td>Memory usage</td><td>{{ metadata.memory }} MB</td></tr>
-        {% endif %}
-
-        {% if metadata.memory is defined %}
-            <tr><td>Execution time</td><td>{{ metadata.time }} seconds</td></tr>
-        {% endif %}
-
-        {% if metadata.memory is defined %}
-            <tr><td>SHA1 of last processed logline</td><td>{{ metadata.lastlinehash }}</td></tr>
-        {% endif %}
-
-        {% if metadata.memory is defined %}
-            <tr><td>Last processed logline</td><td>{{ metadata.lastline }}</td></tr>
-        {% endif %}
-    {% else %}
-        <tr><td>No metadata found</td></tr>
-    {% endif %}
-    </table>
-    <p>[ <a href="/{{ baseurlpath }}module.php/statistics/showstats.php">Show statistics</a> ]</p>
-{% endblock %}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/tests/bootstrap.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/tests/bootstrap.php
deleted file mode 100644
index 60565036ecc1672468c3b82a0de01c015e83d9af..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/tests/bootstrap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-$projectRoot = dirname(__DIR__);
-require_once($projectRoot . '/vendor/autoload.php');
-
-// Symlink module into ssp vendor lib so that templates and urls can resolve correctly
-$linkPath = $projectRoot . '/vendor/simplesamlphp/simplesamlphp/modules/statistics';
-if (file_exists($linkPath) === false) {
-    echo "Linking '$linkPath' to '$projectRoot'\n";
-    symlink($projectRoot, $linkPath);
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/statistics.css b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/statistics.css
deleted file mode 100644
index 4d0d163d600681ffe26fa34cee7cd7cbd9505bc4..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/statistics.css
+++ /dev/null
@@ -1,127 +0,0 @@
-@media all {
-    div#content {
-        margin: .4em ! important;
-    }
-
-    .tableview {
-        border-collapse: collapse;
-        border: 1px solid #ccc;
-        margin: 1em;
-        width: 80%;
-    }
-
-    .tableview th, .tableview td {
-        border: 1px solid #ccc;
-        padding: 0px 5px;
-    }
-
-    .tableview th {
-        background: #e5e5e5;
-    }
-
-    .tableview tr.total td {
-        color: #500; font-weight: bold;
-    }
-
-    .tableview tr.even td {
-        background: #f5f5f5;
-        border-top: 1px solid #e0e0e0;
-        border-bottom: 1px solid #e0e0e0;
-    }
-
-    .tableview th.value, .tableview td.value {
-        text-align: right;
-    }
-
-    table.timeseries tr.odd td {
-        background-color: #f4f4f4;
-    }
-
-    table.timeseries td {
-        padding-right: 2em; border: 1px solid #ccc
-    }
-
-    td.datacontent {
-        text-align: right;
-    }
-
-    table.selecttime {
-        width: 100%;
-        border: 1px solid #ccc;
-        background: #eee;
-        margin: 1px 0px; padding: 0px;
-    }
-
-    td.selecttime_icon {
-        width: 50px;
-        padding: 0px;
-    }
-
-    td.selecttime_icon img {
-        margin: 0px;
-    }
-
-    td.selecttime_link_grey {
-        color: #ccc;
-    }
-
-    td.td_right {
-        text-align: right;
-    }
-    td.td_next_right {
-        padding-right: 4px;
-    }
-    td.td_left {
-        text-align: left;
-    }
-
-    p.p_right {
-        text-align: right;
-    }
-
-    form {
-        display: inline;
-    }
-
-    table#statmeta {
-        width: 100%;
-    }
-
-    ul.tabset_tabs {
-        margin: 0px;
-        padding: 0px;
-        list-style: none;
-    }
-
-    ul.tabset_tabs li {
-        background: none;
-        color: #222;
-        display: inline-block;
-        padding: 10px 15px;
-        cursor: pointer;
-    }
-
-    ul.tabset_tabs li.current {
-        background: #ededed;
-        color: #222;
-    }
-
-    .tabset_content {
-        display: none;
-        background: #ededed;
-        padding: 15px;
-    }
-
-    .tabset_content.current {
-        display: inherit;
-    }
-
-    #graph img {
-        max-width: 77%;
-        height: auto;
-    }
-    #table img {
-        max-width: 77%;
-        height: auto;
-    }
-}
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_55_fbf9ee_1x400.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_55_fbf9ee_1x400.png
deleted file mode 100644
index 1f851db2c9babc701aa0df1cc4e675943ab7812b..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_55_fbf9ee_1x400.png
+++ /dev/null
@@ -1,5 +0,0 @@
-�PNG
-
-���
IHDR�����������A����bKGD������	X�����	pHYs���H���H�F�k>����IDATH���!
-A���bl����A1{�V�Y0i��x��x�v����D�K_��O��9��a�Ք��}��^�JaȌ�0b�vBA�$,�Q���"_44���=�Sqc�yE��I�W
-<kA����i�0��<a$S��y.���%tEXtdate:create�2019-05-26T16:42:24+00:00R������%tEXtdate:modify�2019-05-26T16:42:24+00:00#�oP����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_65_ffffff_1x400.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100644
index a82e07c128d7a152c2ddd7d5eed531ac7f1b5ec7..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_65_ffffff_1x400.png
+++ /dev/null
@@ -1,3 +0,0 @@
-�PNG
-
-���
IHDR����������G#7v���bKGD�݊����	pHYs���H���H�F�k>���IDAT(�ch`��p���h��4�i���%tEXtdate:create�2019-05-26T16:42:24+00:00R������%tEXtdate:modify�2019-05-26T16:42:24+00:00#�oP����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_75_dadada_1x400.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_75_dadada_1x400.png
deleted file mode 100644
index f323d2943e827649ecb51caf4e1a53c4d4435ab9..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_75_dadada_1x400.png
+++ /dev/null
@@ -1,3 +0,0 @@
-�PNG
-
-���
IHDR������������D���bKGD���1����	pHYs���H���H�F�k>���HIDAT8�cx��a�"��[�n{1�qc��po"��?3}`xR���1�s?��^^bxu��u)�뉣h���W�%R�|���%tEXtdate:create�2019-05-26T16:42:24+00:00R������%tEXtdate:modify�2019-05-26T16:42:24+00:00#�oP����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_75_e6e6e6_1x400.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_75_e6e6e6_1x400.png
deleted file mode 100644
index 8adf417e90dd6fad53bc76564f9d497c58184a6e..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_75_e6e6e6_1x400.png
+++ /dev/null
@@ -1,3 +0,0 @@
-�PNG
-
-���
IHDR������������D���bKGD���1����	pHYs���H���H�F�k>���HIDAT8�cx��0�F�ѳgύ��ax1��e&ë8��!obަ2��fx�����#3�ǵ��>��QD��@�$�.5o���%tEXtdate:create�2019-05-26T16:42:24+00:00R������%tEXtdate:modify�2019-05-26T16:42:24+00:00#�oP����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_95_fef1ec_1x400.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_95_fef1ec_1x400.png
deleted file mode 100644
index 3f88c6b520cd6d07bbeb3a7f7aa748ebcbe3aabf..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_glass_95_fef1ec_1x400.png
+++ /dev/null
@@ -1,3 +0,0 @@
-�PNG
-
-���
IHDR�����������A����bKGD������	X�����	pHYs���H���H�F�k>����IDATH��ϱ
a�����\!V��J#X����ЋD}�
.f�>���>��P�կx���x����q��жuɚq���f+��6���[��\�‡����כW�T4r���6:]V:�,
(�Ŵ�8�yG-(d��	H���%tEXtdate:create�2019-05-26T16:42:24+00:00R������%tEXtdate:modify�2019-05-26T16:42:24+00:00#�oP����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_highlight-soft_75_cccccc_1x100.png
deleted file mode 100644
index d022fb79b5b59df131762103ed3cfdf66eadfc8f..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-bg_highlight-soft_75_cccccc_1x100.png
+++ /dev/null
@@ -1,3 +0,0 @@
-�PNG
-
-���
IHDR������d����2������bKGD���1����	pHYs���H���H�F�k>���ZIDAT�cx|��Nhã����2<hc�_�p/��n,�
�[_n�g���p=����w2\je�X�pa��&�s��b8��p���"�����Y{���%tEXtdate:create�2019-05-26T16:42:24+00:00R������%tEXtdate:modify�2019-05-26T16:42:24+00:00#�oP����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_222222_256x240.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_222222_256x240.png
deleted file mode 100644
index e723e17cb5428094de75a0d3c6f4f3c07dbd3bbe..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_222222_256x240.png
+++ /dev/null
@@ -1,32 +0,0 @@
-�PNG
-
-���
IHDR����������E�r@���bKGD�"�b����	pHYs���H���H�F�k>��'IDATx��{he�}�?g����{��1)�����]K&qq�U�4kbiK�R(H��B��P(I�vJ�_��ӮIV�@nB�5i�N��iG�jq�&
~A#Q����rX'����9�:�ܫ{�3�E{�=�y�o~3g~��Mp�&����1Xxh8<�#dlЅ�Mx1�&��$�5~��V��	��c�$��ױ���,����	��ƹ�i���N:�Z
��ߊY���>�"�B���H!�������-C�u�8t�}����8�!�B��	*�OF�.[�aͲ��l��B&���1h�>��M]hN���4MAb���̐!(�hE�1�5jձcO�<6�e7��,e���S(��f�o�16+3�y
-JR|{�^3�^����{�88������~'����pxh8<4���
�g����������2��n6e̘�����{�����Q�����pӀ��P�A��iۺߖ�f�S����(�D��'�L�6=����T:s���f�q��羀l��.c�I
-���ǧ�=�i���M�>��ڠLN{U��&������&��{u��o�����.�.��4~#����pxh8<4���
�g��Û��p���^i����/�0���TW�c����Q��� �@)��y��u}`L��Uc���%T��������ȥ
-�A��R��@�?��P�-`����BKl�
b����Z}�������Ш��͢uJ��%U�]�K2��e
ts�Y���@,e�e���豅r��jcܭs��M�n�0
A���mP��y
�D�K(5�,�lN�&b�D�m�rwYDV����t�e$��謷�
�L���[��C��0O��	P��&��0����+��;�
�g���3@������pxh8<4����Y��`��O����F�Z<��h�\J!c��`����j
�;TK�Vr�0��ʹqc�cGz�䟾c�[ ̕P5�t�h�)���ti���З߭ty��׎�����&��M/Е����S���u����@��݅���n���b�9��`y�9�󉡔�Ya�SX�0e���q�J`nB���g����b�����3���4P�- k�**�@HC�z(}�򯂬�U����cj2��=��Ob�����3�
����R��05���1U�\8SMi�U��}���΀�l�Hl�N�
���J��q+%e��7s���"�<։�ּ�z����M�L�T��ƾP��1f�1i��Ѹ��Vp������pxh8<4�z�A��+ o`�I_�R�����~�~��f��սh`�Ic�K�h����Q�p��xx`=�j�`]|S�B�(������(��v���F3�4v�؁6��T��4
���5����:���*��-D#�n6��a��J<U���~�y(�1��(,�|t�z�}��d��j��0u]PT��-D}@�����
-�n�+[�Ύ� A�B�T���(V� K������BT<𑹗[F{�m��=��-�ڤ����$��.��JR�U
j��:X��e�n�e���bՅ��"C	��e2�@�Ј�݂�	�Ѱ���xxh8<4���
��1@kX6I��<��M*�Љ�Ѣ�+�b���04(�.�M3Z�<]&i�UuY�a��^2�w�ͻ�ɨn�U�@�n����E�4
���O�Us�.J���}��dw�Ed�p��� ��me^f���mF
gg������T��G4�Ѱ����m��������N��է��N�c�����������5�L�xi���D��9�|��%ܔ�h�P=�áb����o�p�VBG�X ,�#E��+�\�^��o�ʼdM��ɳ]�d����.�@ 䮚���D���e��FU6'g6��)��52p|��f��X�_a�"z��x���� �w�.c�t�
-��
�g���3@ñ�`"�i��K�9���s
D07�
-ӕS��E�oC�Y�Z�l'N��~_Sƞ��y���a��xK�������z�-&|(�ϜC�K������Xg�d����5Ig��8k8YTL=�,/
-]s��w-~��t�����e��	^�~�&6vh�}�Զ�:g���?m�bG!����1�:O8����]�%��2�����v
-�E�@�5"�6	Y�rXcRb��ݎ���E%���`�#�D��r¤��Z�:�ϛ!�x�R���h�!��}v�۴��ϳ����x�y}FrA1#�*�u�T�?>��!�x#�~��G���k���@3K@�:>P�R�����M�A|��e]K�g�F.B�����t�l��OY d��!(v�V�X��%m�#���I[RR�`2�T��	��H��w�Y�u=���b�YPEc�U%�&@��Ĺ�]��}�q���o7*�G�L�
��e�QX�5�U����-����³��8| ���_�ݟ��5\�5�p�VH^��\
�Fآ��a��a��5�l1�4[��#�b�o�P�1�E��is��wMJ'5�T���06�B|I�,b�����`�ՈP���X�k��B�$�[��-E�OHt�|�3�D�(i��d9�N6@x/ؠm�(�#�wj�P�t��/Z���ob�q%[:���3^�~a��5���5�����|E닃�^�E��$�L�-���_s,
-߫��㕔Ņ�&��
-�_�,�������#F�}����&���.��<4���
�g���O��rdh9�����M7L(5꓂.���?M(�����stզ��-?�:��[ڧC�r�]�'��YB�2�l�C|
l�eXS��pG��0KcI��~�u�L0/��y�Lt�r�I�?�R�%�����-�w�Ƿ�h���$L��J��V���Ϳ�Ӣ,�����g�
x�_7��l��4�*��u�M+�@�x�<}���q>��<�#��`�i�
-:=��*��ۿ�{��)��_��8hs���������p�CWғ�K�`B]H��"}���_P�N���t�Q�l��1Y�Q�h+����&?��x�5:�	֘aY�ҭ���=\��En��������.�Yʸ��J���E%uTj5�����F�'������b;[��v�ט4�u��6]�lkw�3�÷���,: ��%&��
�[|��|��|Yi�q`:�����qXc�2+u|~/�wrz�[j-�I>#���,�9�Q:�#,2�����5@�@%��S@@6ÅJ�{��6��{��)h���W�~q]����t��<�+|�'�0O�a����6���3�U��HW������l;�����'�Z9�Z\�o��O�嵁���e�e�Ƣ[o��da�����rEm&�ʧ�������3m���6��=�g�^S��x
-Hj���mi�(v��ۈ�{.�h�_���%�8��nF�7y{�����O���FS5�:�����/��ա���W�P�H+b�����Gx��/9��I�Yy�.����M�t��T�eە,�ѿ�-�R����e�d��
-��;�Ә:�9k��T�5��m����������E�G��|\Wu����ǣ��@^L���E���
��4���
�g���y��;
-J'U��䐎N׷�<�p2m���ӫ��.Z������Z5<� V
-,��p�3��w�=~�3j��ǿě�#����ʭ�|�S��f�yk��=C�n1]�C�'I_O��*,�J՞�D\\I���}�E�\�$�M�(�E��\�߮�?ƫw
-�����NJ��E�b�6��t�z�:<��u��d��k��vs!��PfM��7dT����3	��*S,�AZl+N����l�R�&{�I��T�G�O�*�M~�;������XFS��j����^�Q���N�n3�Z���0Ne�R�]�3�8��<�$@�˜c.�t�=�.{e��'�TI�s��u����>-?B��p���?���X�J	$�x�QJ�}�!#��Ո2�Ht!VɽV�\'���Y�3�6����6Yu��JOAa�[5e���]p9=7����t���_�y��?�OS���<V��q.��Ի���;�8�~��YE����KSȀ��Xjq@M��
���/�p�X��۴�[�S��c7�'S6	�E� ������_Ձ'�_��)^3�b�h���+Z	��"rLz�ZA��#��[��'�?�Z7{mZl�Ӭ�Q�De+^��o�*D��g��r؈;/�."��HF�Ƴ5��)F	���2�c.�W�~�`����VEl����6�R����8ظ�ky�k�.����`��Fp7pps"�"��KR{(us�[�%6
u�s�ͻ���,BD�����/�ȷ�_Pt?�Y�Vy�.s���Y�3����3������\�V*#��y�f2j��g����A��Ѣ�
-�g�-�5����Fh�-1�9�v��<�s	�����m�� =/�_f�WX�M�&�לi�†RvٗQt��_���"������Q<�(�1[��_~��b"T z3��sxh8��������p�`Z�/�NΧ���F��{�"p�i`��
-�gsO��s�.�G}��t<��9�ug����g�R`���&��X�t�岇�}�	������7����2J�X�e\��	08j=�XJ�Ql�l����x�6z(\5Q��I��=�l
-8�7Ɏ���E�a4�O�;�-��M�1Iy�vV�y^�b�EN��sQ���Cw[
�2	��V�Ǽ�	o�yw�7J����K'�Tu�l�>_�i���T��<͛<�iM
-�p������7�YMW���=�ӡl(����u�+���^j��>3��2N�묳}��j�H��Q
RT�Ȣ�� ���n�fݮ�~�+��c�iQ��<
����Ma=��|�*����
-�$@'��Ԍ��ǕqUO;�5~@��eI�2��9�w��"��O�~��s��s��k{‰��$�m��>����v�z��^2���v�ow�`a������4c��M C�����b�>����q:��o�=�-�p`_2�ng:6K��XV,����2�Ǿ��6���
�g���3@�� ��ś�s�a����R��WWB
-g-N�;F[��Ւa�A��V�L�F�<-m
-VbMC����7���K)�X����P�y�
�s�~��=�����<�ܒ�{�x!�=����Ãq�R��l�]���/���� 0�l)'�}�#�^tX��孋�t�8FC�Y�$)�PUBE�(~��Ҟ��V�2^��*SL�H�l��S��'IA[�������Z���x-V�"ȥ�J�+���\�|�5u�W��nLJ�k��ܟ���(0�0����JyꞄ���a���f��g����6���
�g���3@Ñg���[�}��Z����Q�k?ҳ=��z�I$Т�:�9FW��m�x��:\(�W���+��e���F�9��,��*�!Gh�D��L��8�[v��o�����)�A�a�K�5�S/�)^c����(��W�H�N�W8T�r=op��p]MC�O?���*��
-D΢O��b/�hs�0�ڜb�9�1C�9-����o�ۿ���ԗ��u���Q��Fc���|W�%@�HB�2�9�������/Dx�D`�U:�Ƈ�gi����"`�%��ᄽ
-������t
�E`t���6�2k�)P�E�ѿO,��?�k��_�yh(/����=@��u
�g���3@������v@]��<����]���~��WD�`��.��f���~�o��ʈ�N�VA��߈�ե�M�����
�^��y��M�Q|��ߛ^-{o�~��>��w���Ѓ
-��(��g��X���ץ�i��&�X
-u��D�U���͕l� ��ғޥ�ߞ���k�������PH�H�C��J�~��S�@O�� �׋�ѓy7���
�k {��25���of����ϫ�o���{���'!�'���Z%��q�*)�g���C\���#��\���'��0���P_���WL��7��&AlJ���\��� Z��p��,���Y�x��j�c�����O�(6z��I�V�� u�:ג���T��D��O��9�ׄ�Q<��*y
=���2��~����/?J,����WJ�Q�W�>����W��u�?��#G��/����4�"�K���{㧏�',I��ҟ综E;���|R�ݠ��~��W�7i8�6����pxh8<4���
��r�<}8� kG�o;��u�C��P��v�)��A�<$��ց;��{l��� ����� ��#`��F���C�!f�	Ӆ/`7��(��0R!9�9�z���@%!/m�]���Ad��hv�G�����3@������pxh8<4{����P/ 3@�}��	B&�^�16�{.
�����ߠa�Q�o
���2l���mt���!\%@�X���?5��ճa��~
��ʠM65wk��a�)T���F��_�
-2�$�x�5�_9!�VxRd�1!}����'�`�$����Uԇ��r�?�	�Q
-�`7`�.���k����_V����zԄ��p�]]�GO���LXCk�3����%tEXtdate:create�2016-07-13T10:21:59+00:00�����%tEXtdate:modify�2016-07-13T09:26:54+00:00�͠���tEXtSoftware�Adobe ImageReadyq�e<����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_2e83ff_256x240.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644
index 1f5f49756ca64bd20a1048bd7a3a584457d4bf00..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_2e83ff_256x240.png
+++ /dev/null
@@ -1,18 +0,0 @@
-�PNG
-
-���
IHDR�����������IJ���PLTE.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.����o���YtRNS�3P���/"Uq@f`2�
!<BHK Z#'1S,�4���j���8E���|��������)��Q$�
-��b�J��mߜGc?o�h�@^����bKGD��H���	pHYs���H���H�F�k>��dIDATx��]c۶�H�阒]�K���d��%٫뺮��lm���w]����|�p��X�m�-��}<�w�(1$��	;�F�@��%��?����B,Lh{�t���#���T@�/?j�9	m��N� #���+`��`����I�
-��_�-s�ʹU0�M��[��
-s�4`x��š�#��
�D<�~؀�K��.4�]`��PDDDDDDĈq������Ek@����A�~�*���	!Y���X�`hv3\LX��Ot�J2b���ؓl�QI<��� �6�-X�lֈ�6�H��|=j�`E�iq����Cv:�q���C?�?���x�,��r*t�ݻ}|;�kP�4���d�Y����f����K��~[	>�X:+�i����ĆQV9\����e�'���A�tOS�:7��2����YsxM�ہ��B���&���z�>n�C��@��r@��*�a�ӝ���%��MFDDDDDD�T�ߖ���H,���E����RU��n
ب<��V-
@�/Nm�թ���������Hw����*�+��#��$o�e�{�% �7\X��ǀ���2��~0��&n��sbA,�D��
�A�V�I��|�
�Og���鴋�	�7�y	7Jf�����:_�w^��H	v{/O�9���<����Y�`+�� HRٰ����[��?��
-������=���c""""""F�˽�sG�<*k9c��E�8薽�������zfm��r�1�N�������nq�w��&=O�\}K`
-#���2��~��L�|?�m>�\�f��͹�:}�4ᦋ���{�)�n[��
-�̰E
-KY��D�ۇ-��	�+�Kl=�Ӄ��L`љ�|�%��n�	a�	���N�#��5�	(4���?�����EDDDD\o�W�Ffq;��\E��_������,���W!%�zE!F�¶.�(USHQ0d�w)T���8#p,�x�B��K���� �*�x��X��E�e������
-K솎%mK��X~s�FE���~������tdc��a��I���1��Af4��dH��c�G�S�B`��0�wev`����"�{��	�.�GDDDD�,d�O�6�k"qk��Me�fS_����U��KŌ&g~>n� �H�})��L���F%8(�)r���!�[4统qQk�0�m[Le���_�7���0�@>1 X0A��Z����Vc�E�V ���Lt�k�3�EJ��44�Zﮊ�N`rt�>`�˥�	�	�
A��HBLH�@��c���Uq=�j������cM����2�s����J���CL�iR �NQ���������0=���Yi�-�|4�V��]��]��B^�ޞ���_H������$�<�$�	
-a����=��d@�	(Z�Ap_�}�~s���:�N�{DC>����m�^��ƒ����S�&�, ;�N����&�B} ��<_A��B]H�u���N(B�0��{h���1�IK����Ds��j����'��M���8�.�ӫ1�h3�df}mq���	��n�U{��L�o��z\=?@	((���e�|=ơ麄�C�i����1r<|�OO�;�
`��H��p�Qy�zԈu�����Z���V���Ʋ�!�)��5m�C���2��Ly�g�;���֑�R���jW�a@��@V�L�&W���ru=Z
-�̥��=U���5}���������7�;b(�����nP&�s��k�4�����8�ͥ��0���1�U�W�v�k�18dq���T��ՌE]qH8�������G�F�����K�����'��r����Or���r�̧��6"fp��T�^3c��"�����n��Mم-�/��W=�tJ,��X�)���{�P
Rm|K����>mX�8v�5h��<������_{ꘀ�Y�F�|&_G;&�>^�����W⁃�&�K���(��81�EB@F&��;"L���'wfw��E-6��o&/̫'X�e,>~�ee��|���A����=)	d��Q�`}P[���K��N��˂����/�~)����O[d�O=�3E�l5'Y�$?��7�m���Tzզ.�\��.��` WE�����"""""v�)��V���<���K�ZX.Ex�~Ч)���ߚ�����W_}�5|��s��/!?����'poդ���tC3����@�Q�)��t��`���b!,dY9�6A2����������/튮���n�t�TK>����#]�L;zq�J���r���²[��\-t�ҽ�5
@�ͷϟ��n�T@��+;��c���Qh�C*���T�ڙ��A<Sku�µb�E�
/��$�Z���.e�j������_ʤrWaB6d���(��S�s[�|���竕
-/5R���(�4X������76����`3|���P��p�'�H~<R?M�2�)�  ��g��Vp��B�n�=�|W�ͬ\��V0_�81Oׄ�Kz||lP_��ω���lxX;ǀ�Ju�<��Ng[��]=�(�#]������p�P�a���i�������s�f��
-V�z��]ౚ������z>�Vr�?�f��?������
�Q�1�T`��} H�k���,{�VZˋT��ϛ�?I̯u�QK�LM�e͆��~��q������y�m0�9�S�;���j�����5 ���i��Q��]7k0�U�ޭ���G�kX����3#���lY��_Цx����j޶9��`�#
-M	[z��KuO_z˿Dܭ��*��kOJ�(7��n��\�e�
I�T�ƨ�l�/�U������߶uw�.�~���;#�r���.�����8
�o# 5L��h>1�i�����p��V�M�?�/u7��0� X@��L��+M�+�����{��Fkt�{�ŧ89�0`���. ĀC�R+\��/��t�R����;
�TӲ���]�aL���|�efđ��	�>�ۣ��G�|�P`P��8C1K՛�A�̍<�2��ۂ��K�r�l@L
-L��������8�@�E>`n�����PNԍ,��p�����E��Ɔ����Z�FlÎ;�����F���7��Ȯ;��
-��s�wSz)g7�{r�s��S��gȋ��(߄~�AWytX��$�NV����R�_��<6�p.�O�8�O[�OdDk>_��O�O�}����JS���d��mV�?�W(_��m� ��j���~=H IԁF>T/��{*]IGJ@i����qam�NF|Q�5���0+���E�S8�:�v�`p~v���j:B�����p96�o��ys%��������
�|@H�����]��+�@��t]W�k}}�����7��Fʮr����A�����B���\m�-�_�2PY8�������x�ՎN�.h�~���@+7��z5������t�_/������/�?���0�S>��)���z�i0n�/�B����`{D��W���#`����B��o���[,�g��FVЁ�pP߾���C]Bz�� ��,X�����X�fԃ����A�:H��� k�7��d�Z9��oc}o�]�0�vd�:R]�0�ve���]刈����j����у����|
	�?�+(��OǍ�+	�#��ys���ߍ�n�p���Fru<��.HȺotM��3h���}��߆P}�������˗��v�����P�}mǀ���?���W��Z@���������}���������@��@���FD�������l����%tEXtdate:create�2016-07-13T10:21:59+00:00�����%tEXtdate:modify�2016-07-13T09:26:54+00:00�͠���tEXtSoftware�Adobe ImageReadyq�e<����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_454545_256x240.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_454545_256x240.png
deleted file mode 100644
index 618f5b0ca756789f81bc276426805df6f61b91d7..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_454545_256x240.png
+++ /dev/null
@@ -1,30 +0,0 @@
-�PNG
-
-���
IHDR����������E�r@���bKGD�E�;�-���	pHYs���H���H�F�k>��mIDATx��{leG}�?g�K��$����U�!�>T��؈�J��i6A"�V��R%;��"���*UP)�
-�/���z�RJ�F��QP��z��BQH�VU������5sμ�9��^�3ߕ��{~����7s�7��<���.��`���� c���Ab/�@�[�V�D��0��3AX9�0�N��_�B���&���>~�>�
c�;ab�D�ߎE����Q�z��'k���M�ayԉ��6�!�:u:�:@RŤ�B�yDD���'�L��-�f�]S��q!��f�
-S�Q�&�S��7MC��r==3dJ��{��f�Z���S0�Ms��:0K٦g�ʿ��&H�U�=�mc�4�i?UĔG��U4�hc��Qb�]�!��hL���W/�
����@������pxh8�~�|�A��Qf?�ێ��1f¸����=u����Q�GJH��p����PϠI�w״m췥���ԧ>2���"�WÓP&{��n����T:s���f�q���H@���.c�I������~�S�s+�^|B�n�29�dH�������]��v�-ˌ-m�e�h�>�����q&ت��g�9x�#c�n��~!����pxh8��4^�/�
����o�#�Z@��S���^��4� KZKP�d�9���C@F[�����,��a+�����]8��v��K�qHl�w9ק�84�KB��ץ|��&��#��[�\C�����`��R��!�����:�F
-z��C���6��)A���T1wU.I�җ!4��ig�3w��������E:��q7����n�0uA���mP��y
�T�K(5ͬ�lNæb�T���rw�DV�]��t�e4���7�
�L���[��C��0��P��&��0����+��+�
����@������pxh8��4����Y��`��O����E�Z<��h�\J!��䞋��j
�;TK�Vr�0��ͬq�cˇ��u���a����p����E{B�w"�K��5���n-��c"w�v�T�6
T�hzီ|6�ŝ���Ι��N{	t��]��K��^m1(�6��m�3��'�R�f���`Ô�� �_�>��j�,�*�-E)�e��{�U�,��
\u���oV��:
`o��m�Ke�t��_W��O��dW3���Z
Քrv|�~^�g��`j�yc���p�*���f���b�]�M5��9��.��L��N��q+%����ۯ�0�vc�c�J��E�M5���kk�#I�<���x_��	�I#0D�w��4xh8��4^�/�
��^c���
-����d�r��DM{w�Q�t�e�{��^�`��b�r./��M:0գ��*����z���`]|S�B�(�e)�h͎/V����ܮ�"aO!�o�
,�u�^���Љ�^�=�z��t`�WeCC�MQϱo���0q��%���U�o?�<��@6��HG/����������uAQ-_�u||����ִ*2l��ٍ�uG�@� j
!�B���r�����	q�L!*)�h������.�V�{3����-��!�w�$dP�*�����/P[�t1���l3�hl�y�p������0b��g�L�} �3���$�%\/��.)TwQ�"uK7d�+�2�!��@������pxh8��4�'��aY$m��f�6�lB'�.D��
��Р��x7S�x��tI��eW�e}���d0�R�W��^ݢ��0](U�݋T�x����|��T�|����@v�^Df׹Lb��(�2��H��0n8;���_�Q�O��}D���&3{��Y��W�w��5*��e˗?�̖�G�
-�:H iZӖ)/MP���(:�!�/�|B��[i����:�Gf
�L�`�~��:z$aa���^����ʭ|P�- kbݞ<ەL&�xJ�AABȼ�Hvᑢ�[�yS��ə�w�NJuy��%pw�0�_a"z��x���� �3i�1|���=����@����%�JW����A���m�\����
��l��X�m9+�(��)������S��� or��ro*E`�Z��1��&=�ޗ�g�!�Rt<<�A.-V���+�l�|����suK��,&�ȇ��%����y�q�s��(A�K�*�q^�~����anb�1`�6��G�P�a�&.�	�)b���muL��I���fnE! k̠Ò��c��m���c�ȱD�-B֥֙�D`:G��e�tQ	��7�0���0��������YQ�Ӕ،?�mb�/�e׸L{8�<�
q�{��X4��$s���D@����s�9�����e8��\c(���Y���"�r���7��q6�u-	|��B����R���i�x!��9^P�HD�����g�t7K���|��2��"�.�t���V����w�E�u>�b�������f����a?q�h'y'r�y����#\��&��
-o+��Ԫ������|�Y��%��_Hp���"����k��1��*ɫ���U[��&x�9�xA��s�mf�e��<�_����7�;y�6m���i
�
-:�[��)�EB���7�̰����8f��CH��`⾿�h�)�����}�(�%m���'��&���
;��(�ݚ!�{:^����R��@���N���Kү"�*�<�V�敡�=��o�h~q���+`6I��i�I<#�����Z=^IE\`�0]1����%�D��A��^�a0f��,���c %[�Gxh8��4^�/������rdh9�����M7L)-�ӂ-���?K(����stբ�h-?�:��[ڧC�r�]�G�(�YB�3�|�C|
l�eXW��_�x�V8Ɗ�b����bQ����7�����V�4J�]������l!��=�
D?��'a`^����a�q��8���:-��O��YP��x�ۀ���֝��X�5Q�"�Gִ����W}���
-���I>ȓ<�c��b�YV
-6=��*��ۿ�-\��įi|��BH���J_F�Wx�CWғ�_��K�`B]J��"}�`�_R��β��&nDsp����t%G-�^���V�����yIc�b�9.hM�u����K��ĭ��6T���6��5Ko(�
-%Hz߲�:.��n�z�ōO�>���c��lpVZM_gڰ�C�v��eG{�����<_d�����0՗e���N�%N�y�ƍ����Ȅp��~�Ú�/���k�������n��������|��(G������#.�s��9�J�ۇ��l���[��6�ɻ�&�.X���{�����SDf�†�<����y?O�~��ƅDP���*~b���gco��s{;�����'�Z9�Z��.��O�孁���e��U�~?�Ӆ1N�3��ڶD�(��1Gx�x�k�S�H�I~ی?O��������k���,��i�(���ׁۈ�{.�h�_���5�؋�nF�7��0Q���O����S5�:�'����/��ա���J�r����
�.���KN�wu�e��r>n��-�U�$U`I�v%�����.A�U����e�d��
-��;�Ә:�+�a&�XĎ �y������������������G�с���	��"��4��pxh8��4^���	@d6�((�Ԕ{�C::[�>�H,
-�ɴNVN����hr.�~N������Z��`�3�᝼���K��Q�|$�%�t��!�Vn%�=�*�7����f��g(�m!fy���"�k�I6Y�/�eZ�ٳ���+���z�g�6W8ɦbQ%�y�{9����Ï�*ŕ�#��7��b-t��X�͕8y��nO�{]�!ټ�*���\� �(��p�2.�H�ٙ�d�.�^Z�(N���&�l�2�&k�	�U&ף���#~�.���7������6���58A7����}P:��BlkU�[�8�)�j�w0�$��W� ��!s\�������QF�n(qRK��:'�X���@����=$��x����|�5:��@��]���2�S�i�.�&��
-��$`
-8�t�����S =�&[#�߫��U3���Wҳq��^H{���➇�Z���4������"��A��H��#����U��0�+̱�1�Ɏ�;����O9���"�D�E
�C+n�U:�|a��ɔ�M|�?H������W1�$~=�k��U�џ���V������V�����l{���7�	�����^�;<�,�t[������T"��3SU9l��˾�H���x^�&�a�@���)�E��&�<<B4�(b����p������Ƶ\˫\�u��f�����7r����������^��Ci�[��.��h���_�^��mD�"DD�_3��e�������e��X�	�,�B@�fU���/�?���g���B�R���C�&��2���P�8��@3ZtS��<����v7�^#�另�;c'�Nȹ����6�g[�J!Az^ ?�<̯�oɛ�_s[Kg{(e�}�E�~J��,�m<<�����U���g
-"&B%��7�~�{��/�
G�l��4^�����j�����Ԓt���cA��0\(�����ܓ�Ԡ�Q�8��YN�Bݝ�?[���R��$�k���\�{�u���׾~�Q���q�)�8���z:G�G��UK�:�
07��6�-��
-WMY<�����
��2�Ѱ��$5�&v�}%��8�)#9&)/��K^2�+��B̳�i���\Ҥ����V�}�LD���1/i��n�]2č��>��I?U�7x���G�4�c�*�i��
-�5)�ñ>�wH�����f5[q���O�.���d&J_�~W\`G{�
|-���e/���Чk��d� E�����(���N�i�v=����C`�̲�Z���+���%m
-)s�!ī�6Fei�N��%���O*㪞v,s��@��%����4���tS/<E�%��0wr��k{ʉ2b�6ɻ��*���;�����zs�]�۝,�B��!,ų�uM�zȐ"��={����O���E����۴��w80���ۙ��%�\PL����
-��H�[/�
����@������G����9��A�Pi�G
-ѫ+!��'��^��u'þ��:�Z�@�LxZ�:�Ɩ����oQA_�RR�`��E��,���~�]M�y_��xD�$��&J�B�k�Q�@����3����=�A_��هA`��RN�#�"��tX��孋�0Z죡�Ԭa�t����R��Mi�C-�k��r�a�fH4@�C��ܓ���-��`$�~����Ul�$^�Ufr)�0�*-C�n9W-��@M�1��a���@7�g!�7
-?̣|�l�R��/ᭁytX5��L݇��p�����@������pxh8�`:{�1����J��5��#;���ǾD"�-��s�ct�Ln3�<D��B���d1w]���=4H�α�'�!���r�+t��d����eG���{h	@�.���k�q���v�e�5V�h.0�©|U������
-��C��u����k��G���O��C��Y�	�"@�E�"mNzP�S,��1����rzk�M}������y�.�{+j{���xL��wE^DPk�$�3�cA�Y�~Y���
-�/�C�H�F�����<m�47Ṟ�Q�3��Wa�o�~o�)�C�d݇��E�ƀl7�(̢b��s��ڸ���<<�Fx�~?@��m
����@������v@]��<����=���~��WD�`��.��f���~�o��ʈ�n�VA{_��ե�M�����
�^��y��M�Q|��ߟ^-{�~��>������Ѓ
-��(��g��X���7��i��&�X
-5WJ"�*V���J6s{��I��w�oO_��5~���YX�w(�R��!��m���)^�'��D������ɸ�����5�=�@��+���~���j��yQ`O�`�$�D��<B�F0C<�^%�@��?t�k3�}�@����{�^��y��U��|���pS�nĦ�t���e��=���$�v��>`����H_�B���T#%].Xx��D�ѫ�OR��2�E���\K"��R\T|��:m�O���
-�x��*y
=���2��~����/?J,����+%q�	�W�ޛ���3������?ܕ�?�������
�^���e������	+R����oҎ�5س�~�o����Bo
l8��4^�/�
����@�!��/ON�G�����ۮ2t]��С8�cݮ5�z=7���������ˮ���g���@�/�aE[��y#�3�#z��7L�.|��
-��(cR�c�S��m�Q�$�6�ץ{D���a�{T�_j8��4^�/�
����@ñ`�/����_g�"d���`�ɾ����0�
���{�����
�����C�j����_9��jD�Ջa�~?�	dc�[�����0�*a���������,�&
0��&�+���O�B4!��1��~��Ix����>�8�c��&�G)�j���I������=@�5@�v�&J?��Q��l�Ç@��Q�����?��^�������%tEXtdate:create�2016-07-13T10:21:59+00:00�����%tEXtdate:modify�2016-07-13T09:26:54+00:00�͠���tEXtSoftware�Adobe ImageReadyq�e<����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_888888_256x240.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_888888_256x240.png
deleted file mode 100644
index ee5e33f27235d1b5cf0259f63f3894a6be33c679..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_888888_256x240.png
+++ /dev/null
@@ -1,35 +0,0 @@
-�PNG
-
-���
IHDR����������E�r@���bKGD��I�( ���	pHYs���H���H�F�k>��tIDATx��{le�}�?g�
k�u��J�>D�C�^�Q���M��H��*MU��
h�(*$H���R�*j�	�D�]����)Ż(M6��F�6!6�-
�xI���i�-�� HN�8��s�uι���g������f����7��3����ƣ��7�x^�/�2&�v&v^�DL�	l6I�-��o?��cn��D Iy�e�#d0+�0�3��~������0�g'L�V���[��R�C:B�~(��)$q�vXu�B@��E@`H�NG���`TA�%=]�qAw��J)��u)�9�:e9d`V��0�A{�=��BS*�ڦ�S��gFA��-(D���R˷@�"����g'�U�,eSwʿ���j���*�)l[����.HLyϰ��9�����j�a�I6��MR~��~�nG�ٕ�3�
����@������pxh8��4~=@>���(��mE��3a\`~��=u����Q�����[�f3W��A���i��oK}3wէ�gV�����,j���n2��*ߕ���m��M��]
y=��xn"�co�.�L"��7]��EC�:dHz�E@W�.�f+^�eƦ6vռE4��O���`��̴�.�)l�:��7����){�_Я��~"����pxh8��4^�/�
����/�#�\@��S��^�T�0sZs1�J�1�Pr��h�w�V��E�g���S��T��Q5�[	\B���O
-`+�˾>}����\�6��/0��k�g���1[
�Kh��l�Xʿ��_�Z�^IA���^�N�4v���OW=%i^�<��9��t�f �2����С��B�Hg�6����!u�\ҭZ�&蒶�
-�2����s	���U�]��i�T����� ��]�Uaq;]�A
�:�rG-3�<F�n��*�ݴ�T�ݯ	4<;���������@������pxh8��4^�ysh�,ux��$\j��"Z-�mo��SJ��9���{�
-���e˹[
�\�fָ�ұ��y�2LT��0�K@�9Լ��Ţ=���?Х��B���=c"��v�T�6
Tokza���9T����s&�6��ո���v�� }3�':��[�5�)�,�xU!��҃@}�����U� �kc��
-ꈡ����Y,]��`&߬('�u*�^�v	��O�wu�?}2�&�C����Ȗr�}ݾ^g�[`��y�c*�9s�"���f_��b��
-uuT?�M���f�
-
-e���ۏ�0e�vb�c�J��E�M%�6���Po��l�M`n�~Esչd�j|���z��)miOq/{�ک��Jq���A�G������pxh8��4^���a��+ ����ʥ�5�݃F�����+��Y�&{�˾����I�
�z��\e�X�����oJ}Hȯ�iW��)~�n��m߮ɞh�����l*7TP3k���XJ7R"�����"NX�U�}ٔއA���/(qW�\���v6�$2�
��-���˶Ezd��j��0u]PT{�[�:>>�L�DkZ�Y���ֺ�14�ZC�WU���b�d�12zB���Y�$i".�~A�i=�����Œ��۪>���E��AI�b�\Ϋ�������
-c6��O�SB\��ɅJ#"�RE�Ȱ_'��I.��aluI��������	��YX^�/�
����@����=h��$i3��7[��d:Qu!Ztw�Ul�~F��Ż�b�k�K"$-c��.�3���@��,�y�;i�-�JӉR�޽H���!���ɷjN��;��L�dw�Ed�p��� fO�,�j�T�q��������+
-򩸹�h[@Vef��6KV����x��\�b���|���l}_��$U+�W!��?o[�����y�B(�p3
��r_�5P�2ݚ�la�˱*�x��GXG$�`�W~9?�r+���y�-k��d����.�@ <]�����#<R�y0/��99����T�����^w�
����.�?0�ꠁ{�]0j"<�v�g��Qxh8��4^���$�S�L��@�����oԆ�5	�l\q+�VN�!��߆���j��L�b-����=UK<��׳�6��R���?S�j����b�s�'�\
->U��\Z,��W�����4Ig��9��L�1�sa��R���O�^�.�P����(�>�K��\�c�6m^�um
��Ql��g�"�y[ө�D�/����[V�*3谨��X�m�@[�q�X#r,a��5�	kLK"0���񢐻(����q��A�O�VP��U
j�(�iJ��l�Wq����l�i�����x�S�� T!s��XD@����s�9�k����y8��\a���Y���"�r������v֗u-	��v!���H��
���
�4�<��@��(B$"Pd�V�Z��5Ɯ��	�ߦ�����s0k��B�5h$��=�dpϪ�_�@0+�������4@"h�O�t���c�ky5�v��z�K����\��1@ޒZ��]��B�_.܋ؿ�!���I��Xd��WpW0�Z%y9�s9�jaK���0��h�sN��,�lU�����X!����h�f!�2.)��0����� 6�B|Iq/�Ӽ��0�jD��F[,�5�
!m`�-�������$�J~1w�WQ�J�D#"YO��
�6hV�Q��5C��t��/���7	�8�-*�"����_E�U�y0�x�+Cxg�h|����+`6H��i�A|]�����Z=^JE\`20
-�~]���f 5X��`?S�0��Q^��?J�1�%[�Gxh8��4^�/�{��S�"��rؘ���ɛn�RZԧ[v�-�P����O��I'�Z~t�t����O�N�z����q����g����آ�4��X�����ԃ,s�e���q�9
,2�)�^���Ķ/�����(��rS?�=<��B|W{|�&~�OO�������
-�t�q���uZt�E��A��)n��7
�;O&-��+��D쏬iEcG����F�	?�c|�Ǹ��54�:�,lz��O�l	�7s��'~C���%B�f�2:`��ě਒�T��T��bjn�
-F�E���,�,p�n��F4'өkLWr�"�P[oa��o��s��k�qNkҭ����\��n��������.�Y�xS�V(A�����q��t+/ԫ-�u�p0w�-z��4��ƴaY�=zt���n��g~��2�7Y,,耄��L
d�=|�|�|Y�p�z��?2�\���f�˼���\~'f�{�[j,�	>#���(�9�a:��,��وK� �x�R��.  ��B%�f6����n�ϻV����/Σ������� %O��+|���!��I��6���3�e��HW����O�� vXIK�O�rZ�8���g�g8=C��2�9Ǫ[�P��B'���rAmK"zʻ�!����
-���m���6�뱾�3����y5����ܓ��"�[�<
�J��sϏ��U9Z^��8_�fD!Zq��_\���- ��-`<uQS,�y�����b�]z@h`�*�*GZ������>���)����D�g��鲔��i�qIb.JXT���bj�k�$��M��1^�K6�<��˿�9��C_��fr��E���M~���8]�T�xX��u5�_<���t_0PA���𶀆�@������p4O�"�qGA餦������v�GbQ���p�rz���E��3��3�U
�6����+��$�q?�W
-1���X�K<�8�
���[����sC!��}E~5C~=C�n1[x�LO
-��g�U�X���=�����̪�y�hs��l(&U�'/qg��v�|�^�8Sx(��o(�B�x�e�\�ӑ�����ľ�U��s���:�҅ͅ2k
-W�!�B�Ԝ�i�
V���EO�f�X6�g�A5�kOد2���jS���6ۼ�[J���S��j����Q��:(����Z���0Ne
-�Z�]L2�$����4@��8�B,���,�Nj(�t'�8.��JC�L�K�U���i��5�#�Xx�#|�U:��@��m��??d,^q5�L!��]�Mr��I4�pZ��;��>�g@��M�F�K�)(�}�f��U�.�{���]��~5��5������>�"����$c�����+�ן�?��Q���c�#
-�mK-6�)࿁���_�Y�n��G+��:�|a������"�~ϯ��ٯb�q�~=�+���,j�?�M��y
-9"�y��D���ʍn��g����6-z<�,+tK�����xW"�����'l��˾�H��[yJ�&�a�@�~/�9�"�a�%�$iѣ���6.S����8ظ�+y�+�*�o�jo�mp-���k��1	�u����%�=�����-�"�
-���4wq�-��Ր�E���K
-�|�Uf�G��
--���Ua]X�r���x.�\���˅h�:"����LF�dF���5p���f�覊�)n�Yͣ�n��Fh�
1{�'��\���<ϫlik)$H�䇙�5��%y��kni�b
��/���O����E���OjZ�<�,�b�������P	���p�+�@��<[��/�
���#/��Z�wp6�$�5�D��E�����
-���|6w�^>7��{ԇ�Nĭ��Pw���f�>��k�7�/��c͗=��cM��ﴯ߁A�E`�q��:N*��N��Q����b�UG�`��ʟ�Ƴ���Cᨉ"��5�w5�.��&�v;����.ܱ��7e$�$��y�K�YE<[�y�8����M
-n�m%�U�4@��[��&����EC�(�.�/���b���C��>Z�1�_P�O�^�;�������!�N��wc��l�^���]`C1�L�����8GO{�
<��fpY�8���:�X�! ��W�Z���Vc��ʺ��b���+����_ݖ�fp9U�4��u
-*��QD�I�3cv�1e\�ݎe�(ֲ$��ؿ��.�]��z�)�/�>�>.|mO9Q��HN
�P��{����;�=�YJ���7'�[��ɂ-����b<
-Xӌ���2��@}�޺Pw�������aŨ�M�	lqG{R�\p��Dx�s��T3�X�ؓ�����@������pxh8���ѱx��e l TZ�B��H�a�e�c��t*ZHF��b52�iiS�[:�DH�S
-�))%��_rp�S���eUӮ@��*I�3�*�C�
-3��=���&�&5�CB���`����Ê�,o]���~����]3�t�������ح�jXe�x����0CTA3œy �5�{�t����!k@Q�V+Vr��
-3�e!�̰Bː�ۓ��O�A����԰‰	#	���U4V��D�ч�D����*Oݕ���<:�Xl��Bxh8�L`������pxh8��4y0���؃���J��k5��#;��ǮD"�-�鞺#t�Ln3ã|��Áysɩ�q�v��A2t�>�}�<���Jw�Z,ӱ:�-�*���%��A$�-�lp�I�d���5�S/���BGs�iN�z,v�~�79P�r5�q��p]MM�O?�m���~"g�ǀ�����9VhAmn`��0G�)�����ԧ_ԇ��U������W�1}�3�y
A�����p��;d��U���>X����J��x��<mV5'Ṟ�a�0�Wa��s��w��A2�����<w�F}b@�`fQ���=�{Ɂ�h�����s<���5P�ŏ�.�_�px[@������pxh82��P�~���G�Mt��M���-�v@]���ܠ�.߰�	�����~��K�9�4}��6��. ��/n�:��&"O�'�"�'G�SH��;U�k�A��'��U峕_������4]|]̅�+%�w~�tUFD�w_���/}�����e��7��%~�B*E�����K�����e�U�پ^̀����Y��`]�����2���Y���O�ޯF��g��E���OB�O���Z5��v�*)���*�C��63ه
��(��/�w0��zP_���WL��
-7��AlJ���(�� ��p��
,���Y����j�c�����w�(6z��I�V�?+�_�Ԓ�༔���D��O+��9�7��Q���*y
=���2��|���/?J,����+%q�{�^�?�@�r_O�ץ������^��c�A�o����.�J��㻏�,K��ҟ��E;��7|B`�N�]�a�+�/i8�5����pxh8��4^�/�
�hr?<}4� [��o���u�#�bP�u���\���������l�{l��V��{h��102p�1#=�СG�y�����/��(�b0V!9�9�z��&@%!m�]���A��ju�G�����@������pxh8��4�W�&��P? @�y��)B���	6��S�Y�&�ϰak�����ͽ�Y�6��pakݞ�}���(|�!,���W/�	���/��A�lj�֮�x�)T��I#}ˏ�Y�L`2eM�)���
-w�B4!��1����FIx���>�8�c��&�G)�j���I������}@�5��V�&J?��	Y�����!�\=jb��<�����h�jo���%tEXtdate:create�2016-07-13T10:21:59+00:00�����%tEXtdate:modify�2016-07-13T09:26:54+00:00�͠���tEXtSoftware�Adobe ImageReadyq�e<����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_cd0a0a_256x240.png b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_cd0a0a_256x240.png
deleted file mode 100644
index 7e8ebc180a2d2a74739059799407b8b7b57a9092..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/images/ui-icons_cd0a0a_256x240.png
+++ /dev/null
@@ -1,198 +0,0 @@
-�PNG
-
-���
IHDR�����������IJ���PLTE�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-�
-
-4�v����YtRNS�3P���/"Uq@f`2�
!<BHK Z#'1S,�4���j���8E���|��������)��Q$�
-��b�J��mߜGc?o�h�@^����bKGD��H���	pHYs���H���H�F�k>��dIDATx��]c۶�H�阒]�K���d��%٫뺮��lm���w]����|�p��X�m�-��}<�w�(1$��	;�F�@��%��?����B,Lh{�t���#���T@�/?j�9	m��N� #���+`��`����I�
-��_�-s�ʹU0�M��[��
-s�4`x��š�#��
�D<�~؀�K��.4�]`��PDDDDDDĈq������Ek@����A�~�*���	!Y���X�`hv3\LX��Ot�J2b���ؓl�QI<��� �6�-X�lֈ�6�H��|=j�`E�iq����Cv:�q���C?�?���x�,��r*t�ݻ}|;�kP�4���d�Y����f����K��~[	>�X:+�i����ĆQV9\����e�'���A�tOS�:7��2����YsxM�ہ��B���&���z�>n�C��@��r@��*�a�ӝ���%��MFDDDDDD�T�ߖ���H,���E����RU��n
ب<��V-
@�/Nm�թ���������Hw����*�+��#��$o�e�{�% �7\X��ǀ���2��~0��&n��sbA,�D��
�A�V�I��|�
�Og���鴋�	�7�y	7Jf�����:_�w^��H	v{/O�9���<����Y�`+�� HRٰ����[��?��
-������=���c""""""F�˽�sG�<*k9c��E�8薽�������zfm��r�1�N�������nq�w��&=O�\}K`
-#���2��~��L�|?�m>�\�f��͹�:}�4ᦋ���{�)�n[��
-�̰E
-KY��D�ۇ-��	�+�Kl=�Ӄ��L`љ�|�%��n�	a�	���N�#��5�	(4���?�����EDDDD\o�W�Ffq;��\E��_������,���W!%�zE!F�¶.�(USHQ0d�w)T���8#p,�x�B��K���� �*�x��X��E�e������
-K솎%mK��X~s�FE���~������tdc��a��I���1��Af4��dH��c�G�S�B`��0�wev`����"�{��	�.�GDDDD�,d�O�6�k"qk��Me�fS_����U��KŌ&g~>n� �H�})��L���F%8(�)r���!�[4统qQk�0�m[Le���_�7���0�@>1 X0A��Z����Vc�E�V ���Lt�k�3�EJ��44�Zﮊ�N`rt�>`�˥�	�	�
A��HBLH�@��c���Uq=�j������cM����2�s����J���CL�iR �NQ���������0=���Yi�-�|4�V��]��]��B^�ޞ���_H������$�<�$�	
-a����=��d@�	(Z�Ap_�}�~s���:�N�{DC>����m�^��ƒ����S�&�, ;�N����&�B} ��<_A��B]H�u���N(B�0��{h���1�IK����Ds��j����'��M���8�.�ӫ1�h3�df}mq���	��n�U{��L�o��z\=?@	((���e�|=ơ麄�C�i����1r<|�OO�;�
`��H��p�Qy�zԈu�����Z���V���Ʋ�!�)��5m�C���2��Ly�g�;���֑�R���jW�a@��@V�L�&W���ru=Z
-�̥��=U���5}���������7�;b(�����nP&�s��k�4�����8�ͥ��0���1�U�W�v�k�18dq���T��ՌE]qH8�������G�F�����K�����'��r����Or���r�̧��6"fp��T�^3c��"�����n��Mم-�/��W=�tJ,��X�)���{�P
Rm|K����>mX�8v�5h��<������_{ꘀ�Y�F�|&_G;&�>^�����W⁃�&�K���(��81�EB@F&��;"L���'wfw��E-6��o&/̫'X�e,>~�ee��|���A����=)	d��Q�`}P[���K��N��˂����/�~)����O[d�O=�3E�l5'Y�$?��7�m���Tzզ.�\��.��` WE�����"""""v�)��V���<���K�ZX.Ex�~Ч)���ߚ�����W_}�5|��s��/!?����'poդ���tC3����@�Q�)��t��`���b!,dY9�6A2����������/튮���n�t�TK>����#]�L;zq�J���r���²[��\-t�ҽ�5
@�ͷϟ��n�T@��+;��c���Qh�C*���T�ڙ��A<Sku�µb�E�
/��$�Z���.e�j������_ʤrWaB6d���(��S�s[�|���竕
-/5R���(�4X������76����`3|���P��p�'�H~<R?M�2�)�  ��g��Vp��B�n�=�|W�ͬ\��V0_�81Oׄ�Kz||lP_��ω���lxX;ǀ�Ju�<��Ng[��]=�(�#]������p�P�a���i�������s�f��
-V�z��]ౚ������z>�Vr�?�f��?������
�Q�1�T`��} H�k���,{�VZˋT��ϛ�?I̯u�QK�LM�e͆��~��q������y�m0�9�S�;���j�����5 ���i��Q��]7k0�U�ޭ���G�kX����3#���lY��_Цx����j޶9��`�#
-M	[z��KuO_z˿Dܭ��*��kOJ�(7��n��\�e�
I�T�ƨ�l�/�U������߶uw�.�~���;#�r���.�����8
�o# 5L��h>1�i�����p��V�M�?�/u7��0� X@��L��+M�+�����{��Fkt�{�ŧ89�0`���. ĀC�R+\��/��t�R����;
�TӲ���]�aL���|�efđ��	�>�ۣ��G�|�P`P��8C1K՛�A�̍<�2��ۂ��K�r�l@L
-L��������8�@�E>`n�����PNԍ,��p�����E��Ɔ����Z�FlÎ;�����F���7��Ȯ;��
-��s�wSz)g7�{r�s��S��gȋ��(߄~�AWytX��$�NV����R�_��<6�p.�O�8�O[�OdDk>_��O�O�}����JS���d��mV�?�W(_��m� ��j���~=H IԁF>T/��{*]IGJ@i����qam�NF|Q�5���0+���E�S8�:�v�`p~v���j:B�����p96�o��ys%��������
�|@H�����]��+�@��t]W�k}}�����7��Fʮr����A�����B���\m�-�_�2PY8�������x�ՎN�.h�~���@+7��z5������t�_/������/�?���0�S>��)���z�i0n�/�B����`{D��W���#`����B��o���[,�g��FVЁ�pP߾���C]Bz�� ��,X�����X�fԃ����A�:H��� k�7��d�Z9��oc}o�]�0�vd�:R]�0�ve���]刈����j����у����|
	�?�+(��OǍ�+	�#��ys���ߍ�n�p���Fru<��.HȺotM��3h���}��߆P}�������˗��v�����P�}mǀ���?���W��Z@���������}���������@��@���FD�������l����%tEXtdate:create�2016-07-13T10:21:59+00:00�����%tEXtdate:modify�2016-07-13T09:26:54+00:00�͠���tEXtSoftware�Adobe ImageReadyq�e<����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/jquery-ui.min.css b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/jquery-ui.min.css
deleted file mode 100644
index b3fe46344d7b1b0e8452e071be22972c2dd7e18b..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/css/uitheme1.12.1/jquery-ui.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2019-05-26
-* http://jqueryui.com
-* Includes: core.css, tabs.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=smoothness&cornerRadiusShadow=8px&offsetLeftShadow=-8px&offsetTopShadow=-8px&thicknessShadow=8px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=aaaaaa&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cd0a0a&fcError=cd0a0a&borderColorError=cd0a0a&bgImgOpacityError=95&bgTextureError=glass&bgColorError=fef1ec&iconColorHighlight=2e83ff&fcHighlight=363636&borderColorHighlight=fcefa1&bgImgOpacityHighlight=55&bgTextureHighlight=glass&bgColorHighlight=fbf9ee&iconColorActive=454545&fcActive=212121&borderColorActive=aaaaaa&bgImgOpacityActive=65&bgTextureActive=glass&bgColorActive=ffffff&iconColorHover=454545&fcHover=212121&borderColorHover=999999&bgImgOpacityHover=75&bgTextureHover=glass&bgColorHover=dadada&iconColorDefault=888888&fcDefault=555555&borderColorDefault=d3d3d3&bgImgOpacityDefault=75&bgTextureDefault=glass&bgColorDefault=e6e6e6&iconColorContent=222222&fcContent=222222&borderColorContent=aaaaaa&bgImgOpacityContent=75&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=222222&fcHeader=222222&borderColorHeader=aaaaaa&bgImgOpacityHeader=75&bgTextureHeader=highlight_soft&bgColorHeader=cccccc&cornerRadius=4px&fsDefault=1.1em&fwDefault=normal&ffDefault=Verdana%2CArial%2Csans-serif
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/js/jquery-1.12.4.min.js b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/js/jquery-1.12.4.min.js
deleted file mode 100644
index e836475870da67f3c72f64777c6e0f37d9f4c87b..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/js/jquery-1.12.4.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
-}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
-marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
-padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/js/jquery-ui-1.12.1.min.js b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/js/jquery-ui-1.12.1.min.js
deleted file mode 100644
index 25398a167415050ae8bfb0bfebac6aa3ab790909..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/js/jquery-ui-1.12.1.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2016-09-14
-* http://jqueryui.com
-* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if(e=t.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function s(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=n(t("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(m.inline?m.dpDiv.parent()[0]:m.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var h=0,l=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=l.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=l.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,g,m,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),k={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,g=_.offset,m=t.extend({},g),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),k[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?m.left+=p:"center"===n.at[0]&&(m.left+=p/2),"bottom"===n.at[1]?m.top+=f:"center"===n.at[1]&&(m.top+=f/2),u=e(k.at,p,f),m.left+=u[0],m.top+=u[1],this.each(function(){var s,r,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),x=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},m),I=e(k.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=I[0],D.top+=I[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:l,elemHeight:c,collisionPosition:s,collisionWidth:x,collisionHeight:C,offset:[u[0]+I[0],u[1]+I[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=g.left-D.left,i=e+p-l,s=g.top-D.top,r=s+f-c,u={target:{element:v,left:g.left,top:g.top,width:p,height:f},element:{element:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}});var c="ui-effects-",u="ui-effects-style",d="ui-effects-animated",p=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("<p>")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(p),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(p.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(d)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(c+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(c+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(u,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(u)||"",t.removeData(u)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(c+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=c+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(d),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(d,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?l?this[l](s.duration,h):this.each(function(){h&&h.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n)
-}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("<div class='ui-effects-transfer'></div>").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var f=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=h?2*u:u/2;h&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=a-(d-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;h&&(r=parseInt(h[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,h=2*r+1,l=Math.round(e.duration/h),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var f;t.uiBackCompat!==!1&&(f=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)})),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,.\/:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t("<span>"),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()<e.index()),c=this.options.animate||{},u=l&&c.down||c,d=function(){a._toggleComplete(i)};return"number"==typeof u&&(o=u),"string"==typeof u&&(n=u),n=n||u.easing||c.easing,o=o||u.duration||c.duration,e.length?t.length?(s=t.show().outerHeight(),e.animate(this.hideProps,{duration:o,easing:n,step:function(t,e){e.now=Math.round(t)}}),t.hide().animate(this.showProps,{duration:o,easing:n,complete:d,step:function(t,i){i.now=Math.round(t),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==a.options.heightStyle&&(i.now=Math.round(s-e.outerHeight()-r),r=0)}}),void 0):e.animate(this.hideProps,o,n,d):t.animate(this.showProps,o,n,d)},_toggleComplete:function(t){var e=t.oldPanel,i=e.prev();this._removeClass(e,"ui-accordion-content-active"),this._removeClass(i,"ui-accordion-header-active")._addClass(i,"ui-accordion-header-collapsed"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}}),t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.widget("ui.menu",{version:"1.12.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("<span>").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=h.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)},_filterMenuItems:function(e){var i=e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(t.trim(t(this).children(".ui-menu-item-wrapper").text()))})}}),t.widget("ui.autocomplete",{version:"1.12.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;
-this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("<ul>").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("<div>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):this._trigger("search",e)!==!1?this._search(t):void 0},_search:function(t){this.pending++,this._addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var e=++this.requestIndex;return t.proxy(function(t){e===this.requestIndex&&this.__response(t),this.pending--,this.pending||this._removeClass("ui-autocomplete-loading")},this)},__response:function(t){t&&(t=this._normalize(t)),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this._off(this.document,"mousedown"),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return"string"==typeof e?{label:e,value:e}:t.extend({},e,{label:e.label||e.value,value:e.value||e.label})})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(),this._on(this.document,{mousedown:"_closeOnClickOutside"})},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var s=this;t.each(i,function(t,i){s._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(e,i){return t("<li>").append(t("<div>").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("<div>").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete;var g=/ui-corner-([a-z]){2,6}/g;t.widget("ui.controlgroup",{version:"1.12.1",defaultElement:"<div>",options:{direction:"horizontal",disabled:null,onlyVisible:!0,items:{button:"input[type=button], input[type=submit], input[type=reset], button, a",controlgroupLabel:".ui-controlgroup-label",checkboxradio:"input[type='checkbox'], input[type='radio']",selectmenu:"select",spinner:".ui-spinner-input"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr("role","toolbar"),this.refresh()},_destroy:function(){this._callChildMethod("destroy"),this.childWidgets.removeData("ui-controlgroup-data"),this.element.removeAttr("role"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap()},_initWidgets:function(){var e=this,i=[];t.each(this.options.items,function(s,n){var o,a={};return n?"controlgroupLabel"===s?(o=e.element.find(n),o.each(function(){var e=t(this);e.children(".ui-controlgroup-label-contents").length||e.contents().wrapAll("<span class='ui-controlgroup-label-contents'></span>")}),e._addClass(o,null,"ui-widget ui-widget-content ui-state-default"),i=i.concat(o.get()),void 0):(t.fn[s]&&(a=e["_"+s+"Options"]?e["_"+s+"Options"]("middle"):{classes:{}},e.element.find(n).each(function(){var n=t(this),o=n[s]("instance"),r=t.widget.extend({},a);if("button"!==s||!n.parent(".ui-spinner").length){o||(o=n[s]()[s]("instance")),o&&(r.classes=e._resolveClassesValues(r.classes,o)),n[s](r);var h=n[s]("widget");t.data(h[0],"ui-controlgroup-data",o?o:n[s]("instance")),i.push(h[0])}})),void 0):void 0}),this.childWidgets=t(t.unique(i)),this._addClass(this.childWidgets,"ui-controlgroup-item")},_callChildMethod:function(e){this.childWidgets.each(function(){var i=t(this),s=i.data("ui-controlgroup-data");s&&s[e]&&s[e]()})},_updateCornerClass:function(t,e){var i="ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all",s=this._buildSimpleOptions(e,"label").classes.label;this._removeClass(t,null,i),this._addClass(t,null,s)},_buildSimpleOptions:function(t,e){var i="vertical"===this.options.direction,s={classes:{}};return s.classes[e]={middle:"",first:"ui-corner-"+(i?"top":"left"),last:"ui-corner-"+(i?"bottom":"right"),only:"ui-corner-all"}[t],s},_spinnerOptions:function(t){var e=this._buildSimpleOptions(t,"ui-spinner");return e.classes["ui-spinner-up"]="",e.classes["ui-spinner-down"]="",e},_buttonOptions:function(t){return this._buildSimpleOptions(t,"ui-button")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,"ui-checkboxradio-label")},_selectmenuOptions:function(t){var e="vertical"===this.options.direction;return{width:e?"auto":!1,classes:{middle:{"ui-selectmenu-button-open":"","ui-selectmenu-button-closed":""},first:{"ui-selectmenu-button-open":"ui-corner-"+(e?"top":"tl"),"ui-selectmenu-button-closed":"ui-corner-"+(e?"top":"left")},last:{"ui-selectmenu-button-open":e?"":"ui-corner-tr","ui-selectmenu-button-closed":"ui-corner-"+(e?"bottom":"right")},only:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"}}[t]}},_resolveClassesValues:function(e,i){var s={};return t.each(e,function(n){var o=i.options.classes[n]||"";o=t.trim(o.replace(g,"")),s[n]=(o+" "+e[n]).replace(/\s+/g," ")}),s},_setOption:function(t,e){return"direction"===t&&this._removeClass("ui-controlgroup-"+this.options.direction),this._super(t,e),"disabled"===t?(this._callChildMethod(e?"disable":"enable"),void 0):(this.refresh(),void 0)},refresh:function(){var e,i=this;this._addClass("ui-controlgroup ui-controlgroup-"+this.options.direction),"horizontal"===this.options.direction&&this._addClass(null,"ui-helper-clearfix"),this._initWidgets(),e=this.childWidgets,this.options.onlyVisible&&(e=e.filter(":visible")),e.length&&(t.each(["first","last"],function(t,s){var n=e[s]().data("ui-controlgroup-data");if(n&&i["_"+n.widgetName+"Options"]){var o=i["_"+n.widgetName+"Options"](1===e.length?"only":s);o.classes=i._resolveClassesValues(o.classes,n),n.element[n.widgetName](o)}else i._updateCornerClass(e[s](),s)}),this._callChildMethod("refresh"))}}),t.widget("ui.checkboxradio",[t.ui.formResetMixin,{version:"1.12.1",options:{disabled:null,label:null,icon:!0,classes:{"ui-checkboxradio-label":"ui-corner-all","ui-checkboxradio-icon":"ui-corner-all"}},_getCreateOptions:function(){var e,i,s=this,n=this._super()||{};return this._readType(),i=this.element.labels(),this.label=t(i[i.length-1]),this.label.length||t.error("No label found for checkboxradio widget"),this.originalLabel="",this.label.contents().not(this.element[0]).each(function(){s.originalLabel+=3===this.nodeType?t(this).text():this.outerHTML}),this.originalLabel&&(n.label=this.originalLabel),e=this.element[0].disabled,null!=e&&(n.disabled=e),n},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption("disabled",this.options.disabled),this._addClass("ui-checkboxradio","ui-helper-hidden-accessible"),this._addClass(this.label,"ui-checkboxradio-label","ui-button ui-widget"),"radio"===this.type&&this._addClass(this.label,"ui-checkboxradio-radio-label"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&(this._addClass(this.label,"ui-checkboxradio-checked","ui-state-active"),this.icon&&this._addClass(this.icon,null,"ui-state-hover")),this._on({change:"_toggleClasses",focus:function(){this._addClass(this.label,null,"ui-state-focus ui-visual-focus")},blur:function(){this._removeClass(this.label,null,"ui-state-focus ui-visual-focus")}})},_readType:function(){var e=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,"input"===e&&/radio|checkbox/.test(this.type)||t.error("Can't create checkboxradio on element.nodeName="+e+" and element.type="+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var e,i=this.element[0].name,s="input[name='"+t.ui.escapeSelector(i)+"']";return i?(e=this.form.length?t(this.form[0].elements).filter(s):t(s).filter(function(){return 0===t(this).form().length}),e.not(this.element)):t([])},_toggleClasses:function(){var e=this.element[0].checked;this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",e),this.options.icon&&"checkbox"===this.type&&this._toggleClass(this.icon,null,"ui-icon-check ui-state-checked",e)._toggleClass(this.icon,null,"ui-icon-blank",!e),"radio"===this.type&&this._getRadioGroup().each(function(){var e=t(this).checkboxradio("instance");e&&e._removeClass(e.label,"ui-checkboxradio-checked","ui-state-active")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){return"label"!==t||e?(this._super(t,e),"disabled"===t?(this._toggleClass(this.label,null,"ui-state-disabled",e),this.element[0].disabled=e,void 0):(this.refresh(),void 0)):void 0},_updateIcon:function(e){var i="ui-icon ui-icon-background ";this.options.icon?(this.icon||(this.icon=t("<span>"),this.iconSpace=t("<span> </span>"),this._addClass(this.iconSpace,"ui-checkboxradio-icon-space")),"checkbox"===this.type?(i+=e?"ui-icon-check ui-state-checked":"ui-icon-blank",this._removeClass(this.icon,null,e?"ui-icon-blank":"ui-icon-check")):i+="ui-icon-blank",this._addClass(this.icon,"ui-checkboxradio-icon",i),e||this._removeClass(this.icon,null,"ui-icon-check ui-state-checked"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon)},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),this.iconSpace&&(t=t.not(this.iconSpace[0])),t.remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]),t.ui.checkboxradio,t.widget("ui.button",{version:"1.12.1",defaultElement:"<button>",options:{classes:{"ui-button":"ui-corner-all"},disabled:null,icon:null,iconPosition:"beginning",label:null,showLabel:!0},_getCreateOptions:function(){var t,e=this._super()||{};return this.isInput=this.element.is("input"),t=this.element[0].disabled,null!=t&&(e.disabled=t),this.originalLabel=this.isInput?this.element.val():this.element.html(),this.originalLabel&&(e.label=this.originalLabel),e},_create:function(){!this.option.showLabel&!this.options.icon&&(this.options.showLabel=!0),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled||!1),this.hasTitle=!!this.element.attr("title"),this.options.label&&this.options.label!==this.originalLabel&&(this.isInput?this.element.val(this.options.label):this.element.html(this.options.label)),this._addClass("ui-button","ui-widget"),this._setOption("disabled",this.options.disabled),this._enhance(),this.element.is("a")&&this._on({keyup:function(e){e.keyCode===t.ui.keyCode.SPACE&&(e.preventDefault(),this.element[0].click?this.element[0].click():this.element.trigger("click"))}})},_enhance:function(){this.element.is("button")||this.element.attr("role","button"),this.options.icon&&(this._updateIcon("icon",this.options.icon),this._updateTooltip())},_updateTooltip:function(){this.title=this.element.attr("title"),this.options.showLabel||this.title||this.element.attr("title",this.options.label)},_updateIcon:function(e,i){var s="iconPosition"!==e,n=s?this.options.iconPosition:i,o="top"===n||"bottom"===n;this.icon?s&&this._removeClass(this.icon,null,this.options.icon):(this.icon=t("<span>"),this._addClass(this.icon,"ui-button-icon","ui-icon"),this.options.showLabel||this._addClass("ui-button-icon-only")),s&&this._addClass(this.icon,null,i),this._attachIcon(n),o?(this._addClass(this.icon,null,"ui-widget-icon-block"),this.iconSpace&&this.iconSpace.remove()):(this.iconSpace||(this.iconSpace=t("<span> </span>"),this._addClass(this.iconSpace,"ui-button-icon-space")),this._removeClass(this.icon,null,"ui-wiget-icon-block"),this._attachIconSpace(n))},_destroy:function(){this.element.removeAttr("role"),this.icon&&this.icon.remove(),this.iconSpace&&this.iconSpace.remove(),this.hasTitle||this.element.removeAttr("title")},_attachIconSpace:function(t){this.icon[/^(?:end|bottom)/.test(t)?"before":"after"](this.iconSpace)},_attachIcon:function(t){this.element[/^(?:end|bottom)/.test(t)?"append":"prepend"](this.icon)},_setOptions:function(t){var e=void 0===t.showLabel?this.options.showLabel:t.showLabel,i=void 0===t.icon?this.options.icon:t.icon;e||i||(t.showLabel=!0),this._super(t)},_setOption:function(t,e){"icon"===t&&(e?this._updateIcon(t,e):this.icon&&(this.icon.remove(),this.iconSpace&&this.iconSpace.remove())),"iconPosition"===t&&this._updateIcon(t,e),"showLabel"===t&&(this._toggleClass("ui-button-icon-only",null,!e),this._updateTooltip()),"label"===t&&(this.isInput?this.element.val(e):(this.element.html(e),this.icon&&(this._attachIcon(this.options.iconPosition),this._attachIconSpace(this.options.iconPosition)))),this._super(t,e),"disabled"===t&&(this._toggleClass(null,"ui-state-disabled",e),this.element[0].disabled=e,e&&this.element.blur())},refresh:function(){var t=this.element.is("input, button")?this.element[0].disabled:this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOptions({disabled:t}),this._updateTooltip()}}),t.uiBackCompat!==!1&&(t.widget("ui.button",t.ui.button,{options:{text:!0,icons:{primary:null,secondary:null}},_create:function(){this.options.showLabel&&!this.options.text&&(this.options.showLabel=this.options.text),!this.options.showLabel&&this.options.text&&(this.options.text=this.options.showLabel),this.options.icon||!this.options.icons.primary&&!this.options.icons.secondary?this.options.icon&&(this.options.icons.primary=this.options.icon):this.options.icons.primary?this.options.icon=this.options.icons.primary:(this.options.icon=this.options.icons.secondary,this.options.iconPosition="end"),this._super()},_setOption:function(t,e){return"text"===t?(this._super("showLabel",e),void 0):("showLabel"===t&&(this.options.text=e),"icon"===t&&(this.options.icons.primary=e),"icons"===t&&(e.primary?(this._super("icon",e.primary),this._super("iconPosition","beginning")):e.secondary&&(this._super("icon",e.secondary),this._super("iconPosition","end"))),this._superApply(arguments),void 0)}}),t.fn.button=function(e){return function(){return!this.length||this.length&&"INPUT"!==this[0].tagName||this.length&&"INPUT"===this[0].tagName&&"checkbox"!==this.attr("type")&&"radio"!==this.attr("type")?e.apply(this,arguments):(t.ui.checkboxradio||t.error("Checkboxradio widget missing"),0===arguments.length?this.checkboxradio({icon:!1}):this.checkboxradio.apply(this,arguments))}}(t.fn.button),t.fn.buttonset=function(){return t.ui.controlgroup||t.error("Controlgroup widget missing"),"option"===arguments[0]&&"items"===arguments[1]&&arguments[2]?this.controlgroup.apply(this,[arguments[0],"items.button",arguments[2]]):"option"===arguments[0]&&"items"===arguments[1]?this.controlgroup.apply(this,[arguments[0],"items.button"]):("object"==typeof arguments[0]&&arguments[0].items&&(arguments[0].items={button:arguments[0].items}),this.controlgroup.apply(this,arguments))}),t.ui.button,t.extend(t.ui,{datepicker:{version:"1.12.1"}});var m;t.extend(s.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return a(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var s,n,o;s=e.nodeName.toLowerCase(),n="div"===s||"span"===s,e.id||(this.uuid+=1,e.id="dp"+this.uuid),o=this._newInst(t(e),n),o.settings=t.extend({},i||{}),"input"===s?this._connectDatepicker(e,o):n&&this._inlineDatepicker(e,o)},_newInst:function(e,i){var s=e[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?n(t("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(e,i){var s=t(e);i.append=t([]),i.trigger=t([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).on("keydown",this._doKeyDown).on("keypress",this._doKeyPress).on("keyup",this._doKeyUp),this._autoSize(i),t.data(e,"datepicker",i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var s,n,o,a=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),a&&(i.append=t("<span class='"+this._appendClass+"'>"+a+"</span>"),e[r?"before":"after"](i.append)),e.off("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&e.on("focus",this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),o=this._get(i,"buttonImage"),i.trigger=t(this._get(i,"buttonImageOnly")?t("<img/>").addClass(this._triggerClass).attr({src:o,alt:n,title:n}):t("<button type='button'></button>").addClass(this._triggerClass).html(o?t("<img/>").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.on("click",function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,n,o){var r,h,l,c,u,d=this._dialogInst;return d||(this.uuid+=1,r="dp"+this.uuid,this._dialogInput=t("<input type='text' id='"+r+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.on("keydown",this._doKeyDown),t("body").append(this._dialogInput),d=this._dialogInst=this._newInst(this._dialogInput,!1),d.settings={},t.data(this._dialogInput[0],"datepicker",d)),a(d.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(d,i):i,this._dialogInput.val(i),this._pos=o?o.length?o:[o.pageX,o.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,u=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+c,l/2-150+u]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),d.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],"datepicker",d),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,"datepicker");s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),m===n&&(m=null))},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(e,i,s){var n,o,r,h,l=this._getInst(e);return 2===arguments.length&&"string"==typeof i?"defaults"===i?t.extend({},t.datepicker._defaults):l?"all"===i?t.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),o=this._getDateDatepicker(e,!0),r=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),a(l.settings,n),null!==r&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,r)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),l),this._autoSize(l),this._setDate(l,o),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var i,s,n=t.datepicker._getInst(e.target);return t.datepicker._get(n,"constrainInput")?(i=t.datepicker._possibleChars(t.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),e.ctrlKey||e.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var s,n,o,r,h,l,c;s=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==s&&(t.datepicker._curInst.dpDiv.stop(!0,!0),s&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),n=t.datepicker._get(s,"beforeShow"),o=n?n.apply(e,[e,s]):{},o!==!1&&(a(s.settings,o),s.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(s),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),r=!1,t(e).parents().each(function(){return r|="fixed"===t(this).css("position"),!r}),h={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,s.dpDiv.empty(),s.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(s),h=t.datepicker._checkOffset(s,h,r),s.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":r?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),s.inline||(l=t.datepicker._get(s,"showAnim"),c=t.datepicker._get(s,"duration"),s.dpDiv.css("z-index",i(t(e))+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[l]?s.dpDiv.show(l,t.datepicker._get(s,"showOptions"),c):s.dpDiv[l||"show"](l?c:null),t.datepicker._shouldFocusInput(s)&&s.input.trigger("focus"),t.datepicker._curInst=s))
-}},_updateDatepicker:function(e){this.maxRows=4,m=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var i,s=this._getNumberOfMonths(e),n=s[1],a=17,r=e.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&e.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.trigger("focus"),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+o>l&&l>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,a=this._curInst;!a||e&&a!==t.data(e,"datepicker")||this._datepickerShowing&&(i=this._get(a,"showAnim"),s=this._get(a,"duration"),n=function(){t.datepicker._tidyDialog(a)},t.effects&&(t.effects.effect[i]||t.effects[i])?a.dpDiv.hide(i,t.datepicker._get(a,"showOptions"),s,n):a.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(a,"onClose"),o&&o.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).val(n))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(e,i,s){if(null==e||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,o,a,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,c="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),u=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,d=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,g=-1,m=-1,_=-1,v=-1,b=!1,y=function(t){var i=e.length>n+1&&e.charAt(n+1)===t;return i&&n++,i},w=function(t){var e=y(t),s="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n="y"===t?s:1,o=RegExp("^\\d{"+n+","+s+"}"),a=i.substring(h).match(o);if(!a)throw"Missing number at position "+h;return h+=a[0].length,parseInt(a[0],10)},k=function(e,s,n){var o=-1,a=t.map(y(e)?n:s,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(a,function(t,e){var s=e[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(o=e[0],h+=s.length,!1):void 0}),-1!==o)return o+1;throw"Unknown name at position "+h},x=function(){if(i.charAt(h)!==e.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;e.length>n;n++)if(b)"'"!==e.charAt(n)||y("'")?x():b=!1;else switch(e.charAt(n)){case"d":_=w("d");break;case"D":k("D",u,d);break;case"o":v=w("o");break;case"m":m=w("m");break;case"M":m=k("M",p,f);break;case"y":g=w("y");break;case"@":r=new Date(w("@")),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"!":r=new Date((w("!")-this._ticksTo1970)/1e4),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"'":y("'")?x():b=!0;break;default:x()}if(i.length>h&&(a=i.substr(h),!/^\s+/.test(a)))throw"Extra/unparsed characters found in date: "+a;if(-1===g?g=(new Date).getFullYear():100>g&&(g+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c>=g?0:-100)),v>-1)for(m=1,_=v;;){if(o=this._getDaysInMonth(g,m-1),o>=_)break;m++,_-=o}if(r=this._daylightSavingAdjust(new Date(g,m-1,_)),r.getFullYear()!==g||r.getMonth()+1!==m||r.getDate()!==_)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},l=function(t,e,i){var s=""+e;if(h(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return h(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||h("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=l("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=l("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=l("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=h("y")?e.getFullYear():(10>e.getFullYear()%100?"0":"")+e.getFullYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":h("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,e){return void 0!==t.settings[e]?t.settings[e]:this._defaults[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":a+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}l=h.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).on(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,h,l,c,u,d,p,f,g,m,_,v,b,y,w,k,x,C,D,I,T,P,M,S,H,z,O,A,N,W,E,F,L,R=new Date,B=this._daylightSavingAdjust(new Date(R.getFullYear(),R.getMonth(),R.getDate())),Y=this._get(t,"isRTL"),j=this._get(t,"showButtonPanel"),q=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),V=this._get(t,"showCurrentAtPos"),$=this._get(t,"stepMonths"),X=1!==U[0]||1!==U[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),Q=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Z=t.drawMonth-V,te=t.drawYear;if(0>Z&&(Z+=12,te--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-U[0]*U[1]+1,J.getDate())),e=Q&&Q>e?Q:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-$,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":q?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+$,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":q?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?G:B,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,h=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",l=j?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(t,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+a+"</button>":"")+(Y?"":h)+"</div>":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),_=this._get(t,"showOtherMonths"),v=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,C=0;U[1]>C;C++){if(D=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),I=" ui-corner-all",T="",X){if(T+="<div class='ui-datepicker-group",U[1]>1)switch(C){case 0:T+=" ui-datepicker-group-first",I=" ui-corner-"+(Y?"right":"left");break;case U[1]-1:T+=" ui-datepicker-group-last",I=" ui-corner-"+(Y?"left":"right");break;default:T+=" ui-datepicker-group-middle",I=""}T+="'>"}for(T+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+I+"'>"+(/all|left/.test(I)&&0===k?Y?o:s:"")+(/all|right/.test(I)&&0===k?Y?s:o:"")+this._generateMonthYearHeader(t,Z,te,Q,J,k>0||C>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",P=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)M=(w+c)%7,P+="<th scope='col'"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[M]+"'>"+p[M]+"</span></th>";for(T+=P+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),H=(this._getFirstDayOfMonth(te,Z)-c+7)%7,z=Math.ceil((H+S)/7),O=X?this.maxRows>z?this.maxRows:z:z,this.maxRows=O,A=this._daylightSavingAdjust(new Date(te,Z,1-H)),N=0;O>N;N++){for(T+="<tr>",W=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(A)+"</td>":"",w=0;7>w;w++)E=m?m.apply(t.input?t.input[0]:null,[A]):[!0,""],F=A.getMonth()!==Z,L=F&&!v||!E[0]||Q&&Q>A||J&&A>J,W+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(A.getTime()===D.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===A.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!_?"":" "+E[1]+(A.getTime()===G.getTime()?" "+this._currentClass:"")+(A.getTime()===B.getTime()?" ui-datepicker-today":""))+"'"+(F&&!_||!E[2]?"":" title='"+E[2].replace(/'/g,"&#39;")+"'")+(L?"":" data-handler='selectDay' data-event='click' data-month='"+A.getMonth()+"' data-year='"+A.getFullYear()+"'")+">"+(F&&!_?"&#xa0;":L?"<span class='ui-state-default'>"+A.getDate()+"</span>":"<a class='ui-state-default"+(A.getTime()===B.getTime()?" ui-state-highlight":"")+(A.getTime()===G.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+A.getDate()+"</a>")+"</td>",A.setDate(A.getDate()+1),A=this._daylightSavingAdjust(A);T+=W+"</tr>"}Z++,Z>11&&(Z=0,te++),T+="</tbody></table>"+(X?"</div>"+(U[0]>0&&C===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=T}y+=x}return y+=l,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,c,u,d,p,f,g,m=this._get(t,"changeMonth"),_=this._get(t,"changeYear"),v=this._get(t,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",y="";if(o||!m)y+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!h||c>=s.getMonth())&&(!l||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(v||(b+=y+(!o&&m&&_?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",o||!_)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";g>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),v&&(b+=(!o&&m&&_?"":"&#xa0;")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.selectedYear+("Y"===i?e:0),n=t.selectedMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,h=this._get(t,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).on("mousedown",t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new s,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.12.1",t.datepicker,t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var _=!1;t(document).on("mouseup",function(){_=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!_){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,n="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),_=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,_=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blurActiveElement(e),this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("<div>").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]),s=t(e.target);s.closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}
-},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),h=t.pageX,l=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(h=this.originalPageX),"x"===a.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY<n.scrollSensitivity?a.scrollTop=o=a.scrollTop+n.scrollSpeed:e.pageY-s.overflowOffset.top<n.scrollSensitivity&&(a.scrollTop=o=a.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+a.offsetWidth-e.pageX<n.scrollSensitivity?a.scrollLeft=o=a.scrollLeft+n.scrollSpeed:e.pageX-s.overflowOffset.left<n.scrollSensitivity&&(a.scrollLeft=o=a.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(e.pageY-t(r).scrollTop()<n.scrollSensitivity?o=t(r).scrollTop(t(r).scrollTop()-n.scrollSpeed):t(window).height()-(e.pageY-t(r).scrollTop())<n.scrollSensitivity&&(o=t(r).scrollTop(t(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(e.pageX-t(r).scrollLeft()<n.scrollSensitivity?o=t(r).scrollLeft(t(r).scrollLeft()-n.scrollSpeed):t(window).width()-(e.pageX-t(r).scrollLeft())<n.scrollSensitivity&&(o=t(r).scrollLeft(t(r).scrollLeft()+n.scrollSpeed)))),o!==!1&&t.ui.ddmanager&&!n.dropBehaviour&&t.ui.ddmanager.prepareOffsets(s,e)}}),t.ui.plugin.add("draggable","snap",{start:function(e,i,s){var n=s.options;s.snapElements=[],t(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var e=t(this),i=e.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:e.outerWidth(),height:e.outerHeight(),top:i.top,left:i.left})})},drag:function(e,i,s){var n,o,a,r,h,l,c,u,d,p,f=s.options,g=f.snapTolerance,m=i.offset.left,_=m+s.helperProportions.width,v=i.offset.top,b=v+s.helperProportions.height;for(d=s.snapElements.length-1;d>=0;d--)h=s.snapElements[d].left-s.margins.left,l=h+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,h-g>_||m>l+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(h-_),r=g>=Math.abs(l-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(h-m),r=g>=Math.abs(l-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable,t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,g=s.maxWidth&&p>s.maxWidth,m=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),g&&(p-=l),m&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable,t.widget("ui.dialog",{version:"1.12.1",options:{appendTo:"body",autoOpen:!0,buttons:[],classes:{"ui-dialog":"ui-corner-all","ui-dialog-titlebar":"ui-corner-all"},closeOnEscape:!0,closeText:"Close",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),null==this.options.title&&null!=this.originalTitle&&(this.options.title=this.originalTitle),this.options.disabled&&(this.options.disabled=!1),this._createWrapper(),this.element.show().removeAttr("title").appendTo(this.uiDialog),this._addClass("ui-dialog-content","ui-widget-content"),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().css(this.originalCss).detach(),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog
-},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&this._trigger("beforeClose",e)!==!1&&(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),this.opener.filter(":focusable").trigger("focus").length||t.ui.safeBlur(t.ui.safeActiveElement(this.document[0])),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(e,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+t(this).css("z-index")}).get(),o=Math.max.apply(null,n);return o>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",o+1),s=!0),s&&!i&&this._trigger("focus",e),s},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=t(t.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var t=this._focusedElement;t||(t=this.element.find("[autofocus]")),t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).trigger("focus")},_keepFocus:function(e){function i(){var e=t.ui.safeActiveElement(this.document[0]),i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("<div>").hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,"ui-dialog","ui-widget ui-widget-content ui-front"),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),void 0;if(e.keyCode===t.ui.keyCode.TAB&&!e.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(this._delay(function(){n.trigger("focus")}),e.preventDefault()):(this._delay(function(){s.trigger("focus")}),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("<div>"),this._addClass(this.uiDialogTitlebar,"ui-dialog-titlebar","ui-widget-header ui-helper-clearfix"),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.trigger("focus")}}),this.uiDialogTitlebarClose=t("<button type='button'></button>").button({label:t("<a>").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("<span>").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(e,"ui-dialog-title"),this._title(e),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html("&#160;")},_createButtonPane:function(){this.uiDialogButtonPane=t("<div>"),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("<div>").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this._removeClass(this.uiDialog,"ui-dialog-buttons"),void 0):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,o={icon:s.icon,iconPosition:s.iconPosition,showLabel:s.showLabel,icons:s.icons,text:s.text},delete s.click,delete s.icon,delete s.iconPosition,delete s.showLabel,delete s.icons,"boolean"==typeof s.text&&delete s.text,t("<button></button>",s).button(o).appendTo(e.uiButtonSet).on("click",function(){n.apply(e.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){i._addClass(t(this),"ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){var a=o.offset.left-i.document.scrollLeft(),r=o.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(a>=0?"+":"")+a+" "+"top"+(r>=0?"+":"")+r,of:i.window},i._removeClass(t(this),"ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){i._addClass(t(this),"ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){var a=i.uiDialog.offset(),r=a.left-i.document.scrollLeft(),h=a.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},i._removeClass(t(this),"ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_trackFocus:function(){this._on(this.widget(),{focusin:function(e){this._makeFocusTarget(),this._focusedElement=t(e.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var e=this._trackingInstances(),i=t.inArray(this,e);-1!==i&&e.splice(i,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||(t=[],this.document.data("ui-dialog-instances",t)),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(e){var i=this,s=!1,n={};t.each(e,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,i){var s,n,o=this.uiDialog;"disabled"!==e&&(this._super(e,i),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:t("<a>").text(""+this.options.closeText).html()}),"draggable"===e&&(s=o.is(":data(ui-draggable)"),s&&!i&&o.draggable("destroy"),!s&&i&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(n=o.is(":data(ui-resizable)"),n&&!i&&o.resizable("destroy"),n&&"string"==typeof i&&o.resizable("option","handles",i),n||i===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("<div>").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=!0;this._delay(function(){e=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=t("<div>").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var t=this.document.data("ui-dialog-overlays")-1;t?this.document.data("ui-dialog-overlays",t):(this._off(this.document,"focusin"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null}}}),t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}}),t.ui.dialog,t.widget("ui.droppable",{version:"1.12.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(s)?s:function(t){return t.is(s)},this.proportions=function(){return arguments.length?(e=arguments[0],void 0):e?e:e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this._addClass("ui-droppable")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if("accept"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if("scope"===e){var s=t.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=t(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&v(s,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var v=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,s,n){if(!i.offset)return!1;var o=(e.positionAbs||e.position.absolute).left+e.margins.left,a=(e.positionAbs||e.position.absolute).top+e.margins.top,r=o+e.helperProportions.width,h=a+e.helperProportions.height,l=i.offset.left,c=i.offset.top,u=l+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=l&&u>=r&&a>=c&&d>=h;case"intersect":return o+e.helperProportions.width/2>l&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>h-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,l,i.proportions().width);case"touch":return(a>=c&&d>=a||h>=c&&d>=h||c>a&&h>d)&&(o>=l&&u>=o||r>=l&&u>=r||l>o&&r>u);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions().height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions({width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight}))}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&v(e,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").on("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=v(e,this,this.options.tolerance,i),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t(this).droppable("instance").options.scope===n}),o.length&&(s=t(o[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").off("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},t.uiBackCompat!==!1&&t.widget("ui.droppable",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget("ui.progressbar",{version:"1.12.1",options:{classes:{"ui-progressbar":"ui-corner-all","ui-progressbar-value":"ui-corner-left","ui-progressbar-complete":"ui-corner-right"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:"progressbar","aria-valuemin":this.min}),this._addClass("ui-progressbar","ui-widget ui-widget-content"),this.valueDiv=t("<div>").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){return void 0===t?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),void 0)},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).width(i.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,e===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("<div>").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}}),t.widget("ui.selectable",t.ui.mouse,{version:"1.12.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e.elementPos=t(e.element[0]).offset(),e.selectees=t(e.options.filter,e.element[0]),e._addClass(e.selectees,"ui-selectee"),e.selectees.each(function(){var i=t(this),s=i.offset(),n={left:s.left-e.elementPos.left,top:s.top-e.elementPos.top};t.data(this,"selectable-item",{element:this,$element:i,left:n.left,top:n.top,right:n.left+i.outerWidth(),bottom:n.top+i.outerHeight(),startselected:!1,selected:i.hasClass("ui-selected"),selecting:i.hasClass("ui-selecting"),unselecting:i.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=t("<div>"),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.elementPos=t(this.element[0]).offset(),this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(i._removeClass(s.$element,"ui-selected"),s.selected=!1,i._addClass(s.$element,"ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),i._removeClass(n.$element,s?"ui-unselecting":"ui-selected")._addClass(n.$element,s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,h=e.pageY;return o>r&&(i=r,r=o,o=i),a>h&&(i=h,h=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:h-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),l=!1,c={};i&&i.element!==s.element[0]&&(c.left=i.left+s.elementPos.left,c.right=i.right+s.elementPos.left,c.top=i.top+s.elementPos.top,c.bottom=i.bottom+s.elementPos.top,"touch"===n.tolerance?l=!(c.left>r||o>c.right||c.top>h||a>c.bottom):"fit"===n.tolerance&&(l=c.left>o&&r>c.right&&c.top>a&&h>c.bottom),l?(i.selected&&(s._removeClass(i.$element,"ui-selected"),i.selected=!1),i.unselecting&&(s._removeClass(i.$element,"ui-unselecting"),i.unselecting=!1),i.selecting||(s._addClass(i.$element,"ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,s._addClass(i.$element,"ui-selected"),i.selected=!0):(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,i.startselected&&(s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(s._removeClass(i.$element,"ui-selected"),i.selected=!1,s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-selecting")._addClass(s.$element,"ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),t.widget("ui.selectmenu",[t.ui.formResetMixin,{version:"1.12.1",defaultElement:"<select>",options:{appendTo:null,classes:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"},disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:!1,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this._bindFormResetHandler(),this._rendered=!1,this.menuItems=t()},_drawButton:function(){var e,i=this,s=this._parseOption(this.element.find("option:selected"),this.element[0].selectedIndex);this.labels=this.element.labels().attr("for",this.ids.button),this._on(this.labels,{click:function(t){this.button.focus(),t.preventDefault()}}),this.element.hide(),this.button=t("<span>",{tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true",title:this.element.attr("title")}).insertAfter(this.element),this._addClass(this.button,"ui-selectmenu-button ui-selectmenu-button-closed","ui-button ui-widget"),e=t("<span>").appendTo(this.button),this._addClass(e,"ui-selectmenu-icon","ui-icon "+this.options.icons.button),this.buttonItem=this._renderButtonItem(s).appendTo(this.button),this.options.width!==!1&&this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){i._rendered||i._refreshMenu()})},_drawMenu:function(){var e=this;this.menu=t("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=t("<div>").append(this.menu),this._addClass(this.menuWrap,"ui-selectmenu-menu","ui-front"),this.menuWrap.appendTo(this._appendTo()),this.menuInstance=this.menu.menu({classes:{"ui-menu":"ui-corner-bottom"},role:"listbox",select:function(t,i){t.preventDefault(),e._setSelection(),e._select(i.item.data("ui-selectmenu-item"),t)},focus:function(t,i){var s=i.item.data("ui-selectmenu-item");null!=e.focusIndex&&s.index!==e.focusIndex&&(e._trigger("focus",t,{item:s}),e.isOpen||e._select(s,t)),e.focusIndex=s.index,e.button.attr("aria-activedescendant",e.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(this._getSelectedItem().data("ui-selectmenu-item")||{})),null===this.options.width&&this._resizeButton()},_refreshMenu:function(){var t,e=this.element.find("option");this.menu.empty(),this._parseOptions(e),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup").find(".ui-menu-item-wrapper"),this._rendered=!0,e.length&&(t=this._getSelectedItem(),this.menuInstance.focus(null,t),this._setAria(t.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(t){this.options.disabled||(this._rendered?(this._removeClass(this.menu.find(".ui-state-active"),null,"ui-state-active"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.menuItems.length&&(this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",t)))},_position:function(){this.menuWrap.position(t.extend({of:this.button},this.options.position))},close:function(t){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",t))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderButtonItem:function(e){var i=t("<span>");return this._setText(i,e.label),this._addClass(i,"ui-selectmenu-text"),i},_renderMenu:function(e,i){var s=this,n="";t.each(i,function(i,o){var a;o.optgroup!==n&&(a=t("<li>",{text:o.optgroup}),s._addClass(a,"ui-selectmenu-optgroup","ui-menu-divider"+(o.element.parent("optgroup").prop("disabled")?" ui-state-disabled":"")),a.appendTo(e),n=o.optgroup),s._renderItemData(e,o)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-selectmenu-item",e)},_renderItem:function(e,i){var s=t("<li>"),n=t("<div>",{title:i.element.attr("title")});return i.disabled&&this._addClass(s,null,"ui-state-disabled"),this._setText(n,i.label),s.append(n).appendTo(e)},_setText:function(t,e){e?t.text(e):t.html("&#160;")},_move:function(t,e){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex).parent("li"):(i=this.menuItems.eq(this.element[0].selectedIndex).parent("li"),n+=":not(.ui-state-disabled)"),s="first"===t||"last"===t?i["first"===t?"prevAll":"nextAll"](n).eq(-1):i[t+"All"](n).eq(0),s.length&&this.menuInstance.focus(e,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex).parent("li")},_toggle:function(t){this[this.isOpen?"close":"open"](t)},_setSelection:function(){var t;this.range&&(window.getSelection?(t=window.getSelection(),t.removeAllRanges(),t.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(e){this.isOpen&&(t(e.target).closest(".ui-selectmenu-menu, #"+t.ui.escapeSelector(this.ids.button)).length||this.close(e))}},_buttonEvents:{mousedown:function(){var t;window.getSelection?(t=window.getSelection(),t.rangeCount&&(this.range=t.getRangeAt(0))):this.range=document.selection.createRange()},click:function(t){this._setSelection(),this._toggle(t)},keydown:function(e){var i=!0;switch(e.keyCode){case t.ui.keyCode.TAB:case t.ui.keyCode.ESCAPE:this.close(e),i=!1;break;case t.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(e);break;case t.ui.keyCode.UP:e.altKey?this._toggle(e):this._move("prev",e);break;case t.ui.keyCode.DOWN:e.altKey?this._toggle(e):this._move("next",e);break;case t.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(e):this._toggle(e);break;case t.ui.keyCode.LEFT:this._move("prev",e);break;case t.ui.keyCode.RIGHT:this._move("next",e);break;case t.ui.keyCode.HOME:case t.ui.keyCode.PAGE_UP:this._move("first",e);break;case t.ui.keyCode.END:case t.ui.keyCode.PAGE_DOWN:this._move("last",e);break;default:this.menu.trigger(e),i=!1}i&&e.preventDefault()}},_selectFocusedItem:function(t){var e=this.menuItems.eq(this.focusIndex).parent("li");e.hasClass("ui-state-disabled")||this._select(e.data("ui-selectmenu-item"),t)},_select:function(t,e){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=t.index,this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(t)),this._setAria(t),this._trigger("select",e,{item:t}),t.index!==i&&this._trigger("change",e,{item:t}),this.close(e)},_setAria:function(t){var e=this.menuItems.eq(t.index).attr("id");this.button.attr({"aria-labelledby":e,"aria-activedescendant":e}),this.menu.attr("aria-activedescendant",e)},_setOption:function(t,e){if("icons"===t){var i=this.button.find("span.ui-icon");this._removeClass(i,null,this.options.icons.button)._addClass(i,null,e.button)}this._super(t,e),"appendTo"===t&&this.menuWrap.appendTo(this._appendTo()),"width"===t&&this._resizeButton()},_setOptionDisabled:function(t){this._super(t),this.menuInstance.option("disabled",t),this.button.attr("aria-disabled",t),this._toggleClass(this.button,null,"ui-state-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_toggleAttr:function(){this.button.attr("aria-expanded",this.isOpen),this._removeClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"closed":"open"))._addClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"open":"closed"))._toggleClass(this.menuWrap,"ui-selectmenu-open",null,this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var t=this.options.width;return t===!1?(this.button.css("width",""),void 0):(null===t&&(t=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(t),void 0)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){var t=this._super();return t.disabled=this.element.prop("disabled"),t},_parseOptions:function(e){var i=this,s=[];e.each(function(e,n){s.push(i._parseOption(t(n),e))}),this.items=s},_parseOption:function(t,e){var i=t.parent("optgroup");return{element:t,index:e,value:t.val(),label:t.text(),optgroup:i.attr("label")||"",disabled:i.prop("disabled")||t.prop("disabled")}},_destroy:function(){this._unbindFormResetHandler(),this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.labels.attr("for",this.ids.element)}}]),t.widget("ui.slider",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"slide",options:{animate:!1,classes:{"ui-slider":"ui-corner-all","ui-slider-handle":"ui-corner-all","ui-slider-range":"ui-corner-all ui-widget-header"},distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass("ui-slider ui-slider-"+this.orientation,"ui-widget ui-widget-content"),this._refresh(),this._animateOff=!1
-},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,s=this.options,n=this.element.find(".ui-slider-handle"),o="<span tabindex='0'></span>",a=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),e=n.length;i>e;e++)a.push(o);this.handles=n.add(t(a.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e).attr("tabIndex",0)})},_createRange:function(){var e=this.options;e.range?(e.range===!0&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=t("<div>").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),("min"===e.range||"max"===e.range)&&this._addClass(this.range,"ui-slider-range-"+e.range)):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,o,a,r,h,l,c=this,u=this.options;return u.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(s-c.values(e));(n>i||n===i&&(e===c._lastChangedValue||c.values(e)===u.min))&&(n=i,o=t(this),a=e)}),r=this._start(e,a),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=a,this._addClass(o,null,"ui-state-active"),o.trigger("focus"),h=o.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-h.left-o.width()/2,top:e.pageY-h.top-o.height()/2-(parseInt(o.css("borderTopWidth"),10)||0)-(parseInt(o.css("borderBottomWidth"),10)||0)+(parseInt(o.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,a,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this._removeClass(this.handles,null,"ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,s,n,o;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/e,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),o=this._valueMin()+s*n,this._trimAlignValue(o)},_uiHash:function(t,e,i){var s={handle:this.handles[t],handleIndex:t,value:void 0!==e?e:this.value()};return this._hasMultipleValues()&&(s.value=void 0!==e?e:this.values(t),s.values=i||this.values()),s},_hasMultipleValues:function(){return this.options.values&&this.options.values.length},_start:function(t,e){return this._trigger("start",t,this._uiHash(e))},_slide:function(t,e,i){var s,n,o=this.value(),a=this.values();this._hasMultipleValues()&&(n=this.values(e?0:1),o=this.values(e),2===this.options.values.length&&this.options.range===!0&&(i=0===e?Math.min(n,i):Math.max(n,i)),a[e]=i),i!==o&&(s=this._trigger("slide",t,this._uiHash(e,i,a)),s!==!1&&(this._hasMultipleValues()?this.values(e,i):this.value(i)))},_stop:function(t,e){this._trigger("stop",t,this._uiHash(e))},_change:function(t,e){this._keySliding||this._mouseSliding||(this._lastChangedValue=e,this._trigger("change",t,this._uiHash(e)))},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(e,i){var s,n,o;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),void 0;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this._hasMultipleValues()?this._values(e):this.value();for(s=this.options.values,n=arguments[0],o=0;s.length>o;o+=1)s[o]=this._trimAlignValue(n[o]),this._change(null,o);this._refreshValue()},_setOption:function(e,i){var s,n=0;switch("range"===e&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(n=this.options.values.length),this._super(e,i),e){case"orientation":this._detectOrientation(),this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-"+this.orientation),this._refreshValue(),this.options.range&&this._refreshRange(i),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=n-1;s>=0;s--)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_setOptionDisabled:function(t){this._super(t),this._toggleClass(null,"ui-state-disabled",!!t)},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this._hasMultipleValues()){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,s=t-i;return 2*Math.abs(i)>=e&&(s+=i>0?e:-e),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var t=this.options.max,e=this._valueMin(),i=this.options.step,s=Math.round((t-e)/i)*i;t=s+e,t>this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,s,n,o,a=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,c={};this._hasMultipleValues()?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),c["horizontal"===h.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[l?"animate":"css"](c,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),o=this._valueMax(),i=o!==n?100*((s-n)/(o-n)):0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:100-i+"%"},r.animate),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:100-i+"%"},r.animate))},_handleEvents:{keydown:function(e){var i,s,n,o,a=t(e.target).data("ui-slider-handle-index");switch(e.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(e.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(t(e.target),null,"ui-state-active"),i=this._start(e,a),i===!1))return}switch(o=this.options.step,s=n=this._hasMultipleValues()?this.values(a):this.value(),e.keyCode){case t.ui.keyCode.HOME:n=this._valueMin();break;case t.ui.keyCode.END:n=this._valueMax();break;case t.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+o);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-o)}this._slide(e,a,n)},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),this._removeClass(t(e.target),null,"ui-state-active"))}}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("<style>*{ cursor: "+a.cursor+" !important; }</style>").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<a.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+a.scrollSpeed:e.pageY-this.overflowOffset.top<a.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-a.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<a.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+a.scrollSpeed:e.pageX-this.overflowOffset.left<a.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-a.scrollSpeed)):(e.pageY-this.document.scrollTop()<a.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-a.scrollSpeed):this.window.height()-(e.pageY-this.document.scrollTop())<a.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+a.scrollSpeed)),e.pageX-this.document.scrollLeft()<a.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-a.scrollSpeed):this.window.width()-(e.pageX-this.document.scrollLeft())<a.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+a.scrollSpeed))),r!==!1&&t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],h=[],l=this._connectWith();if(l&&e)for(s=l.length-1;s>=0;s--)for(o=t(l[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&h.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(h.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("<tr>",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t("<td>&#160;</td>",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,h,l,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[a],l=!1,e[u]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(e[u]-h)&&(n=Math.abs(e[u]-h),o=this.items[s],this.direction=l?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(o=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(a=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;
-this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget("ui.spinner",{version:"1.12.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e=this._super(),i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);null!=n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var e=this.element[0]===t.ui.safeActiveElement(this.document[0]);e||(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===t.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("<span>").parent().append("<a></a><a></a>")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&this.uiSpinner.height()>0&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i,s,n;return"culture"===t||"numberFormat"===t?(i=this._parse(this.element.val()),this.options[t]=e,this.element.val(this._format(i)),void 0):(("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(s=this.buttons.first().find(".ui-icon"),this._removeClass(s,null,this.options.icons.up),this._addClass(s,null,e.up),n=this.buttons.last().find(".ui-icon"),this._removeClass(n,null,this.options.icons.down),this._addClass(n,null,e.down)),this._super(t,e),void 0)},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:r(function(t){this._super(t)}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null===t?!1:t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:r(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:r(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:r(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:r(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(r(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),t.uiBackCompat!==!1&&t.widget("ui.spinner",t.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return"<span>"},_buttonHtml:function(){return"<a></a><a></a>"}}),t.ui.spinner,t.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,s;i=e.href.replace(t,""),s=location.href.replace(t,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return e.hash.length>1&&i===s}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===e&&(s&&this.tabs.each(function(i,n){return t(n).attr("aria-controls")===s?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===e||-1===e)&&(e=this.tabs.length?0:!1)),e!==!1&&(e=this.tabs.index(this.tabs.eq(e)),-1===e&&(e=i?!1:0)),!i&&e===!1&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:s++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:n=!1,s--;break;case t.ui.keyCode.END:s=this.anchors.length-1;break;case t.ui.keyCode.HOME:s=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}e.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),e.ctrlKey||e.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e),void 0)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=t(),this.anchors.each(function(i,s){var n,o,a,r=t(s).uniqueId().attr("id"),h=t(s).closest("li"),l=h.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=h.attr("aria-controls")||t({}).uniqueId()[0].id,n="#"+a,o=e.element.find(n),o.length||(o=e._createPanel(a),o.insertAfter(e.panels[i-1]||e.tablist)),o.attr("aria-live","polite")),o.length&&(e.panels=e.panels.add(o)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":a,"aria-labelledby":r}),o.attr("aria-labelledby",r)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(e){return t("<div>").attr("id",e).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(e){var i,s,n;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),n=0;s=this.tabs[n];n++)i=t(s),e===!0||-1!==t.inArray(n,e)?(i.attr("aria-disabled","true"),this._addClass(i,null,"ui-state-disabled")):(i.removeAttr("aria-disabled"),this._removeClass(i,null,"ui-state-disabled"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,e===!0)},_setupEvents:function(e){var i={};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,h=r?t():this._getPanelForTab(o),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():o,newPanel:h};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){o._addClass(i.newTab.closest("li"),"ui-tabs-active","ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){o._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n()}):(this._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+t.ui.escapeSelector(e)+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(e){var i=this.options.disabled;i!==!1&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(i!==!0){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var s=this,n=this.tabs.eq(e),o=n.find(".ui-tabs-anchor"),a=this._getPanelForTab(n),r={tab:n,panel:a},h=function(t,e){"abort"===e&&s.panels.stop(!1,!0),s._removeClass(n,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===s.xhr&&delete s.xhr};this._isLocal(o[0])||(this.xhr=t.ajax(this._ajaxSettings(o,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(n,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,n){setTimeout(function(){a.html(t),s._trigger("load",i,r),h(n,e)},1)}).fail(function(t,e){setTimeout(function(){h(t,e)},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href").replace(/#.*$/,""),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),t.uiBackCompat!==!1&&t.widget("ui.tabs",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}}),t.ui.tabs,t.widget("ui.tooltip",{version:"1.12.1",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var e=t(this).attr("title")||"";return t("<a>").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))},_removeDescribedBy:function(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=t("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=t([])},_setOption:function(e,i){var s=this;this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s.element[0],e.close(n,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var e=t(this);return e.is("[title]")?e.data("ui-tooltip-title",e.attr("title")).removeAttr("title"):void 0}))},_enable:function(){this.disabledTitles.each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))}),this.disabledTitles=t([])},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(e,s),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s||s.nodeType||s.jquery?this._open(e,t,s):(i=s.call(t[0],function(i){n._delay(function(){t.data("ui-tooltip-open")&&(e&&(e.type=o),this._open(e,t,i))})}),i&&this._open(e,t,i),void 0)},_open:function(e,i,s){function n(t){l.of=t,a.is(":hidden")||a.position(l)}var o,a,r,h,l=t.extend({},this.options.position);if(s){if(o=this._find(i))return o.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(e&&"mouseover"===e.type?i.attr("title",""):i.removeAttr("title")),o=this._tooltip(i),a=o.tooltip,this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),h=t("<div>").html(a.find(".ui-tooltip-content").html()),h.removeAttr("name").find("[name]").removeAttr("name"),h.removeAttr("id").find("[id]").removeAttr("id"),h.appendTo(this.liveRegion),this.options.track&&e&&/^mouse/.test(e.type)?(this._on(this.document,{mousemove:n}),n(e)):a.position(t.extend({of:i},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(l.of),clearInterval(r))},t.fx.interval)),this._trigger("open",e,{tooltip:a})}},_registerCloseHandlers:function(e,i){var s={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var s=t.Event(e);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),e&&"mouseover"!==e.type||(s.mouseleave="close"),e&&"focusin"!==e.type||(s.focusout="close"),this._on(!0,i,s)},close:function(e){var i,s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);return o?(i=o.tooltip,o.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),o.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e]}),o.closing=!0,this._trigger("close",e,{tooltip:i}),o.hiding||(o.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(e){var i=t("<div>").attr("role","tooltip"),s=t("<div>").appendTo(i),n=i.uniqueId().attr("id");return this._addClass(s,"ui-tooltip-content"),this._addClass(i,"ui-tooltip","ui-widget ui-widget-content"),i.appendTo(this._appendTo(e)),this.tooltips[n]={element:e,tooltip:i}},_find:function(t){var e=t.data("ui-tooltip-id");return e?this.tooltips[e]:null},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){var e=t.closest(".ui-front, dialog");return e.length||(e=this.document[0].body),e},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur"),o=s.element;n.target=n.currentTarget=o[0],e.close(n,!0),t("#"+i).remove(),o.data("ui-tooltip-title")&&(o.attr("title")||o.attr("title",o.data("ui-tooltip-title")),o.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),t.uiBackCompat!==!1&&t.widget("ui.tooltip",t.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}}),t.ui.tooltip});
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/js/statistics.js b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/js/statistics.js
deleted file mode 100644
index ddddc25b74f1962f4e05d719f299e423d6c4d320..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/assets/js/statistics.js
+++ /dev/null
@@ -1,16 +0,0 @@
-$(document).ready(function () {
-    // Render tabs
-    $("#tabdiv").tabs();
-    $('ul.tabset_tabs li').click(
-        function () {
-            $("html, body").animate({ scrollTop: 0 }, "slow");
-        }
-    );
-
-    // Add listeners to dropdowns
-    $('select').change(
-         function() {
-            $(this).parents("form").submit();
-        }
-    );
-});
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/showstats.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/showstats.php
deleted file mode 100644
index 37dc45a5cf0791d1e21521d533f0a20a2df57dd4..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/showstats.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-use SimpleSAML\Configuration;
-use SimpleSAML\Session;
-use Symfony\Component\HttpFoundation\Request;
-
-$config = Configuration::getInstance();
-$session = Session::getSessionFromRequest();
-$request = Request::createFromGlobals();
-
-$controller = new StatisticsController($config, $session);
-$t = $controller->main($request);
-$t->show();
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/statmeta.php b/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/statmeta.php
deleted file mode 100644
index 336ac615bde7df616d22918970316b70fe86f930..0000000000000000000000000000000000000000
--- a/vendor/simplesamlphp/simplesamlphp/modules/statistics/www/statmeta.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace SimpleSAML\Module\statistics;
-
-use SimpleSAML\Configuration;
-use SimpleSAML\Session;
-use Symfony\Component\HttpFoundation\Request;
-
-$config = Configuration::getInstance();
-$session = Session::getSessionFromRequest();
-$request = Request::createFromGlobals();
-
-$controller = new StatisticsController($config, $session);
-$t = $controller->metadata($request);
-$t->show();
diff --git a/vendor/simplesamlphp/simplesamlphp/package-lock.json b/vendor/simplesamlphp/simplesamlphp/package-lock.json
index d44fb54511b71ca924f3b30afbfe7860dd1a3c2a..8c6a8eac92d04bff1581c693199532e7c44c6b8b 100644
--- a/vendor/simplesamlphp/simplesamlphp/package-lock.json
+++ b/vendor/simplesamlphp/simplesamlphp/package-lock.json
@@ -3,426 +3,515 @@
   "requires": true,
   "lockfileVersion": 1,
   "dependencies": {
-    "@babel/code-frame": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
-      "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+    "@ampproject/remapping": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+      "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
       "dev": true,
       "requires": {
-        "@babel/highlight": "^7.0.0"
+        "@jridgewell/gen-mapping": "^0.1.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
       }
     },
-    "@babel/core": {
-      "version": "7.7.5",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.5.tgz",
-      "integrity": "sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw==",
+    "@babel/code-frame": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
+      "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.5.5",
-        "@babel/generator": "^7.7.4",
-        "@babel/helpers": "^7.7.4",
-        "@babel/parser": "^7.7.5",
-        "@babel/template": "^7.7.4",
-        "@babel/traverse": "^7.7.4",
-        "@babel/types": "^7.7.4",
+        "@babel/highlight": "^7.16.7"
+      }
+    },
+    "@babel/compat-data": {
+      "version": "7.17.10",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz",
+      "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==",
+      "dev": true
+    },
+    "@babel/core": {
+      "version": "7.17.10",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz",
+      "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==",
+      "dev": true,
+      "requires": {
+        "@ampproject/remapping": "^2.1.0",
+        "@babel/code-frame": "^7.16.7",
+        "@babel/generator": "^7.17.10",
+        "@babel/helper-compilation-targets": "^7.17.10",
+        "@babel/helper-module-transforms": "^7.17.7",
+        "@babel/helpers": "^7.17.9",
+        "@babel/parser": "^7.17.10",
+        "@babel/template": "^7.16.7",
+        "@babel/traverse": "^7.17.10",
+        "@babel/types": "^7.17.10",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
-        "json5": "^2.1.0",
-        "lodash": "^4.17.13",
-        "resolve": "^1.3.2",
-        "semver": "^5.4.1",
-        "source-map": "^0.5.0"
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.1",
+        "semver": "^6.3.0"
       },
       "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
         "json5": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
-          "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
+          "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
           "dev": true
         }
       }
     },
     "@babel/generator": {
-      "version": "7.7.4",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz",
-      "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==",
+      "version": "7.17.10",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz",
+      "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.7.4",
-        "jsesc": "^2.5.1",
-        "lodash": "^4.17.13",
-        "source-map": "^0.5.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
+        "@babel/types": "^7.17.10",
+        "@jridgewell/gen-mapping": "^0.1.0",
+        "jsesc": "^2.5.1"
+      }
+    },
+    "@babel/helper-compilation-targets": {
+      "version": "7.17.10",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz",
+      "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.17.10",
+        "@babel/helper-validator-option": "^7.16.7",
+        "browserslist": "^4.20.2",
+        "semver": "^6.3.0"
+      }
+    },
+    "@babel/helper-environment-visitor": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
+      "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.16.7"
       }
     },
     "@babel/helper-function-name": {
-      "version": "7.7.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
-      "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
+      "version": "7.17.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
+      "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.16.7",
+        "@babel/types": "^7.17.0"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
+      "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.16.7"
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+      "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.16.7"
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.17.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz",
+      "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==",
       "dev": true,
       "requires": {
-        "@babel/helper-get-function-arity": "^7.7.4",
-        "@babel/template": "^7.7.4",
-        "@babel/types": "^7.7.4"
+        "@babel/helper-environment-visitor": "^7.16.7",
+        "@babel/helper-module-imports": "^7.16.7",
+        "@babel/helper-simple-access": "^7.17.7",
+        "@babel/helper-split-export-declaration": "^7.16.7",
+        "@babel/helper-validator-identifier": "^7.16.7",
+        "@babel/template": "^7.16.7",
+        "@babel/traverse": "^7.17.3",
+        "@babel/types": "^7.17.0"
       }
     },
-    "@babel/helper-get-function-arity": {
-      "version": "7.7.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
-      "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
+    "@babel/helper-simple-access": {
+      "version": "7.17.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz",
+      "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.7.4"
+        "@babel/types": "^7.17.0"
       }
     },
     "@babel/helper-split-export-declaration": {
-      "version": "7.7.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
-      "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
+      "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.7.4"
+        "@babel/types": "^7.16.7"
       }
     },
+    "@babel/helper-validator-identifier": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+      "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+      "dev": true
+    },
+    "@babel/helper-validator-option": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
+      "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
+      "dev": true
+    },
     "@babel/helpers": {
-      "version": "7.7.4",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz",
-      "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==",
+      "version": "7.17.9",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz",
+      "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.7.4",
-        "@babel/traverse": "^7.7.4",
-        "@babel/types": "^7.7.4"
+        "@babel/template": "^7.16.7",
+        "@babel/traverse": "^7.17.9",
+        "@babel/types": "^7.17.0"
       }
     },
     "@babel/highlight": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
-      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
+      "version": "7.17.9",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz",
+      "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==",
       "dev": true,
       "requires": {
+        "@babel/helper-validator-identifier": "^7.16.7",
         "chalk": "^2.0.0",
-        "esutils": "^2.0.2",
         "js-tokens": "^4.0.0"
       }
     },
     "@babel/parser": {
-      "version": "7.7.5",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz",
-      "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==",
+      "version": "7.17.10",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz",
+      "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==",
       "dev": true
     },
     "@babel/template": {
-      "version": "7.7.4",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
-      "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
+      "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.7.4",
-        "@babel/types": "^7.7.4"
+        "@babel/code-frame": "^7.16.7",
+        "@babel/parser": "^7.16.7",
+        "@babel/types": "^7.16.7"
       }
     },
     "@babel/traverse": {
-      "version": "7.7.4",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz",
-      "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.5.5",
-        "@babel/generator": "^7.7.4",
-        "@babel/helper-function-name": "^7.7.4",
-        "@babel/helper-split-export-declaration": "^7.7.4",
-        "@babel/parser": "^7.7.4",
-        "@babel/types": "^7.7.4",
+      "version": "7.17.10",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz",
+      "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.16.7",
+        "@babel/generator": "^7.17.10",
+        "@babel/helper-environment-visitor": "^7.16.7",
+        "@babel/helper-function-name": "^7.17.9",
+        "@babel/helper-hoist-variables": "^7.16.7",
+        "@babel/helper-split-export-declaration": "^7.16.7",
+        "@babel/parser": "^7.17.10",
+        "@babel/types": "^7.17.10",
         "debug": "^4.1.0",
-        "globals": "^11.1.0",
-        "lodash": "^4.17.13"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
+        "globals": "^11.1.0"
       }
     },
     "@babel/types": {
-      "version": "7.7.4",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
-      "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
+      "version": "7.17.10",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz",
+      "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==",
       "dev": true,
       "requires": {
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.13",
+        "@babel/helper-validator-identifier": "^7.16.7",
         "to-fast-properties": "^2.0.0"
       }
     },
+    "@discoveryjs/json-ext": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+      "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+      "dev": true
+    },
+    "@fortawesome/fontawesome-free": {
+      "version": "5.15.4",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz",
+      "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg=="
+    },
+    "@jridgewell/gen-mapping": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+      "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/set-array": "^1.0.0",
+        "@jridgewell/sourcemap-codec": "^1.4.10"
+      }
+    },
+    "@jridgewell/resolve-uri": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz",
+      "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==",
+      "dev": true
+    },
+    "@jridgewell/set-array": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz",
+      "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==",
+      "dev": true
+    },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.4.12",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.12.tgz",
+      "integrity": "sha512-az/NhpIwP3K33ILr0T2bso+k2E/SLf8Yidd8mHl0n6sCQ4YdyC8qDhZA6kOPDNDBA56ZnIjngVl0U3jREA0BUA==",
+      "dev": true
+    },
+    "@jridgewell/trace-mapping": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+      "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/resolve-uri": "^3.0.3",
+        "@jridgewell/sourcemap-codec": "^1.4.10"
+      }
+    },
     "@nodelib/fs.scandir": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
-      "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
       "dev": true,
       "requires": {
-        "@nodelib/fs.stat": "2.0.3",
+        "@nodelib/fs.stat": "2.0.5",
         "run-parallel": "^1.1.9"
       }
     },
     "@nodelib/fs.stat": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
-      "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
       "dev": true
     },
     "@nodelib/fs.walk": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
-      "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
       "dev": true,
       "requires": {
-        "@nodelib/fs.scandir": "2.1.3",
+        "@nodelib/fs.scandir": "2.1.5",
         "fastq": "^1.6.0"
       }
     },
-    "@npmcli/move-file": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz",
-      "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==",
+    "@types/eslint": {
+      "version": "8.4.2",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz",
+      "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==",
       "dev": true,
       "requires": {
-        "mkdirp": "^1.0.4"
-      },
-      "dependencies": {
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
-        }
+        "@types/estree": "*",
+        "@types/json-schema": "*"
+      }
+    },
+    "@types/eslint-scope": {
+      "version": "3.7.3",
+      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
+      "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
+      "dev": true,
+      "requires": {
+        "@types/eslint": "*",
+        "@types/estree": "*"
       }
     },
+    "@types/estree": {
+      "version": "0.0.51",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
+      "dev": true
+    },
     "@types/json-schema": {
-      "version": "7.0.5",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
-      "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==",
+      "version": "7.0.9",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+      "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "17.0.31",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.31.tgz",
+      "integrity": "sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q==",
       "dev": true
     },
     "@webassemblyjs/ast": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
-      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0"
+        "@webassemblyjs/helper-numbers": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
       }
     },
     "@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
-      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
       "dev": true
     },
     "@webassemblyjs/helper-api-error": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
-      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
       "dev": true
     },
     "@webassemblyjs/helper-buffer": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
-      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
-      "dev": true
-    },
-    "@webassemblyjs/helper-code-frame": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
-      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/wast-printer": "1.9.0"
-      }
-    },
-    "@webassemblyjs/helper-fsm": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
-      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
       "dev": true
     },
-    "@webassemblyjs/helper-module-context": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
-      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+    "@webassemblyjs/helper-numbers": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0"
+        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@xtuc/long": "4.2.2"
       }
     },
     "@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
-      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
       "dev": true
     },
     "@webassemblyjs/helper-wasm-section": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
-      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0"
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1"
       }
     },
     "@webassemblyjs/ieee754": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
-      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
       "dev": true,
       "requires": {
         "@xtuc/ieee754": "^1.2.0"
       }
     },
     "@webassemblyjs/leb128": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
-      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
       "dev": true,
       "requires": {
         "@xtuc/long": "4.2.2"
       }
     },
     "@webassemblyjs/utf8": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
-      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
       "dev": true
     },
     "@webassemblyjs/wasm-edit": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
-      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/helper-wasm-section": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0",
-        "@webassemblyjs/wasm-opt": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0",
-        "@webassemblyjs/wast-printer": "1.9.0"
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/helper-wasm-section": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-opt": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "@webassemblyjs/wast-printer": "1.11.1"
       }
     },
     "@webassemblyjs/wasm-gen": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
-      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/ieee754": "1.9.0",
-        "@webassemblyjs/leb128": "1.9.0",
-        "@webassemblyjs/utf8": "1.9.0"
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
       }
     },
     "@webassemblyjs/wasm-opt": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
-      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0"
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1"
       }
     },
     "@webassemblyjs/wasm-parser": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
-      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-api-error": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/ieee754": "1.9.0",
-        "@webassemblyjs/leb128": "1.9.0",
-        "@webassemblyjs/utf8": "1.9.0"
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
       }
     },
-    "@webassemblyjs/wast-parser": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
-      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+    "@webassemblyjs/wast-printer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
-        "@webassemblyjs/helper-api-error": "1.9.0",
-        "@webassemblyjs/helper-code-frame": "1.9.0",
-        "@webassemblyjs/helper-fsm": "1.9.0",
+        "@webassemblyjs/ast": "1.11.1",
         "@xtuc/long": "4.2.2"
       }
     },
-    "@webassemblyjs/wast-printer": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
-      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+    "@webpack-cli/configtest": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz",
+      "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==",
+      "dev": true
+    },
+    "@webpack-cli/info": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz",
+      "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0",
-        "@xtuc/long": "4.2.2"
+        "envinfo": "^7.7.3"
       }
     },
+    "@webpack-cli/serve": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz",
+      "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==",
+      "dev": true
+    },
     "@xtuc/ieee754": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@@ -435,70 +524,39 @@
       "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
       "dev": true
     },
-    "abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+    "acorn": {
+      "version": "8.7.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
+      "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
       "dev": true
     },
-    "acorn": {
-      "version": "6.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
-      "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
+    "acorn-import-assertions": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
+      "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
       "dev": true
     },
-    "aggregate-error": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
-      "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
-      "dev": true,
-      "requires": {
-        "clean-stack": "^2.0.0",
-        "indent-string": "^4.0.0"
-      },
-      "dependencies": {
-        "indent-string": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-          "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-          "dev": true
-        }
-      }
+    "after": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+      "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA=="
     },
     "ajv": {
-      "version": "6.10.2",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
-      "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dev": true,
       "requires": {
-        "fast-deep-equal": "^2.0.1",
+        "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
         "json-schema-traverse": "^0.4.1",
         "uri-js": "^4.2.2"
       }
     },
-    "ajv-errors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
-      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
-      "dev": true
-    },
     "ajv-keywords": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
-      "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
-      "dev": true
-    },
-    "amdefine": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
-      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
-      "dev": true
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
       "dev": true
     },
     "ansi-styles": {
@@ -510,5489 +568,1755 @@
         "color-convert": "^1.9.0"
       }
     },
-    "ansicolors": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz",
-      "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8="
-    },
     "anymatch": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
-      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
       "dev": true,
-      "optional": true,
       "requires": {
         "normalize-path": "^3.0.0",
         "picomatch": "^2.0.4"
       }
     },
-    "aproba": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+    "array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
       "dev": true
     },
-    "are-we-there-yet": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
-      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+    "babel-loader": {
+      "version": "8.2.5",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz",
+      "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==",
       "dev": true,
       "requires": {
-        "delegates": "^1.0.0",
-        "readable-stream": "^2.0.6"
+        "find-cache-dir": "^3.3.1",
+        "loader-utils": "^2.0.0",
+        "make-dir": "^3.1.0",
+        "schema-utils": "^2.6.5"
       }
     },
-    "arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+    "big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
       "dev": true
     },
-    "array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+    "binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
       "dev": true
     },
-    "array-union": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-      "dev": true
+    "bl": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz",
+      "integrity": "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==",
+      "requires": {
+        "readable-stream": "^3.0.1"
+      }
     },
-    "array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
     },
-    "asn1": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
-      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+    "browserslist": {
+      "version": "4.20.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
+      "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
       "dev": true,
       "requires": {
-        "safer-buffer": "~2.1.0"
+        "caniuse-lite": "^1.0.30001332",
+        "electron-to-chromium": "^1.4.118",
+        "escalade": "^3.1.1",
+        "node-releases": "^2.0.3",
+        "picocolors": "^1.0.0"
       }
     },
-    "asn1.js": {
-      "version": "4.10.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
-      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+    "buffer-from": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz",
+      "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg=="
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001336",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001336.tgz",
+      "integrity": "sha512-/YxSlBmL7iKXTbIJ48IQTnAOBk7XmWsxhBF1PZLOko5Dt9qc4Pl+84lfqG3Tc4EuavurRn1QLoVJGxY2iSycfw==",
+      "dev": true
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
       "requires": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
       }
     },
-    "assert": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
-      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+    "chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
       "dev": true,
       "requires": {
-        "object-assign": "^4.1.1",
-        "util": "0.10.3"
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
       },
       "dependencies": {
-        "inherits": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
-          "dev": true
-        },
-        "util": {
-          "version": "0.10.3",
-          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
-          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
           "dev": true,
           "requires": {
-            "inherits": "2.0.1"
+            "is-glob": "^4.0.1"
           }
         }
       }
     },
-    "assert-plus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+    "chrome-trace-event": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
       "dev": true
     },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true
+    "clipboard": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz",
+      "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+      "requires": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
     },
-    "async": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
-      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+    "clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "dev": true,
       "requires": {
-        "lodash": "^4.17.14"
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
       }
     },
-    "async-each": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
-      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
       "dev": true,
-      "optional": true
+      "requires": {
+        "color-name": "1.1.3"
+      }
     },
-    "async-foreach": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
-      "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
       "dev": true
     },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+    "colorette": {
+      "version": "2.0.16",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
+      "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
       "dev": true
     },
-    "atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+    "commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
       "dev": true
     },
-    "aws-sign2": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
       "dev": true
     },
-    "aws4": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
-      "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==",
-      "dev": true
+    "convert-source-map": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+      "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      }
     },
-    "babel-loader": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
-      "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
+    "copy-webpack-plugin": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz",
+      "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==",
       "dev": true,
       "requires": {
-        "find-cache-dir": "^2.1.0",
-        "loader-utils": "^1.4.0",
-        "mkdirp": "^0.5.3",
-        "pify": "^4.0.1",
-        "schema-utils": "^2.6.5"
+        "fast-glob": "^3.2.7",
+        "glob-parent": "^6.0.1",
+        "globby": "^11.0.3",
+        "normalize-path": "^3.0.0",
+        "schema-utils": "^3.1.1",
+        "serialize-javascript": "^6.0.0"
       },
       "dependencies": {
-        "emojis-list": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-          "dev": true
-        },
-        "loader-utils": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+        "schema-utils": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
           "dev": true,
           "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
+            "@types/json-schema": "^7.0.8",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
           }
         }
       }
     },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
+    "core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      }
     },
-    "base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+    "css-loader": {
+      "version": "5.2.7",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz",
+      "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==",
       "dev": true,
       "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
+        "icss-utils": "^5.1.0",
+        "loader-utils": "^2.0.0",
+        "postcss": "^8.2.15",
+        "postcss-modules-extract-imports": "^3.0.0",
+        "postcss-modules-local-by-default": "^4.0.0",
+        "postcss-modules-scope": "^3.0.0",
+        "postcss-modules-values": "^4.0.0",
+        "postcss-value-parser": "^4.1.0",
+        "schema-utils": "^3.0.0",
+        "semver": "^7.3.5"
       },
       "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+        "loader-utils": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
           "dev": true,
           "requires": {
-            "kind-of": "^6.0.0"
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
           }
         },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+        "schema-utils": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
           "dev": true,
           "requires": {
-            "kind-of": "^6.0.0"
+            "@types/json-schema": "^7.0.8",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
           }
         },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+        "semver": {
+          "version": "7.3.5",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
           "dev": true,
           "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
+            "lru-cache": "^6.0.0"
           }
         }
       }
     },
-    "base64-js": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
-      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
-      "dev": true
-    },
-    "bcrypt-pbkdf": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "dev": true,
-      "requires": {
-        "tweetnacl": "^0.14.3"
-      }
-    },
-    "big.js": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
-      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+    "cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
       "dev": true
     },
-    "binary-extensions": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
-      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
-      "dev": true,
-      "optional": true
-    },
-    "block-stream": {
-      "version": "0.0.9",
-      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
-      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+    "debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
       "requires": {
-        "inherits": "~2.0.0"
+        "ms": "2.1.2"
       }
     },
-    "bluebird": {
-      "version": "3.7.2",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
-      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
-      "dev": true
-    },
-    "bn.js": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz",
-      "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==",
-      "dev": true
+    "delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
     },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+    "dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
       "dev": true,
       "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+        "path-type": "^4.0.0"
       }
     },
-    "braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
+    "duplexer2": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+      "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==",
       "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
+        "readable-stream": "~1.1.9"
       },
       "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
+        "readable-stream": {
+          "version": "1.1.14",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+          "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
           "requires": {
-            "is-extendable": "^0.1.0"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "0.0.1",
+            "string_decoder": "~0.10.x"
           }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
         }
       }
     },
-    "brorand": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+    "electron-to-chromium": {
+      "version": "1.4.134",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.134.tgz",
+      "integrity": "sha512-OdD7M2no4Mi8PopfvoOuNcwYDJ2mNFxaBfurA6okG3fLBaMcFah9S+si84FhX+FIWLKkdaiHfl4A+5ep/gOVrg==",
       "dev": true
     },
-    "browserify-aes": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
-      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
-      "dev": true,
-      "requires": {
-        "buffer-xor": "^1.0.3",
-        "cipher-base": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.3",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
+    "emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true
     },
-    "browserify-cipher": {
+    "engine-check": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
-      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
-      "dev": true,
-      "requires": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "browserify-des": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
-      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "browserify-rsa": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
-      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "randombytes": "^2.0.1"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
-    "browserify-sign": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz",
-      "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==",
-      "dev": true,
+      "resolved": "https://registry.npmjs.org/engine-check/-/engine-check-1.0.1.tgz",
+      "integrity": "sha512-We1LIiRIkaGfEvhuqgmvyJiZFGO+lpD7nMfSFryM5UaFhrh9vfZWYbb4lqZhsnVCRW55RSflC7WgTiEHbdbIAA==",
       "requires": {
-        "bn.js": "^5.1.1",
-        "browserify-rsa": "^4.0.1",
-        "create-hash": "^1.2.0",
-        "create-hmac": "^1.1.7",
-        "elliptic": "^6.5.2",
-        "inherits": "^2.0.4",
-        "parse-asn1": "^5.1.5",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
+        "semver": "^5.0"
       },
       "dependencies": {
-        "readable-stream": {
-          "version": "3.6.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-          "dev": true
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
         }
       }
     },
-    "browserify-zlib": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
-      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
-      "dev": true,
-      "requires": {
-        "pako": "~1.0.5"
-      }
-    },
-    "buffer": {
-      "version": "4.9.2",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
-      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+    "enhanced-resolve": {
+      "version": "5.9.3",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz",
+      "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==",
       "dev": true,
       "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4",
-        "isarray": "^1.0.0"
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.2.0"
       }
     },
-    "buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+    "envinfo": {
+      "version": "7.8.1",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
+      "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
       "dev": true
     },
-    "buffer-xor": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+    "es-module-lexer": {
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
       "dev": true
     },
-    "builtin-status-codes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+    "es6-shim": {
+      "version": "0.35.6",
+      "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.6.tgz",
+      "integrity": "sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA=="
+    },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
       "dev": true
     },
-    "cacache": {
-      "version": "12.0.4",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
-      "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
-      "dev": true,
-      "requires": {
-        "bluebird": "^3.5.5",
-        "chownr": "^1.1.1",
-        "figgy-pudding": "^3.5.1",
-        "glob": "^7.1.4",
-        "graceful-fs": "^4.1.15",
-        "infer-owner": "^1.0.3",
-        "lru-cache": "^5.1.1",
-        "mississippi": "^3.0.0",
-        "mkdirp": "^0.5.1",
-        "move-concurrently": "^1.0.1",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^2.6.3",
-        "ssri": "^6.0.1",
-        "unique-filename": "^1.1.1",
-        "y18n": "^4.0.0"
-      }
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
     },
-    "cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+    "eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
       "dev": true,
       "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
       }
     },
-    "camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true
+    "esm": {
+      "version": "3.2.25",
+      "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+      "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="
     },
-    "camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
       "dev": true,
       "requires": {
-        "camelcase": "^2.0.0",
-        "map-obj": "^1.0.0"
+        "estraverse": "^5.2.0"
       },
       "dependencies": {
-        "camelcase": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
           "dev": true
         }
       }
     },
-    "cardinal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz",
-      "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=",
-      "requires": {
-        "ansicolors": "~0.2.1",
-        "redeyed": "~1.0.0"
-      }
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true
     },
-    "caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+    "events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
       "dev": true
     },
-    "chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+    "execa": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
       "dev": true,
       "requires": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "dependencies": {
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
       }
     },
-    "chokidar": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz",
-      "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==",
+    "expected-node-version": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/expected-node-version/-/expected-node-version-1.0.2.tgz",
+      "integrity": "sha512-OSaCdgF02srujDqJz1JWGpqk8Rq3uNYHLmtpBHJrZN3BvuMvzijJMqRVxZN1qLJtKVwjXhmOp+lfsRUqx8n54w=="
+    },
+    "expose-loader": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-2.0.0.tgz",
+      "integrity": "sha512-WBpSGlNkn7YwbU2us7O+h0XsoFrB43Y/VCNSpRV4OZFXXKgw8W800BgNxLV0S97N3+KGnFYSCAJi1AV86NO22w==",
+      "dev": true
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "fast-glob": {
+      "version": "3.2.11",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+      "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "anymatch": "~3.1.1",
-        "braces": "~3.0.2",
-        "fsevents": "~2.1.2",
-        "glob-parent": "~5.1.0",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.4.0"
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
       },
       "dependencies": {
-        "braces": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "fill-range": "^7.0.1"
-          }
-        },
-        "fill-range": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "to-regex-range": "^5.0.1"
-          }
-        },
         "glob-parent": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
           "dev": true,
-          "optional": true,
           "requires": {
             "is-glob": "^4.0.1"
           }
-        },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-          "dev": true,
-          "optional": true
-        },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "is-number": "^7.0.0"
-          }
         }
       }
     },
-    "chownr": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
       "dev": true
     },
-    "chrome-trace-event": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
-      "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.9.0"
-      }
+    "fastest-levenshtein": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+      "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+      "dev": true
     },
-    "cipher-base": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
-      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+    "fastq": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
       "dev": true,
       "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
+        "reusify": "^1.0.4"
       }
     },
-    "class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "dev": true,
       "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
+        "to-regex-range": "^5.0.1"
       }
     },
-    "clean-stack": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-      "dev": true
-    },
-    "clipboard": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz",
-      "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==",
+    "find-cache-dir": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+      "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+      "dev": true,
       "requires": {
-        "good-listener": "^1.2.2",
-        "select": "^1.1.2",
-        "tiny-emitter": "^2.0.0"
+        "commondir": "^1.0.1",
+        "make-dir": "^3.0.2",
+        "pkg-dir": "^4.1.0"
       }
     },
-    "cliui": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+    "find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "dev": true,
       "requires": {
-        "string-width": "^3.1.0",
-        "strip-ansi": "^5.2.0",
-        "wrap-ansi": "^5.1.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
       }
     },
-    "clone-deep": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
-      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+    "fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
       "dev": true,
-      "requires": {
-        "is-plain-object": "^2.0.4",
-        "kind-of": "^6.0.2",
-        "shallow-clone": "^3.0.0"
-      }
+      "optional": true
     },
-    "code-point-at": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
       "dev": true
     },
-    "collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
-      "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      }
-    },
-    "color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "requires": {
-        "color-name": "1.1.3"
-      }
-    },
-    "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
-    },
-    "combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "dev": true
-    },
-    "commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
-      "dev": true
-    },
-    "component-emitter": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
-      "dev": true
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "console-browserify": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
-      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
-      "dev": true
-    },
-    "console-control-strings": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
-      "dev": true
-    },
-    "constants-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
-      "dev": true
-    },
-    "convert-source-map": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
-      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "~5.1.1"
-      }
-    },
-    "copy-concurrently": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
-      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1",
-        "fs-write-stream-atomic": "^1.0.8",
-        "iferr": "^0.1.5",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.0"
-      }
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
-    },
-    "copy-webpack-plugin": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz",
-      "integrity": "sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA==",
-      "dev": true,
-      "requires": {
-        "cacache": "^15.0.4",
-        "fast-glob": "^3.2.4",
-        "find-cache-dir": "^3.3.1",
-        "glob-parent": "^5.1.1",
-        "globby": "^11.0.1",
-        "loader-utils": "^2.0.0",
-        "normalize-path": "^3.0.0",
-        "p-limit": "^3.0.1",
-        "schema-utils": "^2.7.0",
-        "serialize-javascript": "^4.0.0",
-        "webpack-sources": "^1.4.3"
-      },
-      "dependencies": {
-        "cacache": {
-          "version": "15.0.5",
-          "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
-          "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
-          "dev": true,
-          "requires": {
-            "@npmcli/move-file": "^1.0.1",
-            "chownr": "^2.0.0",
-            "fs-minipass": "^2.0.0",
-            "glob": "^7.1.4",
-            "infer-owner": "^1.0.4",
-            "lru-cache": "^6.0.0",
-            "minipass": "^3.1.1",
-            "minipass-collect": "^1.0.2",
-            "minipass-flush": "^1.0.5",
-            "minipass-pipeline": "^1.2.2",
-            "mkdirp": "^1.0.3",
-            "p-map": "^4.0.0",
-            "promise-inflight": "^1.0.1",
-            "rimraf": "^3.0.2",
-            "ssri": "^8.0.0",
-            "tar": "^6.0.2",
-            "unique-filename": "^1.1.1"
-          }
-        },
-        "chownr": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-          "dev": true
-        },
-        "emojis-list": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-          "dev": true
-        },
-        "find-cache-dir": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
-          "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
-          "dev": true,
-          "requires": {
-            "commondir": "^1.0.1",
-            "make-dir": "^3.0.2",
-            "pkg-dir": "^4.1.0"
-          }
-        },
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "glob-parent": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        },
-        "json5": {
-          "version": "2.1.3",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
-          "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.5"
-          }
-        },
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "lru-cache": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "make-dir": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-          "dev": true,
-          "requires": {
-            "semver": "^6.0.0"
-          }
-        },
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
-        },
-        "p-limit": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
-          "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.2.0"
-          },
-          "dependencies": {
-            "p-limit": {
-              "version": "2.3.0",
-              "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-              "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-              "dev": true,
-              "requires": {
-                "p-try": "^2.0.0"
-              }
-            }
-          }
-        },
-        "path-exists": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
-        },
-        "pkg-dir": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-          "dev": true,
-          "requires": {
-            "find-up": "^4.0.0"
-          }
-        },
-        "rimraf": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        },
-        "ssri": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
-          "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
-          "dev": true,
-          "requires": {
-            "minipass": "^3.1.1"
-          }
-        },
-        "tar": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz",
-          "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==",
-          "dev": true,
-          "requires": {
-            "chownr": "^2.0.0",
-            "fs-minipass": "^2.0.0",
-            "minipass": "^3.0.0",
-            "minizlib": "^2.1.0",
-            "mkdirp": "^1.0.3",
-            "yallist": "^4.0.0"
-          }
-        },
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
-        }
-      }
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
-    },
-    "create-ecdh": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
-      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.0.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
-    "create-hash": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
-      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "inherits": "^2.0.1",
-        "md5.js": "^1.3.4",
-        "ripemd160": "^2.0.1",
-        "sha.js": "^2.4.0"
-      }
-    },
-    "create-hmac": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
-      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.3",
-        "create-hash": "^1.1.0",
-        "inherits": "^2.0.1",
-        "ripemd160": "^2.0.0",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "cross-spawn": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
-      "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
-      "dev": true,
-      "requires": {
-        "lru-cache": "^4.0.1",
-        "which": "^1.2.9"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "4.1.5",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-          "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-          "dev": true,
-          "requires": {
-            "pseudomap": "^1.0.2",
-            "yallist": "^2.1.2"
-          }
-        },
-        "yallist": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
-          "dev": true
-        }
-      }
-    },
-    "crypto-browserify": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
-      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
-      "dev": true,
-      "requires": {
-        "browserify-cipher": "^1.0.0",
-        "browserify-sign": "^4.0.0",
-        "create-ecdh": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.0",
-        "diffie-hellman": "^5.0.0",
-        "inherits": "^2.0.1",
-        "pbkdf2": "^3.0.3",
-        "public-encrypt": "^4.0.0",
-        "randombytes": "^2.0.0",
-        "randomfill": "^1.0.3"
-      }
-    },
-    "css-loader": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.1.tgz",
-      "integrity": "sha512-q40kYdcBNzMvkIImCL2O+wk8dh+RGwPPV9Dfz3n7XtOYPXqe2Z6VgtvoxjkLHz02gmhepG9sOAJOUlx+3hHsBg==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.3.1",
-        "cssesc": "^3.0.0",
-        "icss-utils": "^4.1.1",
-        "loader-utils": "^1.2.3",
-        "normalize-path": "^3.0.0",
-        "postcss": "^7.0.23",
-        "postcss-modules-extract-imports": "^2.0.0",
-        "postcss-modules-local-by-default": "^3.0.2",
-        "postcss-modules-scope": "^2.1.1",
-        "postcss-modules-values": "^3.0.0",
-        "postcss-value-parser": "^4.0.2",
-        "schema-utils": "^2.6.0"
-      },
-      "dependencies": {
-        "schema-utils": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz",
-          "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.10.2",
-            "ajv-keywords": "^3.4.1"
-          }
-        }
-      }
-    },
-    "cssesc": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
-      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
-      "dev": true
-    },
-    "csv-parse": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.12.0.tgz",
-      "integrity": "sha512-wPQl3H79vWLPI8cgKFcQXl0NBgYYEqVnT1i6/So7OjMpsI540oD7p93r3w6fDSyPvwkTepG05F69/7AViX2lXg=="
-    },
-    "currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
-      "dev": true,
-      "requires": {
-        "array-find-index": "^1.0.1"
-      }
-    },
-    "cyclist": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
-      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
-      "dev": true
-    },
-    "dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true
-    },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true
-    },
-    "define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
-    },
-    "delegate": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
-      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
-    },
-    "delegates": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
-      "dev": true
-    },
-    "des.js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
-      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "detect-file": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
-      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
-      "dev": true
-    },
-    "diffie-hellman": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
-      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
-    "dir-glob": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-      "dev": true,
-      "requires": {
-        "path-type": "^4.0.0"
-      }
-    },
-    "domain-browser": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
-      "dev": true
-    },
-    "duplexify": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
-      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "ecc-jsbn": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-      "dev": true,
-      "requires": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
-      }
-    },
-    "elliptic": {
-      "version": "6.5.3",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
-      "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.4.0",
-        "brorand": "^1.0.1",
-        "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
-    "emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-      "dev": true
-    },
-    "emojis-list": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
-      "dev": true
-    },
-    "end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "enhanced-resolve": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
-      "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "memory-fs": "^0.5.0",
-        "tapable": "^1.0.0"
-      },
-      "dependencies": {
-        "memory-fs": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
-          "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
-          "dev": true,
-          "requires": {
-            "errno": "^0.1.3",
-            "readable-stream": "^2.0.1"
-          }
-        }
-      }
-    },
-    "errno": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
-      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
-      "dev": true,
-      "requires": {
-        "prr": "~1.0.1"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "es6-shim": {
-      "version": "0.35.5",
-      "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.5.tgz",
-      "integrity": "sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg=="
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
-    },
-    "eslint-scope": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
-      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
-      "dev": true,
-      "requires": {
-        "esrecurse": "^4.1.0",
-        "estraverse": "^4.1.1"
-      }
-    },
-    "esprima": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz",
-      "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k="
-    },
-    "esrecurse": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^4.1.0"
-      }
-    },
-    "estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true
-    },
-    "events": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
-      "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
-      "dev": true
-    },
-    "evp_bytestokey": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
-      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
-      "dev": true,
-      "requires": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "expand-tilde": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
-      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1"
-      }
-    },
-    "expose-loader": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.5.tgz",
-      "integrity": "sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==",
-      "dev": true
-    },
-    "extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
-    },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
-      "requires": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "extract-text-webpack-plugin": {
-      "version": "4.0.0-beta.0",
-      "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz",
-      "integrity": "sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==",
-      "dev": true,
-      "requires": {
-        "async": "^2.4.1",
-        "loader-utils": "^1.1.0",
-        "schema-utils": "^0.4.5",
-        "webpack-sources": "^1.1.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "6.6.0",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.0.tgz",
-          "integrity": "sha512-ZCIMdm75ps9usdeb0GQL9rKOUlTtS0p0vU2nQVXgRIu6Yb00G9GY7AvbVLwTQ5Po4JDKIwJlT5nwggoRDrDVAw==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^2.0.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "ajv-keywords": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
-          "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
-          "dev": true
-        },
-        "async": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
-          "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.17.10"
-          }
-        },
-        "big.js": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
-          "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
-          "dev": true
-        },
-        "emojis-list": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-          "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
-          "dev": true
-        },
-        "fast-deep-equal": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-          "dev": true
-        },
-        "fast-json-stable-stringify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-          "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-          "dev": true
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-          "dev": true
-        },
-        "json5": {
-          "version": "0.5.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
-          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
-          "dev": true
-        },
-        "loader-utils": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
-          "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
-          "dev": true,
-          "requires": {
-            "big.js": "^3.1.3",
-            "emojis-list": "^2.0.0",
-            "json5": "^0.5.0"
-          }
-        },
-        "lodash": {
-          "version": "4.17.19",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
-          "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
-          "dev": true
-        },
-        "punycode": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-          "dev": true
-        },
-        "schema-utils": {
-          "version": "0.4.7",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
-          "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.1.0",
-            "ajv-keywords": "^3.1.0"
-          }
-        },
-        "source-list-map": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
-          "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        },
-        "uri-js": {
-          "version": "4.2.2",
-          "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-          "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-          "dev": true,
-          "requires": {
-            "punycode": "^2.1.0"
-          }
-        },
-        "webpack-sources": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
-          "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
-          "dev": true,
-          "requires": {
-            "source-list-map": "^2.0.0",
-            "source-map": "~0.6.1"
-          }
-        }
-      }
-    },
-    "extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-      "dev": true
-    },
-    "fast-deep-equal": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-      "dev": true
-    },
-    "fast-glob": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
-      "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.0",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.2",
-        "picomatch": "^2.2.1"
-      },
-      "dependencies": {
-        "braces": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-          "dev": true,
-          "requires": {
-            "fill-range": "^7.0.1"
-          }
-        },
-        "fill-range": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-          "dev": true,
-          "requires": {
-            "to-regex-range": "^5.0.1"
-          }
-        },
-        "glob-parent": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-          "dev": true
-        },
-        "micromatch": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
-          "dev": true,
-          "requires": {
-            "braces": "^3.0.1",
-            "picomatch": "^2.0.5"
-          }
-        },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-          "dev": true,
-          "requires": {
-            "is-number": "^7.0.0"
-          }
-        }
-      }
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-      "dev": true
-    },
-    "fastq": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
-      "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
-      "dev": true,
-      "requires": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "figgy-pudding": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
-      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
-      "dev": true
-    },
-    "fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "find-cache-dir": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
-      "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
-      "dev": true,
-      "requires": {
-        "commondir": "^1.0.1",
-        "make-dir": "^2.0.0",
-        "pkg-dir": "^3.0.0"
-      }
-    },
-    "find-up": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-      "dev": true,
-      "requires": {
-        "locate-path": "^3.0.0"
-      }
-    },
-    "findup-sync": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
-      "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
-      "dev": true,
-      "requires": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "micromatch": "^3.0.4",
-        "resolve-dir": "^1.0.1"
-      }
-    },
-    "flush-write-stream": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
-      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.3.6"
-      }
-    },
-    "font-awesome": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
-      "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true
-    },
-    "forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true
-    },
-    "form-data": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "dev": true,
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
-        "mime-types": "^2.1.12"
-      }
-    },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
-    "from2": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
-      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0"
-      }
-    },
-    "fs-minipass": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "fs-write-stream-atomic": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
-      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "iferr": "^0.1.5",
-        "imurmurhash": "^0.1.4",
-        "readable-stream": "1 || 2"
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
-      "dev": true,
-      "optional": true
-    },
-    "fstream": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
-      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "inherits": "~2.0.0",
-        "mkdirp": ">=0.5 0",
-        "rimraf": "2"
-      }
-    },
-    "gauge": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.0.3",
-        "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.0",
-        "object-assign": "^4.1.0",
-        "signal-exit": "^3.0.0",
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wide-align": "^1.1.0"
-      }
-    },
-    "gaze": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
-      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
-      "dev": true,
-      "requires": {
-        "globule": "^1.0.0"
-      }
-    },
-    "get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true
-    },
-    "get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
-      "dev": true
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
-    },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      },
-      "dependencies": {
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
-      }
-    },
-    "global-modules": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
-      "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
-      "dev": true,
-      "requires": {
-        "global-prefix": "^3.0.0"
-      },
-      "dependencies": {
-        "global-prefix": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
-          "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
-          "dev": true,
-          "requires": {
-            "ini": "^1.3.5",
-            "kind-of": "^6.0.2",
-            "which": "^1.3.1"
-          }
-        }
-      }
-    },
-    "global-prefix": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
-      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      }
-    },
-    "globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true
-    },
-    "globby": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
-      "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
-      "dev": true,
-      "requires": {
-        "array-union": "^2.1.0",
-        "dir-glob": "^3.0.1",
-        "fast-glob": "^3.1.1",
-        "ignore": "^5.1.4",
-        "merge2": "^1.3.0",
-        "slash": "^3.0.0"
-      }
-    },
-    "globule": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz",
-      "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==",
-      "dev": true,
-      "requires": {
-        "glob": "~7.1.1",
-        "lodash": "~4.17.10",
-        "minimatch": "~3.0.2"
-      }
-    },
-    "good-listener": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
-      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
-      "requires": {
-        "delegate": "^3.1.2"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
-      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
-      "dev": true
-    },
-    "har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-      "dev": true
-    },
-    "har-validator": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
-      "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.5.5",
-        "har-schema": "^2.0.0"
-      }
-    },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
-    },
-    "has-unicode": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
-      "dev": true
-    },
-    "has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
-      "requires": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "hash-base": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
-      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.6.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-          "dev": true
-        }
-      }
-    },
-    "hash.js": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
-      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.1"
-      }
-    },
-    "highlight.js": {
-      "version": "9.18.3",
-      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.3.tgz",
-      "integrity": "sha512-zBZAmhSupHIl5sITeMqIJnYCDfAEc3Gdkqj65wC1lpI468MMQeeQkhcIAvk+RylAkxrCcI9xy9piHiXeQ1BdzQ=="
-    },
-    "hmac-drbg": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
-      "dev": true,
-      "requires": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "homedir-polyfill": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
-      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
-      "dev": true,
-      "requires": {
-        "parse-passwd": "^1.0.0"
-      }
-    },
-    "hosted-git-info": {
-      "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-      "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
-      "dev": true
-    },
-    "http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      }
-    },
-    "https-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
-      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
-      "dev": true
-    },
-    "humanize": {
-      "version": "0.0.9",
-      "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz",
-      "integrity": "sha1-GZT/rs3+nEQe0r2sdFK3u0yeQaQ="
-    },
-    "icss-utils": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
-      "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.14"
-      }
-    },
-    "ieee754": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
-      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
-      "dev": true
-    },
-    "iferr": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
-      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
-      "dev": true
-    },
-    "ignore": {
-      "version": "5.1.8",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
-      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
-      "dev": true
-    },
-    "import-local": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
-      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
-      "dev": true,
-      "requires": {
-        "pkg-dir": "^3.0.0",
-        "resolve-cwd": "^2.0.0"
-      }
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
-    "in-publish": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz",
-      "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==",
-      "dev": true
-    },
-    "indent-string": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
-      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
-      "dev": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
-    "indexes-of": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
-      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
-      "dev": true
-    },
-    "infer-owner": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
-      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
-      "dev": true
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
-    },
-    "ini": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
-      "dev": true
-    },
-    "interpret": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
-      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
-      "dev": true
-    },
-    "is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
-    },
-    "is-binary-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "binary-extensions": "^2.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
-    },
-    "is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "requires": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
-    },
-    "is-finite": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
-      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
-      "dev": true
-    },
-    "is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
-    },
-    "is-glob": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
-      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
-      "dev": true
-    },
-    "is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true
-    },
-    "is-wsl": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
-      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
-      "dev": true
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
-    },
-    "isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-      "dev": true
-    },
-    "jquery": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz",
-      "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg=="
-    },
-    "jquery-ui": {
-      "version": "1.12.1",
-      "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz",
-      "integrity": "sha1-vLQEXI3QU5wTS8FIjN0+dop6nlE="
-    },
-    "js-base64": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.3.tgz",
-      "integrity": "sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg==",
-      "dev": true
-    },
-    "js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
-    },
-    "jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-      "dev": true
-    },
-    "jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true
-    },
-    "json-parse-better-errors": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
-      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
-      "dev": true
-    },
-    "json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "dev": true
-    },
-    "json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
-    },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "dev": true
-    },
-    "json5": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.0"
-      }
-    },
-    "jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
-        "verror": "1.10.0"
-      }
-    },
-    "kind-of": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true
-    },
-    "load-json-file": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
-      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "loader-runner": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
-      "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
-      "dev": true
-    },
-    "loader-utils": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-      "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
-      "dev": true,
-      "requires": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^2.0.0",
-        "json5": "^1.0.1"
-      }
-    },
-    "locate-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-      "dev": true,
-      "requires": {
-        "p-locate": "^3.0.0",
-        "path-exists": "^3.0.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.20",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
-    },
-    "loud-rejection": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
-      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
-      "dev": true,
-      "requires": {
-        "currently-unhandled": "^0.4.1",
-        "signal-exit": "^3.0.0"
-      }
-    },
-    "lru-cache": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-      "dev": true,
-      "requires": {
-        "yallist": "^3.0.2"
-      }
-    },
-    "make-dir": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
-      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
-      "dev": true,
-      "requires": {
-        "pify": "^4.0.1",
-        "semver": "^5.6.0"
-      }
-    },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true
-    },
-    "map-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
-      "dev": true
-    },
-    "map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
-      "requires": {
-        "object-visit": "^1.0.0"
-      }
-    },
-    "md5.js": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
-      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
-      "dev": true,
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "memory-fs": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
-      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
-      "dev": true,
-      "requires": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "meow": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
-      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
-      "dev": true,
-      "requires": {
-        "camelcase-keys": "^2.0.0",
-        "decamelize": "^1.1.2",
-        "loud-rejection": "^1.0.0",
-        "map-obj": "^1.0.1",
-        "minimist": "^1.1.3",
-        "normalize-package-data": "^2.3.4",
-        "object-assign": "^4.0.1",
-        "read-pkg-up": "^1.0.1",
-        "redent": "^1.0.0",
-        "trim-newlines": "^1.0.0"
-      }
-    },
-    "merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true
-    },
-    "micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      }
-    },
-    "microplugin": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/microplugin/-/microplugin-0.0.3.tgz",
-      "integrity": "sha1-H8Lhu3yeGegr2Eu6kTe75xJQ2M0="
-    },
-    "miller-rabin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
-      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
-    "mime-db": {
-      "version": "1.44.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
-      "dev": true
-    },
-    "mime-types": {
-      "version": "2.1.27",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
-      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
-      "dev": true,
-      "requires": {
-        "mime-db": "1.44.0"
-      }
-    },
-    "minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
-      "dev": true
-    },
-    "minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
-    },
-    "minipass": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
-      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
-      "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      },
-      "dependencies": {
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
-        }
-      }
-    },
-    "minipass-collect": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
-      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-flush": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
-      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-pipeline": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
-      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minizlib": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz",
-      "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0",
-        "yallist": "^4.0.0"
-      },
-      "dependencies": {
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
-        }
-      }
-    },
-    "mississippi": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
-      "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
-      "dev": true,
-      "requires": {
-        "concat-stream": "^1.5.0",
-        "duplexify": "^3.4.2",
-        "end-of-stream": "^1.1.0",
-        "flush-write-stream": "^1.0.0",
-        "from2": "^2.1.0",
-        "parallel-transform": "^1.1.0",
-        "pump": "^3.0.0",
-        "pumpify": "^1.3.3",
-        "stream-each": "^1.1.0",
-        "through2": "^2.0.0"
-      }
-    },
-    "mixin-deep": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
-      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.5"
-      }
-    },
-    "move-concurrently": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
-      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1",
-        "copy-concurrently": "^1.0.0",
-        "fs-write-stream-atomic": "^1.0.8",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.3"
-      }
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "nan": {
-      "version": "2.14.0",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
-      "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
-      "dev": true
-    },
-    "nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      }
-    },
-    "neo-async": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
-      "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
-      "dev": true
-    },
-    "nice-try": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true
-    },
-    "node-gyp": {
-      "version": "3.8.0",
-      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
-      "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
-      "dev": true,
-      "requires": {
-        "fstream": "^1.0.0",
-        "glob": "^7.0.3",
-        "graceful-fs": "^4.1.2",
-        "mkdirp": "^0.5.0",
-        "nopt": "2 || 3",
-        "npmlog": "0 || 1 || 2 || 3 || 4",
-        "osenv": "0",
-        "request": "^2.87.0",
-        "rimraf": "2",
-        "semver": "~5.3.0",
-        "tar": "^2.0.0",
-        "which": "1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
-          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
-          "dev": true
-        }
-      }
-    },
-    "node-libs-browser": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
-      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
-      "dev": true,
-      "requires": {
-        "assert": "^1.1.1",
-        "browserify-zlib": "^0.2.0",
-        "buffer": "^4.3.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "^1.0.0",
-        "crypto-browserify": "^3.11.0",
-        "domain-browser": "^1.1.1",
-        "events": "^3.0.0",
-        "https-browserify": "^1.0.0",
-        "os-browserify": "^0.3.0",
-        "path-browserify": "0.0.1",
-        "process": "^0.11.10",
-        "punycode": "^1.2.4",
-        "querystring-es3": "^0.2.0",
-        "readable-stream": "^2.3.3",
-        "stream-browserify": "^2.0.1",
-        "stream-http": "^2.7.2",
-        "string_decoder": "^1.0.0",
-        "timers-browserify": "^2.0.4",
-        "tty-browserify": "0.0.0",
-        "url": "^0.11.0",
-        "util": "^0.11.0",
-        "vm-browserify": "^1.0.1"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
-        }
-      }
-    },
-    "node-sass": {
-      "version": "4.14.1",
-      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz",
-      "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
-      "dev": true,
-      "requires": {
-        "async-foreach": "^0.1.3",
-        "chalk": "^1.1.1",
-        "cross-spawn": "^3.0.0",
-        "gaze": "^1.0.0",
-        "get-stdin": "^4.0.1",
-        "glob": "^7.0.3",
-        "in-publish": "^2.0.0",
-        "lodash": "^4.17.15",
-        "meow": "^3.7.0",
-        "mkdirp": "^0.5.1",
-        "nan": "^2.13.2",
-        "node-gyp": "^3.8.0",
-        "npmlog": "^4.0.0",
-        "request": "^2.88.0",
-        "sass-graph": "2.2.5",
-        "stdout-stream": "^1.4.0",
-        "true-case-path": "^1.0.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
-        }
-      }
-    },
-    "nopt": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
-      "dev": true,
-      "requires": {
-        "abbrev": "1"
-      }
-    },
-    "normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true
-    },
-    "npmlog": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
-      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
-      "dev": true,
-      "requires": {
-        "are-we-there-yet": "~1.1.2",
-        "console-control-strings": "~1.1.0",
-        "gauge": "~2.7.3",
-        "set-blocking": "~2.0.0"
-      }
-    },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-      "dev": true
-    },
-    "oauth-sign": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "dev": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
-    },
-    "object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
-      "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "optimist": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
-      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
-      "requires": {
-        "minimist": "~0.0.1",
-        "wordwrap": "~0.0.2"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "0.0.10",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
-          "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
-        }
-      }
-    },
-    "os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
-      "dev": true
-    },
-    "os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-      "dev": true
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
-    },
-    "osenv": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
-      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-      "dev": true,
-      "requires": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
-      }
-    },
-    "p-limit": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
-      "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
-      "dev": true,
-      "requires": {
-        "p-try": "^2.0.0"
-      }
-    },
-    "p-locate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-      "dev": true,
-      "requires": {
-        "p-limit": "^2.0.0"
-      }
-    },
-    "p-map": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-      "dev": true,
-      "requires": {
-        "aggregate-error": "^3.0.0"
-      }
-    },
-    "p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true
-    },
-    "pako": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
-      "dev": true
-    },
-    "parallel-transform": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
-      "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
-      "dev": true,
-      "requires": {
-        "cyclist": "^1.0.1",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.1.5"
-      }
-    },
-    "parse-asn1": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
-      "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
-      "dev": true,
-      "requires": {
-        "asn1.js": "^4.0.0",
-        "browserify-aes": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-      "dev": true,
-      "requires": {
-        "error-ex": "^1.2.0"
-      }
-    },
-    "parse-passwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
-      "dev": true
-    },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true
-    },
-    "path-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
-      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
-      "dev": true
-    },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true,
-      "optional": true
-    },
-    "path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
-    },
-    "path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+    "gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
       "dev": true
     },
-    "path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+    "get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
       "dev": true
     },
-    "pbkdf2": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
-      "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+    "glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
       "dev": true,
       "requires": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
+        "is-glob": "^4.0.3"
       }
     },
-    "performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
-    },
-    "picomatch": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true
-    },
-    "pify": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-      "dev": true
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+    "glob-to-regexp": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
       "dev": true
     },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "pkg-dir": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
-      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
-      "dev": true,
-      "requires": {
-        "find-up": "^3.0.0"
-      }
-    },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+    "globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
       "dev": true
     },
-    "postcss": {
-      "version": "7.0.24",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.24.tgz",
-      "integrity": "sha512-Xl0XvdNWg+CblAXzNvbSOUvgJXwSjmbAKORqyw9V2AlHrm1js2gFw9y3jibBAhpKZi8b5JzJCVh/FyzPsTtgTA==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      }
-    },
-    "postcss-modules-extract-imports": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
-      "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.5"
-      }
-    },
-    "postcss-modules-local-by-default": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz",
-      "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==",
-      "dev": true,
-      "requires": {
-        "icss-utils": "^4.1.1",
-        "postcss": "^7.0.16",
-        "postcss-selector-parser": "^6.0.2",
-        "postcss-value-parser": "^4.0.0"
-      }
-    },
-    "postcss-modules-scope": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz",
-      "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.6",
-        "postcss-selector-parser": "^6.0.0"
-      }
-    },
-    "postcss-modules-values": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
-      "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
+    "globby": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
       "dev": true,
       "requires": {
-        "icss-utils": "^4.0.0",
-        "postcss": "^7.0.6"
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.2.9",
+        "ignore": "^5.2.0",
+        "merge2": "^1.4.1",
+        "slash": "^3.0.0"
       }
     },
-    "postcss-selector-parser": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
-      "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
-      "dev": true,
+    "good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
       "requires": {
-        "cssesc": "^3.0.0",
-        "indexes-of": "^1.0.1",
-        "uniq": "^1.0.1"
+        "delegate": "^3.1.2"
       }
     },
-    "postcss-value-parser": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz",
-      "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==",
-      "dev": true
-    },
-    "process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
-      "dev": true
-    },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
-    },
-    "promise-inflight": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
-      "dev": true
-    },
-    "prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
-      "dev": true
-    },
-    "pseudomap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
-      "dev": true
-    },
-    "psl": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+    "graceful-fs": {
+      "version": "4.2.10",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
       "dev": true
     },
-    "public-encrypt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
-      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
       "dev": true,
       "requires": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
+        "function-bind": "^1.1.1"
       }
     },
-    "pump": {
+    "has-flag": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "pumpify": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
-      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
-      "dev": true,
-      "requires": {
-        "duplexify": "^3.6.0",
-        "inherits": "^2.0.3",
-        "pump": "^2.0.0"
-      },
-      "dependencies": {
-        "pump": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
-          "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.1.0",
-            "once": "^1.3.1"
-          }
-        }
-      }
-    },
-    "punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
-    },
-    "purecss": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/purecss/-/purecss-1.0.1.tgz",
-      "integrity": "sha512-mTUc5ZzpzafswEhCmTDfSRMMyRFdLYdd+KywMwnBC/MuA/Th7jug2z0Xso4WkxvtxoU/BS9aRb7WnBNyuA7YJQ=="
-    },
-    "qs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-      "dev": true
-    },
-    "querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
       "dev": true
     },
-    "querystring-es3": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
-      "dev": true
+    "highlight.js": {
+      "version": "10.7.3",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+      "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="
     },
-    "randombytes": {
+    "human-signals": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "randomfill": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
-      "dev": true,
-      "requires": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "read-pkg": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
-      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
-      "dev": true,
-      "requires": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
-      },
-      "dependencies": {
-        "path-type": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
-          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "read-pkg-up": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
-      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
-      "dev": true,
-      "requires": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
-          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
-          "dev": true,
-          "requires": {
-            "path-exists": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "path-exists": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
-          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
-          "dev": true,
-          "requires": {
-            "pinkie-promise": "^2.0.0"
-          }
-        }
-      }
-    },
-    "readable-stream": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-      "dev": true,
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "readdirp": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
-      "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "picomatch": "^2.2.1"
-      }
-    },
-    "redent": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
-      "dev": true,
-      "requires": {
-        "indent-string": "^2.1.0",
-        "strip-indent": "^1.0.1"
-      }
-    },
-    "redeyed": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz",
-      "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=",
-      "requires": {
-        "esprima": "~3.0.0"
-      }
-    },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true,
-      "optional": true
-    },
-    "repeat-element": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
-      "dev": true
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
       "dev": true
     },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "dev": true,
-      "requires": {
-        "is-finite": "^1.0.0"
-      }
-    },
-    "request": {
-      "version": "2.88.2",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
-      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
-      "dev": true,
+    "hyperquest": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/hyperquest/-/hyperquest-2.1.3.tgz",
+      "integrity": "sha512-fUuDOrB47PqNK/BAMOS13v41UoaqIxqSLHX6CAbOD7OfT+/GCWO1/vPLfTNutOeXrv1ikuaZ3yux+33Z9vh+rw==",
       "requires": {
-        "aws-sign2": "~0.7.0",
-        "aws4": "^1.8.0",
-        "caseless": "~0.12.0",
-        "combined-stream": "~1.0.6",
-        "extend": "~3.0.2",
-        "forever-agent": "~0.6.1",
-        "form-data": "~2.3.2",
-        "har-validator": "~5.1.3",
-        "http-signature": "~1.2.0",
-        "is-typedarray": "~1.0.0",
-        "isstream": "~0.1.2",
-        "json-stringify-safe": "~5.0.1",
-        "mime-types": "~2.1.19",
-        "oauth-sign": "~0.9.0",
-        "performance-now": "^2.1.0",
-        "qs": "~6.5.2",
-        "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.5.0",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^3.3.2"
+        "buffer-from": "^0.1.1",
+        "duplexer2": "~0.0.2",
+        "through2": "~0.6.3"
       }
     },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+    "icss-utils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+      "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
       "dev": true
     },
-    "require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+    "ignore": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
       "dev": true
     },
-    "reset-css": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/reset-css/-/reset-css-5.0.1.tgz",
-      "integrity": "sha512-VyuJdNFfp5x/W6e5wauJM59C02Vs0P22sxzZGhQMPaqu/NGTeFxlBFOOw3eq9vQd19gIDdZp7zi89ylyKOJ33Q=="
-    },
-    "resolve": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
-      "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
-      "dev": true,
-      "requires": {
-        "path-parse": "^1.0.6"
-      }
-    },
-    "resolve-cwd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
-      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
-      "dev": true,
-      "requires": {
-        "resolve-from": "^3.0.0"
-      }
-    },
-    "resolve-dir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
-      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      },
-      "dependencies": {
-        "global-modules": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
-          "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
-          "dev": true,
-          "requires": {
-            "global-prefix": "^1.0.1",
-            "is-windows": "^1.0.1",
-            "resolve-dir": "^1.0.0"
-          }
-        }
-      }
-    },
-    "resolve-from": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+    "immutable": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz",
+      "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==",
       "dev": true
     },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "dev": true
+    "import-local": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      }
     },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
-    "reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+    "interpret": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+      "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
       "dev": true
     },
-    "rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+    "is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
       "requires": {
-        "glob": "^7.1.3"
+        "binary-extensions": "^2.0.0"
       }
     },
-    "ripemd160": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
-      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+    "is-core-module": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+      "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
       "dev": true,
       "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
+        "has": "^1.0.3"
       }
     },
-    "run-parallel": {
-      "version": "1.1.9",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
-      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
       "dev": true
     },
-    "run-queue": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
-      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+    "is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "dev": true,
       "requires": {
-        "aproba": "^1.1.1"
+        "is-extglob": "^2.1.1"
       }
     },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true
     },
-    "safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
       "requires": {
-        "ret": "~0.1.10"
+        "isobject": "^3.0.1"
       }
     },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+    "is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
       "dev": true
     },
-    "sass-graph": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
-      "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
-      "dev": true,
-      "requires": {
-        "glob": "^7.0.0",
-        "lodash": "^4.0.0",
-        "scss-tokenizer": "^0.2.3",
-        "yargs": "^13.3.2"
-      }
+    "isarray": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+      "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
     },
-    "sass-loader": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz",
-      "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==",
-      "dev": true,
-      "requires": {
-        "clone-deep": "^4.0.1",
-        "loader-utils": "^1.0.1",
-        "neo-async": "^2.5.0",
-        "pify": "^4.0.1",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
     },
-    "schema-utils": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
-      "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "jest-worker": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
       "dev": true,
       "requires": {
-        "@types/json-schema": "^7.0.4",
-        "ajv": "^6.12.2",
-        "ajv-keywords": "^3.4.1"
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
       },
       "dependencies": {
-        "ajv": {
-          "version": "6.12.3",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
-          "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
           "dev": true,
           "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
+            "has-flag": "^4.0.0"
           }
-        },
-        "fast-deep-equal": {
-          "version": "3.1.3",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-          "dev": true
         }
       }
     },
-    "scss-tokenizer": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
-      "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+    "jquery": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
+      "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "dev": true
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+    },
+    "json5": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
       "dev": true,
       "requires": {
-        "js-base64": "^2.1.8",
-        "source-map": "^0.4.2"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
-          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
-          "dev": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        }
+        "minimist": "^1.2.5"
       }
     },
-    "select": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
-      "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
-    },
-    "selectize": {
-      "version": "0.12.6",
-      "resolved": "https://registry.npmjs.org/selectize/-/selectize-0.12.6.tgz",
-      "integrity": "sha512-bWO5A7G+I8+QXyjLfQUgh31VI4WKYagUZQxAXlDyUmDDNrFxrASV0W9hxCOl0XJ/XQ1dZEu3G9HjXV4Wj0yb6w==",
+    "jsonist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/jsonist/-/jsonist-2.1.2.tgz",
+      "integrity": "sha512-8yqmWJAC2VaYoSKQAbsfgCpGY5o/1etWzx6ZxaZrC4iGaHrHUZEo+a2MyF8w+2uTavTlHdLWaZUoR19UfBstxQ==",
       "requires": {
-        "microplugin": "0.0.3",
-        "sifter": "^0.5.1"
+        "bl": "~3.0.0",
+        "hyperquest": "~2.1.3",
+        "json-stringify-safe": "~5.0.1",
+        "xtend": "~4.0.1"
       }
     },
-    "semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true
     },
-    "serialize-javascript": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
-      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
-      "dev": true,
-      "requires": {
-        "randombytes": "^2.1.0"
-      }
+    "klona": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz",
+      "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==",
+      "dev": true
     },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+    "loader-runner": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
       "dev": true
     },
-    "set-value": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+    "loader-utils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+      "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
       "dev": true,
       "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
       }
     },
-    "setimmediate": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
-      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
-      "dev": true
-    },
-    "sha.js": {
-      "version": "2.4.11",
-      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
-      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "dev": true,
       "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
+        "p-locate": "^4.1.0"
       }
     },
-    "shallow-clone": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
-      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
-      "dev": true,
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+      "dev": true
+    },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
       "requires": {
-        "kind-of": "^6.0.2"
+        "yallist": "^4.0.0"
       }
     },
-    "shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+    "make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
       "dev": true,
       "requires": {
-        "shebang-regex": "^1.0.0"
+        "semver": "^6.0.0"
       }
     },
-    "shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
       "dev": true
     },
-    "sifter": {
-      "version": "0.5.4",
-      "resolved": "https://registry.npmjs.org/sifter/-/sifter-0.5.4.tgz",
-      "integrity": "sha512-t2yxTi/MM/ESup7XH5oMu8PUcttlekt269RqxARgnvS+7D/oP6RyA1x3M/5w8dG9OgkOyQ8hNRWelQ8Rj4TAQQ==",
+    "micromatch": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+      "dev": true,
       "requires": {
-        "async": "^2.6.0",
-        "cardinal": "^1.0.0",
-        "csv-parse": "^4.6.5",
-        "humanize": "^0.0.9",
-        "optimist": "^0.6.1"
+        "braces": "^3.0.1",
+        "picomatch": "^2.2.3"
       }
     },
-    "signal-exit": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
-      "dev": true
-    },
-    "slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+    "mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
       "dev": true
     },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+    "mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
       "dev": true,
       "requires": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
+        "mime-db": "1.52.0"
       }
     },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+    "mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true
+    },
+    "mini-css-extract-plugin": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz",
+      "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==",
       "dev": true,
       "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0",
+        "webpack-sources": "^1.1.0"
       },
       "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+        "loader-utils": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
           "dev": true,
           "requires": {
-            "kind-of": "^6.0.0"
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
           }
         },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+        "schema-utils": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
           "dev": true,
           "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
+            "@types/json-schema": "^7.0.8",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
           }
         }
       }
     },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
+    "minimist": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+      "dev": true
+    },
+    "minimum-node-version": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/minimum-node-version/-/minimum-node-version-3.0.0.tgz",
+      "integrity": "sha512-XFcX466e9NjEbx2lVyYDaRtWTkB6hPEizIRWkF2D0G80mWYM/YVW+PUibsFjuvnpNYlpKzjdupFXJHEsK3w8Jg==",
       "requires": {
-        "kind-of": "^3.2.0"
+        "engine-check": "^1.0.1",
+        "esm": "^3.2.25",
+        "expected-node-version": "^1.0.2",
+        "node-version-data": "^1.0.1",
+        "pify": "^5.0.0",
+        "semver": "^7.3.4"
       },
       "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
+        "semver": {
+          "version": "7.3.7",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
           "requires": {
-            "is-buffer": "^1.1.5"
+            "lru-cache": "^6.0.0"
           }
         }
       }
     },
-    "source-list-map": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
-      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
-      "dev": true
-    },
-    "source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true
-    },
-    "source-map-resolve": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-      "dev": true,
-      "requires": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "source-map-support": {
-      "version": "0.5.19",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
-      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
     },
-    "source-map-url": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+    "nanoid": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
+      "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
       "dev": true
     },
-    "spdx-correct": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
-      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
-      "dev": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
     },
-    "spdx-exceptions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+    "node-releases": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz",
+      "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==",
       "dev": true
     },
-    "spdx-expression-parse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-      "dev": true,
+    "node-version-data": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/node-version-data/-/node-version-data-1.1.0.tgz",
+      "integrity": "sha512-/uQsoJ6Q5JvReqSlHaWazlVdtJYm/1VXk2eaIvN1Z0C7gD8RGirlIdWvNs3OqgmltkM1toV+9R+drhV4fqifJw==",
       "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
+        "after": "~0.8.2",
+        "jsonist": "~2.1.2",
+        "semver": "~6.3.0"
       }
     },
-    "spdx-license-ids": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
-      "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
       "dev": true
     },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+    "npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
       "dev": true,
       "requires": {
-        "extend-shallow": "^3.0.0"
+        "path-key": "^3.0.0"
       }
     },
-    "sshpk": {
-      "version": "1.16.1",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
-      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+    "onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
       "dev": true,
       "requires": {
-        "asn1": "~0.2.3",
-        "assert-plus": "^1.0.0",
-        "bcrypt-pbkdf": "^1.0.0",
-        "dashdash": "^1.12.0",
-        "ecc-jsbn": "~0.1.1",
-        "getpass": "^0.1.1",
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.0.2",
-        "tweetnacl": "~0.14.0"
+        "mimic-fn": "^2.1.0"
       }
     },
-    "ssri": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
-      "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "dev": true,
       "requires": {
-        "figgy-pudding": "^3.5.1"
+        "p-try": "^2.0.0"
       }
     },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
       "dev": true,
       "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
+        "p-limit": "^2.2.0"
       }
     },
-    "stdout-stream": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
-      "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.1"
-      }
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true
     },
-    "stream-browserify": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
-      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
-      "dev": true,
-      "requires": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      }
+    "path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true
     },
-    "stream-each": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
-      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "stream-shift": "^1.0.0"
-      }
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true
     },
-    "stream-http": {
-      "version": "2.8.3",
-      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
-      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
-      "dev": true,
-      "requires": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.3.6",
-        "to-arraybuffer": "^1.0.0",
-        "xtend": "^4.0.0"
-      }
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
     },
-    "stream-shift": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
-      "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+    "path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
       "dev": true
     },
-    "string-width": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-      "dev": true,
-      "requires": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      }
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+      "dev": true
     },
-    "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true
+    },
+    "pify": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
+      "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA=="
+    },
+    "pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
       "dev": true,
       "requires": {
-        "safe-buffer": "~5.1.0"
+        "find-up": "^4.0.0"
       }
     },
-    "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+    "postcss": {
+      "version": "8.4.5",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
+      "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
       "dev": true,
       "requires": {
-        "ansi-regex": "^2.0.0"
+        "nanoid": "^3.1.30",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.1"
       }
     },
-    "strip-bom": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+    "postcss-modules-extract-imports": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+      "dev": true
+    },
+    "postcss-modules-local-by-default": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+      "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
       "dev": true,
       "requires": {
-        "is-utf8": "^0.2.0"
+        "icss-utils": "^5.0.0",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
       }
     },
-    "strip-indent": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
-      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+    "postcss-modules-scope": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+      "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
       "dev": true,
       "requires": {
-        "get-stdin": "^4.0.1"
+        "postcss-selector-parser": "^6.0.4"
       }
     },
-    "style-loader": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
-      "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
+    "postcss-modules-values": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
       "dev": true,
       "requires": {
-        "loader-utils": "^1.1.0",
-        "schema-utils": "^1.0.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "6.5.5",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz",
-          "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^2.0.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "ajv-errors": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz",
-          "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=",
-          "dev": true
-        },
-        "ajv-keywords": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
-          "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
-          "dev": true
-        },
-        "big.js": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
-          "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
-          "dev": true
-        },
-        "emojis-list": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-          "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
-          "dev": true
-        },
-        "fast-deep-equal": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-          "dev": true
-        },
-        "fast-json-stable-stringify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-          "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-          "dev": true
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-          "dev": true
-        },
-        "json5": {
-          "version": "0.5.1",
-          "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
-          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
-          "dev": true
-        },
-        "loader-utils": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
-          "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
-          "dev": true,
-          "requires": {
-            "big.js": "^3.1.3",
-            "emojis-list": "^2.0.0",
-            "json5": "^0.5.0"
-          }
-        },
-        "punycode": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-          "dev": true
-        },
-        "schema-utils": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.1.0",
-            "ajv-errors": "^1.0.0",
-            "ajv-keywords": "^3.1.0"
-          }
-        },
-        "uri-js": {
-          "version": "4.2.2",
-          "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-          "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-          "dev": true,
-          "requires": {
-            "punycode": "^2.1.0"
-          }
-        }
+        "icss-utils": "^5.0.0"
       }
     },
-    "supports-color": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+    "postcss-selector-parser": {
+      "version": "6.0.9",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz",
+      "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==",
       "dev": true,
       "requires": {
-        "has-flag": "^3.0.0"
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
       }
     },
-    "tapable": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
-      "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+    "postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+      "dev": true
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
       "dev": true
     },
-    "tar": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
-      "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+    "purecss": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/purecss/-/purecss-2.1.0.tgz",
+      "integrity": "sha512-QIgWhat8QkHTXdejFJNwZuw0pZ7Mj0MHILHNz8sV6HZBfbWtHpW3b1+Q1D6W/9x4chFhaq9u4+Uk8YbwELzsXg=="
+    },
+    "queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
       "dev": true,
       "requires": {
-        "block-stream": "*",
-        "fstream": "^1.0.12",
-        "inherits": "2"
+        "safe-buffer": "^5.1.0"
       }
     },
-    "terser": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
-      "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+    "readable-stream": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "requires": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dev": true,
       "requires": {
-        "commander": "^2.20.0",
-        "source-map": "~0.6.1",
-        "source-map-support": "~0.5.12"
+        "picomatch": "^2.2.1"
       }
     },
-    "terser-webpack-plugin": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz",
-      "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==",
+    "rechoir": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+      "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
       "dev": true,
       "requires": {
-        "cacache": "^12.0.2",
-        "find-cache-dir": "^2.1.0",
-        "is-wsl": "^1.1.0",
-        "schema-utils": "^1.0.0",
-        "serialize-javascript": "^3.1.0",
-        "source-map": "^0.6.1",
-        "terser": "^4.1.2",
-        "webpack-sources": "^1.4.0",
-        "worker-farm": "^1.7.0"
-      },
-      "dependencies": {
-        "schema-utils": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.1.0",
-            "ajv-errors": "^1.0.0",
-            "ajv-keywords": "^3.1.0"
-          }
-        },
-        "serialize-javascript": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
-          "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
-          "dev": true,
-          "requires": {
-            "randombytes": "^2.1.0"
-          }
-        }
+        "resolve": "^1.9.0"
       }
     },
-    "through2": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+    "reset-css": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/reset-css/-/reset-css-5.0.1.tgz",
+      "integrity": "sha512-VyuJdNFfp5x/W6e5wauJM59C02Vs0P22sxzZGhQMPaqu/NGTeFxlBFOOw3eq9vQd19gIDdZp7zi89ylyKOJ33Q=="
+    },
+    "resolve": {
+      "version": "1.22.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
       "dev": true,
       "requires": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
+        "is-core-module": "^2.8.1",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
       }
     },
-    "timers-browserify": {
-      "version": "2.0.11",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
-      "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
+    "resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
       "dev": true,
       "requires": {
-        "setimmediate": "^1.0.4"
+        "resolve-from": "^5.0.0"
       }
     },
-    "tiny-emitter": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
-      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    "resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "dev": true
     },
-    "to-arraybuffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
-      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
       "dev": true
     },
-    "to-fast-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+    "run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "requires": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
       "dev": true
     },
-    "to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+    "sass": {
+      "version": "1.51.0",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz",
+      "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==",
       "dev": true,
       "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
+        "chokidar": ">=3.0.0 <4.0.0",
+        "immutable": "^4.0.0",
+        "source-map-js": ">=0.6.2 <2.0.0"
       }
     },
-    "to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+    "sass-loader": {
+      "version": "12.6.0",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
+      "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
       "dev": true,
       "requires": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
+        "klona": "^2.0.4",
+        "neo-async": "^2.6.2"
       }
     },
-    "to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+    "schema-utils": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
       "dev": true,
       "requires": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
+        "@types/json-schema": "^7.0.5",
+        "ajv": "^6.12.4",
+        "ajv-keywords": "^3.5.2"
       }
     },
-    "tough-cookie": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+    "select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+      "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+    },
+    "semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+    },
+    "serialize-javascript": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
       "dev": true,
       "requires": {
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
+        "randombytes": "^2.1.0"
       }
     },
-    "trim-newlines": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
-      "dev": true
+    "shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.2"
+      }
     },
-    "true-case-path": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
-      "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
       "dev": true,
       "requires": {
-        "glob": "^7.1.2"
+        "shebang-regex": "^3.0.0"
       }
     },
-    "tslib": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-      "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
       "dev": true
     },
-    "tty-browserify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
-      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+    "signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
       "dev": true
     },
-    "tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
       "dev": true
     },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
       "dev": true
     },
-    "union-value": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
-      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^2.0.1"
-      }
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true
     },
-    "uniq": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
-      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+    "source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
       "dev": true
     },
-    "unique-filename": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
-      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+    "source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
       "dev": true,
       "requires": {
-        "unique-slug": "^2.0.0"
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "buffer-from": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+          "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+          "dev": true
+        }
       }
     },
-    "unique-slug": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
-      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
-      "dev": true,
+    "string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
       "requires": {
-        "imurmurhash": "^0.1.4"
+        "safe-buffer": "~5.2.0"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+        }
       }
     },
-    "unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "style-loader": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz",
+      "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==",
       "dev": true,
       "requires": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0"
       },
       "dependencies": {
-        "has-value": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+        "loader-utils": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
           "dev": true,
           "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
-          },
-          "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "dev": true,
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            }
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
           }
         },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-          "dev": true
+        "schema-utils": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.8",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
+          }
         }
       }
     },
-    "upath": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
-      "dev": true,
-      "optional": true
-    },
-    "uri-js": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
       "requires": {
-        "punycode": "^2.1.0"
+        "has-flag": "^3.0.0"
       }
     },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true
+    },
+    "tapable": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
       "dev": true
     },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+    "terser": {
+      "version": "5.13.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz",
+      "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==",
       "dev": true,
       "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
+        "acorn": "^8.5.0",
+        "commander": "^2.20.0",
+        "source-map": "~0.8.0-beta.0",
+        "source-map-support": "~0.5.20"
       },
       "dependencies": {
-        "punycode": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
-          "dev": true
+        "source-map": {
+          "version": "0.8.0-beta.0",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+          "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+          "dev": true,
+          "requires": {
+            "whatwg-url": "^7.0.0"
+          }
         }
       }
     },
-    "use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true
-    },
-    "util": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
-      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+    "terser-webpack-plugin": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz",
+      "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==",
       "dev": true,
       "requires": {
-        "inherits": "2.0.3"
+        "jest-worker": "^27.4.5",
+        "schema-utils": "^3.1.1",
+        "serialize-javascript": "^6.0.0",
+        "source-map": "^0.6.1",
+        "terser": "^5.7.2"
       },
       "dependencies": {
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-          "dev": true
+        "schema-utils": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.8",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
+          }
         }
       }
     },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
+    "through2": {
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+      "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
+      "requires": {
+        "readable-stream": ">=1.0.33-1 <1.1.0-0",
+        "xtend": ">=4.0.0 <4.1.0-0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+          "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "0.0.1",
+            "string_decoder": "~0.10.x"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+        }
+      }
     },
-    "uuid": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
-      "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
-      "dev": true
+    "tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
     },
-    "v8-compile-cache": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
-      "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+    "to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
       "dev": true
     },
-    "validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
       "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
+        "is-number": "^7.0.0"
       }
     },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+    "tr46": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+      "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
       "dev": true,
       "requires": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
+        "punycode": "^2.1.0"
       }
     },
-    "vm-browserify": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
-      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
-      "dev": true
-    },
-    "watchpack": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
-      "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
       "dev": true,
       "requires": {
-        "chokidar": "^3.4.1",
-        "graceful-fs": "^4.1.2",
-        "neo-async": "^2.5.0",
-        "watchpack-chokidar2": "^2.0.0"
+        "punycode": "^2.1.0"
       }
     },
-    "watchpack-chokidar2": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
-      "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "watchpack": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
+      "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "chokidar": "^2.1.8"
-      },
-      "dependencies": {
-        "anymatch": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          },
-          "dependencies": {
-            "normalize-path": {
-              "version": "2.1.1",
-              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
-          }
-        },
-        "binary-extensions": {
-          "version": "1.13.1",
-          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-          "dev": true,
-          "optional": true
-        },
-        "chokidar": {
-          "version": "2.1.8",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.1",
-            "braces": "^2.3.2",
-            "fsevents": "^1.2.7",
-            "glob-parent": "^3.1.0",
-            "inherits": "^2.0.3",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "normalize-path": "^3.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.2.1",
-            "upath": "^1.1.1"
-          }
-        },
-        "fsevents": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
-          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "nan": "^2.12.1"
-          }
-        },
-        "is-binary-path": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "binary-extensions": "^1.0.0"
-          }
-        },
-        "readdirp": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "graceful-fs": "^4.1.11",
-            "micromatch": "^3.1.10",
-            "readable-stream": "^2.0.2"
-          }
-        }
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.1.2"
       }
     },
+    "webidl-conversions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+      "dev": true
+    },
     "webpack": {
-      "version": "4.44.1",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz",
-      "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/wasm-edit": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0",
-        "acorn": "^6.4.1",
-        "ajv": "^6.10.2",
-        "ajv-keywords": "^3.4.1",
+      "version": "5.72.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz",
+      "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==",
+      "dev": true,
+      "requires": {
+        "@types/eslint-scope": "^3.7.3",
+        "@types/estree": "^0.0.51",
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/wasm-edit": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "acorn": "^8.4.1",
+        "acorn-import-assertions": "^1.7.6",
+        "browserslist": "^4.14.5",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^4.3.0",
-        "eslint-scope": "^4.0.3",
+        "enhanced-resolve": "^5.9.2",
+        "es-module-lexer": "^0.9.0",
+        "eslint-scope": "5.1.1",
+        "events": "^3.2.0",
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.2.9",
         "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^2.4.0",
-        "loader-utils": "^1.2.3",
-        "memory-fs": "^0.4.1",
-        "micromatch": "^3.1.10",
-        "mkdirp": "^0.5.3",
-        "neo-async": "^2.6.1",
-        "node-libs-browser": "^2.2.1",
-        "schema-utils": "^1.0.0",
-        "tapable": "^1.1.3",
-        "terser-webpack-plugin": "^1.4.3",
-        "watchpack": "^1.7.4",
-        "webpack-sources": "^1.4.1"
+        "loader-runner": "^4.2.0",
+        "mime-types": "^2.1.27",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^3.1.0",
+        "tapable": "^2.1.1",
+        "terser-webpack-plugin": "^5.1.3",
+        "watchpack": "^2.3.1",
+        "webpack-sources": "^3.2.3"
       },
       "dependencies": {
         "schema-utils": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
           "dev": true,
           "requires": {
-            "ajv": "^6.1.0",
-            "ajv-errors": "^1.0.0",
-            "ajv-keywords": "^3.1.0"
+            "@types/json-schema": "^7.0.8",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
           }
+        },
+        "webpack-sources": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+          "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+          "dev": true
         }
       }
     },
     "webpack-cli": {
-      "version": "3.3.12",
-      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz",
-      "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==",
+      "version": "4.9.2",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz",
+      "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==",
       "dev": true,
       "requires": {
-        "chalk": "^2.4.2",
-        "cross-spawn": "^6.0.5",
-        "enhanced-resolve": "^4.1.1",
-        "findup-sync": "^3.0.0",
-        "global-modules": "^2.0.0",
-        "import-local": "^2.0.0",
-        "interpret": "^1.4.0",
-        "loader-utils": "^1.4.0",
-        "supports-color": "^6.1.0",
-        "v8-compile-cache": "^2.1.1",
-        "yargs": "^13.3.2"
+        "@discoveryjs/json-ext": "^0.5.0",
+        "@webpack-cli/configtest": "^1.1.1",
+        "@webpack-cli/info": "^1.4.1",
+        "@webpack-cli/serve": "^1.6.1",
+        "colorette": "^2.0.14",
+        "commander": "^7.0.0",
+        "execa": "^5.0.0",
+        "fastest-levenshtein": "^1.0.12",
+        "import-local": "^3.0.2",
+        "interpret": "^2.2.0",
+        "rechoir": "^0.7.0",
+        "webpack-merge": "^5.7.3"
       },
       "dependencies": {
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          }
-        },
-        "emojis-list": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+        "commander": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+          "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
           "dev": true
-        },
-        "loader-utils": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
-          }
         }
       }
     },
+    "webpack-merge": {
+      "version": "5.8.0",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
+      "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
+      "dev": true,
+      "requires": {
+        "clone-deep": "^4.0.1",
+        "wildcard": "^2.0.0"
+      }
+    },
     "webpack-sources": {
       "version": "1.4.3",
       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
@@ -6001,176 +2325,51 @@
       "requires": {
         "source-list-map": "^2.0.0",
         "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
       }
     },
-    "which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
-    },
-    "wide-align": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
-      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.2 || 2"
-      }
-    },
-    "wordwrap": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
-      "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
-    },
-    "worker-farm": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
-      "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+    "whatwg-url": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+      "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
       "dev": true,
       "requires": {
-        "errno": "~0.1.7"
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^1.0.1",
+        "webidl-conversions": "^4.0.2"
       }
     },
-    "wrap-ansi": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "dev": true,
       "requires": {
-        "ansi-styles": "^3.2.0",
-        "string-width": "^3.0.0",
-        "strip-ansi": "^5.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "isexe": "^2.0.0"
       }
     },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+    "wildcard": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
+      "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
       "dev": true
     },
     "xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "dev": true
-    },
-    "y18n": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
-      "dev": true
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
     },
     "yallist": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-      "dev": true
-    },
-    "yargs": {
-      "version": "13.3.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
-      "dev": true,
-      "requires": {
-        "cliui": "^5.0.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^13.1.2"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
-      }
-    },
-    "yargs-parser": {
-      "version": "13.1.2",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      }
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
     }
   }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/package.json b/vendor/simplesamlphp/simplesamlphp/package.json
index 59558be27f9abb6da189de50e8c832e61297ac14..ec218f05cd81b71c4f0108a577dd30b56357e257 100644
--- a/vendor/simplesamlphp/simplesamlphp/package.json
+++ b/vendor/simplesamlphp/simplesamlphp/package.json
@@ -4,33 +4,37 @@
   "repository": "https://github.com/simplesamlphp/simplesamlphp",
   "author": "olimpiam",
   "license": "MIT",
+  "engines": {
+    "node": ">=14.0.0",
+    "npm": ">=6.0.0"
+  },
   "scripts": {
+    "post-intall": "minimum-node-version",
     "clean": "rm -rf www/assets/css/* && rm -rf www/assets/js/*",
-    "build": "webpack -p"
+    "build": "webpack"
   },
   "dependencies": {
-    "clipboard": "^2.0.6",
-    "es6-shim": "^0.35.5",
-    "font-awesome": "^4.7.0",
-    "highlight.js": "^9.18.3",
-    "jquery": "^3.5.1",
-    "jquery-ui": "^1.12.1",
-    "lodash": "^4.17.19",
-    "purecss": "^1.0.1",
-    "reset-css": "^5.0.1",
-    "selectize": "^0.12.6"
+    "@fortawesome/fontawesome-free": "^5.15.4",
+    "clipboard": "^2.0.11",
+    "es6-shim": "^0.35.6",
+    "highlight.js": "^10.7.0",
+    "jquery": "^3.6.0",
+    "minimum-node-version": "^3.0.0",
+    "purecss": "^2.1.0",
+    "reset-css": "^5.0.1"
   },
   "devDependencies": {
-    "@babel/core": "^7.7.5",
-    "babel-loader": "^8.1.0",
-    "copy-webpack-plugin": "^6.0.3",
-    "css-loader": "^3.2.1",
-    "expose-loader": "^0.7.5",
-    "extract-text-webpack-plugin": "^4.0.0-beta.0",
-    "node-sass": "^4.14.1",
-    "sass-loader": "^7.3.1",
-    "style-loader": "^0.23.1",
-    "webpack": "^4.44.1",
-    "webpack-cli": "^3.3.12"
+    "@babel/core": "^7.17.10",
+    "@babel/helper-compilation-targets": "^7.17.10",
+    "babel-loader": "^8.2.5",
+    "copy-webpack-plugin": "^9.0.1",
+    "css-loader": "^5.2.7",
+    "expose-loader": "^2.0.0",
+    "mini-css-extract-plugin": "^1.6.2",
+    "sass": "^1.51.0",
+    "sass-loader": "^12.6.0",
+    "style-loader": "^2.0.0",
+    "webpack": "^5.72.0",
+    "webpack-cli": "^4.9.2"
   }
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/phpunit.xml
index 4a7750b5f74ba104a4bec91b0571d517d88ebca0..84dc59b007cf80facf83b2e8adb0688ff974ac1f 100644
--- a/vendor/simplesamlphp/simplesamlphp/phpunit.xml
+++ b/vendor/simplesamlphp/simplesamlphp/phpunit.xml
@@ -10,7 +10,8 @@
          bootstrap="./tests/bootstrap.php">
     <testsuites>
         <testsuite name="Unit tests">
-            <directory>./tests/</directory>
+            <directory>./vendor/simplesamlphp/simplesamlphp-test-framework/src</directory>
+            <directory>./tests</directory>
         </testsuite>
     </testsuites>
     <filter>
@@ -28,7 +29,7 @@
     </filter>
     <logging>
         <log type="coverage-text" target="php://stdout" showUncoveredFiles="true"/>
-        <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70"/>
+        <log type="coverage-html" target="build/coverage" lowUpperBound="35" highLowerBound="70"/>
         <log type="coverage-clover" target="build/logs/clover.xml"/>
     </logging>
 </phpunit>
diff --git a/vendor/simplesamlphp/simplesamlphp/psalm.xml b/vendor/simplesamlphp/simplesamlphp/psalm.xml
index 5a230843ec723656c9ef1dcd912045848ea34d71..84000454de27a2d25cc3f09798b41b46210b75a9 100644
--- a/vendor/simplesamlphp/simplesamlphp/psalm.xml
+++ b/vendor/simplesamlphp/simplesamlphp/psalm.xml
@@ -4,10 +4,10 @@
     useDocblockTypes="true"
     totallyTyped="false"
     hideExternalErrors="true"
-    allowCoercionFromStringToClassConst="true"
     allowStringToStandInForClass="true"
 >
     <projectFiles>
+        <directory name="config-templates" />
         <directory name="lib/SimpleSAML" />
 
         <!-- Replaces all modules/... with this one-liner for 2.0
@@ -22,12 +22,18 @@
         <directory name="modules/saml" />
 
         <directory name="tests" />
+        <directory name="www" />
 
         <!-- Ignore deprecated classes -->
         <ignoreFiles>
+            <directory name="lib/SimpleSAML/Bindings/Shib13" />
+            <directory name="lib/SimpleSAML/XML/Shib13" />
+            <directory name="tests/lib/SimpleSAML/XML/Shib13" />
+
             <file name="lib/SimpleSAML/Auth/DefaultAuth.php" />
             <file name="lib/SimpleSAML/Auth/TimeLimitedToken.php" />
             <file name="lib/SimpleSAML/Utilities.php" />
+            <file name="tests/lib/SimpleSAML/Auth/TimeLimitedTokenTest.php" />
 
             <!-- Ignore deprecated PHP-templates - Remove for 2.0 -->
             <file name="modules/**/templates/*.tpl.php" />
@@ -49,7 +55,6 @@
         <MissingReturnType errorLevel="info" />
         <MissingPropertyType errorLevel="info" />
         <InvalidDocblock errorLevel="info" />
-        <MisplacedRequiredParam errorLevel="info" />
 
         <PropertyNotSetInConstructor errorLevel="info" />
         <MissingConstructor errorLevel="info" />
@@ -62,13 +67,6 @@
         <DocblockTypeContradiction errorLevel="suppress" />
         <RedundantConditionGivenDocblockType errorLevel="suppress" />
 
-        <!-- See #1141 -->
-        <MissingDependency>
-            <errorLevel type="suppress">
-                <file name="lib/SimpleSAML/HTTP/Router.php" />
-            </errorLevel>
-        </MissingDependency>
-
         <!-- Ignore UnresolvableInclude on CLI-scripts -->
         <UnresolvableInclude>
             <errorLevel type="suppress">
@@ -81,7 +79,7 @@
             </errorLevel>
         </UnresolvableInclude>
 
-        <!-- Ignore MissingFile on www-scripts - Remove for 2.0 -->
+        <!-- Ignore MissingFile on www-scripts - Remove when the last www-script is replaced by a controller -->
         <MissingFile>
             <errorLevel type="suppress">
                 <file name="www/*.php" />
@@ -89,6 +87,15 @@
             </errorLevel>
         </MissingFile>
 
+        <!-- Suppress PossiblyUndefinedGlobalVariable on templates -->
+        <PossiblyUndefinedGlobalVariable>
+            <errorLevel type="suppress">
+                <directory name="config-templates" />
+                <directory name="metadata-templates" />
+                <directory name="modules/adfs/metadata-templates" />
+            </errorLevel>
+        </PossiblyUndefinedGlobalVariable>
+
         <!-- Suppress PHPunit-issue -->
         <PropertyNotSetInConstructor>
             <errorLevel type="suppress">
diff --git a/vendor/simplesamlphp/simplesamlphp/routing/routes/routes.yml b/vendor/simplesamlphp/simplesamlphp/routing/routes/routes.yml
new file mode 100644
index 0000000000000000000000000000000000000000..950cce0bbaec10c37255b6fccc43a21fc0dacbc3
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/routing/routes/routes.yml
@@ -0,0 +1,13 @@
+remove_trailing_slash:
+    path: /{module}/{url}
+    defaults: { _controller: SimpleSAML\Module::removeTrailingSlash }
+    requirements:
+        url: ".*/$"
+    methods: [GET]
+
+add_trailing_slash:
+    path: /{url}
+    defaults: { _controller: SimpleSAML\Module::addTrailingSlash }
+    requirements:
+        url: "[a-zA-Z0-9_-]+[^/]$"
+    methods: [GET]
diff --git a/vendor/simplesamlphp/simplesamlphp/routing/services/console.yml b/vendor/simplesamlphp/simplesamlphp/routing/services/console.yml
new file mode 100644
index 0000000000000000000000000000000000000000..13df312374aa8fd13ced71d283d4fdad70f4235a
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/routing/services/console.yml
@@ -0,0 +1,4 @@
+services:
+    # default configuration for services in *this* file
+    _defaults:
+        public: false
diff --git a/vendor/simplesamlphp/simplesamlphp/routing/services/routing.yml b/vendor/simplesamlphp/simplesamlphp/routing/services/routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..95109537159ab33e823dac250ef1d79c0c4b264e
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/routing/services/routing.yml
@@ -0,0 +1,72 @@
+services:
+    # default configuration for services in *this* file
+    _defaults:
+        public: false
+
+    routing.resolver:
+        class: Symfony\Component\Config\Loader\LoaderResolver
+
+    routing.loader.xml:
+        class: Symfony\Component\Routing\Loader\XmlFileLoader
+        arguments:
+            - '@file_locator'
+        tags: ['routing.loader']
+
+    routing.loader.yaml:
+        class: Symfony\Component\Routing\Loader\YamlFileLoader
+        arguments:
+            - '@file_locator'
+        tags: ['routing.loader']
+
+    routing.loader.php:
+        class: Symfony\Component\Routing\Loader\PhpFileLoader
+        arguments:
+            - '@file_locator'
+        tags: ['routing.loader']
+
+    routing.loader.glob:
+        class: Symfony\Component\Routing\Loader\GlobFileLoader
+        arguments:
+            - '@file_locator'
+        tags: ['routing.loader']
+
+    routing.loader.directory:
+        class: Symfony\Component\Routing\Loader\DirectoryLoader
+        arguments:
+            - '@file_locator'
+        tags: ['routing.loader']
+
+    routing.loader.service:
+        class: Symfony\Component\Routing\Loader\ContainerLoader
+        arguments:
+            - '@service_container'
+        tags: ['routing.loader']
+
+    routing.loader:
+        public: true
+        class: Symfony\Component\Config\Loader\DelegatingLoader
+        arguments:
+            - '@routing.resolver'
+            - {}
+
+    router.default:
+        class: Symfony\Component\Routing\Router
+        arguments:
+            - '@routing.loader'
+            - 'kernel::loadRoutes'
+            - { resource_type: 'service' }
+            - '@?router.request_context'
+
+    router:
+        alias: router.default
+        public: true
+
+    router.request_context:
+        class: Symfony\Component\Routing\RequestContext
+
+    router.router_listener:
+        class: Symfony\Component\HttpKernel\EventListener\RouterListener
+        arguments:
+            - '@router'
+            - '@request_stack'
+            - '@?router.request_context'
diff --git a/vendor/simplesamlphp/simplesamlphp/routing/services/services.yml b/vendor/simplesamlphp/simplesamlphp/routing/services/services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bbf8989760e429a629bb2d8e0c044b68a1214e2d
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/routing/services/services.yml
@@ -0,0 +1,33 @@
+services:
+    # default configuration for services in *this* file
+    _defaults:
+        public: false
+
+    request_stack:
+        class: Symfony\Component\HttpFoundation\RequestStack
+        public: true
+
+    Symfony\Component\HttpFoundation\RequestStack:
+        alias: request_stack
+
+    file_locator:
+        class: Symfony\Component\Config\FileLocator
+
+    dispatcher:
+        class: Symfony\Component\EventDispatcher\EventDispatcher
+        calls:
+            - method: addSubscriber
+              arguments:
+                  - '@router_listener'
+            - method: addSubscriber
+              arguments:
+                  - '@response_listener'
+
+    http_kernel:
+        class: Symfony\Component\HttpKernel\HttpKernel
+        public: true
+        arguments:
+            - '@dispatcher'
+            - '@controller_resolver'
+            - '@request_stack'
+            - '@argument_resolver'
diff --git a/vendor/simplesamlphp/simplesamlphp/routing/services/simplesaml.yml b/vendor/simplesamlphp/simplesamlphp/routing/services/simplesaml.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8a0c7d2b7154b8d74bf1f02564b1757172edb6e5
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/routing/services/simplesaml.yml
@@ -0,0 +1,16 @@
+services:
+    # default configuration for services in *this* file
+    _defaults:
+        public: false
+
+    SimpleSAML\Configuration:
+        factory: ['SimpleSAML\Configuration', 'getInstance']
+
+    SimpleSAML\Session:
+        factory: ['SimpleSAML\Session', 'getSessionFromRequest']
+
+    SimpleSAML\Auth\AuthenticationFactory:
+        class: SimpleSAML\Auth\AuthenticationFactory
+        arguments:
+            - '@SimpleSAML\Configuration'
+            - '@SimpleSAML\Session'
diff --git a/vendor/simplesamlphp/simplesamlphp/routing/services/web.yml b/vendor/simplesamlphp/simplesamlphp/routing/services/web.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dcca7e4c320d0288295094c4593b8247e5056cc1
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/routing/services/web.yml
@@ -0,0 +1,22 @@
+services:
+    # default configuration for services in *this* file
+    _defaults:
+        public: false
+
+    controller_resolver:
+        class: Symfony\Component\HttpKernel\Controller\ContainerControllerResolver
+        arguments:
+            - '@service_container'
+
+    argument_metadata_factory:
+        class: Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory
+
+    argument_resolver:
+        class: Symfony\Component\HttpKernel\Controller\ArgumentResolver
+        arguments:
+            - '@argument_metadata_factory'
+            - ''
+    response_listener:
+        class: Symfony\Component\HttpKernel\EventListener\ResponseListener
+        arguments:
+            - 'UTF-8'
diff --git a/vendor/simplesamlphp/simplesamlphp/src/css/default-rtl.css b/vendor/simplesamlphp/simplesamlphp/src/css/default-rtl.css
index 3df1c9ce86998b56833c14cdb020a736ab6318e0..aff3e40f63dac3f64274bde834991206a1e9d513 100644
--- a/vendor/simplesamlphp/simplesamlphp/src/css/default-rtl.css
+++ b/vendor/simplesamlphp/simplesamlphp/src/css/default-rtl.css
@@ -93,16 +93,9 @@ fieldset.fancyfieldset legend {
     margin-right: auto;
 }
 
-/*selectize elements*/
 div .item{
     float: right;
 }
-.selectize-input{
-    padding-right:8px;
-}
-.selectize-input:after{
-    transform: translate(-8px, 0);
-}
 
 /*purecss elements*/
 .pure-form-aligned .pure-control-group label {
diff --git a/vendor/simplesamlphp/simplesamlphp/src/css/default.scss b/vendor/simplesamlphp/simplesamlphp/src/css/default.scss
index 7ce9b78e79f588d23b560944728bd62b3aea04f1..eda609b5faf56eb4e963aa91fe3ade66d2a13408 100644
--- a/vendor/simplesamlphp/simplesamlphp/src/css/default.scss
+++ b/vendor/simplesamlphp/simplesamlphp/src/css/default.scss
@@ -1,7 +1,8 @@
 @import "../../node_modules/reset-css/sass/_reset.scss";
 @import "../../node_modules/purecss/build/pure.css";
-@import "../../node_modules/font-awesome/scss/font-awesome.scss";
-@import "../../node_modules/selectize/dist/css/selectize.css";
+$fa-font-path: '../fonts/';
+@import "../../node_modules/\@fortawesome/fontawesome-free/scss/fontawesome";
+@import "../../node_modules/\@fortawesome/fontawesome-free/scss/solid";
 @import "../../node_modules/highlight.js/styles/zenburn.css";
 
 /*************
@@ -417,7 +418,8 @@ HEADER
 }
 
 .language-menu {
-  font-family: FontAwesome, sans-serif;
+  font-family: "Font Awesome 5 Free", sans-serif;
+  font-weight: 400;
   min-width: 10rem;
 }
 
@@ -606,58 +608,16 @@ input[type="file"] {
   float: right;
 }
 
-/* SELECTIZE */
-.selectize-input,
-.selectize-dropdown,
-.selectize-input.dropdown-active {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-
-.selectize-input:after {
-  transform: translate(8px, 0);
-}
-
 div .item {
   float: left;
 }
 
-.selectize-dropdown {
-  text-align: left;
-}
-
-.selectize-control.single .selectize-input, .selectize-dropdown.single {
-  background-color: white;
-  background-image: none;
-  border: 1px solid #ccc;
-  box-shadow: inset 0 1px 3px #ddd;
-  box-sizing: border-box;
-  font-size: inherit;
-  padding: 0.5em 0.6em;
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.selectize-dropdown-content {
-  cursor: pointer;
-  .option {
-    &:hover, &:focus, &.active {
-      color: white;
-      background-color: #444444;
-    }
-    span.highlight {
-      color: black;
-      background-color: #fffbd5;
-    }
-  }
-}
-
 /* ***********************************************************
 IMAGES
 ************************************************************ */
 .fa {
-  font-family: FontAwesome !important;
+  font-family: "Font Awesome 5 Free" !important;
+  font-weight: 400;
 }
 
 span.fa, i.fa {
@@ -856,7 +816,8 @@ div.preferredidp {
     }
     &:after {
       content: "\f078";
-      font-family: FontAwesome;
+      font-family: "Font Awesome 5 Free";
+      font-weight: 400;
     }
   }
 
diff --git a/vendor/simplesamlphp/simplesamlphp/src/js/bundle.js b/vendor/simplesamlphp/simplesamlphp/src/js/bundle.js
index 14e550b245ae1615e8b667e0b57f283770b9a380..2025d3916a02d726f130f9bab855ca037a2ab9a3 100644
--- a/vendor/simplesamlphp/simplesamlphp/src/js/bundle.js
+++ b/vendor/simplesamlphp/simplesamlphp/src/js/bundle.js
@@ -1,24 +1,13 @@
 import "es6-shim";
 import ClipboardJS from "clipboard/dist/clipboard";
-import "selectize/dist/js/selectize";
-import hljs from  "highlight.js/lib/highlight";
+import hljs from  "highlight.js/lib/core";
 import xml from "highlight.js/lib/languages/xml";
 import php from "highlight.js/lib/languages/php";
 import json from "highlight.js/lib/languages/json";
 
 $(document).ready(function () {
-    // get available languages
-    let languages = $.map($('#language-selector option'), function (option) {
-        return option.text.toLowerCase();
-    });
-
-    // initialize selectize
-    $('#language-selector').selectize({
-        onChange: function () {
-            if (-1 !== $.inArray($('#language-selector-selectized').prev().text().toLowerCase(), languages)) {
-                $('#language-form').submit();
-            }
-        },
+    $('#language-selector').on('change', function () {
+        $("#language-form").submit();
     });
 
     // side menu
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/_footer.twig b/vendor/simplesamlphp/simplesamlphp/templates/_footer.twig
index 5cfb974b9d8bd91a49bb471a6b98dee26ad37301..7a6705b9cb2bcf70b57dde431137aad5d8da58d6 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/_footer.twig
+++ b/vendor/simplesamlphp/simplesamlphp/templates/_footer.twig
@@ -4,7 +4,7 @@
     </div>
     <div class="logo-footer-right show-for-large">
       <div class="logo-footer">
-        <img class="pure-img" src="/{{ baseurlpath }}resources/icons/ssplogo-fish-small.png" alt="Small fish logo">
+        <img class="pure-img" src="{{ asset("icons/ssplogo-fish-small.png") }}" alt="Small fish logo">
       </div>
     </div>
   </div>
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/_header.twig b/vendor/simplesamlphp/simplesamlphp/templates/_header.twig
index e23d3854710fe89454fc0cae27bcf290092d60b3..02130c0f310fbb763cbad80224ba267f1dfa4221 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/_header.twig
+++ b/vendor/simplesamlphp/simplesamlphp/templates/_header.twig
@@ -55,7 +55,7 @@
             <input type="hidden" name="{{ name }}" />
               {% endif %}
             {% endfor %}
-            <select  class="pure-input-1-4 language-menu selectize" name="language" id="language-selector">
+            <select aria-label="{% trans %}Language{% endtrans %}" class="pure-input-1-4 language-menu" name="language" id="language-selector">
             {% for key, lang in languageBar %}
               {% if key == currentLanguage %}
               <option value="{{ key }}" selected="selected">&#xf0ac;  {{ lang.name }}</option>
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/auth_status.twig b/vendor/simplesamlphp/simplesamlphp/templates/auth_status.twig
index 9965dd37601b028f1294b9b560403c133ef1020a..8a80f413d388b0f6618b9d948758c4274f9ccf13 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/auth_status.twig
+++ b/vendor/simplesamlphp/simplesamlphp/templates/auth_status.twig
@@ -102,12 +102,12 @@
     </dl>
     <br>
 
-{% if logout %}
+{% if logout is defined %}
     <h2>{% trans %}Logout{% endtrans %}</h2>
     <p> {{ logout }}</p>
 {% endif %}
 
-{% if logouturl %}
+{% if logouturl is defined %}
     <div class="center">
         <a class="pure-button pure-button-red" href="{{ logouturl }}">{{ 'Logout'|trans }}</a>
     </div>
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/base.twig b/vendor/simplesamlphp/simplesamlphp/templates/base.twig
index ea464b7caa868809f7d1b6f2deaa86715cdd6b8c..8c8f6c012863e0ccad3abbfe928f3dc17c677d62 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/base.twig
+++ b/vendor/simplesamlphp/simplesamlphp/templates/base.twig
@@ -6,7 +6,7 @@
     <meta name="viewport" content="initial-scale=1.0">
     <title>{{ pagetitle }}</title>
     <link rel="stylesheet" href="{{ asset("css/stylesheet.css") }}">
-    <link rel="icon" href="/{{ baseurlpath }}resources/icons/favicon.ico">
+    <link rel="icon" href="{{ asset("icons/favicon.ico") }}">
     {% if isRTL %}
     <link rel="stylesheet" href="{{ asset("assets/css/src/default-rtl.css") }}">
     {% endif %}
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/error.twig b/vendor/simplesamlphp/simplesamlphp/templates/error.twig
index 6468acee2e1758ea3f7e0d170478c75de23a852c..8a15542fa7d29e6b1cf33e4e2f38b8fe3d6abcac 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/error.twig
+++ b/vendor/simplesamlphp/simplesamlphp/templates/error.twig
@@ -37,7 +37,7 @@
 
     {# Add error report submit section if we have a valid technical contact. 'errorreportaddress' will only be set if
        the technical contact email address has been set. #}
-    {% if errorReportAddress -%}
+    {% if errorReportAddress is defined -%}
         <h2>{{ '{errors:report_header}' | trans }}</h2>
         <form action="{{ errorReportAddress }}" class="pure-form" method="post">
             <p>{{ '{errors:report_text}' | trans }}</p>
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/includes/expander.twig b/vendor/simplesamlphp/simplesamlphp/templates/includes/expander.twig
index 0817520d3fca72894a5c740dba9c0108c57ca058..37deceb6bfbbd4711dc8d03b13029646ac855cf0 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/includes/expander.twig
+++ b/vendor/simplesamlphp/simplesamlphp/templates/includes/expander.twig
@@ -1,4 +1,4 @@
-        <div class="expandable{% if expanded %} expanded{% endif %}">
+        <div class="expandable{% if expanded is defined %} expanded{% endif %}">
           {% if block('general') is defined %}
           <div class="general">
             {{- block("general") }}
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/includes/footer.php b/vendor/simplesamlphp/simplesamlphp/templates/includes/footer.php
index 58905b0dfbe39013beb969a830f799c6ea40ba0e..248461953aadf9668c9d413b04aff3e25a9b5091 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/includes/footer.php
+++ b/vendor/simplesamlphp/simplesamlphp/templates/includes/footer.php
@@ -9,7 +9,7 @@
             <div id="footer">
                 <hr />
                 <img src="/<?php echo $this->data['baseurlpath']; ?>resources/icons/ssplogo-fish-small.png" alt="Small fish logo" style="float: right" />		
-                    Copyright &copy; 2007-2019 <a href="http://uninett.no/">UNINETT AS</a>
+                    Copyright &copy; 2007-2021 <a href="https://uninett.no/">UNINETT AS</a>
 
                 <br style="clear: right" />
 
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/includes/header.php b/vendor/simplesamlphp/simplesamlphp/templates/includes/header.php
index 119e6d194799f3d764481d4ebcc47385a05a67fb..208139d29630c3ccae09f0357656d6146d1e75ed 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/includes/header.php
+++ b/vendor/simplesamlphp/simplesamlphp/templates/includes/header.php
@@ -175,6 +175,7 @@
                 'af' => 'Afrikaans', // Afrikaans
                 'zu' => 'IsiZulu', // Zulu
                 'xh' => 'isiXhosa', // Xhosa
+                'st' => 'Sesotho', // Sesotho
             ];
 
             $textarray = [];
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/login-ldapmulti.php b/vendor/simplesamlphp/simplesamlphp/templates/login-ldapmulti.php
index b4cf136dffa7f0496ddfb0de71f08c09414209f1..64159298d9faca906aeda4427657a1cd25eb8290 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/login-ldapmulti.php
+++ b/vendor/simplesamlphp/simplesamlphp/templates/login-ldapmulti.php
@@ -24,7 +24,7 @@
             <tr>
                 <td rowspan="3"><img src="/<?php echo $this->data['baseurlpath']; ?>resources/icons/experience/gtk-dialog-authentication.48x48.png" id="loginicon" alt="" /></td>
                 <td style="padding: .3em;"><?php echo $this->t('username'); ?></td>
-                <td><input type="text" tabindex="1" name="username"
+                <td><input type="text" tabindex="1" name="username" autocomplete="username"
 <?php
 if (isset($this->data['username'])) {
     echo 'value="'.htmlspecialchars($this->data['username']).'"';
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/login.php b/vendor/simplesamlphp/simplesamlphp/templates/login.php
index fb1d7b951bf4b97fce84cc4fe4e221c187bd585d..04502944ddf6e32667fbb86b7bcaba7163f2c330 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/login.php
+++ b/vendor/simplesamlphp/simplesamlphp/templates/login.php
@@ -28,7 +28,7 @@
 if (array_key_exists('admin', $this->data)) {
     echo '<strong style="font-size: medium">Administrator</strong>';
 } else {
-    echo '<input type="text" id="username" tabindex="1" name="username" ';
+    echo '<input type="text" id="username" tabindex="1" name="username" autocomplete="username" ';
     if (isset($this->data['username'])) {
         echo 'value="'.htmlspecialchars($this->data['username']).'"';
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/metadata.twig b/vendor/simplesamlphp/simplesamlphp/templates/metadata.twig
index 4d3903533689fcb890d6d5cbd51077de9e285ba7..1857b4cbbffca850b2e6023662d4238a72f491d4 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/metadata.twig
+++ b/vendor/simplesamlphp/simplesamlphp/templates/metadata.twig
@@ -3,7 +3,7 @@
 {% block content %}
   <h2>{% trans %}Metadata{% endtrans %}</h2>
   <dl>
-    <dd>{{ metadata_intro }}</dd>
+    <dd>{{ '{admin:metadata_intro}'|trans }}</dd>
 
   {% if metaurl is defined %}
     <dd>{% trans %}You can get the metadata xml on a dedicated URL:{% endtrans %}</dd>
@@ -49,9 +49,9 @@
 
         <li>
           <a href="{{ cert.url }}"><i class="fa fa-download"></i>{{ cert.name }}
-          {#- #}{% if cert.signing %}-signing{% endif %}
-          {#- #}{% if cert.encryption %}-encryption{% endif %}.pem
-          {#- #}{% if cert.prefix %} ({% trans %}new{% endtrans %}){% endif %}</a> {{ cert.comment }}
+          {#- #}{% if cert.signing is defined %}-signing{% endif %}
+          {#- #}{% if cert.encryption is defined %}-encryption{% endif %}.pem
+          {#- #}{% if cert.prefix is defined %} ({% trans %}new{% endtrans %}){% endif %}</a> {{ cert.comment }}
         </li>
       {% endfor %}
 
@@ -59,4 +59,4 @@
   {% endif %}
 
   </dl>
-{% endblock content %}
\ No newline at end of file
+{% endblock content %}
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/post.twig b/vendor/simplesamlphp/simplesamlphp/templates/post.twig
index a11c56a18886b0eb58efa87bb4880f0c9fa60621..c297d5500365c6f6ba0e7be64190a179e3d87ba7 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/post.twig
+++ b/vendor/simplesamlphp/simplesamlphp/templates/post.twig
@@ -4,10 +4,10 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'self'">
-    <link rel="icon" href="/{{ baseurlpath }}resources/icons/favicon.ico">
+    <link rel="icon" href="{{ asset("icons/favicon.ico") }}">
     <title>{% trans %}Sending message{% endtrans %}</title>
-    <link rel="stylesheet" href="/{{ baseurlpath }}resources/post.css">
-    <script src="/{{ baseurlpath }}resources/post.js"></script>
+    <link rel="stylesheet" href="{{ asset("css/post.css") }}">
+    <script src="{{ asset("js/post.js") }}"></script>
   </head>
   <body>
     <form method="post" action="{{ destination }}">
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/selectidp-dropdown.php b/vendor/simplesamlphp/simplesamlphp/templates/selectidp-dropdown.php
index 4fa03d6ff05a5c07a3d98e2d961a026f894283f7..130ebcd1c9d7faa31ac535bf4add907f42afe7ba 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/selectidp-dropdown.php
+++ b/vendor/simplesamlphp/simplesamlphp/templates/selectidp-dropdown.php
@@ -53,7 +53,11 @@
         <button class="btn" type="submit"><?php echo $this->t('select'); ?></button>
         <?php
         if ($this->data['rememberenabled']) {
-            echo('<br/><input type="checkbox" name="remember" value="1" />'.$this->t('remember'));
+            echo('<br/><input type="checkbox" id="remember" name="remember" value="1"');
+            if ($this->data['rememberchecked']) {
+                echo(' checked');
+            }
+            echo(' /><label for="remember">'.$this->t('remember').'</label>');
         }
         ?>
     </form>
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/selectidp-dropdown.twig b/vendor/simplesamlphp/simplesamlphp/templates/selectidp-dropdown.twig
index 22b8f22206f8a573468d088c22799d55aa156805..d34b80aa8aeb106cf82e2bfdc63310d9b46d2491 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/selectidp-dropdown.twig
+++ b/vendor/simplesamlphp/simplesamlphp/templates/selectidp-dropdown.twig
@@ -23,8 +23,10 @@
         </div>
         {% if rememberenabled %}
         <div class="pure-control-group">
-            <input type="checkbox" name="remember" id="remember" value="1">
-            <label for="remember">{{ 'Remember my choice' | trans }}</label>
+            <label for="remember">
+                <input type="checkbox" name="remember" id="remember" value="1"{% if rememberchecked %} checked{% endif %}>
+                {{ 'Remember my choice' | trans }}
+            </label>
         </div>
         {% endif %}
     </form>
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/selectidp-links.php b/vendor/simplesamlphp/simplesamlphp/templates/selectidp-links.php
index 6c4eabad3c5fbccb57f33671b5c0ce8b2e693fce..0d8b44d1727f207b79db3e7aed648a653fbcb4f4 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/selectidp-links.php
+++ b/vendor/simplesamlphp/simplesamlphp/templates/selectidp-links.php
@@ -29,8 +29,11 @@
         <p><?php
             echo $this->t('selectidp_full');
             if ($this->data['rememberenabled']) {
-                echo '<br /><input type="checkbox" name="remember" value="1" title="'.$this->t('remember').'" />'.
-                    $this->t('remember');
+                echo('<br/><input type="checkbox" id="remember" name="remember" value="1"');
+                if ($this->data['rememberchecked']) {
+                    echo(' checked');
+                }
+                echo(' /><label for="remember">'.$this->t('remember').'</label>');
             }
             ?></p>
 <?php
diff --git a/vendor/simplesamlphp/simplesamlphp/templates/selectidp-links.twig b/vendor/simplesamlphp/simplesamlphp/templates/selectidp-links.twig
index a7bf1103fdfe0b210988767bc99f69736edf4c26..30603556fe0535d89e3c21812e2e09a7bb55f143 100644
--- a/vendor/simplesamlphp/simplesamlphp/templates/selectidp-links.twig
+++ b/vendor/simplesamlphp/simplesamlphp/templates/selectidp-links.twig
@@ -10,18 +10,22 @@
         <input type="hidden" name="return" value="{{ return }}">
         <input type="hidden" name="returnIDParam" value="{{ returnIDParam }}">
         {% if rememberenabled %}
-            <p><input type="checkbox" name="remember" id="remember" value="1">
-            <label for="remember">{{ 'Remember my choice' | trans }}</label></p>
+        <div class="pure-control-group">
+            <label for="remember">
+                <input type="checkbox" name="remember" id="remember" value="1"{% if rememberchecked %} checked{% endif %}>
+                {{ 'Remember my choice' | trans }}
+            </label>
+        </div>
         {% endif %}
 
         {% for idpentry in idplist %}
         {% if idpentry.entityid == preferredidp %}
                 <div class="preferredidp">
-                {% if idpentry.iconurl %}
+                {% if idpentry.iconurl is defined %}
                     <img class="float-l" src="{{ idpentry.iconurl }}">
                 {% endif %}
                 <h3><i class="fa fa-star"></i> {{ idpentry.name }}</h3>
-                {% if idpentry.description %}
+                {% if idpentry.description is defined %}
                     <p>{{ idpentry.description }}</p>
                 {% endif %}
                 <button type="submit" class="btn" name="idp_{{ idpentry.entityid }}">{{'Select'|trans}}</button>
@@ -31,11 +35,11 @@
 
         {% for idpentry in idplist %}
         {% if idpentry.entityid != preferredidp %}
-                {% if idpentry.iconurl %}
+                {% if idpentry.iconurl is defined %}
                     <img class="float-l" src="{{ idpentry.iconurl }}">
                 {% endif %}
                 <h3>{{ idpentry.name }}</h3>
-                {% if idpentry.description %}
+                {% if idpentry.description is defined %}
                     <p>{{ idpentry.description }}</p>
                 {% endif %}
                 <button type="submit" class="btn" name="idp_{{ idpentry.entityid }}">{{'Select'|trans}}</button>
diff --git a/vendor/simplesamlphp/simplesamlphp/webpack.config.js b/vendor/simplesamlphp/simplesamlphp/webpack.config.js
index 8792220fad4700d7ef1bde2c73ccb36c774245e3..e1ccb98731c334e9da5227c5974a7efbee6dd632 100644
--- a/vendor/simplesamlphp/simplesamlphp/webpack.config.js
+++ b/vendor/simplesamlphp/simplesamlphp/webpack.config.js
@@ -1,6 +1,6 @@
 const path = require('path');
 const webpack = require('webpack');
-const ExtractTextPlugin = require('extract-text-webpack-plugin');
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 const CopyWebpackPlugin = require('copy-webpack-plugin');
 
 const buildDir = __dirname + '/www/assets/';
@@ -37,39 +37,35 @@ module.exports = environment => {
                 },
                 {
                     test: /\.scss$/,
-                    use: ExtractTextPlugin.extract({
-                        fallback: 'style-loader',
-                        use: [
-                            {
-                                loader: 'css-loader',
-                                options: {
-                                    url: false,
-                                    sourceMap: true
-                                }
-                            },
-                            {
-                                loader: 'sass-loader',
-                                options: {
-                                    indentedSyntax: false,
-                                    sourceMap: true,
-                                    data: "$primaryBackground: " + primaryBackground + '; ' +
-                                          "$transitionBackground: " + transitionBackground + "; " +
-                                          "$secondaryBackground: " + secondaryBackground + ";"
-                                }
+                    use: [
+                        'style-loader',
+                        MiniCssExtractPlugin.loader,
+                        {
+                            loader: 'css-loader',
+                            options: {
+                                url: false
                             }
-                        ]
-                    })
+                        },
+                        {
+                            loader: 'sass-loader',
+                            options: {
+                                sassOptions: {
+                                    indentedSyntax: false
+                                },
+                                additionalData: "$primaryBackground: " + primaryBackground + '; ' +
+                                      "$transitionBackground: " + transitionBackground + "; " +
+                                      "$secondaryBackground: " + secondaryBackground + ";"
+                            }
+                        }
+                    ]
                 },
                 {
                     // expose jquery for use outside webpack bundle
                     test: require.resolve('jquery'),
-                    use: [{
-                        loader: 'expose-loader',
-                        options: 'jQuery'
-                    }, {
-                        loader: 'expose-loader',
-                        options: '$'
-                    }]
+                    loader: "expose-loader",
+                    options: {
+                        exposes: ["$", "jQuery"],
+                    }
                 }
             ]
         },
@@ -80,19 +76,18 @@ module.exports = environment => {
                 $: 'jquery',
                 jQuery: 'jquery'
             }),
-            new ExtractTextPlugin({
+            new MiniCssExtractPlugin({
                 filename: localConfig['css_filename'],
                 ignoreOrder: true
             }),
             new CopyWebpackPlugin({
                 patterns: [
                     {
-                        from: path.resolve(__dirname + '/node_modules/font-awesome/fonts/*'),
-                        to: 'fonts/',
-                        flatten: true
+                        from: path.resolve(__dirname + '/node_modules/\@fortawesome/fontawesome-free/webfonts/*'),
+                        to: 'fonts/[name][ext]'
                     }
-                ],
-            }),
+                ]
+            })
         ]
     }
 };
diff --git a/vendor/simplesamlphp/simplesamlphp/www/_include.php b/vendor/simplesamlphp/simplesamlphp/www/_include.php
index afe9b6b39ec15722bcb3185e4308cda358b09d8b..fa3035c15942a56072b0967b1ef94786e24318a7 100644
--- a/vendor/simplesamlphp/simplesamlphp/www/_include.php
+++ b/vendor/simplesamlphp/simplesamlphp/www/_include.php
@@ -17,12 +17,8 @@ function SimpleSAML_exception_handler($exception)
         $e = new \SimpleSAML\Error\Error('UNHANDLEDEXCEPTION', $exception);
         $e->show();
     } elseif (class_exists('Error') && $exception instanceof \Error) {
-        $code = $exception->getCode();
-        $errno = ($code > 0) ? $code : E_ERROR;
-        $errstr = $exception->getMessage();
-        $errfile = $exception->getFile();
-        $errline = $exception->getLine();
-        SimpleSAML_error_handler($errno, $errstr, $errfile, $errline);
+        $e = new \SimpleSAML\Error\Error('UNHANDLEDEXCEPTION', $exception);
+        $e->show();
     }
 }
 
diff --git a/vendor/simplesamlphp/simplesamlphp/www/admin/metadata-converter.php b/vendor/simplesamlphp/simplesamlphp/www/admin/metadata-converter.php
index 83837409de1e921376f45cc036fa3a9d68adab9c..94e38fec3e4f6d93e64a95549d78e8e163999e8c 100644
--- a/vendor/simplesamlphp/simplesamlphp/www/admin/metadata-converter.php
+++ b/vendor/simplesamlphp/simplesamlphp/www/admin/metadata-converter.php
@@ -2,6 +2,8 @@
 
 require_once('../_include.php');
 
+use Symfony\Component\VarExporter\VarExporter;
+
 // make sure that the user has admin access rights
 \SimpleSAML\Utils\Auth::requireAdmin();
 
@@ -42,7 +44,7 @@
             unset($entityMetadata['entityDescriptor']);
 
             $text .= '$metadata[' . var_export($entityId, true) . '] = ' .
-                var_export($entityMetadata, true) . ";\n";
+                VarExporter::export($entityMetadata) . ";\n";
         }
         $entities = $text;
     }
diff --git a/vendor/simplesamlphp/simplesamlphp/www/assets/css/post.css b/vendor/simplesamlphp/simplesamlphp/www/assets/css/post.css
new file mode 100644
index 0000000000000000000000000000000000000000..3f8684c702d2cdb8a66ba20c49c72950703dd032
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/www/assets/css/post.css
@@ -0,0 +1,3 @@
+input#postLoginSubmitButton {
+    display:none;
+}
diff --git a/vendor/simplesamlphp/simplesamlphp/www/assets/icons/favicon.ico b/vendor/simplesamlphp/simplesamlphp/www/assets/icons/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..ddded01e615a2a4cf9ff0e335dd23e5e19d0f09c
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/www/assets/icons/favicon.ico
@@ -0,0 +1,5 @@
+������� �h�����(������ ���� �����������������������������������������������������������\���]���������������������������������������������������EEE�HHH������������������������������������������������A���������"""����=��������������������������������������������������������
+���������������������������������������


�...���������FFF�
+
+
+����&�����������������������{���:


�TTT�����������������GGG����������������������WWW���������������mmm�������"����������������������������������������"""����4���������������������������������������������������:::����W������N�����������������������			�����������������


�����������������������������������Q�����������������888��������������������������������������]�����������������������������������������������������			�������������'�������������������������������������������7�������������A���������������������������������������������			��������������������������������������������������������������������������������������������������������������?���?������������������������
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/www/assets/icons/ssplogo-fish-small.png b/vendor/simplesamlphp/simplesamlphp/www/assets/icons/ssplogo-fish-small.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a20f4fe8e272398d8027ac8d9b93bfde1f1836c
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/www/assets/icons/ssplogo-fish-small.png
@@ -0,0 +1,9 @@
+�PNG
+
+���
IHDR���<���)���i�JZ���iCCPICC Profile��x��OhQƿM�*�B�ûZY6��C�5B��
D���f��gݬQo��̓T�=���W=	ZēW��^ڲ~o_K��v����vv�d���V@��7o�;w
���S0 ��l�L���A-����5A4)�
+��g�M�5�%�C?�fY�����>y&�,Z�W��
��%��I�
����w��y�<W�z.���޺~@M�79�nwY?y�|E΂���/p�s�q,�x���?�]���X{2�mn�����d���vr{E�U`�*��3��GQ�����[k�T��Vߩ�C���#f���,b�@%��ց�`�3`3Ƹ����Us��tq�\6L=W]�K���V�8���)K��y�y�БC�Q��렅&jH!<ĉGVݯ~��G�������j(
+�NO���f���s��=��3ܩ7#[Y�����`�?<-�~rR����	pHYs��������y(q���	�IDATh�Y{L���`�a@���(Ep�mWѢȪ(�ZW⃄P��֤n��������lb,]Y5Kj$Ѳ�֢��*+��QTDt��0���z�저����&�����wϹ�{GQ�ϒ�w�e�B]]]S����|��Y��3g����SSS��������ѣG/^�����\�/���ϟ�����h4���n����4�����l�O�;V���%''�x{{�޶m�״i�T�V�UٹsgGyy�I�^�|�(�/�
����9f���dR�^ʭ[�,�/_v����ѣ[��5?������Z����ʆ
�n�F���W;)##��`0�"?g�/0�l߾={�ʕO�����h�;Z��<�\�v�U����X�'w,�@}{}\g�ȑ�ڵkM����.4��K�:���{��v���*Ԇݶ�3�*C�0�Ӌ�7���ŋ�М�Ǐ+<�W�\Qrss-]]]9NSi��5k�T]�p�{,��
+��&0Q�uuu
+�y�`t�Z������>���W�^ݛ���#�u��@�~YXX��4�`�X~�EJ��<C��	���Ç��f�6�L>u�T����R//�hJ��۷�W�X�k���Cd`3�O�<�4�o4v��Յ���������O�P������u��ٖ-[�PU�͆sjKKK3O�>ݽ?�N;�\0)))����Ç�S����
�B��'�����_��5k��uftt4
�[PPPh���;�;�߆�����K��`1�rJJ�i�̙��J�	�/^����q.+���,���jwee%7�������x�ٍI۾hѢ���_><a�ƍ^���v���"MJz��݊���� ��Dh�+p�5�u�!t�'��Q�FYa��0�}�?��|]�8�҉'ƭ[��I&@	�e�aM�#DZ��#G���L&U:b��}̏�WD��1��?��`���Ǐ���<i��U�v��d���x1�҂�*�}�$}gϞ�9q�D�蒒�'�1����ɋ���Bh����:���,�-a�H%ơ��7ԧ�tl��3Ж�i�&#ru�̙� �����
+����~~~�ܹs]�޽�@cJ�:��Tw�P#��gvvv+�����׎y]�w���ѐ�'���g�?~.�EFF����f���o4������`ᶤ�ݻ�WR��ظ����k�f��	�ٳg{`#��Ƨ555a�
��Dl�������
|o��$���y�����(	1�/d���"!H0	���͛M0J�� a�ԩS]PC��޺u�'r�������СC������l�\����n<6���g��$A���q�C�hW��4��4�M�	$XN�uPM��d?B�h��g���Y�d�;��&�V$I`�&˒�Fcu��u,�OѮ�eqq���f�cq�}��Q�7�d��$�*/�9R�	�dX� �A�����2�o��;�%@=�;G��p$,^	C}G�qo�ﲾp�����1b�]�l�$@�����q���U����r;`,hW-0J�c�PBU���EL������p�Y~i���w���.�CK0����R��ը1)�V+E{KK�=,$�Hʎ�l����ys��z�=;`0P�	�?�	CiRG����Ze�L�GK}��=�Cm�H_�رc�G�3,u ��rl�Z%Y_���_�h$���C���B�������p>Qٳg�9??���������$ٯ���E�|ț4i���_�>�R[����A���#E�����/@7���aaaV\ڭ���\��z��4eʔ,�oO�"8�WG�}�������-�h^Ϋ�6��8F�ܠ���fl`ȹs���j�c�^A
ڶ���S�������լ_���pɅ4�Pk�Ν;*����eܸqj����߿�{��x��A~��P����L�U�/��sE�.�m��6V߼y3�ƍ������A�ү[F�"��(0����fRE�&Ղe6���P�<\����G]W�d�q�	��j�bn7����6g���ܒjq�����^����Z��V~�3�������V�x�Rh�pS��7��ѣG?G�����:68
0y���Z

M��� �}�,�����p%�-�����Nv?쌅�u�T<��wd��y��2,3�ԓ���
+�����ɓ'����xb����{�36�M����811Q}��+]��C�90���:b�mN�+&�0o|���8[bm)C�yc��p�h:
0��3C]{�>}���R��R�F ������9
0�
���O�>�ƸYT��|l?�<�P���^AL����aC�_�	�p�Jƕ��f-x��PO��"^��ˠ�C[a�ꇅ��8���G@�!a>0�@�?ǿ�e����i̞���r����IEND�B`�
\ No newline at end of file
diff --git a/vendor/simplesamlphp/simplesamlphp/www/assets/js/post.js b/vendor/simplesamlphp/simplesamlphp/www/assets/js/post.js
new file mode 100644
index 0000000000000000000000000000000000000000..043bec73322079eb6d6e8bfd9f39bbb3b654615f
--- /dev/null
+++ b/vendor/simplesamlphp/simplesamlphp/www/assets/js/post.js
@@ -0,0 +1,7 @@
+/**
+ * Automatically click the input button to redirect the user to
+ * the SSO
+ */
+window.onload = function () {
+    document.getElementById('postLoginSubmitButton').click();
+};
diff --git a/vendor/simplesamlphp/simplesamlphp/www/resources/default.css b/vendor/simplesamlphp/simplesamlphp/www/resources/default.css
index f033b771621ec1542e5ce77240e5adf123545e84..0723eabdf78ac5c1d5e99641c1b8491696f4b7bc 100644
--- a/vendor/simplesamlphp/simplesamlphp/www/resources/default.css
+++ b/vendor/simplesamlphp/simplesamlphp/www/resources/default.css
@@ -257,6 +257,11 @@ div.caution {
 th.rowtitle {
     text-align: left;
 }
+.youareadmin {
+    border: 1px solid #aaa;
+    margin-left: 1em;
+    padding: 5px;
+}
 .enablebox table {
     border: 1px solid #eee;
     margin-left: 1em;
diff --git a/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/ArtifactResolutionService.php b/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/ArtifactResolutionService.php
index c4e52bd1498e45b5b7b835575b9825e7f54a08aa..8da7681aeb4fe8eefbf42d087d4fcd94fdcf8f55 100644
--- a/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/ArtifactResolutionService.php
+++ b/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/ArtifactResolutionService.php
@@ -11,7 +11,7 @@
 require_once('../../_include.php');
 
 $config = \SimpleSAML\Configuration::getInstance();
-if (!$config->getBoolean('enable.saml20-idp', false)) {
+if (!$config->getBoolean('enable.saml20-idp', false) || !\SimpleSAML\Module::isModuleEnabled('saml')) {
     throw new \SimpleSAML\Error\Error('NOACCESS');
 }
 
@@ -47,10 +47,8 @@
 }
 
 $issuer = $request->getIssuer();
-if (!is_string($issuer)) {
-    $issuer = $issuer->getValue();
-}
-
+\Webmozart\Assert\Assert::notNull($issuer);
+$issuer = $issuer->getValue();
 $spMetadata = $metadata->getMetaDataConfig($issuer, 'saml20-sp-remote');
 
 $artifact = $request->getArtifact();
@@ -60,7 +58,7 @@
 
 if ($responseData !== null) {
     $document = \SAML2\DOMDocumentFactory::fromString($responseData);
-    $responseXML = $document->firstChild;
+    $responseXML = $document->documentElement;
 } else {
     $responseXML = null;
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/SSOService.php b/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/SSOService.php
index 5a400b854499c39bc04cf7fc62d99ede897551ed..e4b8988e66e0a3b52d470f6a6f1cdf8261bb6025 100644
--- a/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/SSOService.php
+++ b/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/SSOService.php
@@ -5,7 +5,6 @@
  * from a SAML 2.0 SP, parses, and process it, and then authenticates the user and sends the user back
  * to the SP with an Authentication Response.
  *
- * @author Andreas Åkre Solberg, UNINETT AS. <andreas.solberg@uninett.no>
  * @package SimpleSAMLphp
  */
 
@@ -14,6 +13,12 @@
 \SimpleSAML\Logger::info('SAML2.0 - IdP.SSOService: Accessing SAML 2.0 IdP endpoint SSOService');
 
 $metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
+
+$config = \SimpleSAML\Configuration::getInstance();
+if (!$config->getBoolean('enable.saml20-idp', false) || !\SimpleSAML\Module::isModuleEnabled('saml')) {
+    throw new \SimpleSAML\Error\Error('NOACCESS', null, 403);
+}
+
 $idpEntityId = $metadata->getMetaDataCurrentEntityID('saml20-idp-hosted');
 $idp = \SimpleSAML\IdP::getById('saml2:' . $idpEntityId);
 
diff --git a/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/SingleLogoutService.php b/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/SingleLogoutService.php
index 2d3c0e4b4a1c1f2331aab0c9da1b9e80d31b0eb1..9a6050f960db5dd2dcfa219616a1ec3f848a62f0 100644
--- a/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/SingleLogoutService.php
+++ b/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/SingleLogoutService.php
@@ -13,6 +13,12 @@
 \SimpleSAML\Logger::info('SAML2.0 - IdP.SingleLogoutService: Accessing SAML 2.0 IdP endpoint SingleLogoutService');
 
 $metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
+
+$config = \SimpleSAML\Configuration::getInstance();
+if (!$config->getBoolean('enable.saml20-idp', false) || !\SimpleSAML\Module::isModuleEnabled('saml')) {
+    throw new \SimpleSAML\Error\Error('NOACCESS', null, 403);
+}
+
 $idpEntityId = $metadata->getMetaDataCurrentEntityID('saml20-idp-hosted');
 $idp = \SimpleSAML\IdP::getById('saml2:' . $idpEntityId);
 
diff --git a/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/initSLO.php b/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/initSLO.php
index 82c38c8d4d0dddcb4d895916a9b09551faa76466..b5eb3c1129c15cd5202c91a3e80b3a97eeb3111a 100644
--- a/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/initSLO.php
+++ b/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/initSLO.php
@@ -3,6 +3,12 @@
 require_once('../../_include.php');
 
 $metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
+
+$config = \SimpleSAML\Configuration::getInstance();
+if (!$config->getBoolean('enable.saml20-idp', false) || !\SimpleSAML\Module::isModuleEnabled('saml')) {
+    throw new \SimpleSAML\Error\Error('NOACCESS', null, 403);
+}
+
 $idpEntityId = $metadata->getMetaDataCurrentEntityID('saml20-idp-hosted');
 $idp = \SimpleSAML\IdP::getById('saml2:' . $idpEntityId);
 
diff --git a/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/metadata.php b/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/metadata.php
index 698cb9f4a308397905fe66165d02f9aeb9f3ea6c..a8a87211f6f4be50839f878b2187bdb7a7c05d0d 100644
--- a/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/metadata.php
+++ b/vendor/simplesamlphp/simplesamlphp/www/saml2/idp/metadata.php
@@ -2,19 +2,20 @@
 
 require_once('../../_include.php');
 
+use Symfony\Component\VarExporter\VarExporter;
+
 use SAML2\Constants;
+use SimpleSAML\Configuration;
+use SimpleSAML\Error;
 use SimpleSAML\Module;
 use SimpleSAML\Utils\Auth as Auth;
 use SimpleSAML\Utils\Crypto as Crypto;
 use SimpleSAML\Utils\HTTP as HTTP;
 use SimpleSAML\Utils\Config\Metadata as Metadata;
 
-// load SimpleSAMLphp configuration and metadata
-$config = \SimpleSAML\Configuration::getInstance();
-$metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
-
-if (!$config->getBoolean('enable.saml20-idp', false)) {
-    throw new \SimpleSAML\Error\Error('NOACCESS');
+$config = Configuration::getInstance();
+if (!$config->getBoolean('enable.saml20-idp', false) || !Module::isModuleEnabled('saml')) {
+    throw new Error\Error('NOACCESS', null, 403);
 }
 
 // check if valid local session exists
@@ -22,6 +23,8 @@
     Auth::requireAdmin();
 }
 
+$metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
+
 try {
     $idpentityid = isset($_GET['idpentityid']) ?
         $_GET['idpentityid'] : $metadata->getMetaDataCurrentEntityID('saml20-idp-hosted');
@@ -148,7 +151,7 @@
         );
 
         if (!$idpmeta->hasValue('OrganizationURL')) {
-            throw new \SimpleSAML\Error\Exception(
+            throw new Error\Exception(
                 'If OrganizationName is set, OrganizationURL must also be set.'
             );
         }
@@ -197,9 +200,11 @@
 
     $technicalContactEmail = $config->getString('technicalcontact_email', false);
     if ($technicalContactEmail && $technicalContactEmail !== 'na@example.org') {
-        $techcontact['emailAddress'] = $technicalContactEmail;
-        $techcontact['name'] = $config->getString('technicalcontact_name', null);
-        $techcontact['contactType'] = 'technical';
+        $techcontact = [
+            'emailAddress' => $technicalContactEmail,
+            'name' => $config->getString('technicalcontact_name', null),
+            'contactType' => 'technical',
+        ];
         $metaArray['contacts'][] = Metadata::getContact($techcontact);
     }
 
@@ -209,7 +214,7 @@
 
     $metaxml = $metaBuilder->getEntityDescriptorText();
 
-    $metaflat = '$metadata[' . var_export($idpentityid, true) . '] = ' . var_export($metaArray, true) . ';';
+    $metaflat = '$metadata[' . var_export($idpentityid, true) . '] = ' . VarExporter::export($metaArray) . ';';
 
     // sign the metadata if enabled
     $metaxml = \SimpleSAML\Metadata\Signer::sign($metaxml, $idpmeta->toArray(), 'SAML 2 IdP');
@@ -237,11 +242,11 @@
         $t->data['metadataflat'] = htmlspecialchars($metaflat);
         $t->show();
     } else {
-        header('Content-Type: application/xml');
+        header('Content-Type: application/samlmetadata+xml');
 
         echo $metaxml;
         exit(0);
     }
 } catch (\Exception $exception) {
-    throw new \SimpleSAML\Error\Error('METADATA', $exception);
+    throw new Error\Error('METADATA', $exception);
 }
diff --git a/vendor/simplesamlphp/simplesamlphp/www/shib13/idp/SSOService.php b/vendor/simplesamlphp/simplesamlphp/www/shib13/idp/SSOService.php
index 14a014fcdb8e8e56b948534494fdea47c34ade5e..1bc2ff7cafc8f40d940635f11e6337fede0b9ec1 100644
--- a/vendor/simplesamlphp/simplesamlphp/www/shib13/idp/SSOService.php
+++ b/vendor/simplesamlphp/simplesamlphp/www/shib13/idp/SSOService.php
@@ -12,6 +12,7 @@
 require_once '../../_include.php';
 
 \SimpleSAML\Logger::info('Shib1.3 - IdP.SSOService: Accessing Shibboleth 1.3 IdP endpoint SSOService');
+\SimpleSAML\Logger::notice('SAML1 support is deprecated and will be removed in SimpleSAMLphp 2.0');
 
 $metadata = \SimpleSAML\Metadata\MetaDataStorageHandler::getMetadataHandler();
 $idpEntityId = $metadata->getMetaDataCurrentEntityID('shib13-idp-hosted');
diff --git a/vendor/symfony/cache-contracts/.gitignore b/vendor/symfony/cache-contracts/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c49a5d8df5c6548379f00c77fe572a7217bce218
--- /dev/null
+++ b/vendor/symfony/cache-contracts/.gitignore
@@ -0,0 +1,3 @@
+vendor/
+composer.lock
+phpunit.xml
diff --git a/vendor/symfony/cache-contracts/CHANGELOG.md b/vendor/symfony/cache-contracts/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..7932e26132d319374a768a73230e78c12535987c
--- /dev/null
+++ b/vendor/symfony/cache-contracts/CHANGELOG.md
@@ -0,0 +1,5 @@
+CHANGELOG
+=========
+
+The changelog is maintained for all Symfony contracts at the following URL:
+https://github.com/symfony/contracts/blob/main/CHANGELOG.md
diff --git a/vendor/symfony/cache-contracts/CacheInterface.php b/vendor/symfony/cache-contracts/CacheInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..67e4dfd3a10257850fa6f8f8184e26da17aff3c1
--- /dev/null
+++ b/vendor/symfony/cache-contracts/CacheInterface.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Cache;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\InvalidArgumentException;
+
+/**
+ * Covers most simple to advanced caching needs.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface CacheInterface
+{
+    /**
+     * Fetches a value from the pool or computes it if not found.
+     *
+     * On cache misses, a callback is called that should return the missing value.
+     * This callback is given a PSR-6 CacheItemInterface instance corresponding to the
+     * requested key, that could be used e.g. for expiration control. It could also
+     * be an ItemInterface instance when its additional features are needed.
+     *
+     * @param string                     $key       The key of the item to retrieve from the cache
+     * @param callable|CallbackInterface $callback  Should return the computed value for the given key/item
+     * @param float|null                 $beta      A float that, as it grows, controls the likeliness of triggering
+     *                                              early expiration. 0 disables it, INF forces immediate expiration.
+     *                                              The default (or providing null) is implementation dependent but should
+     *                                              typically be 1.0, which should provide optimal stampede protection.
+     *                                              See https://en.wikipedia.org/wiki/Cache_stampede#Probabilistic_early_expiration
+     * @param array                      &$metadata The metadata of the cached item {@see ItemInterface::getMetadata()}
+     *
+     * @return mixed
+     *
+     * @throws InvalidArgumentException When $key is not valid or when $beta is negative
+     */
+    public function get(string $key, callable $callback, float $beta = null, array &$metadata = null);
+
+    /**
+     * Removes an item from the pool.
+     *
+     * @param string $key The key to delete
+     *
+     * @throws InvalidArgumentException When $key is not valid
+     *
+     * @return bool True if the item was successfully removed, false if there was any error
+     */
+    public function delete(string $key): bool;
+}
diff --git a/vendor/symfony/cache-contracts/CacheTrait.php b/vendor/symfony/cache-contracts/CacheTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..d340e069623f900eea2be71697e780a560909524
--- /dev/null
+++ b/vendor/symfony/cache-contracts/CacheTrait.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Cache;
+
+use Psr\Cache\CacheItemPoolInterface;
+use Psr\Cache\InvalidArgumentException;
+use Psr\Log\LoggerInterface;
+
+// Help opcache.preload discover always-needed symbols
+class_exists(InvalidArgumentException::class);
+
+/**
+ * An implementation of CacheInterface for PSR-6 CacheItemPoolInterface classes.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+trait CacheTrait
+{
+    /**
+     * {@inheritdoc}
+     *
+     * @return mixed
+     */
+    public function get(string $key, callable $callback, float $beta = null, array &$metadata = null)
+    {
+        return $this->doGet($this, $key, $callback, $beta, $metadata);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete(string $key): bool
+    {
+        return $this->deleteItem($key);
+    }
+
+    private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null, LoggerInterface $logger = null)
+    {
+        if (0 > $beta = $beta ?? 1.0) {
+            throw new class(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)) extends \InvalidArgumentException implements InvalidArgumentException { };
+        }
+
+        $item = $pool->getItem($key);
+        $recompute = !$item->isHit() || \INF === $beta;
+        $metadata = $item instanceof ItemInterface ? $item->getMetadata() : [];
+
+        if (!$recompute && $metadata) {
+            $expiry = $metadata[ItemInterface::METADATA_EXPIRY] ?? false;
+            $ctime = $metadata[ItemInterface::METADATA_CTIME] ?? false;
+
+            if ($recompute = $ctime && $expiry && $expiry <= ($now = microtime(true)) - $ctime / 1000 * $beta * log(random_int(1, \PHP_INT_MAX) / \PHP_INT_MAX)) {
+                // force applying defaultLifetime to expiry
+                $item->expiresAt(null);
+                $logger && $logger->info('Item "{key}" elected for early recomputation {delta}s before its expiration', [
+                    'key' => $key,
+                    'delta' => sprintf('%.1f', $expiry - $now),
+                ]);
+            }
+        }
+
+        if ($recompute) {
+            $save = true;
+            $item->set($callback($item, $save));
+            if ($save) {
+                $pool->save($item);
+            }
+        }
+
+        return $item->get();
+    }
+}
diff --git a/vendor/symfony/cache-contracts/CallbackInterface.php b/vendor/symfony/cache-contracts/CallbackInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..7dae2aac373606977dc7291843c8b67faf99cfc9
--- /dev/null
+++ b/vendor/symfony/cache-contracts/CallbackInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Cache;
+
+use Psr\Cache\CacheItemInterface;
+
+/**
+ * Computes and returns the cached value of an item.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface CallbackInterface
+{
+    /**
+     * @param CacheItemInterface|ItemInterface $item  The item to compute the value for
+     * @param bool                             &$save Should be set to false when the value should not be saved in the pool
+     *
+     * @return mixed The computed value for the passed item
+     */
+    public function __invoke(CacheItemInterface $item, bool &$save);
+}
diff --git a/vendor/symfony/cache-contracts/ItemInterface.php b/vendor/symfony/cache-contracts/ItemInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..10c048897c2fdb4bef571f8092224bb9ef7cd46f
--- /dev/null
+++ b/vendor/symfony/cache-contracts/ItemInterface.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Cache;
+
+use Psr\Cache\CacheException;
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\InvalidArgumentException;
+
+/**
+ * Augments PSR-6's CacheItemInterface with support for tags and metadata.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface ItemInterface extends CacheItemInterface
+{
+    /**
+     * References the Unix timestamp stating when the item will expire.
+     */
+    public const METADATA_EXPIRY = 'expiry';
+
+    /**
+     * References the time the item took to be created, in milliseconds.
+     */
+    public const METADATA_CTIME = 'ctime';
+
+    /**
+     * References the list of tags that were assigned to the item, as string[].
+     */
+    public const METADATA_TAGS = 'tags';
+
+    /**
+     * Reserved characters that cannot be used in a key or tag.
+     */
+    public const RESERVED_CHARACTERS = '{}()/\@:';
+
+    /**
+     * Adds a tag to a cache item.
+     *
+     * Tags are strings that follow the same validation rules as keys.
+     *
+     * @param string|string[] $tags A tag or array of tags
+     *
+     * @return $this
+     *
+     * @throws InvalidArgumentException When $tag is not valid
+     * @throws CacheException           When the item comes from a pool that is not tag-aware
+     */
+    public function tag($tags): self;
+
+    /**
+     * Returns a list of metadata info that were saved alongside with the cached value.
+     *
+     * See ItemInterface::METADATA_* consts for keys potentially found in the returned array.
+     */
+    public function getMetadata(): array;
+}
diff --git a/vendor/symfony/cache-contracts/LICENSE b/vendor/symfony/cache-contracts/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..74cdc2dbf6dbec4aea949b7bd47e3ee1e8c421e7
--- /dev/null
+++ b/vendor/symfony/cache-contracts/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2018-2022 Fabien Potencier
+
+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/vendor/symfony/cache-contracts/README.md b/vendor/symfony/cache-contracts/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..7085a6996e4d7afec141692ad69d4f545af7fcfd
--- /dev/null
+++ b/vendor/symfony/cache-contracts/README.md
@@ -0,0 +1,9 @@
+Symfony Cache Contracts
+=======================
+
+A set of abstractions extracted out of the Symfony components.
+
+Can be used to build on semantics that the Symfony components proved useful - and
+that already have battle tested implementations.
+
+See https://github.com/symfony/contracts/blob/main/README.md for more information.
diff --git a/vendor/symfony/cache-contracts/TagAwareCacheInterface.php b/vendor/symfony/cache-contracts/TagAwareCacheInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c4cf11116390449cd004c425b194e1e3c8b3fb5
--- /dev/null
+++ b/vendor/symfony/cache-contracts/TagAwareCacheInterface.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Cache;
+
+use Psr\Cache\InvalidArgumentException;
+
+/**
+ * Allows invalidating cached items using tags.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface TagAwareCacheInterface extends CacheInterface
+{
+    /**
+     * Invalidates cached items using tags.
+     *
+     * When implemented on a PSR-6 pool, invalidation should not apply
+     * to deferred items. Instead, they should be committed as usual.
+     * This allows replacing old tagged values by new ones without
+     * race conditions.
+     *
+     * @param string[] $tags An array of tags to invalidate
+     *
+     * @return bool True on success
+     *
+     * @throws InvalidArgumentException When $tags is not valid
+     */
+    public function invalidateTags(array $tags);
+}
diff --git a/vendor/symfony/cache-contracts/composer.json b/vendor/symfony/cache-contracts/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..9f45e17801c793534bb83a14916a8dfa8fe43240
--- /dev/null
+++ b/vendor/symfony/cache-contracts/composer.json
@@ -0,0 +1,38 @@
+{
+    "name": "symfony/cache-contracts",
+    "type": "library",
+    "description": "Generic abstractions related to caching",
+    "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nicolas Grekas",
+            "email": "p@tchwork.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=7.2.5",
+        "psr/cache": "^1.0|^2.0|^3.0"
+    },
+    "suggest": {
+        "symfony/cache-implementation": ""
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Contracts\\Cache\\": "" }
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-main": "2.5-dev"
+        },
+        "thanks": {
+            "name": "symfony/contracts",
+            "url": "https://github.com/symfony/contracts"
+        }
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/AbstractAdapter.php b/vendor/symfony/cache/Adapter/AbstractAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..3d01409227fa7ff89867d2bf1dd8721c342cd086
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/AbstractAdapter.php
@@ -0,0 +1,208 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\AbstractAdapterTrait;
+use Symfony\Component\Cache\Traits\ContractsTrait;
+use Symfony\Contracts\Cache\CacheInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+abstract class AbstractAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface
+{
+    use AbstractAdapterTrait;
+    use ContractsTrait;
+
+    /**
+     * @internal
+     */
+    protected const NS_SEPARATOR = ':';
+
+    private static $apcuSupported;
+    private static $phpFilesSupported;
+
+    protected function __construct(string $namespace = '', int $defaultLifetime = 0)
+    {
+        $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).static::NS_SEPARATOR;
+        $this->defaultLifetime = $defaultLifetime;
+        if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) {
+            throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given ("%s").', $this->maxIdLength - 24, \strlen($namespace), $namespace));
+        }
+        self::$createCacheItem ?? self::$createCacheItem = \Closure::bind(
+            static function ($key, $value, $isHit) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->value = $v = $value;
+                $item->isHit = $isHit;
+                // Detect wrapped values that encode for their expiry and creation duration
+                // For compactness, these values are packed in the key of an array using
+                // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F
+                if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) array_key_first($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) {
+                    $item->value = $v[$k];
+                    $v = unpack('Ve/Nc', substr($k, 1, -1));
+                    $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET;
+                    $item->metadata[CacheItem::METADATA_CTIME] = $v['c'];
+                }
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+        self::$mergeByLifetime ?? self::$mergeByLifetime = \Closure::bind(
+            static function ($deferred, $namespace, &$expiredIds, $getId, $defaultLifetime) {
+                $byLifetime = [];
+                $now = microtime(true);
+                $expiredIds = [];
+
+                foreach ($deferred as $key => $item) {
+                    $key = (string) $key;
+                    if (null === $item->expiry) {
+                        $ttl = 0 < $defaultLifetime ? $defaultLifetime : 0;
+                    } elseif (!$item->expiry) {
+                        $ttl = 0;
+                    } elseif (0 >= $ttl = (int) (0.1 + $item->expiry - $now)) {
+                        $expiredIds[] = $getId($key);
+                        continue;
+                    }
+                    if (isset(($metadata = $item->newMetadata)[CacheItem::METADATA_TAGS])) {
+                        unset($metadata[CacheItem::METADATA_TAGS]);
+                    }
+                    // For compactness, expiry and creation duration are packed in the key of an array, using magic numbers as separators
+                    $byLifetime[$ttl][$getId($key)] = $metadata ? ["\x9D".pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME])."\x5F" => $item->value] : $item->value;
+                }
+
+                return $byLifetime;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * Returns the best possible adapter that your runtime supports.
+     *
+     * Using ApcuAdapter makes system caches compatible with read-only filesystems.
+     *
+     * @return AdapterInterface
+     */
+    public static function createSystemCache(string $namespace, int $defaultLifetime, string $version, string $directory, LoggerInterface $logger = null)
+    {
+        $opcache = new PhpFilesAdapter($namespace, $defaultLifetime, $directory, true);
+        if (null !== $logger) {
+            $opcache->setLogger($logger);
+        }
+
+        if (!self::$apcuSupported = self::$apcuSupported ?? ApcuAdapter::isSupported()) {
+            return $opcache;
+        }
+
+        if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) && !filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) {
+            return $opcache;
+        }
+
+        $apcu = new ApcuAdapter($namespace, intdiv($defaultLifetime, 5), $version);
+        if (null !== $logger) {
+            $apcu->setLogger($logger);
+        }
+
+        return new ChainAdapter([$apcu, $opcache]);
+    }
+
+    public static function createConnection(string $dsn, array $options = [])
+    {
+        if (str_starts_with($dsn, 'redis:') || str_starts_with($dsn, 'rediss:')) {
+            return RedisAdapter::createConnection($dsn, $options);
+        }
+        if (str_starts_with($dsn, 'memcached:')) {
+            return MemcachedAdapter::createConnection($dsn, $options);
+        }
+        if (0 === strpos($dsn, 'couchbase:')) {
+            if (CouchbaseBucketAdapter::isSupported()) {
+                return CouchbaseBucketAdapter::createConnection($dsn, $options);
+            }
+
+            return CouchbaseCollectionAdapter::createConnection($dsn, $options);
+        }
+
+        throw new InvalidArgumentException(sprintf('Unsupported DSN: "%s".', $dsn));
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function commit()
+    {
+        $ok = true;
+        $byLifetime = (self::$mergeByLifetime)($this->deferred, $this->namespace, $expiredIds, \Closure::fromCallable([$this, 'getId']), $this->defaultLifetime);
+        $retry = $this->deferred = [];
+
+        if ($expiredIds) {
+            try {
+                $this->doDelete($expiredIds);
+            } catch (\Exception $e) {
+                $ok = false;
+                CacheItem::log($this->logger, 'Failed to delete expired items: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+            }
+        }
+        foreach ($byLifetime as $lifetime => $values) {
+            try {
+                $e = $this->doSave($values, $lifetime);
+            } catch (\Exception $e) {
+            }
+            if (true === $e || [] === $e) {
+                continue;
+            }
+            if (\is_array($e) || 1 === \count($values)) {
+                foreach (\is_array($e) ? $e : array_keys($values) as $id) {
+                    $ok = false;
+                    $v = $values[$id];
+                    $type = get_debug_type($v);
+                    $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.');
+                    CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
+                }
+            } else {
+                foreach ($values as $id => $v) {
+                    $retry[$lifetime][] = $id;
+                }
+            }
+        }
+
+        // When bulk-save failed, retry each item individually
+        foreach ($retry as $lifetime => $ids) {
+            foreach ($ids as $id) {
+                try {
+                    $v = $byLifetime[$lifetime][$id];
+                    $e = $this->doSave([$id => $v], $lifetime);
+                } catch (\Exception $e) {
+                }
+                if (true === $e || [] === $e) {
+                    continue;
+                }
+                $ok = false;
+                $type = get_debug_type($v);
+                $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.');
+                CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
+            }
+        }
+
+        return $ok;
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php b/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..a384b16adf55fd039f7b1cff8abfa5db9029f8ea
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php
@@ -0,0 +1,330 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Log\LoggerAwareInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\AbstractAdapterTrait;
+use Symfony\Component\Cache\Traits\ContractsTrait;
+use Symfony\Contracts\Cache\TagAwareCacheInterface;
+
+/**
+ * Abstract for native TagAware adapters.
+ *
+ * To keep info on tags, the tags are both serialized as part of cache value and provided as tag ids
+ * to Adapters on operations when needed for storage to doSave(), doDelete() & doInvalidate().
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ * @author André Rømcke <andre.romcke+symfony@gmail.com>
+ *
+ * @internal
+ */
+abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, LoggerAwareInterface, ResettableInterface
+{
+    use AbstractAdapterTrait;
+    use ContractsTrait;
+
+    private const TAGS_PREFIX = "\0tags\0";
+
+    protected function __construct(string $namespace = '', int $defaultLifetime = 0)
+    {
+        $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).':';
+        $this->defaultLifetime = $defaultLifetime;
+        if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) {
+            throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given ("%s").', $this->maxIdLength - 24, \strlen($namespace), $namespace));
+        }
+        self::$createCacheItem ?? self::$createCacheItem = \Closure::bind(
+            static function ($key, $value, $isHit) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->isTaggable = true;
+                // If structure does not match what we expect return item as is (no value and not a hit)
+                if (!\is_array($value) || !\array_key_exists('value', $value)) {
+                    return $item;
+                }
+                $item->isHit = $isHit;
+                // Extract value, tags and meta data from the cache value
+                $item->value = $value['value'];
+                $item->metadata[CacheItem::METADATA_TAGS] = $value['tags'] ?? [];
+                if (isset($value['meta'])) {
+                    // For compactness these values are packed, & expiry is offset to reduce size
+                    $v = unpack('Ve/Nc', $value['meta']);
+                    $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET;
+                    $item->metadata[CacheItem::METADATA_CTIME] = $v['c'];
+                }
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+        self::$mergeByLifetime ?? self::$mergeByLifetime = \Closure::bind(
+            static function ($deferred, &$expiredIds, $getId, $tagPrefix, $defaultLifetime) {
+                $byLifetime = [];
+                $now = microtime(true);
+                $expiredIds = [];
+
+                foreach ($deferred as $key => $item) {
+                    $key = (string) $key;
+                    if (null === $item->expiry) {
+                        $ttl = 0 < $defaultLifetime ? $defaultLifetime : 0;
+                    } elseif (!$item->expiry) {
+                        $ttl = 0;
+                    } elseif (0 >= $ttl = (int) (0.1 + $item->expiry - $now)) {
+                        $expiredIds[] = $getId($key);
+                        continue;
+                    }
+                    // Store Value and Tags on the cache value
+                    if (isset(($metadata = $item->newMetadata)[CacheItem::METADATA_TAGS])) {
+                        $value = ['value' => $item->value, 'tags' => $metadata[CacheItem::METADATA_TAGS]];
+                        unset($metadata[CacheItem::METADATA_TAGS]);
+                    } else {
+                        $value = ['value' => $item->value, 'tags' => []];
+                    }
+
+                    if ($metadata) {
+                        // For compactness, expiry and creation duration are packed, using magic numbers as separators
+                        $value['meta'] = pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME]);
+                    }
+
+                    // Extract tag changes, these should be removed from values in doSave()
+                    $value['tag-operations'] = ['add' => [], 'remove' => []];
+                    $oldTags = $item->metadata[CacheItem::METADATA_TAGS] ?? [];
+                    foreach (array_diff($value['tags'], $oldTags) as $addedTag) {
+                        $value['tag-operations']['add'][] = $getId($tagPrefix.$addedTag);
+                    }
+                    foreach (array_diff($oldTags, $value['tags']) as $removedTag) {
+                        $value['tag-operations']['remove'][] = $getId($tagPrefix.$removedTag);
+                    }
+
+                    $byLifetime[$ttl][$getId($key)] = $value;
+                    $item->metadata = $item->newMetadata;
+                }
+
+                return $byLifetime;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * Persists several cache items immediately.
+     *
+     * @param array   $values        The values to cache, indexed by their cache identifier
+     * @param int     $lifetime      The lifetime of the cached values, 0 for persisting until manual cleaning
+     * @param array[] $addTagData    Hash where key is tag id, and array value is list of cache id's to add to tag
+     * @param array[] $removeTagData Hash where key is tag id, and array value is list of cache id's to remove to tag
+     *
+     * @return array The identifiers that failed to be cached or a boolean stating if caching succeeded or not
+     */
+    abstract protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []): array;
+
+    /**
+     * Removes multiple items from the pool and their corresponding tags.
+     *
+     * @param array $ids An array of identifiers that should be removed from the pool
+     *
+     * @return bool
+     */
+    abstract protected function doDelete(array $ids);
+
+    /**
+     * Removes relations between tags and deleted items.
+     *
+     * @param array $tagData Array of tag => key identifiers that should be removed from the pool
+     */
+    abstract protected function doDeleteTagRelations(array $tagData): bool;
+
+    /**
+     * Invalidates cached items using tags.
+     *
+     * @param string[] $tagIds An array of tags to invalidate, key is tag and value is tag id
+     */
+    abstract protected function doInvalidate(array $tagIds): bool;
+
+    /**
+     * Delete items and yields the tags they were bound to.
+     */
+    protected function doDeleteYieldTags(array $ids): iterable
+    {
+        foreach ($this->doFetch($ids) as $id => $value) {
+            yield $id => \is_array($value) && \is_array($value['tags'] ?? null) ? $value['tags'] : [];
+        }
+
+        $this->doDelete($ids);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function commit(): bool
+    {
+        $ok = true;
+        $byLifetime = (self::$mergeByLifetime)($this->deferred, $expiredIds, \Closure::fromCallable([$this, 'getId']), self::TAGS_PREFIX, $this->defaultLifetime);
+        $retry = $this->deferred = [];
+
+        if ($expiredIds) {
+            // Tags are not cleaned up in this case, however that is done on invalidateTags().
+            try {
+                $this->doDelete($expiredIds);
+            } catch (\Exception $e) {
+                $ok = false;
+                CacheItem::log($this->logger, 'Failed to delete expired items: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+            }
+        }
+        foreach ($byLifetime as $lifetime => $values) {
+            try {
+                $values = $this->extractTagData($values, $addTagData, $removeTagData);
+                $e = $this->doSave($values, $lifetime, $addTagData, $removeTagData);
+            } catch (\Exception $e) {
+            }
+            if (true === $e || [] === $e) {
+                continue;
+            }
+            if (\is_array($e) || 1 === \count($values)) {
+                foreach (\is_array($e) ? $e : array_keys($values) as $id) {
+                    $ok = false;
+                    $v = $values[$id];
+                    $type = get_debug_type($v);
+                    $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.');
+                    CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
+                }
+            } else {
+                foreach ($values as $id => $v) {
+                    $retry[$lifetime][] = $id;
+                }
+            }
+        }
+
+        // When bulk-save failed, retry each item individually
+        foreach ($retry as $lifetime => $ids) {
+            foreach ($ids as $id) {
+                try {
+                    $v = $byLifetime[$lifetime][$id];
+                    $values = $this->extractTagData([$id => $v], $addTagData, $removeTagData);
+                    $e = $this->doSave($values, $lifetime, $addTagData, $removeTagData);
+                } catch (\Exception $e) {
+                }
+                if (true === $e || [] === $e) {
+                    continue;
+                }
+                $ok = false;
+                $type = get_debug_type($v);
+                $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.');
+                CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
+            }
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItems(array $keys): bool
+    {
+        if (!$keys) {
+            return true;
+        }
+
+        $ok = true;
+        $ids = [];
+        $tagData = [];
+
+        foreach ($keys as $key) {
+            $ids[$key] = $this->getId($key);
+            unset($this->deferred[$key]);
+        }
+
+        try {
+            foreach ($this->doDeleteYieldTags(array_values($ids)) as $id => $tags) {
+                foreach ($tags as $tag) {
+                    $tagData[$this->getId(self::TAGS_PREFIX.$tag)][] = $id;
+                }
+            }
+        } catch (\Exception $e) {
+            $ok = false;
+        }
+
+        try {
+            if ((!$tagData || $this->doDeleteTagRelations($tagData)) && $ok) {
+                return true;
+            }
+        } catch (\Exception $e) {
+        }
+
+        // When bulk-delete failed, retry each item individually
+        foreach ($ids as $key => $id) {
+            try {
+                $e = null;
+                if ($this->doDelete([$id])) {
+                    continue;
+                }
+            } catch (\Exception $e) {
+            }
+            $message = 'Failed to delete key "{key}"'.($e instanceof \Exception ? ': '.$e->getMessage() : '.');
+            CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+            $ok = false;
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function invalidateTags(array $tags)
+    {
+        if (empty($tags)) {
+            return false;
+        }
+
+        $tagIds = [];
+        foreach (array_unique($tags) as $tag) {
+            $tagIds[] = $this->getId(self::TAGS_PREFIX.$tag);
+        }
+
+        try {
+            if ($this->doInvalidate($tagIds)) {
+                return true;
+            }
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to invalidate tags: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+        }
+
+        return false;
+    }
+
+    /**
+     * Extracts tags operation data from $values set in mergeByLifetime, and returns values without it.
+     */
+    private function extractTagData(array $values, ?array &$addTagData, ?array &$removeTagData): array
+    {
+        $addTagData = $removeTagData = [];
+        foreach ($values as $id => $value) {
+            foreach ($value['tag-operations']['add'] as $tag => $tagId) {
+                $addTagData[$tagId][] = $id;
+            }
+
+            foreach ($value['tag-operations']['remove'] as $tag => $tagId) {
+                $removeTagData[$tagId][] = $id;
+            }
+
+            unset($values[$id]['tag-operations']);
+        }
+
+        return $values;
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/AdapterInterface.php b/vendor/symfony/cache/Adapter/AdapterInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..f8dce866d2d663821056fa32b8a4d5f038e55559
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/AdapterInterface.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\CacheItem;
+
+// Help opcache.preload discover always-needed symbols
+class_exists(CacheItem::class);
+
+/**
+ * Interface for adapters managing instances of Symfony's CacheItem.
+ *
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ */
+interface AdapterInterface extends CacheItemPoolInterface
+{
+    /**
+     * {@inheritdoc}
+     *
+     * @return CacheItem
+     */
+    public function getItem($key);
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Traversable<string, CacheItem>
+     */
+    public function getItems(array $keys = []);
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function clear(string $prefix = '');
+}
diff --git a/vendor/symfony/cache/Adapter/ApcuAdapter.php b/vendor/symfony/cache/Adapter/ApcuAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..270a139e83a48c5f5daea59d8879df80b91049c5
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/ApcuAdapter.php
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ApcuAdapter extends AbstractAdapter
+{
+    private $marshaller;
+
+    /**
+     * @throws CacheException if APCu is not enabled
+     */
+    public function __construct(string $namespace = '', int $defaultLifetime = 0, string $version = null, MarshallerInterface $marshaller = null)
+    {
+        if (!static::isSupported()) {
+            throw new CacheException('APCu is not enabled.');
+        }
+        if ('cli' === \PHP_SAPI) {
+            ini_set('apc.use_request_time', 0);
+        }
+        parent::__construct($namespace, $defaultLifetime);
+
+        if (null !== $version) {
+            CacheItem::validateKey($version);
+
+            if (!apcu_exists($version.'@'.$namespace)) {
+                $this->doClear($namespace);
+                apcu_add($version.'@'.$namespace, null);
+            }
+        }
+
+        $this->marshaller = $marshaller;
+    }
+
+    public static function isSupported()
+    {
+        return \function_exists('apcu_fetch') && filter_var(\ini_get('apc.enabled'), \FILTER_VALIDATE_BOOLEAN);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');
+        try {
+            $values = [];
+            $ids = array_flip($ids);
+            foreach (apcu_fetch(array_keys($ids), $ok) ?: [] as $k => $v) {
+                if (!isset($ids[$k])) {
+                    // work around https://github.com/krakjoe/apcu/issues/247
+                    $k = key($ids);
+                }
+                unset($ids[$k]);
+
+                if (null !== $v || $ok) {
+                    $values[$k] = null !== $this->marshaller ? $this->marshaller->unmarshall($v) : $v;
+                }
+            }
+
+            return $values;
+        } catch (\Error $e) {
+            throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine());
+        } finally {
+            ini_set('unserialize_callback_func', $unserializeCallbackHandler);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave(string $id)
+    {
+        return apcu_exists($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace)
+    {
+        return isset($namespace[0]) && class_exists(\APCUIterator::class, false) && ('cli' !== \PHP_SAPI || filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN))
+            ? apcu_delete(new \APCUIterator(sprintf('/^%s/', preg_quote($namespace, '/')), \APC_ITER_KEY))
+            : apcu_clear_cache();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        foreach ($ids as $id) {
+            apcu_delete($id);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime)
+    {
+        if (null !== $this->marshaller && (!$values = $this->marshaller->marshall($values, $failed))) {
+            return $failed;
+        }
+
+        try {
+            if (false === $failures = apcu_store($values, null, $lifetime)) {
+                $failures = $values;
+            }
+
+            return array_keys($failures);
+        } catch (\Throwable $e) {
+            if (1 === \count($values)) {
+                // Workaround https://github.com/krakjoe/apcu/issues/170
+                apcu_delete(array_key_first($values));
+            }
+
+            throw $e;
+        }
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/ArrayAdapter.php b/vendor/symfony/cache/Adapter/ArrayAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..d8695b743dae2a45f8dabfdc251bfda43eeefab8
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/ArrayAdapter.php
@@ -0,0 +1,407 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Contracts\Cache\CacheInterface;
+
+/**
+ * An in-memory cache storage.
+ *
+ * Acts as a least-recently-used (LRU) storage when configured with a maximum number of items.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface
+{
+    use LoggerAwareTrait;
+
+    private $storeSerialized;
+    private $values = [];
+    private $expiries = [];
+    private $defaultLifetime;
+    private $maxLifetime;
+    private $maxItems;
+
+    private static $createCacheItem;
+
+    /**
+     * @param bool $storeSerialized Disabling serialization can lead to cache corruptions when storing mutable values but increases performance otherwise
+     */
+    public function __construct(int $defaultLifetime = 0, bool $storeSerialized = true, float $maxLifetime = 0, int $maxItems = 0)
+    {
+        if (0 > $maxLifetime) {
+            throw new InvalidArgumentException(sprintf('Argument $maxLifetime must be positive, %F passed.', $maxLifetime));
+        }
+
+        if (0 > $maxItems) {
+            throw new InvalidArgumentException(sprintf('Argument $maxItems must be a positive integer, %d passed.', $maxItems));
+        }
+
+        $this->defaultLifetime = $defaultLifetime;
+        $this->storeSerialized = $storeSerialized;
+        $this->maxLifetime = $maxLifetime;
+        $this->maxItems = $maxItems;
+        self::$createCacheItem ?? self::$createCacheItem = \Closure::bind(
+            static function ($key, $value, $isHit) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->value = $value;
+                $item->isHit = $isHit;
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get(string $key, callable $callback, float $beta = null, array &$metadata = null)
+    {
+        $item = $this->getItem($key);
+        $metadata = $item->getMetadata();
+
+        // ArrayAdapter works in memory, we don't care about stampede protection
+        if (\INF === $beta || !$item->isHit()) {
+            $save = true;
+            $item->set($callback($item, $save));
+            if ($save) {
+                $this->save($item);
+            }
+        }
+
+        return $item->get();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete(string $key): bool
+    {
+        return $this->deleteItem($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function hasItem($key)
+    {
+        if (\is_string($key) && isset($this->expiries[$key]) && $this->expiries[$key] > microtime(true)) {
+            if ($this->maxItems) {
+                // Move the item last in the storage
+                $value = $this->values[$key];
+                unset($this->values[$key]);
+                $this->values[$key] = $value;
+            }
+
+            return true;
+        }
+        \assert('' !== CacheItem::validateKey($key));
+
+        return isset($this->expiries[$key]) && !$this->deleteItem($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        if (!$isHit = $this->hasItem($key)) {
+            $value = null;
+
+            if (!$this->maxItems) {
+                // Track misses in non-LRU mode only
+                $this->values[$key] = null;
+            }
+        } else {
+            $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key];
+        }
+
+        return (self::$createCacheItem)($key, $value, $isHit);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = [])
+    {
+        \assert(self::validateKeys($keys));
+
+        return $this->generateItems($keys, microtime(true), self::$createCacheItem);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItem($key)
+    {
+        \assert('' !== CacheItem::validateKey($key));
+        unset($this->values[$key], $this->expiries[$key]);
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItems(array $keys)
+    {
+        foreach ($keys as $key) {
+            $this->deleteItem($key);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function save(CacheItemInterface $item)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $item = (array) $item;
+        $key = $item["\0*\0key"];
+        $value = $item["\0*\0value"];
+        $expiry = $item["\0*\0expiry"];
+
+        $now = microtime(true);
+
+        if (null !== $expiry) {
+            if (!$expiry) {
+                $expiry = \PHP_INT_MAX;
+            } elseif ($expiry <= $now) {
+                $this->deleteItem($key);
+
+                return true;
+            }
+        }
+        if ($this->storeSerialized && null === $value = $this->freeze($value, $key)) {
+            return false;
+        }
+        if (null === $expiry && 0 < $this->defaultLifetime) {
+            $expiry = $this->defaultLifetime;
+            $expiry = $now + ($expiry > ($this->maxLifetime ?: $expiry) ? $this->maxLifetime : $expiry);
+        } elseif ($this->maxLifetime && (null === $expiry || $expiry > $now + $this->maxLifetime)) {
+            $expiry = $now + $this->maxLifetime;
+        }
+
+        if ($this->maxItems) {
+            unset($this->values[$key]);
+
+            // Iterate items and vacuum expired ones while we are at it
+            foreach ($this->values as $k => $v) {
+                if ($this->expiries[$k] > $now && \count($this->values) < $this->maxItems) {
+                    break;
+                }
+
+                unset($this->values[$k], $this->expiries[$k]);
+            }
+        }
+
+        $this->values[$key] = $value;
+        $this->expiries[$key] = $expiry ?? \PHP_INT_MAX;
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        return $this->save($item);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function commit()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function clear(string $prefix = '')
+    {
+        if ('' !== $prefix) {
+            $now = microtime(true);
+
+            foreach ($this->values as $key => $value) {
+                if (!isset($this->expiries[$key]) || $this->expiries[$key] <= $now || 0 === strpos($key, $prefix)) {
+                    unset($this->values[$key], $this->expiries[$key]);
+                }
+            }
+
+            if ($this->values) {
+                return true;
+            }
+        }
+
+        $this->values = $this->expiries = [];
+
+        return true;
+    }
+
+    /**
+     * Returns all cached values, with cache miss as null.
+     *
+     * @return array
+     */
+    public function getValues()
+    {
+        if (!$this->storeSerialized) {
+            return $this->values;
+        }
+
+        $values = $this->values;
+        foreach ($values as $k => $v) {
+            if (null === $v || 'N;' === $v) {
+                continue;
+            }
+            if (!\is_string($v) || !isset($v[2]) || ':' !== $v[1]) {
+                $values[$k] = serialize($v);
+            }
+        }
+
+        return $values;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        $this->clear();
+    }
+
+    private function generateItems(array $keys, float $now, \Closure $f): \Generator
+    {
+        foreach ($keys as $i => $key) {
+            if (!$isHit = isset($this->expiries[$key]) && ($this->expiries[$key] > $now || !$this->deleteItem($key))) {
+                $value = null;
+
+                if (!$this->maxItems) {
+                    // Track misses in non-LRU mode only
+                    $this->values[$key] = null;
+                }
+            } else {
+                if ($this->maxItems) {
+                    // Move the item last in the storage
+                    $value = $this->values[$key];
+                    unset($this->values[$key]);
+                    $this->values[$key] = $value;
+                }
+
+                $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key];
+            }
+            unset($keys[$i]);
+
+            yield $key => $f($key, $value, $isHit);
+        }
+
+        foreach ($keys as $key) {
+            yield $key => $f($key, null, false);
+        }
+    }
+
+    private function freeze($value, string $key)
+    {
+        if (null === $value) {
+            return 'N;';
+        }
+        if (\is_string($value)) {
+            // Serialize strings if they could be confused with serialized objects or arrays
+            if ('N;' === $value || (isset($value[2]) && ':' === $value[1])) {
+                return serialize($value);
+            }
+        } elseif (!\is_scalar($value)) {
+            try {
+                $serialized = serialize($value);
+            } catch (\Exception $e) {
+                unset($this->values[$key]);
+                $type = get_debug_type($value);
+                $message = sprintf('Failed to save key "{key}" of type %s: %s', $type, $e->getMessage());
+                CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+
+                return;
+            }
+            // Keep value serialized if it contains any objects or any internal references
+            if ('C' === $serialized[0] || 'O' === $serialized[0] || preg_match('/;[OCRr]:[1-9]/', $serialized)) {
+                return $serialized;
+            }
+        }
+
+        return $value;
+    }
+
+    private function unfreeze(string $key, bool &$isHit)
+    {
+        if ('N;' === $value = $this->values[$key]) {
+            return null;
+        }
+        if (\is_string($value) && isset($value[2]) && ':' === $value[1]) {
+            try {
+                $value = unserialize($value);
+            } catch (\Exception $e) {
+                CacheItem::log($this->logger, 'Failed to unserialize key "{key}": '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+                $value = false;
+            }
+            if (false === $value) {
+                $value = null;
+                $isHit = false;
+
+                if (!$this->maxItems) {
+                    $this->values[$key] = null;
+                }
+            }
+        }
+
+        return $value;
+    }
+
+    private function validateKeys(array $keys): bool
+    {
+        foreach ($keys as $key) {
+            if (!\is_string($key) || !isset($this->expiries[$key])) {
+                CacheItem::validateKey($key);
+            }
+        }
+
+        return true;
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/ChainAdapter.php b/vendor/symfony/cache/Adapter/ChainAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..059c0ed275da7c60bdf1cf5c617ecd34cb50a2c1
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/ChainAdapter.php
@@ -0,0 +1,342 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ContractsTrait;
+use Symfony\Contracts\Cache\CacheInterface;
+use Symfony\Contracts\Service\ResetInterface;
+
+/**
+ * Chains several adapters together.
+ *
+ * Cached items are fetched from the first adapter having them in its data store.
+ * They are saved and deleted in all adapters at once.
+ *
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ */
+class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface
+{
+    use ContractsTrait;
+
+    private $adapters = [];
+    private $adapterCount;
+    private $defaultLifetime;
+
+    private static $syncItem;
+
+    /**
+     * @param CacheItemPoolInterface[] $adapters        The ordered list of adapters used to fetch cached items
+     * @param int                      $defaultLifetime The default lifetime of items propagated from lower adapters to upper ones
+     */
+    public function __construct(array $adapters, int $defaultLifetime = 0)
+    {
+        if (!$adapters) {
+            throw new InvalidArgumentException('At least one adapter must be specified.');
+        }
+
+        foreach ($adapters as $adapter) {
+            if (!$adapter instanceof CacheItemPoolInterface) {
+                throw new InvalidArgumentException(sprintf('The class "%s" does not implement the "%s" interface.', get_debug_type($adapter), CacheItemPoolInterface::class));
+            }
+            if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) && $adapter instanceof ApcuAdapter && !filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) {
+                continue; // skip putting APCu in the chain when the backend is disabled
+            }
+
+            if ($adapter instanceof AdapterInterface) {
+                $this->adapters[] = $adapter;
+            } else {
+                $this->adapters[] = new ProxyAdapter($adapter);
+            }
+        }
+        $this->adapterCount = \count($this->adapters);
+        $this->defaultLifetime = $defaultLifetime;
+
+        self::$syncItem ?? self::$syncItem = \Closure::bind(
+            static function ($sourceItem, $item, $defaultLifetime, $sourceMetadata = null) {
+                $sourceItem->isTaggable = false;
+                $sourceMetadata = $sourceMetadata ?? $sourceItem->metadata;
+                unset($sourceMetadata[CacheItem::METADATA_TAGS]);
+
+                $item->value = $sourceItem->value;
+                $item->isHit = $sourceItem->isHit;
+                $item->metadata = $item->newMetadata = $sourceItem->metadata = $sourceMetadata;
+
+                if (isset($item->metadata[CacheItem::METADATA_EXPIRY])) {
+                    $item->expiresAt(\DateTime::createFromFormat('U.u', sprintf('%.6F', $item->metadata[CacheItem::METADATA_EXPIRY])));
+                } elseif (0 < $defaultLifetime) {
+                    $item->expiresAfter($defaultLifetime);
+                }
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get(string $key, callable $callback, float $beta = null, array &$metadata = null)
+    {
+        $doSave = true;
+        $callback = static function (CacheItem $item, bool &$save) use ($callback, &$doSave) {
+            $value = $callback($item, $save);
+            $doSave = $save;
+
+            return $value;
+        };
+
+        $lastItem = null;
+        $i = 0;
+        $wrap = function (CacheItem $item = null, bool &$save = true) use ($key, $callback, $beta, &$wrap, &$i, &$doSave, &$lastItem, &$metadata) {
+            $adapter = $this->adapters[$i];
+            if (isset($this->adapters[++$i])) {
+                $callback = $wrap;
+                $beta = \INF === $beta ? \INF : 0;
+            }
+            if ($adapter instanceof CacheInterface) {
+                $value = $adapter->get($key, $callback, $beta, $metadata);
+            } else {
+                $value = $this->doGet($adapter, $key, $callback, $beta, $metadata);
+            }
+            if (null !== $item) {
+                (self::$syncItem)($lastItem = $lastItem ?? $item, $item, $this->defaultLifetime, $metadata);
+            }
+            $save = $doSave;
+
+            return $value;
+        };
+
+        return $wrap();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        $syncItem = self::$syncItem;
+        $misses = [];
+
+        foreach ($this->adapters as $i => $adapter) {
+            $item = $adapter->getItem($key);
+
+            if ($item->isHit()) {
+                while (0 <= --$i) {
+                    $this->adapters[$i]->save($syncItem($item, $misses[$i], $this->defaultLifetime));
+                }
+
+                return $item;
+            }
+
+            $misses[$i] = $item;
+        }
+
+        return $item;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = [])
+    {
+        return $this->generateItems($this->adapters[0]->getItems($keys), 0);
+    }
+
+    private function generateItems(iterable $items, int $adapterIndex): \Generator
+    {
+        $missing = [];
+        $misses = [];
+        $nextAdapterIndex = $adapterIndex + 1;
+        $nextAdapter = $this->adapters[$nextAdapterIndex] ?? null;
+
+        foreach ($items as $k => $item) {
+            if (!$nextAdapter || $item->isHit()) {
+                yield $k => $item;
+            } else {
+                $missing[] = $k;
+                $misses[$k] = $item;
+            }
+        }
+
+        if ($missing) {
+            $syncItem = self::$syncItem;
+            $adapter = $this->adapters[$adapterIndex];
+            $items = $this->generateItems($nextAdapter->getItems($missing), $nextAdapterIndex);
+
+            foreach ($items as $k => $item) {
+                if ($item->isHit()) {
+                    $adapter->save($syncItem($item, $misses[$k], $this->defaultLifetime));
+                }
+
+                yield $k => $item;
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function hasItem($key)
+    {
+        foreach ($this->adapters as $adapter) {
+            if ($adapter->hasItem($key)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function clear(string $prefix = '')
+    {
+        $cleared = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            if ($this->adapters[$i] instanceof AdapterInterface) {
+                $cleared = $this->adapters[$i]->clear($prefix) && $cleared;
+            } else {
+                $cleared = $this->adapters[$i]->clear() && $cleared;
+            }
+        }
+
+        return $cleared;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItem($key)
+    {
+        $deleted = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $deleted = $this->adapters[$i]->deleteItem($key) && $deleted;
+        }
+
+        return $deleted;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItems(array $keys)
+    {
+        $deleted = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $deleted = $this->adapters[$i]->deleteItems($keys) && $deleted;
+        }
+
+        return $deleted;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function save(CacheItemInterface $item)
+    {
+        $saved = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $saved = $this->adapters[$i]->save($item) && $saved;
+        }
+
+        return $saved;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        $saved = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $saved = $this->adapters[$i]->saveDeferred($item) && $saved;
+        }
+
+        return $saved;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function commit()
+    {
+        $committed = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $committed = $this->adapters[$i]->commit() && $committed;
+        }
+
+        return $committed;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        $pruned = true;
+
+        foreach ($this->adapters as $adapter) {
+            if ($adapter instanceof PruneableInterface) {
+                $pruned = $adapter->prune() && $pruned;
+            }
+        }
+
+        return $pruned;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        foreach ($this->adapters as $adapter) {
+            if ($adapter instanceof ResetInterface) {
+                $adapter->reset();
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php b/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..36d5249b4addc1705e1d754987849c85b7bd3764
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php
@@ -0,0 +1,252 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+
+/**
+ * @author Antonio Jose Cerezo Aranda <aj.cerezo@gmail.com>
+ */
+class CouchbaseBucketAdapter extends AbstractAdapter
+{
+    private const THIRTY_DAYS_IN_SECONDS = 2592000;
+    private const MAX_KEY_LENGTH = 250;
+    private const KEY_NOT_FOUND = 13;
+    private const VALID_DSN_OPTIONS = [
+        'operationTimeout',
+        'configTimeout',
+        'configNodeTimeout',
+        'n1qlTimeout',
+        'httpTimeout',
+        'configDelay',
+        'htconfigIdleTimeout',
+        'durabilityInterval',
+        'durabilityTimeout',
+    ];
+
+    private $bucket;
+    private $marshaller;
+
+    public function __construct(\CouchbaseBucket $bucket, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null)
+    {
+        if (!static::isSupported()) {
+            throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.');
+        }
+
+        $this->maxIdLength = static::MAX_KEY_LENGTH;
+
+        $this->bucket = $bucket;
+
+        parent::__construct($namespace, $defaultLifetime);
+        $this->enableVersioning();
+        $this->marshaller = $marshaller ?? new DefaultMarshaller();
+    }
+
+    /**
+     * @param array|string $servers
+     */
+    public static function createConnection($servers, array $options = []): \CouchbaseBucket
+    {
+        if (\is_string($servers)) {
+            $servers = [$servers];
+        } elseif (!\is_array($servers)) {
+            throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be array or string, "%s" given.', __METHOD__, get_debug_type($servers)));
+        }
+
+        if (!static::isSupported()) {
+            throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.');
+        }
+
+        set_error_handler(function ($type, $msg, $file, $line) { throw new \ErrorException($msg, 0, $type, $file, $line); });
+
+        $dsnPattern = '/^(?<protocol>couchbase(?:s)?)\:\/\/(?:(?<username>[^\:]+)\:(?<password>[^\@]{6,})@)?'
+            .'(?<host>[^\:]+(?:\:\d+)?)(?:\/(?<bucketName>[^\?]+))(?:\?(?<options>.*))?$/i';
+
+        $newServers = [];
+        $protocol = 'couchbase';
+        try {
+            $options = self::initOptions($options);
+            $username = $options['username'];
+            $password = $options['password'];
+
+            foreach ($servers as $dsn) {
+                if (0 !== strpos($dsn, 'couchbase:')) {
+                    throw new InvalidArgumentException(sprintf('Invalid Couchbase DSN: "%s" does not start with "couchbase:".', $dsn));
+                }
+
+                preg_match($dsnPattern, $dsn, $matches);
+
+                $username = $matches['username'] ?: $username;
+                $password = $matches['password'] ?: $password;
+                $protocol = $matches['protocol'] ?: $protocol;
+
+                if (isset($matches['options'])) {
+                    $optionsInDsn = self::getOptions($matches['options']);
+
+                    foreach ($optionsInDsn as $parameter => $value) {
+                        $options[$parameter] = $value;
+                    }
+                }
+
+                $newServers[] = $matches['host'];
+            }
+
+            $connectionString = $protocol.'://'.implode(',', $newServers);
+
+            $client = new \CouchbaseCluster($connectionString);
+            $client->authenticateAs($username, $password);
+
+            $bucket = $client->openBucket($matches['bucketName']);
+
+            unset($options['username'], $options['password']);
+            foreach ($options as $option => $value) {
+                if (!empty($value)) {
+                    $bucket->$option = $value;
+                }
+            }
+
+            return $bucket;
+        } finally {
+            restore_error_handler();
+        }
+    }
+
+    public static function isSupported(): bool
+    {
+        return \extension_loaded('couchbase') && version_compare(phpversion('couchbase'), '2.6.0', '>=') && version_compare(phpversion('couchbase'), '3.0', '<');
+    }
+
+    private static function getOptions(string $options): array
+    {
+        $results = [];
+        $optionsInArray = explode('&', $options);
+
+        foreach ($optionsInArray as $option) {
+            [$key, $value] = explode('=', $option);
+
+            if (\in_array($key, static::VALID_DSN_OPTIONS, true)) {
+                $results[$key] = $value;
+            }
+        }
+
+        return $results;
+    }
+
+    private static function initOptions(array $options): array
+    {
+        $options['username'] = $options['username'] ?? '';
+        $options['password'] = $options['password'] ?? '';
+        $options['operationTimeout'] = $options['operationTimeout'] ?? 0;
+        $options['configTimeout'] = $options['configTimeout'] ?? 0;
+        $options['configNodeTimeout'] = $options['configNodeTimeout'] ?? 0;
+        $options['n1qlTimeout'] = $options['n1qlTimeout'] ?? 0;
+        $options['httpTimeout'] = $options['httpTimeout'] ?? 0;
+        $options['configDelay'] = $options['configDelay'] ?? 0;
+        $options['htconfigIdleTimeout'] = $options['htconfigIdleTimeout'] ?? 0;
+        $options['durabilityInterval'] = $options['durabilityInterval'] ?? 0;
+        $options['durabilityTimeout'] = $options['durabilityTimeout'] ?? 0;
+
+        return $options;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        $resultsCouchbase = $this->bucket->get($ids);
+
+        $results = [];
+        foreach ($resultsCouchbase as $key => $value) {
+            if (null !== $value->error) {
+                continue;
+            }
+            $results[$key] = $this->marshaller->unmarshall($value->value);
+        }
+
+        return $results;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave(string $id): bool
+    {
+        return false !== $this->bucket->get($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace): bool
+    {
+        if ('' === $namespace) {
+            $this->bucket->manager()->flush();
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids): bool
+    {
+        $results = $this->bucket->remove(array_values($ids));
+
+        foreach ($results as $key => $result) {
+            if (null !== $result->error && static::KEY_NOT_FOUND !== $result->error->getCode()) {
+                continue;
+            }
+            unset($results[$key]);
+        }
+
+        return 0 === \count($results);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime)
+    {
+        if (!$values = $this->marshaller->marshall($values, $failed)) {
+            return $failed;
+        }
+
+        $lifetime = $this->normalizeExpiry($lifetime);
+
+        $ko = [];
+        foreach ($values as $key => $value) {
+            $result = $this->bucket->upsert($key, $value, ['expiry' => $lifetime]);
+
+            if (null !== $result->error) {
+                $ko[$key] = $result;
+            }
+        }
+
+        return [] === $ko ? true : $ko;
+    }
+
+    private function normalizeExpiry(int $expiry): int
+    {
+        if ($expiry && $expiry > static::THIRTY_DAYS_IN_SECONDS) {
+            $expiry += time();
+        }
+
+        return $expiry;
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php b/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..79f648531c23077be3e6f99fb4c6863609546686
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php
@@ -0,0 +1,222 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Couchbase\Bucket;
+use Couchbase\Cluster;
+use Couchbase\ClusterOptions;
+use Couchbase\Collection;
+use Couchbase\DocumentNotFoundException;
+use Couchbase\UpsertOptions;
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+
+/**
+ * @author Antonio Jose Cerezo Aranda <aj.cerezo@gmail.com>
+ */
+class CouchbaseCollectionAdapter extends AbstractAdapter
+{
+    private const MAX_KEY_LENGTH = 250;
+
+    /** @var Collection */
+    private $connection;
+    private $marshaller;
+
+    public function __construct(Collection $connection, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null)
+    {
+        if (!static::isSupported()) {
+            throw new CacheException('Couchbase >= 3.0.0 < 4.0.0 is required.');
+        }
+
+        $this->maxIdLength = static::MAX_KEY_LENGTH;
+
+        $this->connection = $connection;
+
+        parent::__construct($namespace, $defaultLifetime);
+        $this->enableVersioning();
+        $this->marshaller = $marshaller ?? new DefaultMarshaller();
+    }
+
+    /**
+     * @param array|string $dsn
+     *
+     * @return Bucket|Collection
+     */
+    public static function createConnection($dsn, array $options = [])
+    {
+        if (\is_string($dsn)) {
+            $dsn = [$dsn];
+        } elseif (!\is_array($dsn)) {
+            throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be array or string, "%s" given.', __METHOD__, get_debug_type($dsn)));
+        }
+
+        if (!static::isSupported()) {
+            throw new CacheException('Couchbase >= 3.0.0 < 4.0.0 is required.');
+        }
+
+        set_error_handler(function ($type, $msg, $file, $line): bool { throw new \ErrorException($msg, 0, $type, $file, $line); });
+
+        $dsnPattern = '/^(?<protocol>couchbase(?:s)?)\:\/\/(?:(?<username>[^\:]+)\:(?<password>[^\@]{6,})@)?'
+            .'(?<host>[^\:]+(?:\:\d+)?)(?:\/(?<bucketName>[^\/\?]+))(?:(?:\/(?<scopeName>[^\/]+))'
+            .'(?:\/(?<collectionName>[^\/\?]+)))?(?:\/)?(?:\?(?<options>.*))?$/i';
+
+        $newServers = [];
+        $protocol = 'couchbase';
+        try {
+            $username = $options['username'] ?? '';
+            $password = $options['password'] ?? '';
+
+            foreach ($dsn as $server) {
+                if (0 !== strpos($server, 'couchbase:')) {
+                    throw new InvalidArgumentException(sprintf('Invalid Couchbase DSN: "%s" does not start with "couchbase:".', $server));
+                }
+
+                preg_match($dsnPattern, $server, $matches);
+
+                $username = $matches['username'] ?: $username;
+                $password = $matches['password'] ?: $password;
+                $protocol = $matches['protocol'] ?: $protocol;
+
+                if (isset($matches['options'])) {
+                    $optionsInDsn = self::getOptions($matches['options']);
+
+                    foreach ($optionsInDsn as $parameter => $value) {
+                        $options[$parameter] = $value;
+                    }
+                }
+
+                $newServers[] = $matches['host'];
+            }
+
+            $option = isset($matches['options']) ? '?'.$matches['options'] : '';
+            $connectionString = $protocol.'://'.implode(',', $newServers).$option;
+
+            $clusterOptions = new ClusterOptions();
+            $clusterOptions->credentials($username, $password);
+
+            $client = new Cluster($connectionString, $clusterOptions);
+
+            $bucket = $client->bucket($matches['bucketName']);
+            $collection = $bucket->defaultCollection();
+            if (!empty($matches['scopeName'])) {
+                $scope = $bucket->scope($matches['scopeName']);
+                $collection = $scope->collection($matches['collectionName']);
+            }
+
+            return $collection;
+        } finally {
+            restore_error_handler();
+        }
+    }
+
+    public static function isSupported(): bool
+    {
+        return \extension_loaded('couchbase') && version_compare(phpversion('couchbase'), '3.0.5', '>=') && version_compare(phpversion('couchbase'), '4.0', '<');
+    }
+
+    private static function getOptions(string $options): array
+    {
+        $results = [];
+        $optionsInArray = explode('&', $options);
+
+        foreach ($optionsInArray as $option) {
+            [$key, $value] = explode('=', $option);
+
+            $results[$key] = $value;
+        }
+
+        return $results;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids): array
+    {
+        $results = [];
+        foreach ($ids as $id) {
+            try {
+                $resultCouchbase = $this->connection->get($id);
+            } catch (DocumentNotFoundException $exception) {
+                continue;
+            }
+
+            $content = $resultCouchbase->value ?? $resultCouchbase->content();
+
+            $results[$id] = $this->marshaller->unmarshall($content);
+        }
+
+        return $results;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave($id): bool
+    {
+        return $this->connection->exists($id)->exists();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear($namespace): bool
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids): bool
+    {
+        $idsErrors = [];
+        foreach ($ids as $id) {
+            try {
+                $result = $this->connection->remove($id);
+
+                if (null === $result->mutationToken()) {
+                    $idsErrors[] = $id;
+                }
+            } catch (DocumentNotFoundException $exception) {
+            }
+        }
+
+        return 0 === \count($idsErrors);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, $lifetime)
+    {
+        if (!$values = $this->marshaller->marshall($values, $failed)) {
+            return $failed;
+        }
+
+        $upsertOptions = new UpsertOptions();
+        $upsertOptions->expiry($lifetime);
+
+        $ko = [];
+        foreach ($values as $key => $value) {
+            try {
+                $this->connection->upsert($key, $value, $upsertOptions);
+            } catch (\Exception $exception) {
+                $ko[$key] = '';
+            }
+        }
+
+        return [] === $ko ? true : $ko;
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/DoctrineAdapter.php b/vendor/symfony/cache/Adapter/DoctrineAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..efa30c842e427a28ce4b662b2f8dcf0b7ad9e5fc
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/DoctrineAdapter.php
@@ -0,0 +1,110 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Doctrine\Common\Cache\CacheProvider;
+use Doctrine\Common\Cache\Psr6\CacheAdapter;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @deprecated Since Symfony 5.4, use Doctrine\Common\Cache\Psr6\CacheAdapter instead
+ */
+class DoctrineAdapter extends AbstractAdapter
+{
+    private $provider;
+
+    public function __construct(CacheProvider $provider, string $namespace = '', int $defaultLifetime = 0)
+    {
+        trigger_deprecation('symfony/cache', '5.4', '"%s" is deprecated, use "%s" instead.', __CLASS__, CacheAdapter::class);
+
+        parent::__construct('', $defaultLifetime);
+        $this->provider = $provider;
+        $provider->setNamespace($namespace);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        parent::reset();
+        $this->provider->setNamespace($this->provider->getNamespace());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        $unserializeCallbackHandler = ini_set('unserialize_callback_func', parent::class.'::handleUnserializeCallback');
+        try {
+            return $this->provider->fetchMultiple($ids);
+        } catch (\Error $e) {
+            $trace = $e->getTrace();
+
+            if (isset($trace[0]['function']) && !isset($trace[0]['class'])) {
+                switch ($trace[0]['function']) {
+                    case 'unserialize':
+                    case 'apcu_fetch':
+                    case 'apc_fetch':
+                        throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine());
+                }
+            }
+
+            throw $e;
+        } finally {
+            ini_set('unserialize_callback_func', $unserializeCallbackHandler);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave(string $id)
+    {
+        return $this->provider->contains($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace)
+    {
+        $namespace = $this->provider->getNamespace();
+
+        return isset($namespace[0])
+            ? $this->provider->deleteAll()
+            : $this->provider->flushAll();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        $ok = true;
+        foreach ($ids as $id) {
+            $ok = $this->provider->delete($id) && $ok;
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime)
+    {
+        return $this->provider->saveMultiple($values, $lifetime);
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php b/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..73f0ea6bcc48014fdf093eeda2d0224221191670
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php
@@ -0,0 +1,397 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Doctrine\DBAL\Connection;
+use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
+use Doctrine\DBAL\DriverManager;
+use Doctrine\DBAL\Exception as DBALException;
+use Doctrine\DBAL\Exception\TableNotFoundException;
+use Doctrine\DBAL\ParameterType;
+use Doctrine\DBAL\Schema\Schema;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+use Symfony\Component\Cache\PruneableInterface;
+
+class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface
+{
+    protected $maxIdLength = 255;
+
+    private $marshaller;
+    private $conn;
+    private $platformName;
+    private $serverVersion;
+    private $table = 'cache_items';
+    private $idCol = 'item_id';
+    private $dataCol = 'item_data';
+    private $lifetimeCol = 'item_lifetime';
+    private $timeCol = 'item_time';
+    private $namespace;
+
+    /**
+     * You can either pass an existing database Doctrine DBAL Connection or
+     * a DSN string that will be used to connect to the database.
+     *
+     * The cache table is created automatically when possible.
+     * Otherwise, use the createTable() method.
+     *
+     * List of available options:
+     *  * db_table: The name of the table [default: cache_items]
+     *  * db_id_col: The column where to store the cache id [default: item_id]
+     *  * db_data_col: The column where to store the cache data [default: item_data]
+     *  * db_lifetime_col: The column where to store the lifetime [default: item_lifetime]
+     *  * db_time_col: The column where to store the timestamp [default: item_time]
+     *
+     * @param Connection|string $connOrDsn
+     *
+     * @throws InvalidArgumentException When namespace contains invalid characters
+     */
+    public function __construct($connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null)
+    {
+        if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) {
+            throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0]));
+        }
+
+        if ($connOrDsn instanceof Connection) {
+            $this->conn = $connOrDsn;
+        } elseif (\is_string($connOrDsn)) {
+            if (!class_exists(DriverManager::class)) {
+                throw new InvalidArgumentException(sprintf('Failed to parse the DSN "%s". Try running "composer require doctrine/dbal".', $connOrDsn));
+            }
+            $this->conn = DriverManager::getConnection(['url' => $connOrDsn]);
+        } else {
+            throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be "%s" or string, "%s" given.', __METHOD__, Connection::class, get_debug_type($connOrDsn)));
+        }
+
+        $this->table = $options['db_table'] ?? $this->table;
+        $this->idCol = $options['db_id_col'] ?? $this->idCol;
+        $this->dataCol = $options['db_data_col'] ?? $this->dataCol;
+        $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol;
+        $this->timeCol = $options['db_time_col'] ?? $this->timeCol;
+        $this->namespace = $namespace;
+        $this->marshaller = $marshaller ?? new DefaultMarshaller();
+
+        parent::__construct($namespace, $defaultLifetime);
+    }
+
+    /**
+     * Creates the table to store cache items which can be called once for setup.
+     *
+     * Cache ID are saved in a column of maximum length 255. Cache data is
+     * saved in a BLOB.
+     *
+     * @throws DBALException When the table already exists
+     */
+    public function createTable()
+    {
+        $schema = new Schema();
+        $this->addTableToSchema($schema);
+
+        foreach ($schema->toSql($this->conn->getDatabasePlatform()) as $sql) {
+            $this->conn->executeStatement($sql);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureSchema(Schema $schema, Connection $forConnection): void
+    {
+        // only update the schema for this connection
+        if ($forConnection !== $this->conn) {
+            return;
+        }
+
+        if ($schema->hasTable($this->table)) {
+            return;
+        }
+
+        $this->addTableToSchema($schema);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune(): bool
+    {
+        $deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ?";
+        $params = [time()];
+        $paramTypes = [ParameterType::INTEGER];
+
+        if ('' !== $this->namespace) {
+            $deleteSql .= " AND $this->idCol LIKE ?";
+            $params[] = sprintf('%s%%', $this->namespace);
+            $paramTypes[] = ParameterType::STRING;
+        }
+
+        try {
+            $this->conn->executeStatement($deleteSql, $params, $paramTypes);
+        } catch (TableNotFoundException $e) {
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids): iterable
+    {
+        $now = time();
+        $expired = [];
+
+        $sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN (?)";
+        $result = $this->conn->executeQuery($sql, [
+            $now,
+            $ids,
+        ], [
+            ParameterType::INTEGER,
+            Connection::PARAM_STR_ARRAY,
+        ])->iterateNumeric();
+
+        foreach ($result as $row) {
+            if (null === $row[1]) {
+                $expired[] = $row[0];
+            } else {
+                yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]);
+            }
+        }
+
+        if ($expired) {
+            $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN (?)";
+            $this->conn->executeStatement($sql, [
+                $now,
+                $expired,
+            ], [
+                ParameterType::INTEGER,
+                Connection::PARAM_STR_ARRAY,
+            ]);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave(string $id): bool
+    {
+        $sql = "SELECT 1 FROM $this->table WHERE $this->idCol = ? AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ?)";
+        $result = $this->conn->executeQuery($sql, [
+            $id,
+            time(),
+        ], [
+            ParameterType::STRING,
+            ParameterType::INTEGER,
+        ]);
+
+        return (bool) $result->fetchOne();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace): bool
+    {
+        if ('' === $namespace) {
+            if ('sqlite' === $this->getPlatformName()) {
+                $sql = "DELETE FROM $this->table";
+            } else {
+                $sql = "TRUNCATE TABLE $this->table";
+            }
+        } else {
+            $sql = "DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'";
+        }
+
+        try {
+            $this->conn->executeStatement($sql);
+        } catch (TableNotFoundException $e) {
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids): bool
+    {
+        $sql = "DELETE FROM $this->table WHERE $this->idCol IN (?)";
+        try {
+            $this->conn->executeStatement($sql, [array_values($ids)], [Connection::PARAM_STR_ARRAY]);
+        } catch (TableNotFoundException $e) {
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime)
+    {
+        if (!$values = $this->marshaller->marshall($values, $failed)) {
+            return $failed;
+        }
+
+        $platformName = $this->getPlatformName();
+        $insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?)";
+
+        switch (true) {
+            case 'mysql' === $platformName:
+                $sql = $insertSql." ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)";
+                break;
+            case 'oci' === $platformName:
+                // DUAL is Oracle specific dummy table
+                $sql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ".
+                    "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
+                    "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?";
+                break;
+            case 'sqlsrv' === $platformName && version_compare($this->getServerVersion(), '10', '>='):
+                // MERGE is only available since SQL Server 2008 and must be terminated by semicolon
+                // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx
+                $sql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ".
+                    "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
+                    "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;";
+                break;
+            case 'sqlite' === $platformName:
+                $sql = 'INSERT OR REPLACE'.substr($insertSql, 6);
+                break;
+            case 'pgsql' === $platformName && version_compare($this->getServerVersion(), '9.5', '>='):
+                $sql = $insertSql." ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)";
+                break;
+            default:
+                $platformName = null;
+                $sql = "UPDATE $this->table SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ? WHERE $this->idCol = ?";
+                break;
+        }
+
+        $now = time();
+        $lifetime = $lifetime ?: null;
+        try {
+            $stmt = $this->conn->prepare($sql);
+        } catch (TableNotFoundException $e) {
+            if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) {
+                $this->createTable();
+            }
+            $stmt = $this->conn->prepare($sql);
+        }
+
+        // $id and $data are defined later in the loop. Binding is done by reference, values are read on execution.
+        if ('sqlsrv' === $platformName || 'oci' === $platformName) {
+            $stmt->bindParam(1, $id);
+            $stmt->bindParam(2, $id);
+            $stmt->bindParam(3, $data, ParameterType::LARGE_OBJECT);
+            $stmt->bindValue(4, $lifetime, ParameterType::INTEGER);
+            $stmt->bindValue(5, $now, ParameterType::INTEGER);
+            $stmt->bindParam(6, $data, ParameterType::LARGE_OBJECT);
+            $stmt->bindValue(7, $lifetime, ParameterType::INTEGER);
+            $stmt->bindValue(8, $now, ParameterType::INTEGER);
+        } elseif (null !== $platformName) {
+            $stmt->bindParam(1, $id);
+            $stmt->bindParam(2, $data, ParameterType::LARGE_OBJECT);
+            $stmt->bindValue(3, $lifetime, ParameterType::INTEGER);
+            $stmt->bindValue(4, $now, ParameterType::INTEGER);
+        } else {
+            $stmt->bindParam(1, $data, ParameterType::LARGE_OBJECT);
+            $stmt->bindValue(2, $lifetime, ParameterType::INTEGER);
+            $stmt->bindValue(3, $now, ParameterType::INTEGER);
+            $stmt->bindParam(4, $id);
+
+            $insertStmt = $this->conn->prepare($insertSql);
+            $insertStmt->bindParam(1, $id);
+            $insertStmt->bindParam(2, $data, ParameterType::LARGE_OBJECT);
+            $insertStmt->bindValue(3, $lifetime, ParameterType::INTEGER);
+            $insertStmt->bindValue(4, $now, ParameterType::INTEGER);
+        }
+
+        foreach ($values as $id => $data) {
+            try {
+                $rowCount = $stmt->executeStatement();
+            } catch (TableNotFoundException $e) {
+                if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) {
+                    $this->createTable();
+                }
+                $rowCount = $stmt->executeStatement();
+            }
+            if (null === $platformName && 0 === $rowCount) {
+                try {
+                    $insertStmt->executeStatement();
+                } catch (DBALException $e) {
+                    // A concurrent write won, let it be
+                }
+            }
+        }
+
+        return $failed;
+    }
+
+    private function getPlatformName(): string
+    {
+        if (isset($this->platformName)) {
+            return $this->platformName;
+        }
+
+        $platform = $this->conn->getDatabasePlatform();
+
+        switch (true) {
+            case $platform instanceof \Doctrine\DBAL\Platforms\MySQLPlatform:
+            case $platform instanceof \Doctrine\DBAL\Platforms\MySQL57Platform:
+                return $this->platformName = 'mysql';
+
+            case $platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform:
+                return $this->platformName = 'sqlite';
+
+            case $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform:
+            case $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQL94Platform:
+                return $this->platformName = 'pgsql';
+
+            case $platform instanceof \Doctrine\DBAL\Platforms\OraclePlatform:
+                return $this->platformName = 'oci';
+
+            case $platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform:
+            case $platform instanceof \Doctrine\DBAL\Platforms\SQLServer2012Platform:
+                return $this->platformName = 'sqlsrv';
+
+            default:
+                return $this->platformName = \get_class($platform);
+        }
+    }
+
+    private function getServerVersion(): string
+    {
+        if (isset($this->serverVersion)) {
+            return $this->serverVersion;
+        }
+
+        $conn = $this->conn->getWrappedConnection();
+        if ($conn instanceof ServerInfoAwareConnection) {
+            return $this->serverVersion = $conn->getServerVersion();
+        }
+
+        return $this->serverVersion = '0';
+    }
+
+    private function addTableToSchema(Schema $schema): void
+    {
+        $types = [
+            'mysql' => 'binary',
+            'sqlite' => 'text',
+        ];
+
+        $table = $schema->createTable($this->table);
+        $table->addColumn($this->idCol, $types[$this->getPlatformName()] ?? 'string', ['length' => 255]);
+        $table->addColumn($this->dataCol, 'blob', ['length' => 16777215]);
+        $table->addColumn($this->lifetimeCol, 'integer', ['unsigned' => true, 'notnull' => false]);
+        $table->addColumn($this->timeCol, 'integer', ['unsigned' => true]);
+        $table->setPrimaryKey([$this->idCol]);
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/FilesystemAdapter.php b/vendor/symfony/cache/Adapter/FilesystemAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..7185dd4877e423ad5adc99f2ac07bcdbd5be2428
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/FilesystemAdapter.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Traits\FilesystemTrait;
+
+class FilesystemAdapter extends AbstractAdapter implements PruneableInterface
+{
+    use FilesystemTrait;
+
+    public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null, MarshallerInterface $marshaller = null)
+    {
+        $this->marshaller = $marshaller ?? new DefaultMarshaller();
+        parent::__construct('', $defaultLifetime);
+        $this->init($namespace, $directory);
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php b/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..afde84375fea924f16c2bb40ec2cc5069d04f766
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php
@@ -0,0 +1,239 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+use Symfony\Component\Cache\Marshaller\TagAwareMarshaller;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Traits\FilesystemTrait;
+
+/**
+ * Stores tag id <> cache id relationship as a symlink, and lookup on invalidation calls.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ * @author André Rømcke <andre.romcke+symfony@gmail.com>
+ */
+class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements PruneableInterface
+{
+    use FilesystemTrait {
+        doClear as private doClearCache;
+        doSave as private doSaveCache;
+    }
+
+    /**
+     * Folder used for tag symlinks.
+     */
+    private const TAG_FOLDER = 'tags';
+
+    public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null, MarshallerInterface $marshaller = null)
+    {
+        $this->marshaller = new TagAwareMarshaller($marshaller);
+        parent::__construct('', $defaultLifetime);
+        $this->init($namespace, $directory);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace)
+    {
+        $ok = $this->doClearCache($namespace);
+
+        if ('' !== $namespace) {
+            return $ok;
+        }
+
+        set_error_handler(static function () {});
+        $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
+
+        try {
+            foreach ($this->scanHashDir($this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR) as $dir) {
+                if (rename($dir, $renamed = substr_replace($dir, bin2hex(random_bytes(4)), -8))) {
+                    $dir = $renamed.\DIRECTORY_SEPARATOR;
+                } else {
+                    $dir .= \DIRECTORY_SEPARATOR;
+                    $renamed = null;
+                }
+
+                for ($i = 0; $i < 38; ++$i) {
+                    if (!is_dir($dir.$chars[$i])) {
+                        continue;
+                    }
+                    for ($j = 0; $j < 38; ++$j) {
+                        if (!is_dir($d = $dir.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) {
+                            continue;
+                        }
+                        foreach (scandir($d, \SCANDIR_SORT_NONE) ?: [] as $link) {
+                            if ('.' !== $link && '..' !== $link && (null !== $renamed || !realpath($d.\DIRECTORY_SEPARATOR.$link))) {
+                                unlink($d.\DIRECTORY_SEPARATOR.$link);
+                            }
+                        }
+                        null === $renamed ?: rmdir($d);
+                    }
+                    null === $renamed ?: rmdir($dir.$chars[$i]);
+                }
+                null === $renamed ?: rmdir($renamed);
+            }
+        } finally {
+            restore_error_handler();
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []): array
+    {
+        $failed = $this->doSaveCache($values, $lifetime);
+
+        // Add Tags as symlinks
+        foreach ($addTagData as $tagId => $ids) {
+            $tagFolder = $this->getTagFolder($tagId);
+            foreach ($ids as $id) {
+                if ($failed && \in_array($id, $failed, true)) {
+                    continue;
+                }
+
+                $file = $this->getFile($id);
+
+                if (!@symlink($file, $tagLink = $this->getFile($id, true, $tagFolder)) && !is_link($tagLink)) {
+                    @unlink($file);
+                    $failed[] = $id;
+                }
+            }
+        }
+
+        // Unlink removed Tags
+        foreach ($removeTagData as $tagId => $ids) {
+            $tagFolder = $this->getTagFolder($tagId);
+            foreach ($ids as $id) {
+                if ($failed && \in_array($id, $failed, true)) {
+                    continue;
+                }
+
+                @unlink($this->getFile($id, false, $tagFolder));
+            }
+        }
+
+        return $failed;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDeleteYieldTags(array $ids): iterable
+    {
+        foreach ($ids as $id) {
+            $file = $this->getFile($id);
+            if (!is_file($file) || !$h = @fopen($file, 'r')) {
+                continue;
+            }
+
+            if ((\PHP_VERSION_ID >= 70300 || '\\' !== \DIRECTORY_SEPARATOR) && !@unlink($file)) {
+                fclose($h);
+                continue;
+            }
+
+            $meta = explode("\n", fread($h, 4096), 3)[2] ?? '';
+
+            // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F
+            if (13 < \strlen($meta) && "\x9D" === $meta[0] && "\0" === $meta[5] && "\x5F" === $meta[9]) {
+                $meta[9] = "\0";
+                $tagLen = unpack('Nlen', $meta, 9)['len'];
+                $meta = substr($meta, 13, $tagLen);
+
+                if (0 < $tagLen -= \strlen($meta)) {
+                    $meta .= fread($h, $tagLen);
+                }
+
+                try {
+                    yield $id => '' === $meta ? [] : $this->marshaller->unmarshall($meta);
+                } catch (\Exception $e) {
+                    yield $id => [];
+                }
+            }
+
+            fclose($h);
+
+            if (\PHP_VERSION_ID < 70300 && '\\' === \DIRECTORY_SEPARATOR) {
+                @unlink($file);
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDeleteTagRelations(array $tagData): bool
+    {
+        foreach ($tagData as $tagId => $idList) {
+            $tagFolder = $this->getTagFolder($tagId);
+            foreach ($idList as $id) {
+                @unlink($this->getFile($id, false, $tagFolder));
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doInvalidate(array $tagIds): bool
+    {
+        foreach ($tagIds as $tagId) {
+            if (!is_dir($tagFolder = $this->getTagFolder($tagId))) {
+                continue;
+            }
+
+            set_error_handler(static function () {});
+
+            try {
+                if (rename($tagFolder, $renamed = substr_replace($tagFolder, bin2hex(random_bytes(4)), -9))) {
+                    $tagFolder = $renamed.\DIRECTORY_SEPARATOR;
+                } else {
+                    $renamed = null;
+                }
+
+                foreach ($this->scanHashDir($tagFolder) as $itemLink) {
+                    unlink(realpath($itemLink) ?: $itemLink);
+                    unlink($itemLink);
+                }
+
+                if (null === $renamed) {
+                    continue;
+                }
+
+                $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
+
+                for ($i = 0; $i < 38; ++$i) {
+                    for ($j = 0; $j < 38; ++$j) {
+                        rmdir($tagFolder.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j]);
+                    }
+                    rmdir($tagFolder.$chars[$i]);
+                }
+                rmdir($renamed);
+            } finally {
+                restore_error_handler();
+            }
+        }
+
+        return true;
+    }
+
+    private function getTagFolder(string $tagId): string
+    {
+        return $this->getFile($tagId, false, $this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR).\DIRECTORY_SEPARATOR;
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/MemcachedAdapter.php b/vendor/symfony/cache/Adapter/MemcachedAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c2933fcfd3f8364462a29a07bfb7e26e727f06a
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/MemcachedAdapter.php
@@ -0,0 +1,353 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+
+/**
+ * @author Rob Frawley 2nd <rmf@src.run>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class MemcachedAdapter extends AbstractAdapter
+{
+    /**
+     * We are replacing characters that are illegal in Memcached keys with reserved characters from
+     * {@see \Symfony\Contracts\Cache\ItemInterface::RESERVED_CHARACTERS} that are legal in Memcached.
+     * Note: don’t use {@see \Symfony\Component\Cache\Adapter\AbstractAdapter::NS_SEPARATOR}.
+     */
+    private const RESERVED_MEMCACHED = " \n\r\t\v\f\0";
+    private const RESERVED_PSR6 = '@()\{}/';
+
+    protected $maxIdLength = 250;
+
+    private const DEFAULT_CLIENT_OPTIONS = [
+        'persistent_id' => null,
+        'username' => null,
+        'password' => null,
+        \Memcached::OPT_SERIALIZER => \Memcached::SERIALIZER_PHP,
+    ];
+
+    private $marshaller;
+    private $client;
+    private $lazyClient;
+
+    /**
+     * Using a MemcachedAdapter with a TagAwareAdapter for storing tags is discouraged.
+     * Using a RedisAdapter is recommended instead. If you cannot do otherwise, be aware that:
+     * - the Memcached::OPT_BINARY_PROTOCOL must be enabled
+     *   (that's the default when using MemcachedAdapter::createConnection());
+     * - tags eviction by Memcached's LRU algorithm will break by-tags invalidation;
+     *   your Memcached memory should be large enough to never trigger LRU.
+     *
+     * Using a MemcachedAdapter as a pure items store is fine.
+     */
+    public function __construct(\Memcached $client, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null)
+    {
+        if (!static::isSupported()) {
+            throw new CacheException('Memcached '.(\PHP_VERSION_ID >= 80100 ? '> 3.1.5' : '>= 2.2.0').' is required.');
+        }
+        if ('Memcached' === \get_class($client)) {
+            $opt = $client->getOption(\Memcached::OPT_SERIALIZER);
+            if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) {
+                throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".');
+            }
+            $this->maxIdLength -= \strlen($client->getOption(\Memcached::OPT_PREFIX_KEY));
+            $this->client = $client;
+        } else {
+            $this->lazyClient = $client;
+        }
+
+        parent::__construct($namespace, $defaultLifetime);
+        $this->enableVersioning();
+        $this->marshaller = $marshaller ?? new DefaultMarshaller();
+    }
+
+    public static function isSupported()
+    {
+        return \extension_loaded('memcached') && version_compare(phpversion('memcached'), \PHP_VERSION_ID >= 80100 ? '3.1.6' : '2.2.0', '>=');
+    }
+
+    /**
+     * Creates a Memcached instance.
+     *
+     * By default, the binary protocol, no block, and libketama compatible options are enabled.
+     *
+     * Examples for servers:
+     * - 'memcached://user:pass@localhost?weight=33'
+     * - [['localhost', 11211, 33]]
+     *
+     * @param array[]|string|string[] $servers An array of servers, a DSN, or an array of DSNs
+     *
+     * @return \Memcached
+     *
+     * @throws \ErrorException When invalid options or servers are provided
+     */
+    public static function createConnection($servers, array $options = [])
+    {
+        if (\is_string($servers)) {
+            $servers = [$servers];
+        } elseif (!\is_array($servers)) {
+            throw new InvalidArgumentException(sprintf('MemcachedAdapter::createClient() expects array or string as first argument, "%s" given.', get_debug_type($servers)));
+        }
+        if (!static::isSupported()) {
+            throw new CacheException('Memcached '.(\PHP_VERSION_ID >= 80100 ? '> 3.1.5' : '>= 2.2.0').' is required.');
+        }
+        set_error_handler(function ($type, $msg, $file, $line) { throw new \ErrorException($msg, 0, $type, $file, $line); });
+        try {
+            $options += static::DEFAULT_CLIENT_OPTIONS;
+            $client = new \Memcached($options['persistent_id']);
+            $username = $options['username'];
+            $password = $options['password'];
+
+            // parse any DSN in $servers
+            foreach ($servers as $i => $dsn) {
+                if (\is_array($dsn)) {
+                    continue;
+                }
+                if (!str_starts_with($dsn, 'memcached:')) {
+                    throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: "%s" does not start with "memcached:".', $dsn));
+                }
+                $params = preg_replace_callback('#^memcached:(//)?(?:([^@]*+)@)?#', function ($m) use (&$username, &$password) {
+                    if (!empty($m[2])) {
+                        [$username, $password] = explode(':', $m[2], 2) + [1 => null];
+                    }
+
+                    return 'file:'.($m[1] ?? '');
+                }, $dsn);
+                if (false === $params = parse_url($params)) {
+                    throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: "%s".', $dsn));
+                }
+                $query = $hosts = [];
+                if (isset($params['query'])) {
+                    parse_str($params['query'], $query);
+
+                    if (isset($query['host'])) {
+                        if (!\is_array($hosts = $query['host'])) {
+                            throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: "%s".', $dsn));
+                        }
+                        foreach ($hosts as $host => $weight) {
+                            if (false === $port = strrpos($host, ':')) {
+                                $hosts[$host] = [$host, 11211, (int) $weight];
+                            } else {
+                                $hosts[$host] = [substr($host, 0, $port), (int) substr($host, 1 + $port), (int) $weight];
+                            }
+                        }
+                        $hosts = array_values($hosts);
+                        unset($query['host']);
+                    }
+                    if ($hosts && !isset($params['host']) && !isset($params['path'])) {
+                        unset($servers[$i]);
+                        $servers = array_merge($servers, $hosts);
+                        continue;
+                    }
+                }
+                if (!isset($params['host']) && !isset($params['path'])) {
+                    throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: "%s".', $dsn));
+                }
+                if (isset($params['path']) && preg_match('#/(\d+)$#', $params['path'], $m)) {
+                    $params['weight'] = $m[1];
+                    $params['path'] = substr($params['path'], 0, -\strlen($m[0]));
+                }
+                $params += [
+                    'host' => $params['host'] ?? $params['path'],
+                    'port' => isset($params['host']) ? 11211 : null,
+                    'weight' => 0,
+                ];
+                if ($query) {
+                    $params += $query;
+                    $options = $query + $options;
+                }
+
+                $servers[$i] = [$params['host'], $params['port'], $params['weight']];
+
+                if ($hosts) {
+                    $servers = array_merge($servers, $hosts);
+                }
+            }
+
+            // set client's options
+            unset($options['persistent_id'], $options['username'], $options['password'], $options['weight'], $options['lazy']);
+            $options = array_change_key_case($options, \CASE_UPPER);
+            $client->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
+            $client->setOption(\Memcached::OPT_NO_BLOCK, true);
+            $client->setOption(\Memcached::OPT_TCP_NODELAY, true);
+            if (!\array_key_exists('LIBKETAMA_COMPATIBLE', $options) && !\array_key_exists(\Memcached::OPT_LIBKETAMA_COMPATIBLE, $options)) {
+                $client->setOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
+            }
+            foreach ($options as $name => $value) {
+                if (\is_int($name)) {
+                    continue;
+                }
+                if ('HASH' === $name || 'SERIALIZER' === $name || 'DISTRIBUTION' === $name) {
+                    $value = \constant('Memcached::'.$name.'_'.strtoupper($value));
+                }
+                unset($options[$name]);
+
+                if (\defined('Memcached::OPT_'.$name)) {
+                    $options[\constant('Memcached::OPT_'.$name)] = $value;
+                }
+            }
+            $client->setOptions($options);
+
+            // set client's servers, taking care of persistent connections
+            if (!$client->isPristine()) {
+                $oldServers = [];
+                foreach ($client->getServerList() as $server) {
+                    $oldServers[] = [$server['host'], $server['port']];
+                }
+
+                $newServers = [];
+                foreach ($servers as $server) {
+                    if (1 < \count($server)) {
+                        $server = array_values($server);
+                        unset($server[2]);
+                        $server[1] = (int) $server[1];
+                    }
+                    $newServers[] = $server;
+                }
+
+                if ($oldServers !== $newServers) {
+                    $client->resetServerList();
+                    $client->addServers($servers);
+                }
+            } else {
+                $client->addServers($servers);
+            }
+
+            if (null !== $username || null !== $password) {
+                if (!method_exists($client, 'setSaslAuthData')) {
+                    trigger_error('Missing SASL support: the memcached extension must be compiled with --enable-memcached-sasl.');
+                }
+                $client->setSaslAuthData($username, $password);
+            }
+
+            return $client;
+        } finally {
+            restore_error_handler();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime)
+    {
+        if (!$values = $this->marshaller->marshall($values, $failed)) {
+            return $failed;
+        }
+
+        if ($lifetime && $lifetime > 30 * 86400) {
+            $lifetime += time();
+        }
+
+        $encodedValues = [];
+        foreach ($values as $key => $value) {
+            $encodedValues[self::encodeKey($key)] = $value;
+        }
+
+        return $this->checkResultCode($this->getClient()->setMulti($encodedValues, $lifetime)) ? $failed : false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        try {
+            $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids);
+
+            $encodedResult = $this->checkResultCode($this->getClient()->getMulti($encodedIds));
+
+            $result = [];
+            foreach ($encodedResult as $key => $value) {
+                $result[self::decodeKey($key)] = $this->marshaller->unmarshall($value);
+            }
+
+            return $result;
+        } catch (\Error $e) {
+            throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine());
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave(string $id)
+    {
+        return false !== $this->getClient()->get(self::encodeKey($id)) || $this->checkResultCode(\Memcached::RES_SUCCESS === $this->client->getResultCode());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        $ok = true;
+        $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids);
+        foreach ($this->checkResultCode($this->getClient()->deleteMulti($encodedIds)) as $result) {
+            if (\Memcached::RES_SUCCESS !== $result && \Memcached::RES_NOTFOUND !== $result) {
+                $ok = false;
+            }
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace)
+    {
+        return '' === $namespace && $this->getClient()->flush();
+    }
+
+    private function checkResultCode($result)
+    {
+        $code = $this->client->getResultCode();
+
+        if (\Memcached::RES_SUCCESS === $code || \Memcached::RES_NOTFOUND === $code) {
+            return $result;
+        }
+
+        throw new CacheException('MemcachedAdapter client error: '.strtolower($this->client->getResultMessage()));
+    }
+
+    private function getClient(): \Memcached
+    {
+        if ($this->client) {
+            return $this->client;
+        }
+
+        $opt = $this->lazyClient->getOption(\Memcached::OPT_SERIALIZER);
+        if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) {
+            throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".');
+        }
+        if ('' !== $prefix = (string) $this->lazyClient->getOption(\Memcached::OPT_PREFIX_KEY)) {
+            throw new CacheException(sprintf('MemcachedAdapter: "prefix_key" option must be empty when using proxified connections, "%s" given.', $prefix));
+        }
+
+        return $this->client = $this->lazyClient;
+    }
+
+    private static function encodeKey(string $key): string
+    {
+        return strtr($key, self::RESERVED_MEMCACHED, self::RESERVED_PSR6);
+    }
+
+    private static function decodeKey(string $key): string
+    {
+        return strtr($key, self::RESERVED_PSR6, self::RESERVED_MEMCACHED);
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/NullAdapter.php b/vendor/symfony/cache/Adapter/NullAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..15f7f8c455a16455f0e919235372beb16b6b4f48
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/NullAdapter.php
@@ -0,0 +1,152 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Contracts\Cache\CacheInterface;
+
+/**
+ * @author Titouan Galopin <galopintitouan@gmail.com>
+ */
+class NullAdapter implements AdapterInterface, CacheInterface
+{
+    private static $createCacheItem;
+
+    public function __construct()
+    {
+        self::$createCacheItem ?? self::$createCacheItem = \Closure::bind(
+            static function ($key) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->isHit = false;
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get(string $key, callable $callback, float $beta = null, array &$metadata = null)
+    {
+        $save = true;
+
+        return $callback((self::$createCacheItem)($key), $save);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        return (self::$createCacheItem)($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = [])
+    {
+        return $this->generateItems($keys);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function hasItem($key)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function clear(string $prefix = '')
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItem($key)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItems(array $keys)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function save(CacheItemInterface $item)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function commit()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete(string $key): bool
+    {
+        return $this->deleteItem($key);
+    }
+
+    private function generateItems(array $keys): \Generator
+    {
+        $f = self::$createCacheItem;
+
+        foreach ($keys as $key) {
+            yield $key => $f($key);
+        }
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/ParameterNormalizer.php b/vendor/symfony/cache/Adapter/ParameterNormalizer.php
new file mode 100644
index 0000000000000000000000000000000000000000..e33ae9f46d98a298ae5b76ba5e77f8c462341316
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/ParameterNormalizer.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+/**
+ * @author Lars Strojny <lars@strojny.net>
+ */
+final class ParameterNormalizer
+{
+    public static function normalizeDuration(string $duration): int
+    {
+        if (is_numeric($duration)) {
+            return $duration;
+        }
+
+        if (false !== $time = strtotime($duration, 0)) {
+            return $time;
+        }
+
+        try {
+            return \DateTime::createFromFormat('U', 0)->add(new \DateInterval($duration))->getTimestamp();
+        } catch (\Exception $e) {
+            throw new \InvalidArgumentException(sprintf('Cannot parse date interval "%s".', $duration), 0, $e);
+        }
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/PdoAdapter.php b/vendor/symfony/cache/Adapter/PdoAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d107244312e7b70dcfbe07abe671fb46c4e6210
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/PdoAdapter.php
@@ -0,0 +1,583 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Doctrine\DBAL\Connection;
+use Doctrine\DBAL\Schema\Schema;
+use Psr\Cache\CacheItemInterface;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+use Symfony\Component\Cache\PruneableInterface;
+
+class PdoAdapter extends AbstractAdapter implements PruneableInterface
+{
+    protected $maxIdLength = 255;
+
+    private $marshaller;
+    private $conn;
+    private $dsn;
+    private $driver;
+    private $serverVersion;
+    private $table = 'cache_items';
+    private $idCol = 'item_id';
+    private $dataCol = 'item_data';
+    private $lifetimeCol = 'item_lifetime';
+    private $timeCol = 'item_time';
+    private $username = '';
+    private $password = '';
+    private $connectionOptions = [];
+    private $namespace;
+
+    private $dbalAdapter;
+
+    /**
+     * You can either pass an existing database connection as PDO instance or
+     * a DSN string that will be used to lazy-connect to the database when the
+     * cache is actually used.
+     *
+     * List of available options:
+     *  * db_table: The name of the table [default: cache_items]
+     *  * db_id_col: The column where to store the cache id [default: item_id]
+     *  * db_data_col: The column where to store the cache data [default: item_data]
+     *  * db_lifetime_col: The column where to store the lifetime [default: item_lifetime]
+     *  * db_time_col: The column where to store the timestamp [default: item_time]
+     *  * db_username: The username when lazy-connect [default: '']
+     *  * db_password: The password when lazy-connect [default: '']
+     *  * db_connection_options: An array of driver-specific connection options [default: []]
+     *
+     * @param \PDO|string $connOrDsn
+     *
+     * @throws InvalidArgumentException When first argument is not PDO nor Connection nor string
+     * @throws InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION
+     * @throws InvalidArgumentException When namespace contains invalid characters
+     */
+    public function __construct($connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null)
+    {
+        if ($connOrDsn instanceof Connection || (\is_string($connOrDsn) && str_contains($connOrDsn, '://'))) {
+            trigger_deprecation('symfony/cache', '5.4', 'Usage of a DBAL Connection with "%s" is deprecated and will be removed in symfony 6.0. Use "%s" instead.', __CLASS__, DoctrineDbalAdapter::class);
+            $this->dbalAdapter = new DoctrineDbalAdapter($connOrDsn, $namespace, $defaultLifetime, $options, $marshaller);
+
+            return;
+        }
+
+        if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) {
+            throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0]));
+        }
+
+        if ($connOrDsn instanceof \PDO) {
+            if (\PDO::ERRMODE_EXCEPTION !== $connOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) {
+                throw new InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)).', __CLASS__));
+            }
+
+            $this->conn = $connOrDsn;
+        } elseif (\is_string($connOrDsn)) {
+            $this->dsn = $connOrDsn;
+        } else {
+            throw new InvalidArgumentException(sprintf('"%s" requires PDO or Doctrine\DBAL\Connection instance or DSN string as first argument, "%s" given.', __CLASS__, get_debug_type($connOrDsn)));
+        }
+
+        $this->table = $options['db_table'] ?? $this->table;
+        $this->idCol = $options['db_id_col'] ?? $this->idCol;
+        $this->dataCol = $options['db_data_col'] ?? $this->dataCol;
+        $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol;
+        $this->timeCol = $options['db_time_col'] ?? $this->timeCol;
+        $this->username = $options['db_username'] ?? $this->username;
+        $this->password = $options['db_password'] ?? $this->password;
+        $this->connectionOptions = $options['db_connection_options'] ?? $this->connectionOptions;
+        $this->namespace = $namespace;
+        $this->marshaller = $marshaller ?? new DefaultMarshaller();
+
+        parent::__construct($namespace, $defaultLifetime);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getItem($key)
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->getItem($key);
+        }
+
+        return parent::getItem($key);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getItems(array $keys = [])
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->getItems($keys);
+        }
+
+        return parent::getItems($keys);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hasItem($key)
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->hasItem($key);
+        }
+
+        return parent::hasItem($key);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function deleteItem($key)
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->deleteItem($key);
+        }
+
+        return parent::deleteItem($key);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function deleteItems(array $keys)
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->deleteItems($keys);
+        }
+
+        return parent::deleteItems($keys);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function clear(string $prefix = '')
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->clear($prefix);
+        }
+
+        return parent::clear($prefix);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function get(string $key, callable $callback, float $beta = null, array &$metadata = null)
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->get($key, $callback, $beta, $metadata);
+        }
+
+        return parent::get($key, $callback, $beta, $metadata);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function delete(string $key): bool
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->delete($key);
+        }
+
+        return parent::delete($key);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function save(CacheItemInterface $item)
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->save($item);
+        }
+
+        return parent::save($item);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->saveDeferred($item);
+        }
+
+        return parent::saveDeferred($item);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setLogger(LoggerInterface $logger): void
+    {
+        if (isset($this->dbalAdapter)) {
+            $this->dbalAdapter->setLogger($logger);
+
+            return;
+        }
+
+        parent::setLogger($logger);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function commit()
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->commit();
+        }
+
+        return parent::commit();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function reset()
+    {
+        if (isset($this->dbalAdapter)) {
+            $this->dbalAdapter->reset();
+
+            return;
+        }
+
+        parent::reset();
+    }
+
+    /**
+     * Creates the table to store cache items which can be called once for setup.
+     *
+     * Cache ID are saved in a column of maximum length 255. Cache data is
+     * saved in a BLOB.
+     *
+     * @throws \PDOException    When the table already exists
+     * @throws \DomainException When an unsupported PDO driver is used
+     */
+    public function createTable()
+    {
+        if (isset($this->dbalAdapter)) {
+            $this->dbalAdapter->createTable();
+
+            return;
+        }
+
+        // connect if we are not yet
+        $conn = $this->getConnection();
+
+        switch ($this->driver) {
+            case 'mysql':
+                // We use varbinary for the ID column because it prevents unwanted conversions:
+                // - character set conversions between server and client
+                // - trailing space removal
+                // - case-insensitivity
+                // - language processing like é == e
+                $sql = "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB";
+                break;
+            case 'sqlite':
+                $sql = "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
+                break;
+            case 'pgsql':
+                $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
+                break;
+            case 'oci':
+                $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
+                break;
+            case 'sqlsrv':
+                $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
+                break;
+            default:
+                throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver));
+        }
+
+        $conn->exec($sql);
+    }
+
+    /**
+     * Adds the Table to the Schema if the adapter uses this Connection.
+     *
+     * @deprecated since symfony/cache 5.4 use DoctrineDbalAdapter instead
+     */
+    public function configureSchema(Schema $schema, Connection $forConnection): void
+    {
+        if (isset($this->dbalAdapter)) {
+            $this->dbalAdapter->configureSchema($schema, $forConnection);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        if (isset($this->dbalAdapter)) {
+            return $this->dbalAdapter->prune();
+        }
+
+        $deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= :time";
+
+        if ('' !== $this->namespace) {
+            $deleteSql .= " AND $this->idCol LIKE :namespace";
+        }
+
+        $connection = $this->getConnection();
+
+        try {
+            $delete = $connection->prepare($deleteSql);
+        } catch (\PDOException $e) {
+            return true;
+        }
+        $delete->bindValue(':time', time(), \PDO::PARAM_INT);
+
+        if ('' !== $this->namespace) {
+            $delete->bindValue(':namespace', sprintf('%s%%', $this->namespace), \PDO::PARAM_STR);
+        }
+        try {
+            return $delete->execute();
+        } catch (\PDOException $e) {
+            return true;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        $connection = $this->getConnection();
+
+        $now = time();
+        $expired = [];
+
+        $sql = str_pad('', (\count($ids) << 1) - 1, '?,');
+        $sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN ($sql)";
+        $stmt = $connection->prepare($sql);
+        $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT);
+        foreach ($ids as $id) {
+            $stmt->bindValue(++$i, $id);
+        }
+        $result = $stmt->execute();
+
+        if (\is_object($result)) {
+            $result = $result->iterateNumeric();
+        } else {
+            $stmt->setFetchMode(\PDO::FETCH_NUM);
+            $result = $stmt;
+        }
+
+        foreach ($result as $row) {
+            if (null === $row[1]) {
+                $expired[] = $row[0];
+            } else {
+                yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]);
+            }
+        }
+
+        if ($expired) {
+            $sql = str_pad('', (\count($expired) << 1) - 1, '?,');
+            $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN ($sql)";
+            $stmt = $connection->prepare($sql);
+            $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT);
+            foreach ($expired as $id) {
+                $stmt->bindValue(++$i, $id);
+            }
+            $stmt->execute();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave(string $id)
+    {
+        $connection = $this->getConnection();
+
+        $sql = "SELECT 1 FROM $this->table WHERE $this->idCol = :id AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > :time)";
+        $stmt = $connection->prepare($sql);
+
+        $stmt->bindValue(':id', $id);
+        $stmt->bindValue(':time', time(), \PDO::PARAM_INT);
+        $stmt->execute();
+
+        return (bool) $stmt->fetchColumn();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace)
+    {
+        $conn = $this->getConnection();
+
+        if ('' === $namespace) {
+            if ('sqlite' === $this->driver) {
+                $sql = "DELETE FROM $this->table";
+            } else {
+                $sql = "TRUNCATE TABLE $this->table";
+            }
+        } else {
+            $sql = "DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'";
+        }
+
+        try {
+            $conn->exec($sql);
+        } catch (\PDOException $e) {
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        $sql = str_pad('', (\count($ids) << 1) - 1, '?,');
+        $sql = "DELETE FROM $this->table WHERE $this->idCol IN ($sql)";
+        try {
+            $stmt = $this->getConnection()->prepare($sql);
+            $stmt->execute(array_values($ids));
+        } catch (\PDOException $e) {
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime)
+    {
+        if (!$values = $this->marshaller->marshall($values, $failed)) {
+            return $failed;
+        }
+
+        $conn = $this->getConnection();
+
+        $driver = $this->driver;
+        $insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)";
+
+        switch (true) {
+            case 'mysql' === $driver:
+                $sql = $insertSql." ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)";
+                break;
+            case 'oci' === $driver:
+                // DUAL is Oracle specific dummy table
+                $sql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ".
+                    "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
+                    "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?";
+                break;
+            case 'sqlsrv' === $driver && version_compare($this->getServerVersion(), '10', '>='):
+                // MERGE is only available since SQL Server 2008 and must be terminated by semicolon
+                // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx
+                $sql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ".
+                    "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
+                    "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;";
+                break;
+            case 'sqlite' === $driver:
+                $sql = 'INSERT OR REPLACE'.substr($insertSql, 6);
+                break;
+            case 'pgsql' === $driver && version_compare($this->getServerVersion(), '9.5', '>='):
+                $sql = $insertSql." ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)";
+                break;
+            default:
+                $driver = null;
+                $sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id";
+                break;
+        }
+
+        $now = time();
+        $lifetime = $lifetime ?: null;
+        try {
+            $stmt = $conn->prepare($sql);
+        } catch (\PDOException $e) {
+            if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) {
+                $this->createTable();
+            }
+            $stmt = $conn->prepare($sql);
+        }
+
+        // $id and $data are defined later in the loop. Binding is done by reference, values are read on execution.
+        if ('sqlsrv' === $driver || 'oci' === $driver) {
+            $stmt->bindParam(1, $id);
+            $stmt->bindParam(2, $id);
+            $stmt->bindParam(3, $data, \PDO::PARAM_LOB);
+            $stmt->bindValue(4, $lifetime, \PDO::PARAM_INT);
+            $stmt->bindValue(5, $now, \PDO::PARAM_INT);
+            $stmt->bindParam(6, $data, \PDO::PARAM_LOB);
+            $stmt->bindValue(7, $lifetime, \PDO::PARAM_INT);
+            $stmt->bindValue(8, $now, \PDO::PARAM_INT);
+        } else {
+            $stmt->bindParam(':id', $id);
+            $stmt->bindParam(':data', $data, \PDO::PARAM_LOB);
+            $stmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT);
+            $stmt->bindValue(':time', $now, \PDO::PARAM_INT);
+        }
+        if (null === $driver) {
+            $insertStmt = $conn->prepare($insertSql);
+
+            $insertStmt->bindParam(':id', $id);
+            $insertStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
+            $insertStmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT);
+            $insertStmt->bindValue(':time', $now, \PDO::PARAM_INT);
+        }
+
+        foreach ($values as $id => $data) {
+            try {
+                $stmt->execute();
+            } catch (\PDOException $e) {
+                if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) {
+                    $this->createTable();
+                }
+                $stmt->execute();
+            }
+            if (null === $driver && !$stmt->rowCount()) {
+                try {
+                    $insertStmt->execute();
+                } catch (\PDOException $e) {
+                    // A concurrent write won, let it be
+                }
+            }
+        }
+
+        return $failed;
+    }
+
+    private function getConnection(): \PDO
+    {
+        if (null === $this->conn) {
+            $this->conn = new \PDO($this->dsn, $this->username, $this->password, $this->connectionOptions);
+            $this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+        }
+        if (null === $this->driver) {
+            $this->driver = $this->conn->getAttribute(\PDO::ATTR_DRIVER_NAME);
+        }
+
+        return $this->conn;
+    }
+
+    private function getServerVersion(): string
+    {
+        if (null === $this->serverVersion) {
+            $this->serverVersion = $this->conn->getAttribute(\PDO::ATTR_SERVER_VERSION);
+        }
+
+        return $this->serverVersion;
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/PhpArrayAdapter.php b/vendor/symfony/cache/Adapter/PhpArrayAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c8fb916415ce5910922b3c28dff53b06a7c804a
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/PhpArrayAdapter.php
@@ -0,0 +1,435 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ContractsTrait;
+use Symfony\Component\Cache\Traits\ProxyTrait;
+use Symfony\Component\VarExporter\VarExporter;
+use Symfony\Contracts\Cache\CacheInterface;
+
+/**
+ * Caches items at warm up time using a PHP array that is stored in shared memory by OPCache since PHP 7.0.
+ * Warmed up items are read-only and run-time discovered items are cached using a fallback adapter.
+ *
+ * @author Titouan Galopin <galopintitouan@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface
+{
+    use ContractsTrait;
+    use ProxyTrait;
+
+    private $file;
+    private $keys;
+    private $values;
+
+    private static $createCacheItem;
+    private static $valuesCache = [];
+
+    /**
+     * @param string           $file         The PHP file were values are cached
+     * @param AdapterInterface $fallbackPool A pool to fallback on when an item is not hit
+     */
+    public function __construct(string $file, AdapterInterface $fallbackPool)
+    {
+        $this->file = $file;
+        $this->pool = $fallbackPool;
+        self::$createCacheItem ?? self::$createCacheItem = \Closure::bind(
+            static function ($key, $value, $isHit) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->value = $value;
+                $item->isHit = $isHit;
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * This adapter takes advantage of how PHP stores arrays in its latest versions.
+     *
+     * @param string                 $file         The PHP file were values are cached
+     * @param CacheItemPoolInterface $fallbackPool A pool to fallback on when an item is not hit
+     *
+     * @return CacheItemPoolInterface
+     */
+    public static function create(string $file, CacheItemPoolInterface $fallbackPool)
+    {
+        if (!$fallbackPool instanceof AdapterInterface) {
+            $fallbackPool = new ProxyAdapter($fallbackPool);
+        }
+
+        return new static($file, $fallbackPool);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get(string $key, callable $callback, float $beta = null, array &$metadata = null)
+    {
+        if (null === $this->values) {
+            $this->initialize();
+        }
+        if (!isset($this->keys[$key])) {
+            get_from_pool:
+            if ($this->pool instanceof CacheInterface) {
+                return $this->pool->get($key, $callback, $beta, $metadata);
+            }
+
+            return $this->doGet($this->pool, $key, $callback, $beta, $metadata);
+        }
+        $value = $this->values[$this->keys[$key]];
+
+        if ('N;' === $value) {
+            return null;
+        }
+        try {
+            if ($value instanceof \Closure) {
+                return $value();
+            }
+        } catch (\Throwable $e) {
+            unset($this->keys[$key]);
+            goto get_from_pool;
+        }
+
+        return $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        if (!\is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+        if (!isset($this->keys[$key])) {
+            return $this->pool->getItem($key);
+        }
+
+        $value = $this->values[$this->keys[$key]];
+        $isHit = true;
+
+        if ('N;' === $value) {
+            $value = null;
+        } elseif ($value instanceof \Closure) {
+            try {
+                $value = $value();
+            } catch (\Throwable $e) {
+                $value = null;
+                $isHit = false;
+            }
+        }
+
+        return (self::$createCacheItem)($key, $value, $isHit);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = [])
+    {
+        foreach ($keys as $key) {
+            if (!\is_string($key)) {
+                throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
+            }
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return $this->generateItems($keys);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function hasItem($key)
+    {
+        if (!\is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return isset($this->keys[$key]) || $this->pool->hasItem($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItem($key)
+    {
+        if (!\is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return !isset($this->keys[$key]) && $this->pool->deleteItem($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItems(array $keys)
+    {
+        $deleted = true;
+        $fallbackKeys = [];
+
+        foreach ($keys as $key) {
+            if (!\is_string($key)) {
+                throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
+            }
+
+            if (isset($this->keys[$key])) {
+                $deleted = false;
+            } else {
+                $fallbackKeys[] = $key;
+            }
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        if ($fallbackKeys) {
+            $deleted = $this->pool->deleteItems($fallbackKeys) && $deleted;
+        }
+
+        return $deleted;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function save(CacheItemInterface $item)
+    {
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return !isset($this->keys[$item->getKey()]) && $this->pool->save($item);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return !isset($this->keys[$item->getKey()]) && $this->pool->saveDeferred($item);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function commit()
+    {
+        return $this->pool->commit();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function clear(string $prefix = '')
+    {
+        $this->keys = $this->values = [];
+
+        $cleared = @unlink($this->file) || !file_exists($this->file);
+        unset(self::$valuesCache[$this->file]);
+
+        if ($this->pool instanceof AdapterInterface) {
+            return $this->pool->clear($prefix) && $cleared;
+        }
+
+        return $this->pool->clear() && $cleared;
+    }
+
+    /**
+     * Store an array of cached values.
+     *
+     * @param array $values The cached values
+     *
+     * @return string[] A list of classes to preload on PHP 7.4+
+     */
+    public function warmUp(array $values)
+    {
+        if (file_exists($this->file)) {
+            if (!is_file($this->file)) {
+                throw new InvalidArgumentException(sprintf('Cache path exists and is not a file: "%s".', $this->file));
+            }
+
+            if (!is_writable($this->file)) {
+                throw new InvalidArgumentException(sprintf('Cache file is not writable: "%s".', $this->file));
+            }
+        } else {
+            $directory = \dirname($this->file);
+
+            if (!is_dir($directory) && !@mkdir($directory, 0777, true)) {
+                throw new InvalidArgumentException(sprintf('Cache directory does not exist and cannot be created: "%s".', $directory));
+            }
+
+            if (!is_writable($directory)) {
+                throw new InvalidArgumentException(sprintf('Cache directory is not writable: "%s".', $directory));
+            }
+        }
+
+        $preload = [];
+        $dumpedValues = '';
+        $dumpedMap = [];
+        $dump = <<<'EOF'
+<?php
+
+// This file has been auto-generated by the Symfony Cache Component.
+
+return [[
+
+
+EOF;
+
+        foreach ($values as $key => $value) {
+            CacheItem::validateKey(\is_int($key) ? (string) $key : $key);
+            $isStaticValue = true;
+
+            if (null === $value) {
+                $value = "'N;'";
+            } elseif (\is_object($value) || \is_array($value)) {
+                try {
+                    $value = VarExporter::export($value, $isStaticValue, $preload);
+                } catch (\Exception $e) {
+                    throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)), 0, $e);
+                }
+            } elseif (\is_string($value)) {
+                // Wrap "N;" in a closure to not confuse it with an encoded `null`
+                if ('N;' === $value) {
+                    $isStaticValue = false;
+                }
+                $value = var_export($value, true);
+            } elseif (!\is_scalar($value)) {
+                throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)));
+            } else {
+                $value = var_export($value, true);
+            }
+
+            if (!$isStaticValue) {
+                $value = str_replace("\n", "\n    ", $value);
+                $value = "static function () {\n    return {$value};\n}";
+            }
+            $hash = hash('md5', $value);
+
+            if (null === $id = $dumpedMap[$hash] ?? null) {
+                $id = $dumpedMap[$hash] = \count($dumpedMap);
+                $dumpedValues .= "{$id} => {$value},\n";
+            }
+
+            $dump .= var_export($key, true)." => {$id},\n";
+        }
+
+        $dump .= "\n], [\n\n{$dumpedValues}\n]];\n";
+
+        $tmpFile = uniqid($this->file, true);
+
+        file_put_contents($tmpFile, $dump);
+        @chmod($tmpFile, 0666 & ~umask());
+        unset($serialized, $value, $dump);
+
+        @rename($tmpFile, $this->file);
+        unset(self::$valuesCache[$this->file]);
+
+        $this->initialize();
+
+        return $preload;
+    }
+
+    /**
+     * Load the cache file.
+     */
+    private function initialize()
+    {
+        if (isset(self::$valuesCache[$this->file])) {
+            $values = self::$valuesCache[$this->file];
+        } elseif (!is_file($this->file)) {
+            $this->keys = $this->values = [];
+
+            return;
+        } else {
+            $values = self::$valuesCache[$this->file] = (include $this->file) ?: [[], []];
+        }
+
+        if (2 !== \count($values) || !isset($values[0], $values[1])) {
+            $this->keys = $this->values = [];
+        } else {
+            [$this->keys, $this->values] = $values;
+        }
+    }
+
+    private function generateItems(array $keys): \Generator
+    {
+        $f = self::$createCacheItem;
+        $fallbackKeys = [];
+
+        foreach ($keys as $key) {
+            if (isset($this->keys[$key])) {
+                $value = $this->values[$this->keys[$key]];
+
+                if ('N;' === $value) {
+                    yield $key => $f($key, null, true);
+                } elseif ($value instanceof \Closure) {
+                    try {
+                        yield $key => $f($key, $value(), true);
+                    } catch (\Throwable $e) {
+                        yield $key => $f($key, null, false);
+                    }
+                } else {
+                    yield $key => $f($key, $value, true);
+                }
+            } else {
+                $fallbackKeys[] = $key;
+            }
+        }
+
+        if ($fallbackKeys) {
+            yield from $this->pool->getItems($fallbackKeys);
+        }
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/PhpFilesAdapter.php b/vendor/symfony/cache/Adapter/PhpFilesAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..2fb08375a1b408bb104a4d62833606e354ea94d1
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/PhpFilesAdapter.php
@@ -0,0 +1,330 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Traits\FilesystemCommonTrait;
+use Symfony\Component\VarExporter\VarExporter;
+
+/**
+ * @author Piotr Stankowski <git@trakos.pl>
+ * @author Nicolas Grekas <p@tchwork.com>
+ * @author Rob Frawley 2nd <rmf@src.run>
+ */
+class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface
+{
+    use FilesystemCommonTrait {
+        doClear as private doCommonClear;
+        doDelete as private doCommonDelete;
+    }
+
+    private $includeHandler;
+    private $appendOnly;
+    private $values = [];
+    private $files = [];
+
+    private static $startTime;
+    private static $valuesCache = [];
+
+    /**
+     * @param $appendOnly Set to `true` to gain extra performance when the items stored in this pool never expire.
+     *                    Doing so is encouraged because it fits perfectly OPcache's memory model.
+     *
+     * @throws CacheException if OPcache is not enabled
+     */
+    public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null, bool $appendOnly = false)
+    {
+        $this->appendOnly = $appendOnly;
+        self::$startTime = self::$startTime ?? $_SERVER['REQUEST_TIME'] ?? time();
+        parent::__construct('', $defaultLifetime);
+        $this->init($namespace, $directory);
+        $this->includeHandler = static function ($type, $msg, $file, $line) {
+            throw new \ErrorException($msg, 0, $type, $file, $line);
+        };
+    }
+
+    public static function isSupported()
+    {
+        self::$startTime = self::$startTime ?? $_SERVER['REQUEST_TIME'] ?? time();
+
+        return \function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) || filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOLEAN));
+    }
+
+    /**
+     * @return bool
+     */
+    public function prune()
+    {
+        $time = time();
+        $pruned = true;
+        $getExpiry = true;
+
+        set_error_handler($this->includeHandler);
+        try {
+            foreach ($this->scanHashDir($this->directory) as $file) {
+                try {
+                    if (\is_array($expiresAt = include $file)) {
+                        $expiresAt = $expiresAt[0];
+                    }
+                } catch (\ErrorException $e) {
+                    $expiresAt = $time;
+                }
+
+                if ($time >= $expiresAt) {
+                    $pruned = $this->doUnlink($file) && !file_exists($file) && $pruned;
+                }
+            }
+        } finally {
+            restore_error_handler();
+        }
+
+        return $pruned;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        if ($this->appendOnly) {
+            $now = 0;
+            $missingIds = [];
+        } else {
+            $now = time();
+            $missingIds = $ids;
+            $ids = [];
+        }
+        $values = [];
+
+        begin:
+        $getExpiry = false;
+
+        foreach ($ids as $id) {
+            if (null === $value = $this->values[$id] ?? null) {
+                $missingIds[] = $id;
+            } elseif ('N;' === $value) {
+                $values[$id] = null;
+            } elseif (!\is_object($value)) {
+                $values[$id] = $value;
+            } elseif (!$value instanceof LazyValue) {
+                $values[$id] = $value();
+            } elseif (false === $values[$id] = include $value->file) {
+                unset($values[$id], $this->values[$id]);
+                $missingIds[] = $id;
+            }
+            if (!$this->appendOnly) {
+                unset($this->values[$id]);
+            }
+        }
+
+        if (!$missingIds) {
+            return $values;
+        }
+
+        set_error_handler($this->includeHandler);
+        try {
+            $getExpiry = true;
+
+            foreach ($missingIds as $k => $id) {
+                try {
+                    $file = $this->files[$id] ?? $this->files[$id] = $this->getFile($id);
+
+                    if (isset(self::$valuesCache[$file])) {
+                        [$expiresAt, $this->values[$id]] = self::$valuesCache[$file];
+                    } elseif (\is_array($expiresAt = include $file)) {
+                        if ($this->appendOnly) {
+                            self::$valuesCache[$file] = $expiresAt;
+                        }
+
+                        [$expiresAt, $this->values[$id]] = $expiresAt;
+                    } elseif ($now < $expiresAt) {
+                        $this->values[$id] = new LazyValue($file);
+                    }
+
+                    if ($now >= $expiresAt) {
+                        unset($this->values[$id], $missingIds[$k], self::$valuesCache[$file]);
+                    }
+                } catch (\ErrorException $e) {
+                    unset($missingIds[$k]);
+                }
+            }
+        } finally {
+            restore_error_handler();
+        }
+
+        $ids = $missingIds;
+        $missingIds = [];
+        goto begin;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave(string $id)
+    {
+        if ($this->appendOnly && isset($this->values[$id])) {
+            return true;
+        }
+
+        set_error_handler($this->includeHandler);
+        try {
+            $file = $this->files[$id] ?? $this->files[$id] = $this->getFile($id);
+            $getExpiry = true;
+
+            if (isset(self::$valuesCache[$file])) {
+                [$expiresAt, $value] = self::$valuesCache[$file];
+            } elseif (\is_array($expiresAt = include $file)) {
+                if ($this->appendOnly) {
+                    self::$valuesCache[$file] = $expiresAt;
+                }
+
+                [$expiresAt, $value] = $expiresAt;
+            } elseif ($this->appendOnly) {
+                $value = new LazyValue($file);
+            }
+        } catch (\ErrorException $e) {
+            return false;
+        } finally {
+            restore_error_handler();
+        }
+        if ($this->appendOnly) {
+            $now = 0;
+            $this->values[$id] = $value;
+        } else {
+            $now = time();
+        }
+
+        return $now < $expiresAt;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime)
+    {
+        $ok = true;
+        $expiry = $lifetime ? time() + $lifetime : 'PHP_INT_MAX';
+        $allowCompile = self::isSupported();
+
+        foreach ($values as $key => $value) {
+            unset($this->values[$key]);
+            $isStaticValue = true;
+            if (null === $value) {
+                $value = "'N;'";
+            } elseif (\is_object($value) || \is_array($value)) {
+                try {
+                    $value = VarExporter::export($value, $isStaticValue);
+                } catch (\Exception $e) {
+                    throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)), 0, $e);
+                }
+            } elseif (\is_string($value)) {
+                // Wrap "N;" in a closure to not confuse it with an encoded `null`
+                if ('N;' === $value) {
+                    $isStaticValue = false;
+                }
+                $value = var_export($value, true);
+            } elseif (!\is_scalar($value)) {
+                throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)));
+            } else {
+                $value = var_export($value, true);
+            }
+
+            $encodedKey = rawurlencode($key);
+
+            if ($isStaticValue) {
+                $value = "return [{$expiry}, {$value}];";
+            } elseif ($this->appendOnly) {
+                $value = "return [{$expiry}, static function () { return {$value}; }];";
+            } else {
+                // We cannot use a closure here because of https://bugs.php.net/76982
+                $value = str_replace('\Symfony\Component\VarExporter\Internal\\', '', $value);
+                $value = "namespace Symfony\Component\VarExporter\Internal;\n\nreturn \$getExpiry ? {$expiry} : {$value};";
+            }
+
+            $file = $this->files[$key] = $this->getFile($key, true);
+            // Since OPcache only compiles files older than the script execution start, set the file's mtime in the past
+            $ok = $this->write($file, "<?php //{$encodedKey}\n\n{$value}\n", self::$startTime - 10) && $ok;
+
+            if ($allowCompile) {
+                @opcache_invalidate($file, true);
+                @opcache_compile_file($file);
+            }
+            unset(self::$valuesCache[$file]);
+        }
+
+        if (!$ok && !is_writable($this->directory)) {
+            throw new CacheException(sprintf('Cache directory is not writable (%s).', $this->directory));
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace)
+    {
+        $this->values = [];
+
+        return $this->doCommonClear($namespace);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        foreach ($ids as $id) {
+            unset($this->values[$id]);
+        }
+
+        return $this->doCommonDelete($ids);
+    }
+
+    protected function doUnlink(string $file)
+    {
+        unset(self::$valuesCache[$file]);
+
+        if (self::isSupported()) {
+            @opcache_invalidate($file, true);
+        }
+
+        return @unlink($file);
+    }
+
+    private function getFileKey(string $file): string
+    {
+        if (!$h = @fopen($file, 'r')) {
+            return '';
+        }
+
+        $encodedKey = substr(fgets($h), 8);
+        fclose($h);
+
+        return rawurldecode(rtrim($encodedKey));
+    }
+}
+
+/**
+ * @internal
+ */
+class LazyValue
+{
+    public $file;
+
+    public function __construct(string $file)
+    {
+        $this->file = $file;
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/ProxyAdapter.php b/vendor/symfony/cache/Adapter/ProxyAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..c715cade5c1f0db0e4caaf37191446e4e36bfb63
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/ProxyAdapter.php
@@ -0,0 +1,268 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ContractsTrait;
+use Symfony\Component\Cache\Traits\ProxyTrait;
+use Symfony\Contracts\Cache\CacheInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface
+{
+    use ContractsTrait;
+    use ProxyTrait;
+
+    private $namespace = '';
+    private $namespaceLen;
+    private $poolHash;
+    private $defaultLifetime;
+
+    private static $createCacheItem;
+    private static $setInnerItem;
+
+    public function __construct(CacheItemPoolInterface $pool, string $namespace = '', int $defaultLifetime = 0)
+    {
+        $this->pool = $pool;
+        $this->poolHash = $poolHash = spl_object_hash($pool);
+        if ('' !== $namespace) {
+            \assert('' !== CacheItem::validateKey($namespace));
+            $this->namespace = $namespace;
+        }
+        $this->namespaceLen = \strlen($namespace);
+        $this->defaultLifetime = $defaultLifetime;
+        self::$createCacheItem ?? self::$createCacheItem = \Closure::bind(
+            static function ($key, $innerItem, $poolHash) {
+                $item = new CacheItem();
+                $item->key = $key;
+
+                if (null === $innerItem) {
+                    return $item;
+                }
+
+                $item->value = $v = $innerItem->get();
+                $item->isHit = $innerItem->isHit();
+                $item->innerItem = $innerItem;
+                $item->poolHash = $poolHash;
+
+                // Detect wrapped values that encode for their expiry and creation duration
+                // For compactness, these values are packed in the key of an array using
+                // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F
+                if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) array_key_first($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) {
+                    $item->value = $v[$k];
+                    $v = unpack('Ve/Nc', substr($k, 1, -1));
+                    $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET;
+                    $item->metadata[CacheItem::METADATA_CTIME] = $v['c'];
+                } elseif ($innerItem instanceof CacheItem) {
+                    $item->metadata = $innerItem->metadata;
+                }
+                $innerItem->set(null);
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+        self::$setInnerItem ?? self::$setInnerItem = \Closure::bind(
+            /**
+             * @param array $item A CacheItem cast to (array); accessing protected properties requires adding the "\0*\0" PHP prefix
+             */
+            static function (CacheItemInterface $innerItem, array $item) {
+                // Tags are stored separately, no need to account for them when considering this item's newly set metadata
+                if (isset(($metadata = $item["\0*\0newMetadata"])[CacheItem::METADATA_TAGS])) {
+                    unset($metadata[CacheItem::METADATA_TAGS]);
+                }
+                if ($metadata) {
+                    // For compactness, expiry and creation duration are packed in the key of an array, using magic numbers as separators
+                    $item["\0*\0value"] = ["\x9D".pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME])."\x5F" => $item["\0*\0value"]];
+                }
+                $innerItem->set($item["\0*\0value"]);
+                $innerItem->expiresAt(null !== $item["\0*\0expiry"] ? \DateTime::createFromFormat('U.u', sprintf('%.6F', $item["\0*\0expiry"])) : null);
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get(string $key, callable $callback, float $beta = null, array &$metadata = null)
+    {
+        if (!$this->pool instanceof CacheInterface) {
+            return $this->doGet($this, $key, $callback, $beta, $metadata);
+        }
+
+        return $this->pool->get($this->getId($key), function ($innerItem, bool &$save) use ($key, $callback) {
+            $item = (self::$createCacheItem)($key, $innerItem, $this->poolHash);
+            $item->set($value = $callback($item, $save));
+            (self::$setInnerItem)($innerItem, (array) $item);
+
+            return $value;
+        }, $beta, $metadata);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        $item = $this->pool->getItem($this->getId($key));
+
+        return (self::$createCacheItem)($key, $item, $this->poolHash);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = [])
+    {
+        if ($this->namespaceLen) {
+            foreach ($keys as $i => $key) {
+                $keys[$i] = $this->getId($key);
+            }
+        }
+
+        return $this->generateItems($this->pool->getItems($keys));
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function hasItem($key)
+    {
+        return $this->pool->hasItem($this->getId($key));
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function clear(string $prefix = '')
+    {
+        if ($this->pool instanceof AdapterInterface) {
+            return $this->pool->clear($this->namespace.$prefix);
+        }
+
+        return $this->pool->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItem($key)
+    {
+        return $this->pool->deleteItem($this->getId($key));
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItems(array $keys)
+    {
+        if ($this->namespaceLen) {
+            foreach ($keys as $i => $key) {
+                $keys[$i] = $this->getId($key);
+            }
+        }
+
+        return $this->pool->deleteItems($keys);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function save(CacheItemInterface $item)
+    {
+        return $this->doSave($item, __FUNCTION__);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        return $this->doSave($item, __FUNCTION__);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function commit()
+    {
+        return $this->pool->commit();
+    }
+
+    private function doSave(CacheItemInterface $item, string $method)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $item = (array) $item;
+        if (null === $item["\0*\0expiry"] && 0 < $this->defaultLifetime) {
+            $item["\0*\0expiry"] = microtime(true) + $this->defaultLifetime;
+        }
+
+        if ($item["\0*\0poolHash"] === $this->poolHash && $item["\0*\0innerItem"]) {
+            $innerItem = $item["\0*\0innerItem"];
+        } elseif ($this->pool instanceof AdapterInterface) {
+            // this is an optimization specific for AdapterInterface implementations
+            // so we can save a round-trip to the backend by just creating a new item
+            $innerItem = (self::$createCacheItem)($this->namespace.$item["\0*\0key"], null, $this->poolHash);
+        } else {
+            $innerItem = $this->pool->getItem($this->namespace.$item["\0*\0key"]);
+        }
+
+        (self::$setInnerItem)($innerItem, $item);
+
+        return $this->pool->$method($innerItem);
+    }
+
+    private function generateItems(iterable $items): \Generator
+    {
+        $f = self::$createCacheItem;
+
+        foreach ($items as $key => $item) {
+            if ($this->namespaceLen) {
+                $key = substr($key, $this->namespaceLen);
+            }
+
+            yield $key => $f($key, $item, $this->poolHash);
+        }
+    }
+
+    private function getId($key): string
+    {
+        \assert('' !== CacheItem::validateKey($key));
+
+        return $this->namespace.$key;
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/Psr16Adapter.php b/vendor/symfony/cache/Adapter/Psr16Adapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..a56aa3930484509e60cfca4f89eff986237620eb
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/Psr16Adapter.php
@@ -0,0 +1,86 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ProxyTrait;
+
+/**
+ * Turns a PSR-16 cache into a PSR-6 one.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class Psr16Adapter extends AbstractAdapter implements PruneableInterface, ResettableInterface
+{
+    use ProxyTrait;
+
+    /**
+     * @internal
+     */
+    protected const NS_SEPARATOR = '_';
+
+    private $miss;
+
+    public function __construct(CacheInterface $pool, string $namespace = '', int $defaultLifetime = 0)
+    {
+        parent::__construct($namespace, $defaultLifetime);
+
+        $this->pool = $pool;
+        $this->miss = new \stdClass();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        foreach ($this->pool->getMultiple($ids, $this->miss) as $key => $value) {
+            if ($this->miss !== $value) {
+                yield $key => $value;
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave(string $id)
+    {
+        return $this->pool->has($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace)
+    {
+        return $this->pool->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        return $this->pool->deleteMultiple($ids);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime)
+    {
+        return $this->pool->setMultiple($values, 0 === $lifetime ? null : $lifetime);
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/RedisAdapter.php b/vendor/symfony/cache/Adapter/RedisAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..eb5950e531677191a7a9db5cab3f418f9bd6f120
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/RedisAdapter.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+use Symfony\Component\Cache\Traits\RedisClusterProxy;
+use Symfony\Component\Cache\Traits\RedisProxy;
+use Symfony\Component\Cache\Traits\RedisTrait;
+
+class RedisAdapter extends AbstractAdapter
+{
+    use RedisTrait;
+
+    /**
+     * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis           The redis client
+     * @param string                                                                                $namespace       The default namespace
+     * @param int                                                                                   $defaultLifetime The default lifetime
+     */
+    public function __construct($redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null)
+    {
+        $this->init($redis, $namespace, $defaultLifetime, $marshaller);
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php b/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..865491e19141a982cb1518dc6871b1d9999d3f35
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php
@@ -0,0 +1,325 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Predis\Connection\Aggregate\ClusterInterface;
+use Predis\Connection\Aggregate\PredisCluster;
+use Predis\Connection\Aggregate\ReplicationInterface;
+use Predis\Response\ErrorInterface;
+use Predis\Response\Status;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Exception\LogicException;
+use Symfony\Component\Cache\Marshaller\DeflateMarshaller;
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+use Symfony\Component\Cache\Marshaller\TagAwareMarshaller;
+use Symfony\Component\Cache\Traits\RedisClusterProxy;
+use Symfony\Component\Cache\Traits\RedisProxy;
+use Symfony\Component\Cache\Traits\RedisTrait;
+
+/**
+ * Stores tag id <> cache id relationship as a Redis Set.
+ *
+ * Set (tag relation info) is stored without expiry (non-volatile), while cache always gets an expiry (volatile) even
+ * if not set by caller. Thus if you configure redis with the right eviction policy you can be safe this tag <> cache
+ * relationship survives eviction (cache cleanup when Redis runs out of memory).
+ *
+ * Redis server 2.8+ with any `volatile-*` eviction policy, OR `noeviction` if you're sure memory will NEVER fill up
+ *
+ * Design limitations:
+ *  - Max 4 billion cache keys per cache tag as limited by Redis Set datatype.
+ *    E.g. If you use a "all" items tag for expiry instead of clear(), that limits you to 4 billion cache items also.
+ *
+ * @see https://redis.io/topics/lru-cache#eviction-policies Documentation for Redis eviction policies.
+ * @see https://redis.io/topics/data-types#sets Documentation for Redis Set datatype.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ * @author André Rømcke <andre.romcke+symfony@gmail.com>
+ */
+class RedisTagAwareAdapter extends AbstractTagAwareAdapter
+{
+    use RedisTrait;
+
+    /**
+     * On cache items without a lifetime set, we set it to 100 days. This is to make sure cache items are
+     * preferred to be evicted over tag Sets, if eviction policy is configured according to requirements.
+     */
+    private const DEFAULT_CACHE_TTL = 8640000;
+
+    /**
+     * @var string|null detected eviction policy used on Redis server
+     */
+    private $redisEvictionPolicy;
+    private $namespace;
+
+    /**
+     * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis           The redis client
+     * @param string                                                                                $namespace       The default namespace
+     * @param int                                                                                   $defaultLifetime The default lifetime
+     */
+    public function __construct($redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null)
+    {
+        if ($redis instanceof \Predis\ClientInterface && $redis->getConnection() instanceof ClusterInterface && !$redis->getConnection() instanceof PredisCluster) {
+            throw new InvalidArgumentException(sprintf('Unsupported Predis cluster connection: only "%s" is, "%s" given.', PredisCluster::class, get_debug_type($redis->getConnection())));
+        }
+
+        if (\defined('Redis::OPT_COMPRESSION') && ($redis instanceof \Redis || $redis instanceof \RedisArray || $redis instanceof \RedisCluster)) {
+            $compression = $redis->getOption(\Redis::OPT_COMPRESSION);
+
+            foreach (\is_array($compression) ? $compression : [$compression] as $c) {
+                if (\Redis::COMPRESSION_NONE !== $c) {
+                    throw new InvalidArgumentException(sprintf('phpredis compression must be disabled when using "%s", use "%s" instead.', static::class, DeflateMarshaller::class));
+                }
+            }
+        }
+
+        $this->init($redis, $namespace, $defaultLifetime, new TagAwareMarshaller($marshaller));
+        $this->namespace = $namespace;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime, array $addTagData = [], array $delTagData = []): array
+    {
+        $eviction = $this->getRedisEvictionPolicy();
+        if ('noeviction' !== $eviction && !str_starts_with($eviction, 'volatile-')) {
+            throw new LogicException(sprintf('Redis maxmemory-policy setting "%s" is *not* supported by RedisTagAwareAdapter, use "noeviction" or "volatile-*" eviction policies.', $eviction));
+        }
+
+        // serialize values
+        if (!$serialized = $this->marshaller->marshall($values, $failed)) {
+            return $failed;
+        }
+
+        // While pipeline isn't supported on RedisCluster, other setups will at least benefit from doing this in one op
+        $results = $this->pipeline(static function () use ($serialized, $lifetime, $addTagData, $delTagData, $failed) {
+            // Store cache items, force a ttl if none is set, as there is no MSETEX we need to set each one
+            foreach ($serialized as $id => $value) {
+                yield 'setEx' => [
+                    $id,
+                    0 >= $lifetime ? self::DEFAULT_CACHE_TTL : $lifetime,
+                    $value,
+                ];
+            }
+
+            // Add and Remove Tags
+            foreach ($addTagData as $tagId => $ids) {
+                if (!$failed || $ids = array_diff($ids, $failed)) {
+                    yield 'sAdd' => array_merge([$tagId], $ids);
+                }
+            }
+
+            foreach ($delTagData as $tagId => $ids) {
+                if (!$failed || $ids = array_diff($ids, $failed)) {
+                    yield 'sRem' => array_merge([$tagId], $ids);
+                }
+            }
+        });
+
+        foreach ($results as $id => $result) {
+            // Skip results of SADD/SREM operations, they'll be 1 or 0 depending on if set value already existed or not
+            if (is_numeric($result)) {
+                continue;
+            }
+            // setEx results
+            if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) {
+                $failed[] = $id;
+            }
+        }
+
+        return $failed;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDeleteYieldTags(array $ids): iterable
+    {
+        $lua = <<<'EOLUA'
+            local v = redis.call('GET', KEYS[1])
+            local e = redis.pcall('UNLINK', KEYS[1])
+
+            if type(e) ~= 'number' then
+                redis.call('DEL', KEYS[1])
+            end
+
+            if not v or v:len() <= 13 or v:byte(1) ~= 0x9D or v:byte(6) ~= 0 or v:byte(10) ~= 0x5F then
+                return ''
+            end
+
+            return v:sub(14, 13 + v:byte(13) + v:byte(12) * 256 + v:byte(11) * 65536)
+EOLUA;
+
+        $results = $this->pipeline(function () use ($ids, $lua) {
+            foreach ($ids as $id) {
+                yield 'eval' => $this->redis instanceof \Predis\ClientInterface ? [$lua, 1, $id] : [$lua, [$id], 1];
+            }
+        });
+
+        foreach ($results as $id => $result) {
+            if ($result instanceof \RedisException || $result instanceof ErrorInterface) {
+                CacheItem::log($this->logger, 'Failed to delete key "{key}": '.$result->getMessage(), ['key' => substr($id, \strlen($this->namespace)), 'exception' => $result]);
+
+                continue;
+            }
+
+            try {
+                yield $id => !\is_string($result) || '' === $result ? [] : $this->marshaller->unmarshall($result);
+            } catch (\Exception $e) {
+                yield $id => [];
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDeleteTagRelations(array $tagData): bool
+    {
+        $results = $this->pipeline(static function () use ($tagData) {
+            foreach ($tagData as $tagId => $idList) {
+                array_unshift($idList, $tagId);
+                yield 'sRem' => $idList;
+            }
+        });
+        foreach ($results as $result) {
+            // no-op
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doInvalidate(array $tagIds): bool
+    {
+        // This script scans the set of items linked to tag: it empties the set
+        // and removes the linked items. When the set is still not empty after
+        // the scan, it means we're in cluster mode and that the linked items
+        // are on other nodes: we move the links to a temporary set and we
+        // gargage collect that set from the client side.
+
+        $lua = <<<'EOLUA'
+            redis.replicate_commands()
+
+            local cursor = '0'
+            local id = KEYS[1]
+            repeat
+                local result = redis.call('SSCAN', id, cursor, 'COUNT', 5000);
+                cursor = result[1];
+                local rems = {}
+
+                for _, v in ipairs(result[2]) do
+                    local ok, _ = pcall(redis.call, 'DEL', ARGV[1]..v)
+                    if ok then
+                        table.insert(rems, v)
+                    end
+                end
+                if 0 < #rems then
+                    redis.call('SREM', id, unpack(rems))
+                end
+            until '0' == cursor;
+
+            redis.call('SUNIONSTORE', '{'..id..'}'..id, id)
+            redis.call('DEL', id)
+
+            return redis.call('SSCAN', '{'..id..'}'..id, '0', 'COUNT', 5000)
+EOLUA;
+
+        $results = $this->pipeline(function () use ($tagIds, $lua) {
+            if ($this->redis instanceof \Predis\ClientInterface) {
+                $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : '';
+            } elseif (\is_array($prefix = $this->redis->getOption(\Redis::OPT_PREFIX) ?? '')) {
+                $prefix = current($prefix);
+            }
+
+            foreach ($tagIds as $id) {
+                yield 'eval' => $this->redis instanceof \Predis\ClientInterface ? [$lua, 1, $id, $prefix] : [$lua, [$id, $prefix], 1];
+            }
+        });
+
+        $lua = <<<'EOLUA'
+            redis.replicate_commands()
+
+            local id = KEYS[1]
+            local cursor = table.remove(ARGV)
+            redis.call('SREM', '{'..id..'}'..id, unpack(ARGV))
+
+            return redis.call('SSCAN', '{'..id..'}'..id, cursor, 'COUNT', 5000)
+EOLUA;
+
+        $success = true;
+        foreach ($results as $id => $values) {
+            if ($values instanceof \RedisException || $values instanceof ErrorInterface) {
+                CacheItem::log($this->logger, 'Failed to invalidate key "{key}": '.$values->getMessage(), ['key' => substr($id, \strlen($this->namespace)), 'exception' => $values]);
+                $success = false;
+
+                continue;
+            }
+
+            [$cursor, $ids] = $values;
+
+            while ($ids || '0' !== $cursor) {
+                $this->doDelete($ids);
+
+                $evalArgs = [$id, $cursor];
+                array_splice($evalArgs, 1, 0, $ids);
+
+                if ($this->redis instanceof \Predis\ClientInterface) {
+                    array_unshift($evalArgs, $lua, 1);
+                } else {
+                    $evalArgs = [$lua, $evalArgs, 1];
+                }
+
+                $results = $this->pipeline(function () use ($evalArgs) {
+                    yield 'eval' => $evalArgs;
+                });
+
+                foreach ($results as [$cursor, $ids]) {
+                    // no-op
+                }
+            }
+        }
+
+        return $success;
+    }
+
+    private function getRedisEvictionPolicy(): string
+    {
+        if (null !== $this->redisEvictionPolicy) {
+            return $this->redisEvictionPolicy;
+        }
+
+        $hosts = $this->getHosts();
+        $host = reset($hosts);
+        if ($host instanceof \Predis\Client && $host->getConnection() instanceof ReplicationInterface) {
+            // Predis supports info command only on the master in replication environments
+            $hosts = [$host->getClientFor('master')];
+        }
+
+        foreach ($hosts as $host) {
+            $info = $host->info('Memory');
+
+            if ($info instanceof ErrorInterface) {
+                continue;
+            }
+
+            $info = $info['Memory'] ?? $info;
+
+            return $this->redisEvictionPolicy = $info['maxmemory_policy'];
+        }
+
+        return $this->redisEvictionPolicy = '';
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/TagAwareAdapter.php b/vendor/symfony/cache/Adapter/TagAwareAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..ff22e5a8ac56ecc92e2f17bf4094c6ae2df11d35
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/TagAwareAdapter.php
@@ -0,0 +1,428 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\InvalidArgumentException;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ContractsTrait;
+use Symfony\Component\Cache\Traits\ProxyTrait;
+use Symfony\Contracts\Cache\TagAwareCacheInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, PruneableInterface, ResettableInterface, LoggerAwareInterface
+{
+    use ContractsTrait;
+    use LoggerAwareTrait;
+    use ProxyTrait;
+
+    public const TAGS_PREFIX = "\0tags\0";
+
+    private $deferred = [];
+    private $tags;
+    private $knownTagVersions = [];
+    private $knownTagVersionsTtl;
+
+    private static $createCacheItem;
+    private static $setCacheItemTags;
+    private static $getTagsByKey;
+    private static $saveTags;
+
+    public function __construct(AdapterInterface $itemsPool, AdapterInterface $tagsPool = null, float $knownTagVersionsTtl = 0.15)
+    {
+        $this->pool = $itemsPool;
+        $this->tags = $tagsPool ?: $itemsPool;
+        $this->knownTagVersionsTtl = $knownTagVersionsTtl;
+        self::$createCacheItem ?? self::$createCacheItem = \Closure::bind(
+            static function ($key, $value, CacheItem $protoItem) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->value = $value;
+                $item->expiry = $protoItem->expiry;
+                $item->poolHash = $protoItem->poolHash;
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+        self::$setCacheItemTags ?? self::$setCacheItemTags = \Closure::bind(
+            static function (CacheItem $item, $key, array &$itemTags) {
+                $item->isTaggable = true;
+                if (!$item->isHit) {
+                    return $item;
+                }
+                if (isset($itemTags[$key])) {
+                    foreach ($itemTags[$key] as $tag => $version) {
+                        $item->metadata[CacheItem::METADATA_TAGS][$tag] = $tag;
+                    }
+                    unset($itemTags[$key]);
+                } else {
+                    $item->value = null;
+                    $item->isHit = false;
+                }
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+        self::$getTagsByKey ?? self::$getTagsByKey = \Closure::bind(
+            static function ($deferred) {
+                $tagsByKey = [];
+                foreach ($deferred as $key => $item) {
+                    $tagsByKey[$key] = $item->newMetadata[CacheItem::METADATA_TAGS] ?? [];
+                    $item->metadata = $item->newMetadata;
+                }
+
+                return $tagsByKey;
+            },
+            null,
+            CacheItem::class
+        );
+        self::$saveTags ?? self::$saveTags = \Closure::bind(
+            static function (AdapterInterface $tagsAdapter, array $tags) {
+                ksort($tags);
+
+                foreach ($tags as $v) {
+                    $v->expiry = 0;
+                    $tagsAdapter->saveDeferred($v);
+                }
+
+                return $tagsAdapter->commit();
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function invalidateTags(array $tags)
+    {
+        $ids = [];
+        foreach ($tags as $tag) {
+            \assert('' !== CacheItem::validateKey($tag));
+            unset($this->knownTagVersions[$tag]);
+            $ids[] = $tag.static::TAGS_PREFIX;
+        }
+
+        return !$tags || $this->tags->deleteItems($ids);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function hasItem($key)
+    {
+        if (\is_string($key) && isset($this->deferred[$key])) {
+            $this->commit();
+        }
+
+        if (!$this->pool->hasItem($key)) {
+            return false;
+        }
+
+        $itemTags = $this->pool->getItem(static::TAGS_PREFIX.$key);
+
+        if (!$itemTags->isHit()) {
+            return false;
+        }
+
+        if (!$itemTags = $itemTags->get()) {
+            return true;
+        }
+
+        foreach ($this->getTagVersions([$itemTags]) as $tag => $version) {
+            if ($itemTags[$tag] !== $version) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        foreach ($this->getItems([$key]) as $item) {
+            return $item;
+        }
+
+        return null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = [])
+    {
+        $tagKeys = [];
+        $commit = false;
+
+        foreach ($keys as $key) {
+            if ('' !== $key && \is_string($key)) {
+                $commit = $commit || isset($this->deferred[$key]);
+                $key = static::TAGS_PREFIX.$key;
+                $tagKeys[$key] = $key;
+            }
+        }
+
+        if ($commit) {
+            $this->commit();
+        }
+
+        try {
+            $items = $this->pool->getItems($tagKeys + $keys);
+        } catch (InvalidArgumentException $e) {
+            $this->pool->getItems($keys); // Should throw an exception
+
+            throw $e;
+        }
+
+        return $this->generateItems($items, $tagKeys);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function clear(string $prefix = '')
+    {
+        if ('' !== $prefix) {
+            foreach ($this->deferred as $key => $item) {
+                if (str_starts_with($key, $prefix)) {
+                    unset($this->deferred[$key]);
+                }
+            }
+        } else {
+            $this->deferred = [];
+        }
+
+        if ($this->pool instanceof AdapterInterface) {
+            return $this->pool->clear($prefix);
+        }
+
+        return $this->pool->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItem($key)
+    {
+        return $this->deleteItems([$key]);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItems(array $keys)
+    {
+        foreach ($keys as $key) {
+            if ('' !== $key && \is_string($key)) {
+                $keys[] = static::TAGS_PREFIX.$key;
+            }
+        }
+
+        return $this->pool->deleteItems($keys);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function save(CacheItemInterface $item)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $this->deferred[$item->getKey()] = $item;
+
+        return $this->commit();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $this->deferred[$item->getKey()] = $item;
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function commit()
+    {
+        if (!$this->deferred) {
+            return true;
+        }
+
+        $ok = true;
+        foreach ($this->deferred as $key => $item) {
+            if (!$this->pool->saveDeferred($item)) {
+                unset($this->deferred[$key]);
+                $ok = false;
+            }
+        }
+
+        $items = $this->deferred;
+        $tagsByKey = (self::$getTagsByKey)($items);
+        $this->deferred = [];
+
+        $tagVersions = $this->getTagVersions($tagsByKey);
+        $f = self::$createCacheItem;
+
+        foreach ($tagsByKey as $key => $tags) {
+            $this->pool->saveDeferred($f(static::TAGS_PREFIX.$key, array_intersect_key($tagVersions, $tags), $items[$key]));
+        }
+
+        return $this->pool->commit() && $ok;
+    }
+
+    /**
+     * @return array
+     */
+    public function __sleep()
+    {
+        throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
+    }
+
+    public function __wakeup()
+    {
+        throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
+    }
+
+    public function __destruct()
+    {
+        $this->commit();
+    }
+
+    private function generateItems(iterable $items, array $tagKeys): \Generator
+    {
+        $bufferedItems = $itemTags = [];
+        $f = self::$setCacheItemTags;
+
+        foreach ($items as $key => $item) {
+            if (!$tagKeys) {
+                yield $key => $f($item, static::TAGS_PREFIX.$key, $itemTags);
+                continue;
+            }
+            if (!isset($tagKeys[$key])) {
+                $bufferedItems[$key] = $item;
+                continue;
+            }
+
+            unset($tagKeys[$key]);
+
+            if ($item->isHit()) {
+                $itemTags[$key] = $item->get() ?: [];
+            }
+
+            if (!$tagKeys) {
+                $tagVersions = $this->getTagVersions($itemTags);
+
+                foreach ($itemTags as $key => $tags) {
+                    foreach ($tags as $tag => $version) {
+                        if ($tagVersions[$tag] !== $version) {
+                            unset($itemTags[$key]);
+                            continue 2;
+                        }
+                    }
+                }
+                $tagVersions = $tagKeys = null;
+
+                foreach ($bufferedItems as $key => $item) {
+                    yield $key => $f($item, static::TAGS_PREFIX.$key, $itemTags);
+                }
+                $bufferedItems = null;
+            }
+        }
+    }
+
+    private function getTagVersions(array $tagsByKey)
+    {
+        $tagVersions = [];
+        $fetchTagVersions = false;
+
+        foreach ($tagsByKey as $tags) {
+            $tagVersions += $tags;
+
+            foreach ($tags as $tag => $version) {
+                if ($tagVersions[$tag] !== $version) {
+                    unset($this->knownTagVersions[$tag]);
+                }
+            }
+        }
+
+        if (!$tagVersions) {
+            return [];
+        }
+
+        $now = microtime(true);
+        $tags = [];
+        foreach ($tagVersions as $tag => $version) {
+            $tags[$tag.static::TAGS_PREFIX] = $tag;
+            if ($fetchTagVersions || ($this->knownTagVersions[$tag][1] ?? null) !== $version || $now - $this->knownTagVersions[$tag][0] >= $this->knownTagVersionsTtl) {
+                // reuse previously fetched tag versions up to the ttl
+                $fetchTagVersions = true;
+            }
+        }
+
+        if (!$fetchTagVersions) {
+            return $tagVersions;
+        }
+
+        $newTags = [];
+        $newVersion = null;
+        foreach ($this->tags->getItems(array_keys($tags)) as $tag => $version) {
+            if (!$version->isHit()) {
+                $newTags[$tag] = $version->set($newVersion ?? $newVersion = random_int(\PHP_INT_MIN, \PHP_INT_MAX));
+            }
+            $tagVersions[$tag = $tags[$tag]] = $version->get();
+            $this->knownTagVersions[$tag] = [$now, $tagVersions[$tag]];
+        }
+
+        if ($newTags) {
+            (self::$saveTags)($this->tags, $newTags);
+        }
+
+        return $tagVersions;
+    }
+}
diff --git a/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php b/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..afa18d3b558df90e66e0fc3d53e23802e6c813e7
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\InvalidArgumentException;
+
+/**
+ * Interface for invalidating cached items using tags.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface TagAwareAdapterInterface extends AdapterInterface
+{
+    /**
+     * Invalidates cached items using tags.
+     *
+     * @param string[] $tags An array of tags to invalidate
+     *
+     * @return bool
+     *
+     * @throws InvalidArgumentException When $tags is not valid
+     */
+    public function invalidateTags(array $tags);
+}
diff --git a/vendor/symfony/cache/Adapter/TraceableAdapter.php b/vendor/symfony/cache/Adapter/TraceableAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b06557f8502a319989b6e49da92c34b24e5c832
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/TraceableAdapter.php
@@ -0,0 +1,295 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Contracts\Cache\CacheInterface;
+use Symfony\Contracts\Service\ResetInterface;
+
+/**
+ * An adapter that collects data about all cache calls.
+ *
+ * @author Aaron Scherer <aequasi@gmail.com>
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface
+{
+    protected $pool;
+    private $calls = [];
+
+    public function __construct(AdapterInterface $pool)
+    {
+        $this->pool = $pool;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get(string $key, callable $callback, float $beta = null, array &$metadata = null)
+    {
+        if (!$this->pool instanceof CacheInterface) {
+            throw new \BadMethodCallException(sprintf('Cannot call "%s::get()": this class doesn\'t implement "%s".', get_debug_type($this->pool), CacheInterface::class));
+        }
+
+        $isHit = true;
+        $callback = function (CacheItem $item, bool &$save) use ($callback, &$isHit) {
+            $isHit = $item->isHit();
+
+            return $callback($item, $save);
+        };
+
+        $event = $this->start(__FUNCTION__);
+        try {
+            $value = $this->pool->get($key, $callback, $beta, $metadata);
+            $event->result[$key] = get_debug_type($value);
+        } finally {
+            $event->end = microtime(true);
+        }
+        if ($isHit) {
+            ++$event->hits;
+        } else {
+            ++$event->misses;
+        }
+
+        return $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            $item = $this->pool->getItem($key);
+        } finally {
+            $event->end = microtime(true);
+        }
+        if ($event->result[$key] = $item->isHit()) {
+            ++$event->hits;
+        } else {
+            ++$event->misses;
+        }
+
+        return $item;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function hasItem($key)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$key] = $this->pool->hasItem($key);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItem($key)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$key] = $this->pool->deleteItem($key);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function save(CacheItemInterface $item)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$item->getKey()] = $this->pool->save($item);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$item->getKey()] = $this->pool->saveDeferred($item);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = [])
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            $result = $this->pool->getItems($keys);
+        } finally {
+            $event->end = microtime(true);
+        }
+        $f = function () use ($result, $event) {
+            $event->result = [];
+            foreach ($result as $key => $item) {
+                if ($event->result[$key] = $item->isHit()) {
+                    ++$event->hits;
+                } else {
+                    ++$event->misses;
+                }
+                yield $key => $item;
+            }
+        };
+
+        return $f();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function clear(string $prefix = '')
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            if ($this->pool instanceof AdapterInterface) {
+                return $event->result = $this->pool->clear($prefix);
+            }
+
+            return $event->result = $this->pool->clear();
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItems(array $keys)
+    {
+        $event = $this->start(__FUNCTION__);
+        $event->result['keys'] = $keys;
+        try {
+            return $event->result['result'] = $this->pool->deleteItems($keys);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function commit()
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result = $this->pool->commit();
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        if (!$this->pool instanceof PruneableInterface) {
+            return false;
+        }
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result = $this->pool->prune();
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if ($this->pool instanceof ResetInterface) {
+            $this->pool->reset();
+        }
+
+        $this->clearCalls();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete(string $key): bool
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$key] = $this->pool->deleteItem($key);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    public function getCalls()
+    {
+        return $this->calls;
+    }
+
+    public function clearCalls()
+    {
+        $this->calls = [];
+    }
+
+    protected function start(string $name)
+    {
+        $this->calls[] = $event = new TraceableAdapterEvent();
+        $event->name = $name;
+        $event->start = microtime(true);
+
+        return $event;
+    }
+}
+
+class TraceableAdapterEvent
+{
+    public $name;
+    public $start;
+    public $end;
+    public $result;
+    public $hits = 0;
+    public $misses = 0;
+}
diff --git a/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php b/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..69461b8b6bb32c16a921275cf35b13341ad7124c
--- /dev/null
+++ b/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Contracts\Cache\TagAwareCacheInterface;
+
+/**
+ * @author Robin Chalas <robin.chalas@gmail.com>
+ */
+class TraceableTagAwareAdapter extends TraceableAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface
+{
+    public function __construct(TagAwareAdapterInterface $pool)
+    {
+        parent::__construct($pool);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function invalidateTags(array $tags)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result = $this->pool->invalidateTags($tags);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+}
diff --git a/vendor/symfony/cache/CHANGELOG.md b/vendor/symfony/cache/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..60a862740d1e7857b3820b17f065b9d87838972c
--- /dev/null
+++ b/vendor/symfony/cache/CHANGELOG.md
@@ -0,0 +1,108 @@
+CHANGELOG
+=========
+
+5.4
+---
+
+ * Deprecate `DoctrineProvider` and `DoctrineAdapter` because these classes have been added to the `doctrine/cache` package
+ * Add `DoctrineDbalAdapter` identical to `PdoAdapter` for `Doctrine\DBAL\Connection` or DBAL URL
+ * Deprecate usage of `PdoAdapter` with `Doctrine\DBAL\Connection` or DBAL URL
+
+5.3
+---
+
+ * added support for connecting to Redis Sentinel clusters when using the Redis PHP extension
+ * add support for a custom serializer to the `ApcuAdapter` class
+
+5.2.0
+-----
+
+ * added integration with Messenger to allow computing cached values in a worker
+ * allow ISO 8601 time intervals to specify default lifetime
+
+5.1.0
+-----
+
+ * added max-items + LRU + max-lifetime capabilities to `ArrayCache`
+ * added `CouchbaseBucketAdapter`
+ * added context `cache-adapter` to log messages
+
+5.0.0
+-----
+
+ * removed all PSR-16 implementations in the `Simple` namespace
+ * removed `SimpleCacheAdapter`
+ * removed `AbstractAdapter::unserialize()`
+ * removed `CacheItem::getPreviousTags()`
+
+4.4.0
+-----
+
+ * added support for connecting to Redis Sentinel clusters
+ * added argument `$prefix` to `AdapterInterface::clear()`
+ * improved `RedisTagAwareAdapter` to support Redis server >= 2.8 and up to 4B items per tag
+ * added `TagAwareMarshaller` for optimized data storage when using `AbstractTagAwareAdapter`
+ * added `DeflateMarshaller` to compress serialized values
+ * removed support for phpredis 4 `compression`
+ * [BC BREAK] `RedisTagAwareAdapter` is not compatible with `RedisCluster` from `Predis` anymore, use `phpredis` instead
+ * Marked the `CacheDataCollector` class as `@final`.
+ * added `SodiumMarshaller` to encrypt/decrypt values using libsodium
+
+4.3.0
+-----
+
+ * removed `psr/simple-cache` dependency, run `composer require psr/simple-cache` if you need it
+ * deprecated all PSR-16 adapters, use `Psr16Cache` or `Symfony\Contracts\Cache\CacheInterface` implementations instead
+ * deprecated `SimpleCacheAdapter`, use `Psr16Adapter` instead
+
+4.2.0
+-----
+
+ * added support for connecting to Redis clusters via DSN
+ * added support for configuring multiple Memcached servers via DSN
+ * added `MarshallerInterface` and `DefaultMarshaller` to allow changing the serializer and provide one that automatically uses igbinary when available
+ * implemented `CacheInterface`, which provides stampede protection via probabilistic early expiration and should become the preferred way to use a cache
+ * added sub-second expiry accuracy for backends that support it
+ * added support for phpredis 4 `compression` and `tcp_keepalive` options
+ * added automatic table creation when using Doctrine DBAL with PDO-based backends
+ * throw `LogicException` when `CacheItem::tag()` is called on an item coming from a non tag-aware pool
+ * deprecated `CacheItem::getPreviousTags()`, use `CacheItem::getMetadata()` instead
+ * deprecated the `AbstractAdapter::unserialize()` and `AbstractCache::unserialize()` methods
+ * added `CacheCollectorPass` (originally in `FrameworkBundle`)
+ * added `CachePoolClearerPass` (originally in `FrameworkBundle`)
+ * added `CachePoolPass` (originally in `FrameworkBundle`)
+ * added `CachePoolPrunerPass` (originally in `FrameworkBundle`)
+
+3.4.0
+-----
+
+ * added using options from Memcached DSN
+ * added PruneableInterface so PSR-6 or PSR-16 cache implementations can declare support for manual stale cache pruning
+ * added prune logic to FilesystemTrait, PhpFilesTrait, PdoTrait, TagAwareAdapter and ChainTrait
+ * now FilesystemAdapter, PhpFilesAdapter, FilesystemCache, PhpFilesCache, PdoAdapter, PdoCache, ChainAdapter, and
+   ChainCache implement PruneableInterface and support manual stale cache pruning
+
+3.3.0
+-----
+
+ * added CacheItem::getPreviousTags() to get bound tags coming from the pool storage if any
+ * added PSR-16 "Simple Cache" implementations for all existing PSR-6 adapters
+ * added Psr6Cache and SimpleCacheAdapter for bidirectional interoperability between PSR-6 and PSR-16
+ * added MemcachedAdapter (PSR-6) and MemcachedCache (PSR-16)
+ * added TraceableAdapter (PSR-6) and TraceableCache (PSR-16)
+
+3.2.0
+-----
+
+ * added TagAwareAdapter for tags-based invalidation
+ * added PdoAdapter with PDO and Doctrine DBAL support
+ * added PhpArrayAdapter and PhpFilesAdapter for OPcache-backed shared memory storage (PHP 7+ only)
+ * added NullAdapter
+
+3.1.0
+-----
+
+ * added the component with strict PSR-6 implementations
+ * added ApcuAdapter, ArrayAdapter, FilesystemAdapter and RedisAdapter
+ * added AbstractAdapter, ChainAdapter and ProxyAdapter
+ * added DoctrineAdapter and DoctrineProvider for bidirectional interoperability with Doctrine Cache
diff --git a/vendor/symfony/cache/CacheItem.php b/vendor/symfony/cache/CacheItem.php
new file mode 100644
index 0000000000000000000000000000000000000000..091d9e9b8999bbd1682d8fa9891226e31edcc5e8
--- /dev/null
+++ b/vendor/symfony/cache/CacheItem.php
@@ -0,0 +1,192 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Exception\LogicException;
+use Symfony\Contracts\Cache\ItemInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+final class CacheItem implements ItemInterface
+{
+    private const METADATA_EXPIRY_OFFSET = 1527506807;
+
+    protected $key;
+    protected $value;
+    protected $isHit = false;
+    protected $expiry;
+    protected $metadata = [];
+    protected $newMetadata = [];
+    protected $innerItem;
+    protected $poolHash;
+    protected $isTaggable = false;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getKey(): string
+    {
+        return $this->key;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return mixed
+     */
+    public function get()
+    {
+        return $this->value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isHit(): bool
+    {
+        return $this->isHit;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return $this
+     */
+    public function set($value): self
+    {
+        $this->value = $value;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return $this
+     */
+    public function expiresAt($expiration): self
+    {
+        if (null === $expiration) {
+            $this->expiry = null;
+        } elseif ($expiration instanceof \DateTimeInterface) {
+            $this->expiry = (float) $expiration->format('U.u');
+        } else {
+            throw new InvalidArgumentException(sprintf('Expiration date must implement DateTimeInterface or be null, "%s" given.', get_debug_type($expiration)));
+        }
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return $this
+     */
+    public function expiresAfter($time): self
+    {
+        if (null === $time) {
+            $this->expiry = null;
+        } elseif ($time instanceof \DateInterval) {
+            $this->expiry = microtime(true) + \DateTime::createFromFormat('U', 0)->add($time)->format('U.u');
+        } elseif (\is_int($time)) {
+            $this->expiry = $time + microtime(true);
+        } else {
+            throw new InvalidArgumentException(sprintf('Expiration date must be an integer, a DateInterval or null, "%s" given.', get_debug_type($time)));
+        }
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function tag($tags): ItemInterface
+    {
+        if (!$this->isTaggable) {
+            throw new LogicException(sprintf('Cache item "%s" comes from a non tag-aware pool: you cannot tag it.', $this->key));
+        }
+        if (!is_iterable($tags)) {
+            $tags = [$tags];
+        }
+        foreach ($tags as $tag) {
+            if (!\is_string($tag) && !(\is_object($tag) && method_exists($tag, '__toString'))) {
+                throw new InvalidArgumentException(sprintf('Cache tag must be string or object that implements __toString(), "%s" given.', \is_object($tag) ? \get_class($tag) : \gettype($tag)));
+            }
+            $tag = (string) $tag;
+            if (isset($this->newMetadata[self::METADATA_TAGS][$tag])) {
+                continue;
+            }
+            if ('' === $tag) {
+                throw new InvalidArgumentException('Cache tag length must be greater than zero.');
+            }
+            if (false !== strpbrk($tag, self::RESERVED_CHARACTERS)) {
+                throw new InvalidArgumentException(sprintf('Cache tag "%s" contains reserved characters "%s".', $tag, self::RESERVED_CHARACTERS));
+            }
+            $this->newMetadata[self::METADATA_TAGS][$tag] = $tag;
+        }
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadata(): array
+    {
+        return $this->metadata;
+    }
+
+    /**
+     * Validates a cache key according to PSR-6.
+     *
+     * @param mixed $key The key to validate
+     *
+     * @throws InvalidArgumentException When $key is not valid
+     */
+    public static function validateKey($key): string
+    {
+        if (!\is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
+        }
+        if ('' === $key) {
+            throw new InvalidArgumentException('Cache key length must be greater than zero.');
+        }
+        if (false !== strpbrk($key, self::RESERVED_CHARACTERS)) {
+            throw new InvalidArgumentException(sprintf('Cache key "%s" contains reserved characters "%s".', $key, self::RESERVED_CHARACTERS));
+        }
+
+        return $key;
+    }
+
+    /**
+     * Internal logging helper.
+     *
+     * @internal
+     */
+    public static function log(?LoggerInterface $logger, string $message, array $context = [])
+    {
+        if ($logger) {
+            $logger->warning($message, $context);
+        } else {
+            $replace = [];
+            foreach ($context as $k => $v) {
+                if (\is_scalar($v)) {
+                    $replace['{'.$k.'}'] = $v;
+                }
+            }
+            @trigger_error(strtr($message, $replace), \E_USER_WARNING);
+        }
+    }
+}
diff --git a/vendor/symfony/cache/DataCollector/CacheDataCollector.php b/vendor/symfony/cache/DataCollector/CacheDataCollector.php
new file mode 100644
index 0000000000000000000000000000000000000000..9590436dc463000fdbe2bc663cf045e320aa5b10
--- /dev/null
+++ b/vendor/symfony/cache/DataCollector/CacheDataCollector.php
@@ -0,0 +1,185 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\DataCollector;
+
+use Symfony\Component\Cache\Adapter\TraceableAdapter;
+use Symfony\Component\Cache\Adapter\TraceableAdapterEvent;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\DataCollector\DataCollector;
+use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
+
+/**
+ * @author Aaron Scherer <aequasi@gmail.com>
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ *
+ * @final
+ */
+class CacheDataCollector extends DataCollector implements LateDataCollectorInterface
+{
+    /**
+     * @var TraceableAdapter[]
+     */
+    private $instances = [];
+
+    public function addInstance(string $name, TraceableAdapter $instance)
+    {
+        $this->instances[$name] = $instance;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Throwable $exception = null)
+    {
+        $empty = ['calls' => [], 'config' => [], 'options' => [], 'statistics' => []];
+        $this->data = ['instances' => $empty, 'total' => $empty];
+        foreach ($this->instances as $name => $instance) {
+            $this->data['instances']['calls'][$name] = $instance->getCalls();
+        }
+
+        $this->data['instances']['statistics'] = $this->calculateStatistics();
+        $this->data['total']['statistics'] = $this->calculateTotalStatistics();
+    }
+
+    public function reset()
+    {
+        $this->data = [];
+        foreach ($this->instances as $instance) {
+            $instance->clearCalls();
+        }
+    }
+
+    public function lateCollect()
+    {
+        $this->data['instances']['calls'] = $this->cloneVar($this->data['instances']['calls']);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName(): string
+    {
+        return 'cache';
+    }
+
+    /**
+     * Method returns amount of logged Cache reads: "get" calls.
+     */
+    public function getStatistics(): array
+    {
+        return $this->data['instances']['statistics'];
+    }
+
+    /**
+     * Method returns the statistic totals.
+     */
+    public function getTotals(): array
+    {
+        return $this->data['total']['statistics'];
+    }
+
+    /**
+     * Method returns all logged Cache call objects.
+     *
+     * @return mixed
+     */
+    public function getCalls()
+    {
+        return $this->data['instances']['calls'];
+    }
+
+    private function calculateStatistics(): array
+    {
+        $statistics = [];
+        foreach ($this->data['instances']['calls'] as $name => $calls) {
+            $statistics[$name] = [
+                'calls' => 0,
+                'time' => 0,
+                'reads' => 0,
+                'writes' => 0,
+                'deletes' => 0,
+                'hits' => 0,
+                'misses' => 0,
+            ];
+            /** @var TraceableAdapterEvent $call */
+            foreach ($calls as $call) {
+                ++$statistics[$name]['calls'];
+                $statistics[$name]['time'] += $call->end - $call->start;
+                if ('get' === $call->name) {
+                    ++$statistics[$name]['reads'];
+                    if ($call->hits) {
+                        ++$statistics[$name]['hits'];
+                    } else {
+                        ++$statistics[$name]['misses'];
+                        ++$statistics[$name]['writes'];
+                    }
+                } elseif ('getItem' === $call->name) {
+                    ++$statistics[$name]['reads'];
+                    if ($call->hits) {
+                        ++$statistics[$name]['hits'];
+                    } else {
+                        ++$statistics[$name]['misses'];
+                    }
+                } elseif ('getItems' === $call->name) {
+                    $statistics[$name]['reads'] += $call->hits + $call->misses;
+                    $statistics[$name]['hits'] += $call->hits;
+                    $statistics[$name]['misses'] += $call->misses;
+                } elseif ('hasItem' === $call->name) {
+                    ++$statistics[$name]['reads'];
+                    if (false === $call->result) {
+                        ++$statistics[$name]['misses'];
+                    } else {
+                        ++$statistics[$name]['hits'];
+                    }
+                } elseif ('save' === $call->name) {
+                    ++$statistics[$name]['writes'];
+                } elseif ('deleteItem' === $call->name) {
+                    ++$statistics[$name]['deletes'];
+                }
+            }
+            if ($statistics[$name]['reads']) {
+                $statistics[$name]['hit_read_ratio'] = round(100 * $statistics[$name]['hits'] / $statistics[$name]['reads'], 2);
+            } else {
+                $statistics[$name]['hit_read_ratio'] = null;
+            }
+        }
+
+        return $statistics;
+    }
+
+    private function calculateTotalStatistics(): array
+    {
+        $statistics = $this->getStatistics();
+        $totals = [
+            'calls' => 0,
+            'time' => 0,
+            'reads' => 0,
+            'writes' => 0,
+            'deletes' => 0,
+            'hits' => 0,
+            'misses' => 0,
+        ];
+        foreach ($statistics as $name => $values) {
+            foreach ($totals as $key => $value) {
+                $totals[$key] += $statistics[$name][$key];
+            }
+        }
+        if ($totals['reads']) {
+            $totals['hit_read_ratio'] = round(100 * $totals['hits'] / $totals['reads'], 2);
+        } else {
+            $totals['hit_read_ratio'] = null;
+        }
+
+        return $totals;
+    }
+}
diff --git a/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php b/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..843232e441530a1483311af048be09af9256cea2
--- /dev/null
+++ b/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\DependencyInjection;
+
+use Symfony\Component\Cache\Adapter\TagAwareAdapterInterface;
+use Symfony\Component\Cache\Adapter\TraceableAdapter;
+use Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Inject a data collector to all the cache services to be able to get detailed statistics.
+ *
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+class CacheCollectorPass implements CompilerPassInterface
+{
+    private $dataCollectorCacheId;
+    private $cachePoolTag;
+    private $cachePoolRecorderInnerSuffix;
+
+    public function __construct(string $dataCollectorCacheId = 'data_collector.cache', string $cachePoolTag = 'cache.pool', string $cachePoolRecorderInnerSuffix = '.recorder_inner')
+    {
+        if (0 < \func_num_args()) {
+            trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__);
+        }
+
+        $this->dataCollectorCacheId = $dataCollectorCacheId;
+        $this->cachePoolTag = $cachePoolTag;
+        $this->cachePoolRecorderInnerSuffix = $cachePoolRecorderInnerSuffix;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->hasDefinition($this->dataCollectorCacheId)) {
+            return;
+        }
+
+        foreach ($container->findTaggedServiceIds($this->cachePoolTag) as $id => $attributes) {
+            $poolName = $attributes[0]['name'] ?? $id;
+
+            $this->addToCollector($id, $poolName, $container);
+        }
+    }
+
+    private function addToCollector(string $id, string $name, ContainerBuilder $container)
+    {
+        $definition = $container->getDefinition($id);
+        if ($definition->isAbstract()) {
+            return;
+        }
+
+        $collectorDefinition = $container->getDefinition($this->dataCollectorCacheId);
+        $recorder = new Definition(is_subclass_of($definition->getClass(), TagAwareAdapterInterface::class) ? TraceableTagAwareAdapter::class : TraceableAdapter::class);
+        $recorder->setTags($definition->getTags());
+        if (!$definition->isPublic() || !$definition->isPrivate()) {
+            $recorder->setPublic($definition->isPublic());
+        }
+        $recorder->setArguments([new Reference($innerId = $id.$this->cachePoolRecorderInnerSuffix)]);
+
+        foreach ($definition->getMethodCalls() as [$method, $args]) {
+            if ('setCallbackWrapper' !== $method || !$args[0] instanceof Definition || !($args[0]->getArguments()[2] ?? null) instanceof Definition) {
+                continue;
+            }
+            if ([new Reference($id), 'setCallbackWrapper'] == $args[0]->getArguments()[2]->getFactory()) {
+                $args[0]->getArguments()[2]->setFactory([new Reference($innerId), 'setCallbackWrapper']);
+            }
+        }
+
+        $definition->setTags([]);
+        $definition->setPublic(false);
+
+        $container->setDefinition($innerId, $definition);
+        $container->setDefinition($id, $recorder);
+
+        // Tell the collector to add the new instance
+        $collectorDefinition->addMethodCall('addInstance', [$name, new Reference($id)]);
+        $collectorDefinition->setPublic(false);
+    }
+}
diff --git a/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php b/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..c9b04addab51eb579fe1dd01266876f6ccfa8a6e
--- /dev/null
+++ b/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class CachePoolClearerPass implements CompilerPassInterface
+{
+    private $cachePoolClearerTag;
+
+    public function __construct(string $cachePoolClearerTag = 'cache.pool.clearer')
+    {
+        if (0 < \func_num_args()) {
+            trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__);
+        }
+
+        $this->cachePoolClearerTag = $cachePoolClearerTag;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $container->getParameterBag()->remove('cache.prefix.seed');
+
+        foreach ($container->findTaggedServiceIds($this->cachePoolClearerTag) as $id => $attr) {
+            $clearer = $container->getDefinition($id);
+            $pools = [];
+            foreach ($clearer->getArgument(0) as $name => $ref) {
+                if ($container->hasDefinition($ref)) {
+                    $pools[$name] = new Reference($ref);
+                }
+            }
+            $clearer->replaceArgument(0, $pools);
+        }
+    }
+}
diff --git a/vendor/symfony/cache/DependencyInjection/CachePoolPass.php b/vendor/symfony/cache/DependencyInjection/CachePoolPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..14ac2bde48f040d174523fe9916fb4028710d814
--- /dev/null
+++ b/vendor/symfony/cache/DependencyInjection/CachePoolPass.php
@@ -0,0 +1,274 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\DependencyInjection;
+
+use Symfony\Component\Cache\Adapter\AbstractAdapter;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\Adapter\ChainAdapter;
+use Symfony\Component\Cache\Adapter\NullAdapter;
+use Symfony\Component\Cache\Adapter\ParameterNormalizer;
+use Symfony\Component\Cache\Messenger\EarlyExpirationDispatcher;
+use Symfony\Component\DependencyInjection\ChildDefinition;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class CachePoolPass implements CompilerPassInterface
+{
+    private $cachePoolTag;
+    private $kernelResetTag;
+    private $cacheClearerId;
+    private $cachePoolClearerTag;
+    private $cacheSystemClearerId;
+    private $cacheSystemClearerTag;
+    private $reverseContainerId;
+    private $reversibleTag;
+    private $messageHandlerId;
+
+    public function __construct(string $cachePoolTag = 'cache.pool', string $kernelResetTag = 'kernel.reset', string $cacheClearerId = 'cache.global_clearer', string $cachePoolClearerTag = 'cache.pool.clearer', string $cacheSystemClearerId = 'cache.system_clearer', string $cacheSystemClearerTag = 'kernel.cache_clearer', string $reverseContainerId = 'reverse_container', string $reversibleTag = 'container.reversible', string $messageHandlerId = 'cache.early_expiration_handler')
+    {
+        if (0 < \func_num_args()) {
+            trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__);
+        }
+
+        $this->cachePoolTag = $cachePoolTag;
+        $this->kernelResetTag = $kernelResetTag;
+        $this->cacheClearerId = $cacheClearerId;
+        $this->cachePoolClearerTag = $cachePoolClearerTag;
+        $this->cacheSystemClearerId = $cacheSystemClearerId;
+        $this->cacheSystemClearerTag = $cacheSystemClearerTag;
+        $this->reverseContainerId = $reverseContainerId;
+        $this->reversibleTag = $reversibleTag;
+        $this->messageHandlerId = $messageHandlerId;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        if ($container->hasParameter('cache.prefix.seed')) {
+            $seed = $container->getParameterBag()->resolveValue($container->getParameter('cache.prefix.seed'));
+        } else {
+            $seed = '_'.$container->getParameter('kernel.project_dir');
+            $seed .= '.'.$container->getParameter('kernel.container_class');
+        }
+
+        $needsMessageHandler = false;
+        $allPools = [];
+        $clearers = [];
+        $attributes = [
+            'provider',
+            'name',
+            'namespace',
+            'default_lifetime',
+            'early_expiration_message_bus',
+            'reset',
+        ];
+        foreach ($container->findTaggedServiceIds($this->cachePoolTag) as $id => $tags) {
+            $adapter = $pool = $container->getDefinition($id);
+            if ($pool->isAbstract()) {
+                continue;
+            }
+            $class = $adapter->getClass();
+            while ($adapter instanceof ChildDefinition) {
+                $adapter = $container->findDefinition($adapter->getParent());
+                $class = $class ?: $adapter->getClass();
+                if ($t = $adapter->getTag($this->cachePoolTag)) {
+                    $tags[0] += $t[0];
+                }
+            }
+            $name = $tags[0]['name'] ?? $id;
+            if (!isset($tags[0]['namespace'])) {
+                $namespaceSeed = $seed;
+                if (null !== $class) {
+                    $namespaceSeed .= '.'.$class;
+                }
+
+                $tags[0]['namespace'] = $this->getNamespace($namespaceSeed, $name);
+            }
+            if (isset($tags[0]['clearer'])) {
+                $clearer = $tags[0]['clearer'];
+                while ($container->hasAlias($clearer)) {
+                    $clearer = (string) $container->getAlias($clearer);
+                }
+            } else {
+                $clearer = null;
+            }
+            unset($tags[0]['clearer'], $tags[0]['name']);
+
+            if (isset($tags[0]['provider'])) {
+                $tags[0]['provider'] = new Reference(static::getServiceProvider($container, $tags[0]['provider']));
+            }
+
+            if (ChainAdapter::class === $class) {
+                $adapters = [];
+                foreach ($adapter->getArgument(0) as $provider => $adapter) {
+                    if ($adapter instanceof ChildDefinition) {
+                        $chainedPool = $adapter;
+                    } else {
+                        $chainedPool = $adapter = new ChildDefinition($adapter);
+                    }
+
+                    $chainedTags = [\is_int($provider) ? [] : ['provider' => $provider]];
+                    $chainedClass = '';
+
+                    while ($adapter instanceof ChildDefinition) {
+                        $adapter = $container->findDefinition($adapter->getParent());
+                        $chainedClass = $chainedClass ?: $adapter->getClass();
+                        if ($t = $adapter->getTag($this->cachePoolTag)) {
+                            $chainedTags[0] += $t[0];
+                        }
+                    }
+
+                    if (ChainAdapter::class === $chainedClass) {
+                        throw new InvalidArgumentException(sprintf('Invalid service "%s": chain of adapters cannot reference another chain, found "%s".', $id, $chainedPool->getParent()));
+                    }
+
+                    $i = 0;
+
+                    if (isset($chainedTags[0]['provider'])) {
+                        $chainedPool->replaceArgument($i++, new Reference(static::getServiceProvider($container, $chainedTags[0]['provider'])));
+                    }
+
+                    if (isset($tags[0]['namespace']) && !\in_array($adapter->getClass(), [ArrayAdapter::class, NullAdapter::class], true)) {
+                        $chainedPool->replaceArgument($i++, $tags[0]['namespace']);
+                    }
+
+                    if (isset($tags[0]['default_lifetime'])) {
+                        $chainedPool->replaceArgument($i++, $tags[0]['default_lifetime']);
+                    }
+
+                    $adapters[] = $chainedPool;
+                }
+
+                $pool->replaceArgument(0, $adapters);
+                unset($tags[0]['provider'], $tags[0]['namespace']);
+                $i = 1;
+            } else {
+                $i = 0;
+            }
+
+            foreach ($attributes as $attr) {
+                if (!isset($tags[0][$attr])) {
+                    // no-op
+                } elseif ('reset' === $attr) {
+                    if ($tags[0][$attr]) {
+                        $pool->addTag($this->kernelResetTag, ['method' => $tags[0][$attr]]);
+                    }
+                } elseif ('early_expiration_message_bus' === $attr) {
+                    $needsMessageHandler = true;
+                    $pool->addMethodCall('setCallbackWrapper', [(new Definition(EarlyExpirationDispatcher::class))
+                        ->addArgument(new Reference($tags[0]['early_expiration_message_bus']))
+                        ->addArgument(new Reference($this->reverseContainerId))
+                        ->addArgument((new Definition('callable'))
+                            ->setFactory([new Reference($id), 'setCallbackWrapper'])
+                            ->addArgument(null)
+                        ),
+                    ]);
+                    $pool->addTag($this->reversibleTag);
+                } elseif ('namespace' !== $attr || !\in_array($class, [ArrayAdapter::class, NullAdapter::class], true)) {
+                    $argument = $tags[0][$attr];
+
+                    if ('default_lifetime' === $attr && !is_numeric($argument)) {
+                        $argument = (new Definition('int', [$argument]))
+                            ->setFactory([ParameterNormalizer::class, 'normalizeDuration']);
+                    }
+
+                    $pool->replaceArgument($i++, $argument);
+                }
+                unset($tags[0][$attr]);
+            }
+            if (!empty($tags[0])) {
+                throw new InvalidArgumentException(sprintf('Invalid "%s" tag for service "%s": accepted attributes are "clearer", "provider", "name", "namespace", "default_lifetime", "early_expiration_message_bus" and "reset", found "%s".', $this->cachePoolTag, $id, implode('", "', array_keys($tags[0]))));
+            }
+
+            if (null !== $clearer) {
+                $clearers[$clearer][$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE);
+            }
+
+            $allPools[$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE);
+        }
+
+        if (!$needsMessageHandler) {
+            $container->removeDefinition($this->messageHandlerId);
+        }
+
+        $notAliasedCacheClearerId = $this->cacheClearerId;
+        while ($container->hasAlias($this->cacheClearerId)) {
+            $this->cacheClearerId = (string) $container->getAlias($this->cacheClearerId);
+        }
+        if ($container->hasDefinition($this->cacheClearerId)) {
+            $clearers[$notAliasedCacheClearerId] = $allPools;
+        }
+
+        foreach ($clearers as $id => $pools) {
+            $clearer = $container->getDefinition($id);
+            if ($clearer instanceof ChildDefinition) {
+                $clearer->replaceArgument(0, $pools);
+            } else {
+                $clearer->setArgument(0, $pools);
+            }
+            $clearer->addTag($this->cachePoolClearerTag);
+
+            if ($this->cacheSystemClearerId === $id) {
+                $clearer->addTag($this->cacheSystemClearerTag);
+            }
+        }
+
+        $allPoolsKeys = array_keys($allPools);
+
+        if ($container->hasDefinition('console.command.cache_pool_list')) {
+            $container->getDefinition('console.command.cache_pool_list')->replaceArgument(0, $allPoolsKeys);
+        }
+
+        if ($container->hasDefinition('console.command.cache_pool_clear')) {
+            $container->getDefinition('console.command.cache_pool_clear')->addArgument($allPoolsKeys);
+        }
+
+        if ($container->hasDefinition('console.command.cache_pool_delete')) {
+            $container->getDefinition('console.command.cache_pool_delete')->addArgument($allPoolsKeys);
+        }
+    }
+
+    private function getNamespace(string $seed, string $id)
+    {
+        return substr(str_replace('/', '-', base64_encode(hash('sha256', $id.$seed, true))), 0, 10);
+    }
+
+    /**
+     * @internal
+     */
+    public static function getServiceProvider(ContainerBuilder $container, string $name)
+    {
+        $container->resolveEnvPlaceholders($name, null, $usedEnvs);
+
+        if ($usedEnvs || preg_match('#^[a-z]++:#', $name)) {
+            $dsn = $name;
+
+            if (!$container->hasDefinition($name = '.cache_connection.'.ContainerBuilder::hash($dsn))) {
+                $definition = new Definition(AbstractAdapter::class);
+                $definition->setPublic(false);
+                $definition->setFactory([AbstractAdapter::class, 'createConnection']);
+                $definition->setArguments([$dsn, ['lazy' => true]]);
+                $container->setDefinition($name, $definition);
+            }
+        }
+
+        return $name;
+    }
+}
diff --git a/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php b/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..86a1906adcf8cd92b66919186054c446c007b371
--- /dev/null
+++ b/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\DependencyInjection;
+
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * @author Rob Frawley 2nd <rmf@src.run>
+ */
+class CachePoolPrunerPass implements CompilerPassInterface
+{
+    private $cacheCommandServiceId;
+    private $cachePoolTag;
+
+    public function __construct(string $cacheCommandServiceId = 'console.command.cache_pool_prune', string $cachePoolTag = 'cache.pool')
+    {
+        if (0 < \func_num_args()) {
+            trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__);
+        }
+
+        $this->cacheCommandServiceId = $cacheCommandServiceId;
+        $this->cachePoolTag = $cachePoolTag;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->hasDefinition($this->cacheCommandServiceId)) {
+            return;
+        }
+
+        $services = [];
+
+        foreach ($container->findTaggedServiceIds($this->cachePoolTag) as $id => $tags) {
+            $class = $container->getParameterBag()->resolveValue($container->getDefinition($id)->getClass());
+
+            if (!$reflection = $container->getReflectionClass($class)) {
+                throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
+            }
+
+            if ($reflection->implementsInterface(PruneableInterface::class)) {
+                $services[$id] = new Reference($id);
+            }
+        }
+
+        $container->getDefinition($this->cacheCommandServiceId)->replaceArgument(0, new IteratorArgument($services));
+    }
+}
diff --git a/vendor/symfony/cache/DoctrineProvider.php b/vendor/symfony/cache/DoctrineProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b55aae23c8059cf541985fec398a987157bf29b
--- /dev/null
+++ b/vendor/symfony/cache/DoctrineProvider.php
@@ -0,0 +1,124 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache;
+
+use Doctrine\Common\Cache\CacheProvider;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Contracts\Service\ResetInterface;
+
+if (!class_exists(CacheProvider::class)) {
+    return;
+}
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @deprecated Use Doctrine\Common\Cache\Psr6\DoctrineProvider instead
+ */
+class DoctrineProvider extends CacheProvider implements PruneableInterface, ResettableInterface
+{
+    private $pool;
+
+    public function __construct(CacheItemPoolInterface $pool)
+    {
+        trigger_deprecation('symfony/cache', '5.4', '"%s" is deprecated, use "Doctrine\Common\Cache\Psr6\DoctrineProvider" instead.', __CLASS__);
+
+        $this->pool = $pool;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        return $this->pool instanceof PruneableInterface && $this->pool->prune();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if ($this->pool instanceof ResetInterface) {
+            $this->pool->reset();
+        }
+        $this->setNamespace($this->getNamespace());
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return mixed
+     */
+    protected function doFetch($id)
+    {
+        $item = $this->pool->getItem(rawurlencode($id));
+
+        return $item->isHit() ? $item->get() : false;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    protected function doContains($id)
+    {
+        return $this->pool->hasItem(rawurlencode($id));
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    protected function doSave($id, $data, $lifeTime = 0)
+    {
+        $item = $this->pool->getItem(rawurlencode($id));
+
+        if (0 < $lifeTime) {
+            $item->expiresAfter($lifeTime);
+        }
+
+        return $this->pool->save($item->set($data));
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    protected function doDelete($id)
+    {
+        return $this->pool->deleteItem(rawurlencode($id));
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    protected function doFlush()
+    {
+        return $this->pool->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return array|null
+     */
+    protected function doGetStats()
+    {
+        return null;
+    }
+}
diff --git a/vendor/symfony/cache/Exception/CacheException.php b/vendor/symfony/cache/Exception/CacheException.php
new file mode 100644
index 0000000000000000000000000000000000000000..d2e975b2bc6066d29699372407541865c5e2cd74
--- /dev/null
+++ b/vendor/symfony/cache/Exception/CacheException.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Exception;
+
+use Psr\Cache\CacheException as Psr6CacheInterface;
+use Psr\SimpleCache\CacheException as SimpleCacheInterface;
+
+if (interface_exists(SimpleCacheInterface::class)) {
+    class CacheException extends \Exception implements Psr6CacheInterface, SimpleCacheInterface
+    {
+    }
+} else {
+    class CacheException extends \Exception implements Psr6CacheInterface
+    {
+    }
+}
diff --git a/vendor/symfony/cache/Exception/InvalidArgumentException.php b/vendor/symfony/cache/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f9584a2643281302c539c764ef7db071bb54d9c
--- /dev/null
+++ b/vendor/symfony/cache/Exception/InvalidArgumentException.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Exception;
+
+use Psr\Cache\InvalidArgumentException as Psr6CacheInterface;
+use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInterface;
+
+if (interface_exists(SimpleCacheInterface::class)) {
+    class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface, SimpleCacheInterface
+    {
+    }
+} else {
+    class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface
+    {
+    }
+}
diff --git a/vendor/symfony/cache/Exception/LogicException.php b/vendor/symfony/cache/Exception/LogicException.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ffa7ed69566b61fd310ca03616e75cf4b18d506
--- /dev/null
+++ b/vendor/symfony/cache/Exception/LogicException.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Exception;
+
+use Psr\Cache\CacheException as Psr6CacheInterface;
+use Psr\SimpleCache\CacheException as SimpleCacheInterface;
+
+if (interface_exists(SimpleCacheInterface::class)) {
+    class LogicException extends \LogicException implements Psr6CacheInterface, SimpleCacheInterface
+    {
+    }
+} else {
+    class LogicException extends \LogicException implements Psr6CacheInterface
+    {
+    }
+}
diff --git a/vendor/symfony/cache/LICENSE b/vendor/symfony/cache/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..7fa9539054928405f33975f38584293d8a73d45a
--- /dev/null
+++ b/vendor/symfony/cache/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2016-2022 Fabien Potencier
+
+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/vendor/symfony/cache/LockRegistry.php b/vendor/symfony/cache/LockRegistry.php
new file mode 100644
index 0000000000000000000000000000000000000000..65f20bb7328e8b0e3359963ce5b39b72e151c5a0
--- /dev/null
+++ b/vendor/symfony/cache/LockRegistry.php
@@ -0,0 +1,165 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Contracts\Cache\CacheInterface;
+use Symfony\Contracts\Cache\ItemInterface;
+
+/**
+ * LockRegistry is used internally by existing adapters to protect against cache stampede.
+ *
+ * It does so by wrapping the computation of items in a pool of locks.
+ * Foreach each apps, there can be at most 20 concurrent processes that
+ * compute items at the same time and only one per cache-key.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+final class LockRegistry
+{
+    private static $openedFiles = [];
+    private static $lockedFiles;
+    private static $signalingException;
+    private static $signalingCallback;
+
+    /**
+     * The number of items in this list controls the max number of concurrent processes.
+     */
+    private static $files = [
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AbstractAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AbstractTagAwareAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AdapterInterface.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ApcuAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ArrayAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ChainAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseBucketAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseCollectionAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'DoctrineAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'DoctrineDbalAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemTagAwareAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'MemcachedAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'NullAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ParameterNormalizer.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PdoAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PhpArrayAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PhpFilesAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ProxyAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'Psr16Adapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'RedisAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'RedisTagAwareAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TagAwareAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TagAwareAdapterInterface.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TraceableAdapter.php',
+        __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TraceableTagAwareAdapter.php',
+    ];
+
+    /**
+     * Defines a set of existing files that will be used as keys to acquire locks.
+     *
+     * @return array The previously defined set of files
+     */
+    public static function setFiles(array $files): array
+    {
+        $previousFiles = self::$files;
+        self::$files = $files;
+
+        foreach (self::$openedFiles as $file) {
+            if ($file) {
+                flock($file, \LOCK_UN);
+                fclose($file);
+            }
+        }
+        self::$openedFiles = self::$lockedFiles = [];
+
+        return $previousFiles;
+    }
+
+    public static function compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata = null, LoggerInterface $logger = null)
+    {
+        if ('\\' === \DIRECTORY_SEPARATOR && null === self::$lockedFiles) {
+            // disable locking on Windows by default
+            self::$files = self::$lockedFiles = [];
+        }
+
+        $key = self::$files ? abs(crc32($item->getKey())) % \count(self::$files) : -1;
+
+        if ($key < 0 || self::$lockedFiles || !$lock = self::open($key)) {
+            return $callback($item, $save);
+        }
+
+        self::$signalingException ?? self::$signalingException = unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}");
+        self::$signalingCallback ?? self::$signalingCallback = function () { throw self::$signalingException; };
+
+        while (true) {
+            try {
+                $locked = false;
+                // race to get the lock in non-blocking mode
+                $locked = flock($lock, \LOCK_EX | \LOCK_NB, $wouldBlock);
+
+                if ($locked || !$wouldBlock) {
+                    $logger && $logger->info(sprintf('Lock %s, now computing item "{key}"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]);
+                    self::$lockedFiles[$key] = true;
+
+                    $value = $callback($item, $save);
+
+                    if ($save) {
+                        if ($setMetadata) {
+                            $setMetadata($item);
+                        }
+
+                        $pool->save($item->set($value));
+                        $save = false;
+                    }
+
+                    return $value;
+                }
+                // if we failed the race, retry locking in blocking mode to wait for the winner
+                $logger && $logger->info('Item "{key}" is locked, waiting for it to be released', ['key' => $item->getKey()]);
+                flock($lock, \LOCK_SH);
+            } finally {
+                flock($lock, \LOCK_UN);
+                unset(self::$lockedFiles[$key]);
+            }
+
+            try {
+                $value = $pool->get($item->getKey(), self::$signalingCallback, 0);
+                $logger && $logger->info('Item "{key}" retrieved after lock was released', ['key' => $item->getKey()]);
+                $save = false;
+
+                return $value;
+            } catch (\Exception $e) {
+                if (self::$signalingException !== $e) {
+                    throw $e;
+                }
+                $logger && $logger->info('Item "{key}" not found while lock was released, now retrying', ['key' => $item->getKey()]);
+            }
+        }
+
+        return null;
+    }
+
+    private static function open(int $key)
+    {
+        if (null !== $h = self::$openedFiles[$key] ?? null) {
+            return $h;
+        }
+        set_error_handler(function () {});
+        try {
+            $h = fopen(self::$files[$key], 'r+');
+        } finally {
+            restore_error_handler();
+        }
+
+        return self::$openedFiles[$key] = $h ?: @fopen(self::$files[$key], 'r');
+    }
+}
diff --git a/vendor/symfony/cache/Marshaller/DefaultMarshaller.php b/vendor/symfony/cache/Marshaller/DefaultMarshaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..3202dd69cdab7b0a64a4dad71fc94c01fb96d409
--- /dev/null
+++ b/vendor/symfony/cache/Marshaller/DefaultMarshaller.php
@@ -0,0 +1,104 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Marshaller;
+
+use Symfony\Component\Cache\Exception\CacheException;
+
+/**
+ * Serializes/unserializes values using igbinary_serialize() if available, serialize() otherwise.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DefaultMarshaller implements MarshallerInterface
+{
+    private $useIgbinarySerialize = true;
+    private $throwOnSerializationFailure;
+
+    public function __construct(bool $useIgbinarySerialize = null, bool $throwOnSerializationFailure = false)
+    {
+        if (null === $useIgbinarySerialize) {
+            $useIgbinarySerialize = \extension_loaded('igbinary') && (\PHP_VERSION_ID < 70400 || version_compare('3.1.6', phpversion('igbinary'), '<='));
+        } elseif ($useIgbinarySerialize && (!\extension_loaded('igbinary') || (\PHP_VERSION_ID >= 70400 && version_compare('3.1.6', phpversion('igbinary'), '>')))) {
+            throw new CacheException(\extension_loaded('igbinary') && \PHP_VERSION_ID >= 70400 ? 'Please upgrade the "igbinary" PHP extension to v3.1.6 or higher.' : 'The "igbinary" PHP extension is not loaded.');
+        }
+        $this->useIgbinarySerialize = $useIgbinarySerialize;
+        $this->throwOnSerializationFailure = $throwOnSerializationFailure;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function marshall(array $values, ?array &$failed): array
+    {
+        $serialized = $failed = [];
+
+        foreach ($values as $id => $value) {
+            try {
+                if ($this->useIgbinarySerialize) {
+                    $serialized[$id] = igbinary_serialize($value);
+                } else {
+                    $serialized[$id] = serialize($value);
+                }
+            } catch (\Exception $e) {
+                if ($this->throwOnSerializationFailure) {
+                    throw new \ValueError($e->getMessage(), 0, $e);
+                }
+                $failed[] = $id;
+            }
+        }
+
+        return $serialized;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function unmarshall(string $value)
+    {
+        if ('b:0;' === $value) {
+            return false;
+        }
+        if ('N;' === $value) {
+            return null;
+        }
+        static $igbinaryNull;
+        if ($value === ($igbinaryNull ?? $igbinaryNull = \extension_loaded('igbinary') ? igbinary_serialize(null) : false)) {
+            return null;
+        }
+        $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');
+        try {
+            if (':' === ($value[1] ?? ':')) {
+                if (false !== $value = unserialize($value)) {
+                    return $value;
+                }
+            } elseif (false === $igbinaryNull) {
+                throw new \RuntimeException('Failed to unserialize values, did you forget to install the "igbinary" extension?');
+            } elseif (null !== $value = igbinary_unserialize($value)) {
+                return $value;
+            }
+
+            throw new \DomainException(error_get_last() ? error_get_last()['message'] : 'Failed to unserialize values.');
+        } catch (\Error $e) {
+            throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine());
+        } finally {
+            ini_set('unserialize_callback_func', $unserializeCallbackHandler);
+        }
+    }
+
+    /**
+     * @internal
+     */
+    public static function handleUnserializeCallback(string $class)
+    {
+        throw new \DomainException('Class not found: '.$class);
+    }
+}
diff --git a/vendor/symfony/cache/Marshaller/DeflateMarshaller.php b/vendor/symfony/cache/Marshaller/DeflateMarshaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..5544806116893177ede1d968e9c5ece66b274490
--- /dev/null
+++ b/vendor/symfony/cache/Marshaller/DeflateMarshaller.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Marshaller;
+
+use Symfony\Component\Cache\Exception\CacheException;
+
+/**
+ * Compresses values using gzdeflate().
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DeflateMarshaller implements MarshallerInterface
+{
+    private $marshaller;
+
+    public function __construct(MarshallerInterface $marshaller)
+    {
+        if (!\function_exists('gzdeflate')) {
+            throw new CacheException('The "zlib" PHP extension is not loaded.');
+        }
+
+        $this->marshaller = $marshaller;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function marshall(array $values, ?array &$failed): array
+    {
+        return array_map('gzdeflate', $this->marshaller->marshall($values, $failed));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function unmarshall(string $value)
+    {
+        if (false !== $inflatedValue = @gzinflate($value)) {
+            $value = $inflatedValue;
+        }
+
+        return $this->marshaller->unmarshall($value);
+    }
+}
diff --git a/vendor/symfony/cache/Marshaller/MarshallerInterface.php b/vendor/symfony/cache/Marshaller/MarshallerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..cdd6c4022ca4fb9461e9b19e65a8f9354d848118
--- /dev/null
+++ b/vendor/symfony/cache/Marshaller/MarshallerInterface.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Marshaller;
+
+/**
+ * Serializes/unserializes PHP values.
+ *
+ * Implementations of this interface MUST deal with errors carefully. They MUST
+ * also deal with forward and backward compatibility at the storage format level.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface MarshallerInterface
+{
+    /**
+     * Serializes a list of values.
+     *
+     * When serialization fails for a specific value, no exception should be
+     * thrown. Instead, its key should be listed in $failed.
+     */
+    public function marshall(array $values, ?array &$failed): array;
+
+    /**
+     * Unserializes a single value and throws an exception if anything goes wrong.
+     *
+     * @return mixed
+     *
+     * @throws \Exception Whenever unserialization fails
+     */
+    public function unmarshall(string $value);
+}
diff --git a/vendor/symfony/cache/Marshaller/SodiumMarshaller.php b/vendor/symfony/cache/Marshaller/SodiumMarshaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..dbf486a721e47de5a9aab18ebc3b5fde3034e22e
--- /dev/null
+++ b/vendor/symfony/cache/Marshaller/SodiumMarshaller.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Marshaller;
+
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+
+/**
+ * Encrypt/decrypt values using Libsodium.
+ *
+ * @author Ahmed TAILOULOUTE <ahmed.tailouloute@gmail.com>
+ */
+class SodiumMarshaller implements MarshallerInterface
+{
+    private $marshaller;
+    private $decryptionKeys;
+
+    /**
+     * @param string[] $decryptionKeys The key at index "0" is required and is used to decrypt and encrypt values;
+     *                                 more rotating keys can be provided to decrypt values;
+     *                                 each key must be generated using sodium_crypto_box_keypair()
+     */
+    public function __construct(array $decryptionKeys, MarshallerInterface $marshaller = null)
+    {
+        if (!self::isSupported()) {
+            throw new CacheException('The "sodium" PHP extension is not loaded.');
+        }
+
+        if (!isset($decryptionKeys[0])) {
+            throw new InvalidArgumentException('At least one decryption key must be provided at index "0".');
+        }
+
+        $this->marshaller = $marshaller ?? new DefaultMarshaller();
+        $this->decryptionKeys = $decryptionKeys;
+    }
+
+    public static function isSupported(): bool
+    {
+        return \function_exists('sodium_crypto_box_seal');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function marshall(array $values, ?array &$failed): array
+    {
+        $encryptionKey = sodium_crypto_box_publickey($this->decryptionKeys[0]);
+
+        $encryptedValues = [];
+        foreach ($this->marshaller->marshall($values, $failed) as $k => $v) {
+            $encryptedValues[$k] = sodium_crypto_box_seal($v, $encryptionKey);
+        }
+
+        return $encryptedValues;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function unmarshall(string $value)
+    {
+        foreach ($this->decryptionKeys as $k) {
+            if (false !== $decryptedValue = @sodium_crypto_box_seal_open($value, $k)) {
+                $value = $decryptedValue;
+                break;
+            }
+        }
+
+        return $this->marshaller->unmarshall($value);
+    }
+}
diff --git a/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php b/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d1e303b4791f29256d6635912da98130a225c07
--- /dev/null
+++ b/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Marshaller;
+
+/**
+ * A marshaller optimized for data structures generated by AbstractTagAwareAdapter.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class TagAwareMarshaller implements MarshallerInterface
+{
+    private $marshaller;
+
+    public function __construct(MarshallerInterface $marshaller = null)
+    {
+        $this->marshaller = $marshaller ?? new DefaultMarshaller();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function marshall(array $values, ?array &$failed): array
+    {
+        $failed = $notSerialized = $serialized = [];
+
+        foreach ($values as $id => $value) {
+            if (\is_array($value) && \is_array($value['tags'] ?? null) && \array_key_exists('value', $value) && \count($value) === 2 + (\is_string($value['meta'] ?? null) && 8 === \strlen($value['meta']))) {
+                // if the value is an array with keys "tags", "value" and "meta", use a compact serialization format
+                // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F allow detecting this format quickly in unmarshall()
+
+                $v = $this->marshaller->marshall($value, $f);
+
+                if ($f) {
+                    $f = [];
+                    $failed[] = $id;
+                } else {
+                    if ([] === $value['tags']) {
+                        $v['tags'] = '';
+                    }
+
+                    $serialized[$id] = "\x9D".($value['meta'] ?? "\0\0\0\0\0\0\0\0").pack('N', \strlen($v['tags'])).$v['tags'].$v['value'];
+                    $serialized[$id][9] = "\x5F";
+                }
+            } else {
+                // other arbitratry values are serialized using the decorated marshaller below
+                $notSerialized[$id] = $value;
+            }
+        }
+
+        if ($notSerialized) {
+            $serialized += $this->marshaller->marshall($notSerialized, $f);
+            $failed = array_merge($failed, $f);
+        }
+
+        return $serialized;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function unmarshall(string $value)
+    {
+        // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F
+        if (13 >= \strlen($value) || "\x9D" !== $value[0] || "\0" !== $value[5] || "\x5F" !== $value[9]) {
+            return $this->marshaller->unmarshall($value);
+        }
+
+        // data consists of value, tags and metadata which we need to unpack
+        $meta = substr($value, 1, 12);
+        $meta[8] = "\0";
+        $tagLen = unpack('Nlen', $meta, 8)['len'];
+        $meta = substr($meta, 0, 8);
+
+        return [
+            'value' => $this->marshaller->unmarshall(substr($value, 13 + $tagLen)),
+            'tags' => $tagLen ? $this->marshaller->unmarshall(substr($value, 13, $tagLen)) : [],
+            'meta' => "\0\0\0\0\0\0\0\0" === $meta ? null : $meta,
+        ];
+    }
+}
diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php b/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f11b8b5a20787fe2c13214ee0fd282541a9ac32
--- /dev/null
+++ b/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Messenger;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Cache\Adapter\AdapterInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\DependencyInjection\ReverseContainer;
+use Symfony\Component\Messenger\MessageBusInterface;
+use Symfony\Component\Messenger\Stamp\HandledStamp;
+
+/**
+ * Sends the computation of cached values to a message bus.
+ */
+class EarlyExpirationDispatcher
+{
+    private $bus;
+    private $reverseContainer;
+    private $callbackWrapper;
+
+    public function __construct(MessageBusInterface $bus, ReverseContainer $reverseContainer, callable $callbackWrapper = null)
+    {
+        $this->bus = $bus;
+        $this->reverseContainer = $reverseContainer;
+        $this->callbackWrapper = $callbackWrapper;
+    }
+
+    public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, LoggerInterface $logger = null)
+    {
+        if (!$item->isHit() || null === $message = EarlyExpirationMessage::create($this->reverseContainer, $callback, $item, $pool)) {
+            // The item is stale or the callback cannot be reversed: we must compute the value now
+            $logger && $logger->info('Computing item "{key}" online: '.($item->isHit() ? 'callback cannot be reversed' : 'item is stale'), ['key' => $item->getKey()]);
+
+            return null !== $this->callbackWrapper ? ($this->callbackWrapper)($callback, $item, $save, $pool, $setMetadata, $logger) : $callback($item, $save);
+        }
+
+        $envelope = $this->bus->dispatch($message);
+
+        if ($logger) {
+            if ($envelope->last(HandledStamp::class)) {
+                $logger->info('Item "{key}" was computed online', ['key' => $item->getKey()]);
+            } else {
+                $logger->info('Item "{key}" sent for recomputation', ['key' => $item->getKey()]);
+            }
+        }
+
+        // The item's value is not stale, no need to write it to the backend
+        $save = false;
+
+        return $message->getItem()->get() ?? $item->get();
+    }
+}
diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php b/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f0bd565ce5ea9745da6a8f541a09810737fe9f5
--- /dev/null
+++ b/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Messenger;
+
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\DependencyInjection\ReverseContainer;
+use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
+
+/**
+ * Computes cached values sent to a message bus.
+ */
+class EarlyExpirationHandler implements MessageHandlerInterface
+{
+    private $reverseContainer;
+    private $processedNonces = [];
+
+    public function __construct(ReverseContainer $reverseContainer)
+    {
+        $this->reverseContainer = $reverseContainer;
+    }
+
+    public function __invoke(EarlyExpirationMessage $message)
+    {
+        $item = $message->getItem();
+        $metadata = $item->getMetadata();
+        $expiry = $metadata[CacheItem::METADATA_EXPIRY] ?? 0;
+        $ctime = $metadata[CacheItem::METADATA_CTIME] ?? 0;
+
+        if ($expiry && $ctime) {
+            // skip duplicate or expired messages
+
+            $processingNonce = [$expiry, $ctime];
+            $pool = $message->getPool();
+            $key = $item->getKey();
+
+            if (($this->processedNonces[$pool][$key] ?? null) === $processingNonce) {
+                return;
+            }
+
+            if (microtime(true) >= $expiry) {
+                return;
+            }
+
+            $this->processedNonces[$pool] = [$key => $processingNonce] + ($this->processedNonces[$pool] ?? []);
+
+            if (\count($this->processedNonces[$pool]) > 100) {
+                array_pop($this->processedNonces[$pool]);
+            }
+        }
+
+        static $setMetadata;
+
+        $setMetadata ?? $setMetadata = \Closure::bind(
+            function (CacheItem $item, float $startTime) {
+                if ($item->expiry > $endTime = microtime(true)) {
+                    $item->newMetadata[CacheItem::METADATA_EXPIRY] = $item->expiry;
+                    $item->newMetadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime));
+                }
+            },
+            null,
+            CacheItem::class
+        );
+
+        $startTime = microtime(true);
+        $pool = $message->findPool($this->reverseContainer);
+        $callback = $message->findCallback($this->reverseContainer);
+        $value = $callback($item);
+        $setMetadata($item, $startTime);
+        $pool->save($item->set($value));
+    }
+}
diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php b/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php
new file mode 100644
index 0000000000000000000000000000000000000000..e25c07e9a66becf812dfbf95e5f93d0c34dcbda1
--- /dev/null
+++ b/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php
@@ -0,0 +1,97 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Messenger;
+
+use Symfony\Component\Cache\Adapter\AdapterInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\DependencyInjection\ReverseContainer;
+
+/**
+ * Conveys a cached value that needs to be computed.
+ */
+final class EarlyExpirationMessage
+{
+    private $item;
+    private $pool;
+    private $callback;
+
+    public static function create(ReverseContainer $reverseContainer, callable $callback, CacheItem $item, AdapterInterface $pool): ?self
+    {
+        try {
+            $item = clone $item;
+            $item->set(null);
+        } catch (\Exception $e) {
+            return null;
+        }
+
+        $pool = $reverseContainer->getId($pool);
+
+        if (\is_object($callback)) {
+            if (null === $id = $reverseContainer->getId($callback)) {
+                return null;
+            }
+
+            $callback = '@'.$id;
+        } elseif (!\is_array($callback)) {
+            $callback = (string) $callback;
+        } elseif (!\is_object($callback[0])) {
+            $callback = [(string) $callback[0], (string) $callback[1]];
+        } else {
+            if (null === $id = $reverseContainer->getId($callback[0])) {
+                return null;
+            }
+
+            $callback = ['@'.$id, (string) $callback[1]];
+        }
+
+        return new self($item, $pool, $callback);
+    }
+
+    public function getItem(): CacheItem
+    {
+        return $this->item;
+    }
+
+    public function getPool(): string
+    {
+        return $this->pool;
+    }
+
+    public function getCallback()
+    {
+        return $this->callback;
+    }
+
+    public function findPool(ReverseContainer $reverseContainer): AdapterInterface
+    {
+        return $reverseContainer->getService($this->pool);
+    }
+
+    public function findCallback(ReverseContainer $reverseContainer): callable
+    {
+        if (\is_string($callback = $this->callback)) {
+            return '@' === $callback[0] ? $reverseContainer->getService(substr($callback, 1)) : $callback;
+        }
+        if ('@' === $callback[0][0]) {
+            $callback[0] = $reverseContainer->getService(substr($callback[0], 1));
+        }
+
+        return $callback;
+    }
+
+    private function __construct(CacheItem $item, string $pool, $callback)
+    {
+        $this->item = $item;
+        $this->pool = $pool;
+        $this->callback = $callback;
+    }
+}
diff --git a/vendor/symfony/cache/PruneableInterface.php b/vendor/symfony/cache/PruneableInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..42615253689fedd1e6c631bde9401ad6a94b371c
--- /dev/null
+++ b/vendor/symfony/cache/PruneableInterface.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache;
+
+/**
+ * Interface extends psr-6 and psr-16 caches to allow for pruning (deletion) of all expired cache items.
+ */
+interface PruneableInterface
+{
+    /**
+     * @return bool
+     */
+    public function prune();
+}
diff --git a/vendor/symfony/cache/Psr16Cache.php b/vendor/symfony/cache/Psr16Cache.php
new file mode 100644
index 0000000000000000000000000000000000000000..28c7de60564f8457b5c038c44b1c8f4e92f9ae55
--- /dev/null
+++ b/vendor/symfony/cache/Psr16Cache.php
@@ -0,0 +1,289 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache;
+
+use Psr\Cache\CacheException as Psr6CacheException;
+use Psr\Cache\CacheItemPoolInterface;
+use Psr\SimpleCache\CacheException as SimpleCacheException;
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\Adapter\AdapterInterface;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Traits\ProxyTrait;
+
+if (null !== (new \ReflectionMethod(CacheInterface::class, 'get'))->getReturnType()) {
+    throw new \LogicException('psr/simple-cache 3.0+ is not compatible with this version of symfony/cache. Please upgrade symfony/cache to 6.0+ or downgrade psr/simple-cache to 1.x or 2.x.');
+}
+
+/**
+ * Turns a PSR-6 cache into a PSR-16 one.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterface
+{
+    use ProxyTrait;
+
+    private const METADATA_EXPIRY_OFFSET = 1527506807;
+
+    private $createCacheItem;
+    private $cacheItemPrototype;
+
+    public function __construct(CacheItemPoolInterface $pool)
+    {
+        $this->pool = $pool;
+
+        if (!$pool instanceof AdapterInterface) {
+            return;
+        }
+        $cacheItemPrototype = &$this->cacheItemPrototype;
+        $createCacheItem = \Closure::bind(
+            static function ($key, $value, $allowInt = false) use (&$cacheItemPrototype) {
+                $item = clone $cacheItemPrototype;
+                $item->poolHash = $item->innerItem = null;
+                if ($allowInt && \is_int($key)) {
+                    $item->key = (string) $key;
+                } else {
+                    \assert('' !== CacheItem::validateKey($key));
+                    $item->key = $key;
+                }
+                $item->value = $value;
+                $item->isHit = false;
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+        $this->createCacheItem = function ($key, $value, $allowInt = false) use ($createCacheItem) {
+            if (null === $this->cacheItemPrototype) {
+                $this->get($allowInt && \is_int($key) ? (string) $key : $key);
+            }
+            $this->createCacheItem = $createCacheItem;
+
+            return $createCacheItem($key, null, $allowInt)->set($value);
+        };
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return mixed
+     */
+    public function get($key, $default = null)
+    {
+        try {
+            $item = $this->pool->getItem($key);
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+        if (null === $this->cacheItemPrototype) {
+            $this->cacheItemPrototype = clone $item;
+            $this->cacheItemPrototype->set(null);
+        }
+
+        return $item->isHit() ? $item->get() : $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function set($key, $value, $ttl = null)
+    {
+        try {
+            if (null !== $f = $this->createCacheItem) {
+                $item = $f($key, $value);
+            } else {
+                $item = $this->pool->getItem($key)->set($value);
+            }
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+        if (null !== $ttl) {
+            $item->expiresAfter($ttl);
+        }
+
+        return $this->pool->save($item);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function delete($key)
+    {
+        try {
+            return $this->pool->deleteItem($key);
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function clear()
+    {
+        return $this->pool->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return iterable
+     */
+    public function getMultiple($keys, $default = null)
+    {
+        if ($keys instanceof \Traversable) {
+            $keys = iterator_to_array($keys, false);
+        } elseif (!\is_array($keys)) {
+            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given.', get_debug_type($keys)));
+        }
+
+        try {
+            $items = $this->pool->getItems($keys);
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+        $values = [];
+
+        if (!$this->pool instanceof AdapterInterface) {
+            foreach ($items as $key => $item) {
+                $values[$key] = $item->isHit() ? $item->get() : $default;
+            }
+
+            return $values;
+        }
+
+        foreach ($items as $key => $item) {
+            if (!$item->isHit()) {
+                $values[$key] = $default;
+                continue;
+            }
+            $values[$key] = $item->get();
+
+            if (!$metadata = $item->getMetadata()) {
+                continue;
+            }
+            unset($metadata[CacheItem::METADATA_TAGS]);
+
+            if ($metadata) {
+                $values[$key] = ["\x9D".pack('VN', (int) (0.1 + $metadata[CacheItem::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[CacheItem::METADATA_CTIME])."\x5F" => $values[$key]];
+            }
+        }
+
+        return $values;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function setMultiple($values, $ttl = null)
+    {
+        $valuesIsArray = \is_array($values);
+        if (!$valuesIsArray && !$values instanceof \Traversable) {
+            throw new InvalidArgumentException(sprintf('Cache values must be array or Traversable, "%s" given.', get_debug_type($values)));
+        }
+        $items = [];
+
+        try {
+            if (null !== $f = $this->createCacheItem) {
+                $valuesIsArray = false;
+                foreach ($values as $key => $value) {
+                    $items[$key] = $f($key, $value, true);
+                }
+            } elseif ($valuesIsArray) {
+                $items = [];
+                foreach ($values as $key => $value) {
+                    $items[] = (string) $key;
+                }
+                $items = $this->pool->getItems($items);
+            } else {
+                foreach ($values as $key => $value) {
+                    if (\is_int($key)) {
+                        $key = (string) $key;
+                    }
+                    $items[$key] = $this->pool->getItem($key)->set($value);
+                }
+            }
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+        $ok = true;
+
+        foreach ($items as $key => $item) {
+            if ($valuesIsArray) {
+                $item->set($values[$key]);
+            }
+            if (null !== $ttl) {
+                $item->expiresAfter($ttl);
+            }
+            $ok = $this->pool->saveDeferred($item) && $ok;
+        }
+
+        return $this->pool->commit() && $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteMultiple($keys)
+    {
+        if ($keys instanceof \Traversable) {
+            $keys = iterator_to_array($keys, false);
+        } elseif (!\is_array($keys)) {
+            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given.', get_debug_type($keys)));
+        }
+
+        try {
+            return $this->pool->deleteItems($keys);
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function has($key)
+    {
+        try {
+            return $this->pool->hasItem($key);
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+    }
+}
diff --git a/vendor/symfony/cache/README.md b/vendor/symfony/cache/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..74052052c8c330b09b98ca528b9061a1843a8971
--- /dev/null
+++ b/vendor/symfony/cache/README.md
@@ -0,0 +1,19 @@
+Symfony PSR-6 implementation for caching
+========================================
+
+The Cache component provides an extended
+[PSR-6](http://www.php-fig.org/psr/psr-6/) implementation for adding cache to
+your applications. It is designed to have a low overhead so that caching is
+fastest. It ships with a few caching adapters for the most widespread and
+suited to caching backends. It also provides a `doctrine/cache` proxy adapter
+to cover more advanced caching needs and a proxy adapter for greater
+interoperability between PSR-6 implementations.
+
+Resources
+---------
+
+ * [Documentation](https://symfony.com/doc/current/components/cache.html)
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+   [send Pull Requests](https://github.com/symfony/symfony/pulls)
+   in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/vendor/symfony/cache/ResettableInterface.php b/vendor/symfony/cache/ResettableInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b0a853f234d12df6f9b80b7174e9ac8a6d9da36
--- /dev/null
+++ b/vendor/symfony/cache/ResettableInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache;
+
+use Symfony\Contracts\Service\ResetInterface;
+
+/**
+ * Resets a pool's local state.
+ */
+interface ResettableInterface extends ResetInterface
+{
+}
diff --git a/vendor/symfony/cache/Traits/AbstractAdapterTrait.php b/vendor/symfony/cache/Traits/AbstractAdapterTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..f0173c4220708deb9916a00ada55327ef7cc92b6
--- /dev/null
+++ b/vendor/symfony/cache/Traits/AbstractAdapterTrait.php
@@ -0,0 +1,424 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Log\LoggerAwareTrait;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait AbstractAdapterTrait
+{
+    use LoggerAwareTrait;
+
+    /**
+     * @var \Closure needs to be set by class, signature is function(string <key>, mixed <value>, bool <isHit>)
+     */
+    private static $createCacheItem;
+
+    /**
+     * @var \Closure needs to be set by class, signature is function(array <deferred>, string <namespace>, array <&expiredIds>)
+     */
+    private static $mergeByLifetime;
+
+    private $namespace = '';
+    private $defaultLifetime;
+    private $namespaceVersion = '';
+    private $versioningIsEnabled = false;
+    private $deferred = [];
+    private $ids = [];
+
+    /**
+     * @var int|null The maximum length to enforce for identifiers or null when no limit applies
+     */
+    protected $maxIdLength;
+
+    /**
+     * Fetches several cache items.
+     *
+     * @param array $ids The cache identifiers to fetch
+     *
+     * @return array|\Traversable
+     */
+    abstract protected function doFetch(array $ids);
+
+    /**
+     * Confirms if the cache contains specified cache item.
+     *
+     * @param string $id The identifier for which to check existence
+     *
+     * @return bool
+     */
+    abstract protected function doHave(string $id);
+
+    /**
+     * Deletes all items in the pool.
+     *
+     * @param string $namespace The prefix used for all identifiers managed by this pool
+     *
+     * @return bool
+     */
+    abstract protected function doClear(string $namespace);
+
+    /**
+     * Removes multiple items from the pool.
+     *
+     * @param array $ids An array of identifiers that should be removed from the pool
+     *
+     * @return bool
+     */
+    abstract protected function doDelete(array $ids);
+
+    /**
+     * Persists several cache items immediately.
+     *
+     * @param array $values   The values to cache, indexed by their cache identifier
+     * @param int   $lifetime The lifetime of the cached values, 0 for persisting until manual cleaning
+     *
+     * @return array|bool The identifiers that failed to be cached or a boolean stating if caching succeeded or not
+     */
+    abstract protected function doSave(array $values, int $lifetime);
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function hasItem($key)
+    {
+        $id = $this->getId($key);
+
+        if (isset($this->deferred[$key])) {
+            $this->commit();
+        }
+
+        try {
+            return $this->doHave($id);
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to check if key "{key}" is cached: '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+
+            return false;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function clear(string $prefix = '')
+    {
+        $this->deferred = [];
+        if ($cleared = $this->versioningIsEnabled) {
+            if ('' === $namespaceVersionToClear = $this->namespaceVersion) {
+                foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) {
+                    $namespaceVersionToClear = $v;
+                }
+            }
+            $namespaceToClear = $this->namespace.$namespaceVersionToClear;
+            $namespaceVersion = self::formatNamespaceVersion(mt_rand());
+            try {
+                $e = $this->doSave([static::NS_SEPARATOR.$this->namespace => $namespaceVersion], 0);
+            } catch (\Exception $e) {
+            }
+            if (true !== $e && [] !== $e) {
+                $cleared = false;
+                $message = 'Failed to save the new namespace'.($e instanceof \Exception ? ': '.$e->getMessage() : '.');
+                CacheItem::log($this->logger, $message, ['exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
+            } else {
+                $this->namespaceVersion = $namespaceVersion;
+                $this->ids = [];
+            }
+        } else {
+            $namespaceToClear = $this->namespace.$prefix;
+        }
+
+        try {
+            return $this->doClear($namespaceToClear) || $cleared;
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to clear the cache: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+
+            return false;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItem($key)
+    {
+        return $this->deleteItems([$key]);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function deleteItems(array $keys)
+    {
+        $ids = [];
+
+        foreach ($keys as $key) {
+            $ids[$key] = $this->getId($key);
+            unset($this->deferred[$key]);
+        }
+
+        try {
+            if ($this->doDelete($ids)) {
+                return true;
+            }
+        } catch (\Exception $e) {
+        }
+
+        $ok = true;
+
+        // When bulk-delete failed, retry each item individually
+        foreach ($ids as $key => $id) {
+            try {
+                $e = null;
+                if ($this->doDelete([$id])) {
+                    continue;
+                }
+            } catch (\Exception $e) {
+            }
+            $message = 'Failed to delete key "{key}"'.($e instanceof \Exception ? ': '.$e->getMessage() : '.');
+            CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+            $ok = false;
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        $id = $this->getId($key);
+
+        if (isset($this->deferred[$key])) {
+            $this->commit();
+        }
+
+        $isHit = false;
+        $value = null;
+
+        try {
+            foreach ($this->doFetch([$id]) as $value) {
+                $isHit = true;
+            }
+
+            return (self::$createCacheItem)($key, $value, $isHit);
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to fetch key "{key}": '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+        }
+
+        return (self::$createCacheItem)($key, null, false);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = [])
+    {
+        $ids = [];
+        $commit = false;
+
+        foreach ($keys as $key) {
+            $ids[] = $this->getId($key);
+            $commit = $commit || isset($this->deferred[$key]);
+        }
+
+        if ($commit) {
+            $this->commit();
+        }
+
+        try {
+            $items = $this->doFetch($ids);
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => $keys, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+            $items = [];
+        }
+        $ids = array_combine($ids, $keys);
+
+        return $this->generateItems($items, $ids);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function save(CacheItemInterface $item)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $this->deferred[$item->getKey()] = $item;
+
+        return $this->commit();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $this->deferred[$item->getKey()] = $item;
+
+        return true;
+    }
+
+    /**
+     * Enables/disables versioning of items.
+     *
+     * When versioning is enabled, clearing the cache is atomic and doesn't require listing existing keys to proceed,
+     * but old keys may need garbage collection and extra round-trips to the back-end are required.
+     *
+     * Calling this method also clears the memoized namespace version and thus forces a resynchonization of it.
+     *
+     * @return bool the previous state of versioning
+     */
+    public function enableVersioning(bool $enable = true)
+    {
+        $wasEnabled = $this->versioningIsEnabled;
+        $this->versioningIsEnabled = $enable;
+        $this->namespaceVersion = '';
+        $this->ids = [];
+
+        return $wasEnabled;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if ($this->deferred) {
+            $this->commit();
+        }
+        $this->namespaceVersion = '';
+        $this->ids = [];
+    }
+
+    /**
+     * @return array
+     */
+    public function __sleep()
+    {
+        throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
+    }
+
+    public function __wakeup()
+    {
+        throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
+    }
+
+    public function __destruct()
+    {
+        if ($this->deferred) {
+            $this->commit();
+        }
+    }
+
+    private function generateItems(iterable $items, array &$keys): \Generator
+    {
+        $f = self::$createCacheItem;
+
+        try {
+            foreach ($items as $id => $value) {
+                if (!isset($keys[$id])) {
+                    throw new InvalidArgumentException(sprintf('Could not match value id "%s" to keys "%s".', $id, implode('", "', $keys)));
+                }
+                $key = $keys[$id];
+                unset($keys[$id]);
+                yield $key => $f($key, $value, true);
+            }
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => array_values($keys), 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
+        }
+
+        foreach ($keys as $key) {
+            yield $key => $f($key, null, false);
+        }
+    }
+
+    private function getId($key)
+    {
+        if ($this->versioningIsEnabled && '' === $this->namespaceVersion) {
+            $this->ids = [];
+            $this->namespaceVersion = '1'.static::NS_SEPARATOR;
+            try {
+                foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) {
+                    $this->namespaceVersion = $v;
+                }
+                $e = true;
+                if ('1'.static::NS_SEPARATOR === $this->namespaceVersion) {
+                    $this->namespaceVersion = self::formatNamespaceVersion(time());
+                    $e = $this->doSave([static::NS_SEPARATOR.$this->namespace => $this->namespaceVersion], 0);
+                }
+            } catch (\Exception $e) {
+            }
+            if (true !== $e && [] !== $e) {
+                $message = 'Failed to save the new namespace'.($e instanceof \Exception ? ': '.$e->getMessage() : '.');
+                CacheItem::log($this->logger, $message, ['exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
+            }
+        }
+
+        if (\is_string($key) && isset($this->ids[$key])) {
+            return $this->namespace.$this->namespaceVersion.$this->ids[$key];
+        }
+        \assert('' !== CacheItem::validateKey($key));
+        $this->ids[$key] = $key;
+
+        if (\count($this->ids) > 1000) {
+            array_splice($this->ids, 0, 500); // stop memory leak if there are many keys
+        }
+
+        if (null === $this->maxIdLength) {
+            return $this->namespace.$this->namespaceVersion.$key;
+        }
+        if (\strlen($id = $this->namespace.$this->namespaceVersion.$key) > $this->maxIdLength) {
+            // Use MD5 to favor speed over security, which is not an issue here
+            $this->ids[$key] = $id = substr_replace(base64_encode(hash('md5', $key, true)), static::NS_SEPARATOR, -(\strlen($this->namespaceVersion) + 2));
+            $id = $this->namespace.$this->namespaceVersion.$id;
+        }
+
+        return $id;
+    }
+
+    /**
+     * @internal
+     */
+    public static function handleUnserializeCallback(string $class)
+    {
+        throw new \DomainException('Class not found: '.$class);
+    }
+
+    private static function formatNamespaceVersion(int $value): string
+    {
+        return strtr(substr_replace(base64_encode(pack('V', $value)), static::NS_SEPARATOR, 5), '/', '_');
+    }
+}
diff --git a/vendor/symfony/cache/Traits/ContractsTrait.php b/vendor/symfony/cache/Traits/ContractsTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a491adb5acb8f4692418f9103c464de89e315dc
--- /dev/null
+++ b/vendor/symfony/cache/Traits/ContractsTrait.php
@@ -0,0 +1,109 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Cache\Adapter\AdapterInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\LockRegistry;
+use Symfony\Contracts\Cache\CacheInterface;
+use Symfony\Contracts\Cache\CacheTrait;
+use Symfony\Contracts\Cache\ItemInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait ContractsTrait
+{
+    use CacheTrait {
+        doGet as private contractsGet;
+    }
+
+    private $callbackWrapper;
+    private $computing = [];
+
+    /**
+     * Wraps the callback passed to ->get() in a callable.
+     *
+     * @return callable the previous callback wrapper
+     */
+    public function setCallbackWrapper(?callable $callbackWrapper): callable
+    {
+        if (!isset($this->callbackWrapper)) {
+            $this->callbackWrapper = \Closure::fromCallable([LockRegistry::class, 'compute']);
+
+            if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) {
+                $this->setCallbackWrapper(null);
+            }
+        }
+
+        $previousWrapper = $this->callbackWrapper;
+        $this->callbackWrapper = $callbackWrapper ?? static function (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger) {
+            return $callback($item, $save);
+        };
+
+        return $previousWrapper;
+    }
+
+    private function doGet(AdapterInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null)
+    {
+        if (0 > $beta = $beta ?? 1.0) {
+            throw new InvalidArgumentException(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta));
+        }
+
+        static $setMetadata;
+
+        $setMetadata ?? $setMetadata = \Closure::bind(
+            static function (CacheItem $item, float $startTime, ?array &$metadata) {
+                if ($item->expiry > $endTime = microtime(true)) {
+                    $item->newMetadata[CacheItem::METADATA_EXPIRY] = $metadata[CacheItem::METADATA_EXPIRY] = $item->expiry;
+                    $item->newMetadata[CacheItem::METADATA_CTIME] = $metadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime));
+                } else {
+                    unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::METADATA_CTIME]);
+                }
+            },
+            null,
+            CacheItem::class
+        );
+
+        return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata, &$metadata, $key) {
+            // don't wrap nor save recursive calls
+            if (isset($this->computing[$key])) {
+                $value = $callback($item, $save);
+                $save = false;
+
+                return $value;
+            }
+
+            $this->computing[$key] = $key;
+            $startTime = microtime(true);
+
+            if (!isset($this->callbackWrapper)) {
+                $this->setCallbackWrapper($this->setCallbackWrapper(null));
+            }
+
+            try {
+                $value = ($this->callbackWrapper)($callback, $item, $save, $pool, function (CacheItem $item) use ($setMetadata, $startTime, &$metadata) {
+                    $setMetadata($item, $startTime, $metadata);
+                }, $this->logger ?? null);
+                $setMetadata($item, $startTime, $metadata);
+
+                return $value;
+            } finally {
+                unset($this->computing[$key]);
+            }
+        }, $beta, $metadata, $this->logger ?? null);
+    }
+}
diff --git a/vendor/symfony/cache/Traits/FilesystemCommonTrait.php b/vendor/symfony/cache/Traits/FilesystemCommonTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..c06cc309a6b3f28e0d7620525dbb707911abdc31
--- /dev/null
+++ b/vendor/symfony/cache/Traits/FilesystemCommonTrait.php
@@ -0,0 +1,196 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait FilesystemCommonTrait
+{
+    private $directory;
+    private $tmp;
+
+    private function init(string $namespace, ?string $directory)
+    {
+        if (!isset($directory[0])) {
+            $directory = sys_get_temp_dir().\DIRECTORY_SEPARATOR.'symfony-cache';
+        } else {
+            $directory = realpath($directory) ?: $directory;
+        }
+        if (isset($namespace[0])) {
+            if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) {
+                throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));
+            }
+            $directory .= \DIRECTORY_SEPARATOR.$namespace;
+        } else {
+            $directory .= \DIRECTORY_SEPARATOR.'@';
+        }
+        if (!is_dir($directory)) {
+            @mkdir($directory, 0777, true);
+        }
+        $directory .= \DIRECTORY_SEPARATOR;
+        // On Windows the whole path is limited to 258 chars
+        if ('\\' === \DIRECTORY_SEPARATOR && \strlen($directory) > 234) {
+            throw new InvalidArgumentException(sprintf('Cache directory too long (%s).', $directory));
+        }
+
+        $this->directory = $directory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace)
+    {
+        $ok = true;
+
+        foreach ($this->scanHashDir($this->directory) as $file) {
+            if ('' !== $namespace && !str_starts_with($this->getFileKey($file), $namespace)) {
+                continue;
+            }
+
+            $ok = ($this->doUnlink($file) || !file_exists($file)) && $ok;
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        $ok = true;
+
+        foreach ($ids as $id) {
+            $file = $this->getFile($id);
+            $ok = (!is_file($file) || $this->doUnlink($file) || !file_exists($file)) && $ok;
+        }
+
+        return $ok;
+    }
+
+    protected function doUnlink(string $file)
+    {
+        return @unlink($file);
+    }
+
+    private function write(string $file, string $data, int $expiresAt = null)
+    {
+        set_error_handler(__CLASS__.'::throwError');
+        try {
+            if (null === $this->tmp) {
+                $this->tmp = $this->directory.bin2hex(random_bytes(6));
+            }
+            try {
+                $h = fopen($this->tmp, 'x');
+            } catch (\ErrorException $e) {
+                if (!str_contains($e->getMessage(), 'File exists')) {
+                    throw $e;
+                }
+
+                $this->tmp = $this->directory.bin2hex(random_bytes(6));
+                $h = fopen($this->tmp, 'x');
+            }
+            fwrite($h, $data);
+            fclose($h);
+
+            if (null !== $expiresAt) {
+                touch($this->tmp, $expiresAt ?: time() + 31556952); // 1 year in seconds
+            }
+
+            return rename($this->tmp, $file);
+        } finally {
+            restore_error_handler();
+        }
+    }
+
+    private function getFile(string $id, bool $mkdir = false, string $directory = null)
+    {
+        // Use MD5 to favor speed over security, which is not an issue here
+        $hash = str_replace('/', '-', base64_encode(hash('md5', static::class.$id, true)));
+        $dir = ($directory ?? $this->directory).strtoupper($hash[0].\DIRECTORY_SEPARATOR.$hash[1].\DIRECTORY_SEPARATOR);
+
+        if ($mkdir && !is_dir($dir)) {
+            @mkdir($dir, 0777, true);
+        }
+
+        return $dir.substr($hash, 2, 20);
+    }
+
+    private function getFileKey(string $file): string
+    {
+        return '';
+    }
+
+    private function scanHashDir(string $directory): \Generator
+    {
+        if (!is_dir($directory)) {
+            return;
+        }
+
+        $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
+
+        for ($i = 0; $i < 38; ++$i) {
+            if (!is_dir($directory.$chars[$i])) {
+                continue;
+            }
+
+            for ($j = 0; $j < 38; ++$j) {
+                if (!is_dir($dir = $directory.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) {
+                    continue;
+                }
+
+                foreach (@scandir($dir, \SCANDIR_SORT_NONE) ?: [] as $file) {
+                    if ('.' !== $file && '..' !== $file) {
+                        yield $dir.\DIRECTORY_SEPARATOR.$file;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * @internal
+     */
+    public static function throwError(int $type, string $message, string $file, int $line)
+    {
+        throw new \ErrorException($message, 0, $type, $file, $line);
+    }
+
+    /**
+     * @return array
+     */
+    public function __sleep()
+    {
+        throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
+    }
+
+    public function __wakeup()
+    {
+        throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
+    }
+
+    public function __destruct()
+    {
+        if (method_exists(parent::class, '__destruct')) {
+            parent::__destruct();
+        }
+        if (null !== $this->tmp && is_file($this->tmp)) {
+            unlink($this->tmp);
+        }
+    }
+}
diff --git a/vendor/symfony/cache/Traits/FilesystemTrait.php b/vendor/symfony/cache/Traits/FilesystemTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..38b741f1cc9c3a32a7d7819f438d602e21544c94
--- /dev/null
+++ b/vendor/symfony/cache/Traits/FilesystemTrait.php
@@ -0,0 +1,124 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Symfony\Component\Cache\Exception\CacheException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ * @author Rob Frawley 2nd <rmf@src.run>
+ *
+ * @internal
+ */
+trait FilesystemTrait
+{
+    use FilesystemCommonTrait;
+
+    private $marshaller;
+
+    /**
+     * @return bool
+     */
+    public function prune()
+    {
+        $time = time();
+        $pruned = true;
+
+        foreach ($this->scanHashDir($this->directory) as $file) {
+            if (!$h = @fopen($file, 'r')) {
+                continue;
+            }
+
+            if (($expiresAt = (int) fgets($h)) && $time >= $expiresAt) {
+                fclose($h);
+                $pruned = @unlink($file) && !file_exists($file) && $pruned;
+            } else {
+                fclose($h);
+            }
+        }
+
+        return $pruned;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        $values = [];
+        $now = time();
+
+        foreach ($ids as $id) {
+            $file = $this->getFile($id);
+            if (!is_file($file) || !$h = @fopen($file, 'r')) {
+                continue;
+            }
+            if (($expiresAt = (int) fgets($h)) && $now >= $expiresAt) {
+                fclose($h);
+                @unlink($file);
+            } else {
+                $i = rawurldecode(rtrim(fgets($h)));
+                $value = stream_get_contents($h);
+                fclose($h);
+                if ($i === $id) {
+                    $values[$id] = $this->marshaller->unmarshall($value);
+                }
+            }
+        }
+
+        return $values;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave(string $id)
+    {
+        $file = $this->getFile($id);
+
+        return is_file($file) && (@filemtime($file) > time() || $this->doFetch([$id]));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime)
+    {
+        $expiresAt = $lifetime ? (time() + $lifetime) : 0;
+        $values = $this->marshaller->marshall($values, $failed);
+
+        foreach ($values as $id => $value) {
+            if (!$this->write($this->getFile($id, true), $expiresAt."\n".rawurlencode($id)."\n".$value, $expiresAt)) {
+                $failed[] = $id;
+            }
+        }
+
+        if ($failed && !is_writable($this->directory)) {
+            throw new CacheException(sprintf('Cache directory is not writable (%s).', $this->directory));
+        }
+
+        return $failed;
+    }
+
+    private function getFileKey(string $file): string
+    {
+        if (!$h = @fopen($file, 'r')) {
+            return '';
+        }
+
+        fgets($h); // expiry
+        $encodedKey = fgets($h);
+        fclose($h);
+
+        return rawurldecode(rtrim($encodedKey));
+    }
+}
diff --git a/vendor/symfony/cache/Traits/ProxyTrait.php b/vendor/symfony/cache/Traits/ProxyTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..c86f360ab752a246c0949cedc88ec42ce1063028
--- /dev/null
+++ b/vendor/symfony/cache/Traits/ProxyTrait.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Contracts\Service\ResetInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait ProxyTrait
+{
+    private $pool;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        return $this->pool instanceof PruneableInterface && $this->pool->prune();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if ($this->pool instanceof ResetInterface) {
+            $this->pool->reset();
+        }
+    }
+}
diff --git a/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php b/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php
new file mode 100644
index 0000000000000000000000000000000000000000..deba74f6a3b7d7a2712b75e942088c41804de273
--- /dev/null
+++ b/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+/**
+ * This file acts as a wrapper to the \RedisCluster implementation so it can accept the same type of calls as
+ *  individual \Redis objects.
+ *
+ * Calls are made to individual nodes via: RedisCluster->{method}($host, ...args)'
+ *  according to https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#directed-node-commands
+ *
+ * @author Jack Thomas <jack.thomas@solidalpha.com>
+ *
+ * @internal
+ */
+class RedisClusterNodeProxy
+{
+    private $host;
+    private $redis;
+
+    /**
+     * @param \RedisCluster|RedisClusterProxy $redis
+     */
+    public function __construct(array $host, $redis)
+    {
+        $this->host = $host;
+        $this->redis = $redis;
+    }
+
+    public function __call(string $method, array $args)
+    {
+        return $this->redis->{$method}($this->host, ...$args);
+    }
+
+    public function scan(&$iIterator, $strPattern = null, $iCount = null)
+    {
+        return $this->redis->scan($iIterator, $this->host, $strPattern, $iCount);
+    }
+
+    public function getOption($name)
+    {
+        return $this->redis->getOption($name);
+    }
+}
diff --git a/vendor/symfony/cache/Traits/RedisClusterProxy.php b/vendor/symfony/cache/Traits/RedisClusterProxy.php
new file mode 100644
index 0000000000000000000000000000000000000000..73c6a4fdbb55e343a40f2a12ede61ec819500205
--- /dev/null
+++ b/vendor/symfony/cache/Traits/RedisClusterProxy.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+/**
+ * @author Alessandro Chitolina <alekitto@gmail.com>
+ *
+ * @internal
+ */
+class RedisClusterProxy
+{
+    private $redis;
+    private $initializer;
+
+    public function __construct(\Closure $initializer)
+    {
+        $this->initializer = $initializer;
+    }
+
+    public function __call(string $method, array $args)
+    {
+        $this->redis ?: $this->redis = $this->initializer->__invoke();
+
+        return $this->redis->{$method}(...$args);
+    }
+
+    public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->redis ?: $this->redis = $this->initializer->__invoke();
+
+        return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount);
+    }
+
+    public function scan(&$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->redis ?: $this->redis = $this->initializer->__invoke();
+
+        return $this->redis->scan($iIterator, $strPattern, $iCount);
+    }
+
+    public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->redis ?: $this->redis = $this->initializer->__invoke();
+
+        return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount);
+    }
+
+    public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->redis ?: $this->redis = $this->initializer->__invoke();
+
+        return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount);
+    }
+}
diff --git a/vendor/symfony/cache/Traits/RedisProxy.php b/vendor/symfony/cache/Traits/RedisProxy.php
new file mode 100644
index 0000000000000000000000000000000000000000..ec5cfabb3381ce9d9e7d6b8277bd48eb4ad90fe7
--- /dev/null
+++ b/vendor/symfony/cache/Traits/RedisProxy.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class RedisProxy
+{
+    private $redis;
+    private $initializer;
+    private $ready = false;
+
+    public function __construct(\Redis $redis, \Closure $initializer)
+    {
+        $this->redis = $redis;
+        $this->initializer = $initializer;
+    }
+
+    public function __call(string $method, array $args)
+    {
+        $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
+
+        return $this->redis->{$method}(...$args);
+    }
+
+    public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
+
+        return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount);
+    }
+
+    public function scan(&$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
+
+        return $this->redis->scan($iIterator, $strPattern, $iCount);
+    }
+
+    public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
+
+        return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount);
+    }
+
+    public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
+
+        return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount);
+    }
+}
diff --git a/vendor/symfony/cache/Traits/RedisTrait.php b/vendor/symfony/cache/Traits/RedisTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..accee44bc8e2a2d2d23dd91db477b2ec28ab1403
--- /dev/null
+++ b/vendor/symfony/cache/Traits/RedisTrait.php
@@ -0,0 +1,603 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Predis\Command\Redis\UNLINK;
+use Predis\Connection\Aggregate\ClusterInterface;
+use Predis\Connection\Aggregate\RedisCluster;
+use Predis\Connection\Aggregate\ReplicationInterface;
+use Predis\Response\ErrorInterface;
+use Predis\Response\Status;
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+
+/**
+ * @author Aurimas Niekis <aurimas@niekis.lt>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait RedisTrait
+{
+    private static $defaultConnectionOptions = [
+        'class' => null,
+        'persistent' => 0,
+        'persistent_id' => null,
+        'timeout' => 30,
+        'read_timeout' => 0,
+        'retry_interval' => 0,
+        'tcp_keepalive' => 0,
+        'lazy' => null,
+        'redis_cluster' => false,
+        'redis_sentinel' => null,
+        'dbindex' => 0,
+        'failover' => 'none',
+        'ssl' => null, // see https://php.net/context.ssl
+    ];
+    private $redis;
+    private $marshaller;
+
+    /**
+     * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis
+     */
+    private function init($redis, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller)
+    {
+        parent::__construct($namespace, $defaultLifetime);
+
+        if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) {
+            throw new InvalidArgumentException(sprintf('RedisAdapter namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));
+        }
+
+        if (!$redis instanceof \Redis && !$redis instanceof \RedisArray && !$redis instanceof \RedisCluster && !$redis instanceof \Predis\ClientInterface && !$redis instanceof RedisProxy && !$redis instanceof RedisClusterProxy) {
+            throw new InvalidArgumentException(sprintf('"%s()" expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.', __METHOD__, get_debug_type($redis)));
+        }
+
+        if ($redis instanceof \Predis\ClientInterface && $redis->getOptions()->exceptions) {
+            $options = clone $redis->getOptions();
+            \Closure::bind(function () { $this->options['exceptions'] = false; }, $options, $options)();
+            $redis = new $redis($redis->getConnection(), $options);
+        }
+
+        $this->redis = $redis;
+        $this->marshaller = $marshaller ?? new DefaultMarshaller();
+    }
+
+    /**
+     * Creates a Redis connection using a DSN configuration.
+     *
+     * Example DSN:
+     *   - redis://localhost
+     *   - redis://example.com:1234
+     *   - redis://secret@example.com/13
+     *   - redis:///var/run/redis.sock
+     *   - redis://secret@/var/run/redis.sock/13
+     *
+     * @param array $options See self::$defaultConnectionOptions
+     *
+     * @return \Redis|\RedisArray|\RedisCluster|RedisClusterProxy|RedisProxy|\Predis\ClientInterface According to the "class" option
+     *
+     * @throws InvalidArgumentException when the DSN is invalid
+     */
+    public static function createConnection(string $dsn, array $options = [])
+    {
+        if (str_starts_with($dsn, 'redis:')) {
+            $scheme = 'redis';
+        } elseif (str_starts_with($dsn, 'rediss:')) {
+            $scheme = 'rediss';
+        } else {
+            throw new InvalidArgumentException(sprintf('Invalid Redis DSN: "%s" does not start with "redis:" or "rediss".', $dsn));
+        }
+
+        if (!\extension_loaded('redis') && !class_exists(\Predis\Client::class)) {
+            throw new CacheException(sprintf('Cannot find the "redis" extension nor the "predis/predis" package: "%s".', $dsn));
+        }
+
+        $params = preg_replace_callback('#^'.$scheme.':(//)?(?:(?:[^:@]*+:)?([^@]*+)@)?#', function ($m) use (&$auth) {
+            if (isset($m[2])) {
+                $auth = $m[2];
+
+                if ('' === $auth) {
+                    $auth = null;
+                }
+            }
+
+            return 'file:'.($m[1] ?? '');
+        }, $dsn);
+
+        if (false === $params = parse_url($params)) {
+            throw new InvalidArgumentException(sprintf('Invalid Redis DSN: "%s".', $dsn));
+        }
+
+        $query = $hosts = [];
+
+        $tls = 'rediss' === $scheme;
+        $tcpScheme = $tls ? 'tls' : 'tcp';
+
+        if (isset($params['query'])) {
+            parse_str($params['query'], $query);
+
+            if (isset($query['host'])) {
+                if (!\is_array($hosts = $query['host'])) {
+                    throw new InvalidArgumentException(sprintf('Invalid Redis DSN: "%s".', $dsn));
+                }
+                foreach ($hosts as $host => $parameters) {
+                    if (\is_string($parameters)) {
+                        parse_str($parameters, $parameters);
+                    }
+                    if (false === $i = strrpos($host, ':')) {
+                        $hosts[$host] = ['scheme' => $tcpScheme, 'host' => $host, 'port' => 6379] + $parameters;
+                    } elseif ($port = (int) substr($host, 1 + $i)) {
+                        $hosts[$host] = ['scheme' => $tcpScheme, 'host' => substr($host, 0, $i), 'port' => $port] + $parameters;
+                    } else {
+                        $hosts[$host] = ['scheme' => 'unix', 'path' => substr($host, 0, $i)] + $parameters;
+                    }
+                }
+                $hosts = array_values($hosts);
+            }
+        }
+
+        if (isset($params['host']) || isset($params['path'])) {
+            if (!isset($params['dbindex']) && isset($params['path'])) {
+                if (preg_match('#/(\d+)$#', $params['path'], $m)) {
+                    $params['dbindex'] = $m[1];
+                    $params['path'] = substr($params['path'], 0, -\strlen($m[0]));
+                } elseif (isset($params['host'])) {
+                    throw new InvalidArgumentException(sprintf('Invalid Redis DSN: "%s", the "dbindex" parameter must be a number.', $dsn));
+                }
+            }
+
+            if (isset($params['host'])) {
+                array_unshift($hosts, ['scheme' => $tcpScheme, 'host' => $params['host'], 'port' => $params['port'] ?? 6379]);
+            } else {
+                array_unshift($hosts, ['scheme' => 'unix', 'path' => $params['path']]);
+            }
+        }
+
+        if (!$hosts) {
+            throw new InvalidArgumentException(sprintf('Invalid Redis DSN: "%s".', $dsn));
+        }
+
+        $params += $query + $options + self::$defaultConnectionOptions;
+
+        if (isset($params['redis_sentinel']) && !class_exists(\Predis\Client::class) && !class_exists(\RedisSentinel::class)) {
+            throw new CacheException(sprintf('Redis Sentinel support requires the "predis/predis" package or the "redis" extension v5.2 or higher: "%s".', $dsn));
+        }
+
+        if ($params['redis_cluster'] && isset($params['redis_sentinel'])) {
+            throw new InvalidArgumentException(sprintf('Cannot use both "redis_cluster" and "redis_sentinel" at the same time: "%s".', $dsn));
+        }
+
+        if (null === $params['class'] && \extension_loaded('redis')) {
+            $class = $params['redis_cluster'] ? \RedisCluster::class : (1 < \count($hosts) && !isset($params['redis_sentinel']) ? \RedisArray::class : \Redis::class);
+        } else {
+            $class = $params['class'] ?? \Predis\Client::class;
+
+            if (isset($params['redis_sentinel']) && !is_a($class, \Predis\Client::class, true) && !class_exists(\RedisSentinel::class)) {
+                throw new CacheException(sprintf('Cannot use Redis Sentinel: class "%s" does not extend "Predis\Client" and ext-redis >= 5.2 not found: "%s".', $class, $dsn));
+            }
+        }
+
+        if (is_a($class, \Redis::class, true)) {
+            $connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect';
+            $redis = new $class();
+
+            $initializer = static function ($redis) use ($connect, $params, $dsn, $auth, $hosts, $tls) {
+                $hostIndex = 0;
+                do {
+                    $host = $hosts[$hostIndex]['host'] ?? $hosts[$hostIndex]['path'];
+                    $port = $hosts[$hostIndex]['port'] ?? 0;
+                    $address = false;
+
+                    if (isset($hosts[$hostIndex]['host']) && $tls) {
+                        $host = 'tls://'.$host;
+                    }
+
+                    if (!isset($params['redis_sentinel'])) {
+                        break;
+                    }
+
+                    $sentinel = new \RedisSentinel($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout']);
+
+                    if ($address = $sentinel->getMasterAddrByName($params['redis_sentinel'])) {
+                        [$host, $port] = $address;
+                    }
+                } while (++$hostIndex < \count($hosts) && !$address);
+
+                if (isset($params['redis_sentinel']) && !$address) {
+                    throw new InvalidArgumentException(sprintf('Failed to retrieve master information from sentinel "%s" and dsn "%s".', $params['redis_sentinel'], $dsn));
+                }
+
+                try {
+                    @$redis->{$connect}($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...\defined('Redis::SCAN_PREFIX') ? [['stream' => $params['ssl'] ?? null]] : []);
+
+                    set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
+                    try {
+                        $isConnected = $redis->isConnected();
+                    } finally {
+                        restore_error_handler();
+                    }
+                    if (!$isConnected) {
+                        $error = preg_match('/^Redis::p?connect\(\): (.*)/', $error, $error) ? sprintf(' (%s)', $error[1]) : '';
+                        throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$error.'.');
+                    }
+
+                    if ((null !== $auth && !$redis->auth($auth))
+                        || ($params['dbindex'] && !$redis->select($params['dbindex']))
+                    ) {
+                        $e = preg_replace('/^ERR /', '', $redis->getLastError());
+                        throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$e.'.');
+                    }
+
+                    if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) {
+                        $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);
+                    }
+                } catch (\RedisException $e) {
+                    throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$e->getMessage());
+                }
+
+                return true;
+            };
+
+            if ($params['lazy']) {
+                $redis = new RedisProxy($redis, $initializer);
+            } else {
+                $initializer($redis);
+            }
+        } elseif (is_a($class, \RedisArray::class, true)) {
+            foreach ($hosts as $i => $host) {
+                switch ($host['scheme']) {
+                    case 'tcp': $hosts[$i] = $host['host'].':'.$host['port']; break;
+                    case 'tls': $hosts[$i] = 'tls://'.$host['host'].':'.$host['port']; break;
+                    default: $hosts[$i] = $host['path'];
+                }
+            }
+            $params['lazy_connect'] = $params['lazy'] ?? true;
+            $params['connect_timeout'] = $params['timeout'];
+
+            try {
+                $redis = new $class($hosts, $params);
+            } catch (\RedisClusterException $e) {
+                throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$e->getMessage());
+            }
+
+            if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) {
+                $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);
+            }
+        } elseif (is_a($class, \RedisCluster::class, true)) {
+            $initializer = static function () use ($class, $params, $dsn, $hosts) {
+                foreach ($hosts as $i => $host) {
+                    switch ($host['scheme']) {
+                        case 'tcp': $hosts[$i] = $host['host'].':'.$host['port']; break;
+                        case 'tls': $hosts[$i] = 'tls://'.$host['host'].':'.$host['port']; break;
+                        default: $hosts[$i] = $host['path'];
+                    }
+                }
+
+                try {
+                    $redis = new $class(null, $hosts, $params['timeout'], $params['read_timeout'], (bool) $params['persistent'], $params['auth'] ?? '', ...\defined('Redis::SCAN_PREFIX') ? [$params['ssl'] ?? null] : []);
+                } catch (\RedisClusterException $e) {
+                    throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$e->getMessage());
+                }
+
+                if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) {
+                    $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);
+                }
+                switch ($params['failover']) {
+                    case 'error': $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_ERROR); break;
+                    case 'distribute': $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_DISTRIBUTE); break;
+                    case 'slaves': $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES); break;
+                }
+
+                return $redis;
+            };
+
+            $redis = $params['lazy'] ? new RedisClusterProxy($initializer) : $initializer();
+        } elseif (is_a($class, \Predis\ClientInterface::class, true)) {
+            if ($params['redis_cluster']) {
+                $params['cluster'] = 'redis';
+            } elseif (isset($params['redis_sentinel'])) {
+                $params['replication'] = 'sentinel';
+                $params['service'] = $params['redis_sentinel'];
+            }
+            $params += ['parameters' => []];
+            $params['parameters'] += [
+                'persistent' => $params['persistent'],
+                'timeout' => $params['timeout'],
+                'read_write_timeout' => $params['read_timeout'],
+                'tcp_nodelay' => true,
+            ];
+            if ($params['dbindex']) {
+                $params['parameters']['database'] = $params['dbindex'];
+            }
+            if (null !== $auth) {
+                $params['parameters']['password'] = $auth;
+            }
+            if (1 === \count($hosts) && !($params['redis_cluster'] || $params['redis_sentinel'])) {
+                $hosts = $hosts[0];
+            } elseif (\in_array($params['failover'], ['slaves', 'distribute'], true) && !isset($params['replication'])) {
+                $params['replication'] = true;
+                $hosts[0] += ['alias' => 'master'];
+            }
+            $params['exceptions'] = false;
+
+            $redis = new $class($hosts, array_diff_key($params, array_diff_key(self::$defaultConnectionOptions, ['ssl' => null])));
+            if (isset($params['redis_sentinel'])) {
+                $redis->getConnection()->setSentinelTimeout($params['timeout']);
+            }
+        } elseif (class_exists($class, false)) {
+            throw new InvalidArgumentException(sprintf('"%s" is not a subclass of "Redis", "RedisArray", "RedisCluster" nor "Predis\ClientInterface".', $class));
+        } else {
+            throw new InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
+        }
+
+        return $redis;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        if (!$ids) {
+            return [];
+        }
+
+        $result = [];
+
+        if ($this->redis instanceof \Predis\ClientInterface && $this->redis->getConnection() instanceof ClusterInterface) {
+            $values = $this->pipeline(function () use ($ids) {
+                foreach ($ids as $id) {
+                    yield 'get' => [$id];
+                }
+            });
+        } else {
+            $values = $this->redis->mget($ids);
+
+            if (!\is_array($values) || \count($values) !== \count($ids)) {
+                return [];
+            }
+
+            $values = array_combine($ids, $values);
+        }
+
+        foreach ($values as $id => $v) {
+            if ($v) {
+                $result[$id] = $this->marshaller->unmarshall($v);
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave(string $id)
+    {
+        return (bool) $this->redis->exists($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear(string $namespace)
+    {
+        if ($this->redis instanceof \Predis\ClientInterface) {
+            $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : '';
+            $prefixLen = \strlen($prefix ?? '');
+        }
+
+        $cleared = true;
+        $hosts = $this->getHosts();
+        $host = reset($hosts);
+        if ($host instanceof \Predis\Client && $host->getConnection() instanceof ReplicationInterface) {
+            // Predis supports info command only on the master in replication environments
+            $hosts = [$host->getClientFor('master')];
+        }
+
+        foreach ($hosts as $host) {
+            if (!isset($namespace[0])) {
+                $cleared = $host->flushDb() && $cleared;
+                continue;
+            }
+
+            $info = $host->info('Server');
+            $info = !$info instanceof ErrorInterface ? $info['Server'] ?? $info : ['redis_version' => '2.0'];
+
+            if (!$host instanceof \Predis\ClientInterface) {
+                $prefix = \defined('Redis::SCAN_PREFIX') && (\Redis::SCAN_PREFIX & $host->getOption(\Redis::OPT_SCAN)) ? '' : $host->getOption(\Redis::OPT_PREFIX);
+                $prefixLen = \strlen($host->getOption(\Redis::OPT_PREFIX) ?? '');
+            }
+            $pattern = $prefix.$namespace.'*';
+
+            if (!version_compare($info['redis_version'], '2.8', '>=')) {
+                // As documented in Redis documentation (http://redis.io/commands/keys) using KEYS
+                // can hang your server when it is executed against large databases (millions of items).
+                // Whenever you hit this scale, you should really consider upgrading to Redis 2.8 or above.
+                $unlink = version_compare($info['redis_version'], '4.0', '>=') ? 'UNLINK' : 'DEL';
+                $args = $this->redis instanceof \Predis\ClientInterface ? [0, $pattern] : [[$pattern], 0];
+                $cleared = $host->eval("local keys=redis.call('KEYS',ARGV[1]) for i=1,#keys,5000 do redis.call('$unlink',unpack(keys,i,math.min(i+4999,#keys))) end return 1", $args[0], $args[1]) && $cleared;
+                continue;
+            }
+
+            $cursor = null;
+            do {
+                $keys = $host instanceof \Predis\ClientInterface ? $host->scan($cursor, 'MATCH', $pattern, 'COUNT', 1000) : $host->scan($cursor, $pattern, 1000);
+                if (isset($keys[1]) && \is_array($keys[1])) {
+                    $cursor = $keys[0];
+                    $keys = $keys[1];
+                }
+                if ($keys) {
+                    if ($prefixLen) {
+                        foreach ($keys as $i => $key) {
+                            $keys[$i] = substr($key, $prefixLen);
+                        }
+                    }
+                    $this->doDelete($keys);
+                }
+            } while ($cursor = (int) $cursor);
+        }
+
+        return $cleared;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        if (!$ids) {
+            return true;
+        }
+
+        if ($this->redis instanceof \Predis\ClientInterface && $this->redis->getConnection() instanceof ClusterInterface) {
+            static $del;
+            $del = $del ?? (class_exists(UNLINK::class) ? 'unlink' : 'del');
+
+            $this->pipeline(function () use ($ids, $del) {
+                foreach ($ids as $id) {
+                    yield $del => [$id];
+                }
+            })->rewind();
+        } else {
+            static $unlink = true;
+
+            if ($unlink) {
+                try {
+                    $unlink = false !== $this->redis->unlink($ids);
+                } catch (\Throwable $e) {
+                    $unlink = false;
+                }
+            }
+
+            if (!$unlink) {
+                $this->redis->del($ids);
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, int $lifetime)
+    {
+        if (!$values = $this->marshaller->marshall($values, $failed)) {
+            return $failed;
+        }
+
+        $results = $this->pipeline(function () use ($values, $lifetime) {
+            foreach ($values as $id => $value) {
+                if (0 >= $lifetime) {
+                    yield 'set' => [$id, $value];
+                } else {
+                    yield 'setEx' => [$id, $lifetime, $value];
+                }
+            }
+        });
+
+        foreach ($results as $id => $result) {
+            if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) {
+                $failed[] = $id;
+            }
+        }
+
+        return $failed;
+    }
+
+    private function pipeline(\Closure $generator, object $redis = null): \Generator
+    {
+        $ids = [];
+        $redis = $redis ?? $this->redis;
+
+        if ($redis instanceof RedisClusterProxy || $redis instanceof \RedisCluster || ($redis instanceof \Predis\ClientInterface && $redis->getConnection() instanceof RedisCluster)) {
+            // phpredis & predis don't support pipelining with RedisCluster
+            // see https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#pipelining
+            // see https://github.com/nrk/predis/issues/267#issuecomment-123781423
+            $results = [];
+            foreach ($generator() as $command => $args) {
+                $results[] = $redis->{$command}(...$args);
+                $ids[] = 'eval' === $command ? ($redis instanceof \Predis\ClientInterface ? $args[2] : $args[1][0]) : $args[0];
+            }
+        } elseif ($redis instanceof \Predis\ClientInterface) {
+            $results = $redis->pipeline(static function ($redis) use ($generator, &$ids) {
+                foreach ($generator() as $command => $args) {
+                    $redis->{$command}(...$args);
+                    $ids[] = 'eval' === $command ? $args[2] : $args[0];
+                }
+            });
+        } elseif ($redis instanceof \RedisArray) {
+            $connections = $results = $ids = [];
+            foreach ($generator() as $command => $args) {
+                $id = 'eval' === $command ? $args[1][0] : $args[0];
+                if (!isset($connections[$h = $redis->_target($id)])) {
+                    $connections[$h] = [$redis->_instance($h), -1];
+                    $connections[$h][0]->multi(\Redis::PIPELINE);
+                }
+                $connections[$h][0]->{$command}(...$args);
+                $results[] = [$h, ++$connections[$h][1]];
+                $ids[] = $id;
+            }
+            foreach ($connections as $h => $c) {
+                $connections[$h] = $c[0]->exec();
+            }
+            foreach ($results as $k => [$h, $c]) {
+                $results[$k] = $connections[$h][$c];
+            }
+        } else {
+            $redis->multi(\Redis::PIPELINE);
+            foreach ($generator() as $command => $args) {
+                $redis->{$command}(...$args);
+                $ids[] = 'eval' === $command ? $args[1][0] : $args[0];
+            }
+            $results = $redis->exec();
+        }
+
+        if (!$redis instanceof \Predis\ClientInterface && 'eval' === $command && $redis->getLastError()) {
+            $e = new \RedisException($redis->getLastError());
+            $results = array_map(function ($v) use ($e) { return false === $v ? $e : $v; }, $results);
+        }
+
+        foreach ($ids as $k => $id) {
+            yield $id => $results[$k];
+        }
+    }
+
+    private function getHosts(): array
+    {
+        $hosts = [$this->redis];
+        if ($this->redis instanceof \Predis\ClientInterface) {
+            $connection = $this->redis->getConnection();
+            if ($connection instanceof ClusterInterface && $connection instanceof \Traversable) {
+                $hosts = [];
+                foreach ($connection as $c) {
+                    $hosts[] = new \Predis\Client($c);
+                }
+            }
+        } elseif ($this->redis instanceof \RedisArray) {
+            $hosts = [];
+            foreach ($this->redis->_hosts() as $host) {
+                $hosts[] = $this->redis->_instance($host);
+            }
+        } elseif ($this->redis instanceof RedisClusterProxy || $this->redis instanceof \RedisCluster) {
+            $hosts = [];
+            foreach ($this->redis->_masters() as $host) {
+                $hosts[] = new RedisClusterNodeProxy($host, $this->redis);
+            }
+        }
+
+        return $hosts;
+    }
+}
diff --git a/vendor/symfony/cache/composer.json b/vendor/symfony/cache/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..1ebcfc9b307e7a199b72b2ed4e813f43d3a9bcf0
--- /dev/null
+++ b/vendor/symfony/cache/composer.json
@@ -0,0 +1,60 @@
+{
+    "name": "symfony/cache",
+    "type": "library",
+    "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation",
+    "keywords": ["caching", "psr6"],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nicolas Grekas",
+            "email": "p@tchwork.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "provide": {
+        "psr/cache-implementation": "1.0|2.0",
+        "psr/simple-cache-implementation": "1.0|2.0",
+        "symfony/cache-implementation": "1.0|2.0"
+    },
+    "require": {
+        "php": ">=7.2.5",
+        "psr/cache": "^1.0|^2.0",
+        "psr/log": "^1.1|^2|^3",
+        "symfony/cache-contracts": "^1.1.7|^2",
+        "symfony/deprecation-contracts": "^2.1|^3",
+        "symfony/polyfill-php73": "^1.9",
+        "symfony/polyfill-php80": "^1.16",
+        "symfony/service-contracts": "^1.1|^2|^3",
+        "symfony/var-exporter": "^4.4|^5.0|^6.0"
+    },
+    "require-dev": {
+        "cache/integration-tests": "dev-master",
+        "doctrine/cache": "^1.6|^2.0",
+        "doctrine/dbal": "^2.13.1|^3.0",
+        "predis/predis": "^1.1",
+        "psr/simple-cache": "^1.0|^2.0",
+        "symfony/config": "^4.4|^5.0|^6.0",
+        "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+        "symfony/filesystem": "^4.4|^5.0|^6.0",
+        "symfony/http-kernel": "^4.4|^5.0|^6.0",
+        "symfony/messenger": "^4.4|^5.0|^6.0",
+        "symfony/var-dumper": "^4.4|^5.0|^6.0"
+    },
+    "conflict": {
+        "doctrine/dbal": "<2.13.1",
+        "symfony/dependency-injection": "<4.4",
+        "symfony/http-kernel": "<4.4",
+        "symfony/var-dumper": "<4.4"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\Cache\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev"
+}
diff --git a/vendor/symfony/config/Definition/ArrayNode.php b/vendor/symfony/config/Definition/ArrayNode.php
index 96f38dcc9250d867b7355e15859619e43aa3a7f0..34201709c217910e5e2f289077fecd2c51884c34 100644
--- a/vendor/symfony/config/Definition/ArrayNode.php
+++ b/vendor/symfony/config/Definition/ArrayNode.php
@@ -55,7 +55,7 @@ protected function preNormalize($value)
         $normalized = [];
 
         foreach ($value as $k => $v) {
-            if (false !== strpos($k, '-') && false === strpos($k, '_') && !\array_key_exists($normalizedKey = str_replace('-', '_', $k), $value)) {
+            if (str_contains($k, '-') && !str_contains($k, '_') && !\array_key_exists($normalizedKey = str_replace('-', '_', $k), $value)) {
                 $normalized[$normalizedKey] = $v;
             } else {
                 $normalized[$k] = $v;
@@ -192,7 +192,7 @@ public function getDefaultValue()
     public function addChild(NodeInterface $node)
     {
         $name = $node->getName();
-        if (!\strlen($name)) {
+        if ('' === $name) {
             throw new \InvalidArgumentException('Child nodes must be named.');
         }
         if (isset($this->children[$name])) {
@@ -203,11 +203,7 @@ public function addChild(NodeInterface $node)
     }
 
     /**
-     * Finalizes the value of this node.
-     *
-     * @param mixed $value
-     *
-     * @return mixed The finalised value
+     * {@inheritdoc}
      *
      * @throws UnsetKeyException
      * @throws InvalidConfigurationException if the node doesn't have enough children
@@ -249,11 +245,7 @@ protected function finalizeValue($value)
     }
 
     /**
-     * Validates the type of the value.
-     *
-     * @param mixed $value
-     *
-     * @throws InvalidTypeException
+     * {@inheritdoc}
      */
     protected function validateType($value)
     {
@@ -269,11 +261,7 @@ protected function validateType($value)
     }
 
     /**
-     * Normalizes the value.
-     *
-     * @param mixed $value The value to normalize
-     *
-     * @return mixed The normalized value
+     * {@inheritdoc}
      *
      * @throws InvalidConfigurationException
      */
@@ -355,12 +343,7 @@ protected function remapXml($value)
     }
 
     /**
-     * Merges values together.
-     *
-     * @param mixed $leftSide  The left side to merge
-     * @param mixed $rightSide The right side to merge
-     *
-     * @return mixed The merged values
+     * {@inheritdoc}
      *
      * @throws InvalidConfigurationException
      * @throws \RuntimeException
diff --git a/vendor/symfony/config/Definition/BaseNode.php b/vendor/symfony/config/Definition/BaseNode.php
index 3b0ea0a98a403697f5f0bca865b16067e1a4dbdb..209e3d265166ef3197e7044d4cc40f22c3505c7e 100644
--- a/vendor/symfony/config/Definition/BaseNode.php
+++ b/vendor/symfony/config/Definition/BaseNode.php
@@ -47,7 +47,7 @@ abstract class BaseNode implements NodeInterface
      */
     public function __construct(?string $name, NodeInterface $parent = null, string $pathSeparator = self::DEFAULT_PATH_SEPARATOR)
     {
-        if (false !== strpos($name = (string) $name, $pathSeparator)) {
+        if (str_contains($name = (string) $name, $pathSeparator)) {
             throw new \InvalidArgumentException('The name must not contain ".'.$pathSeparator.'".');
         }
 
@@ -514,7 +514,7 @@ private static function resolvePlaceholderValue($value)
             }
 
             foreach (self::$placeholderUniquePrefixes as $placeholderUniquePrefix) {
-                if (0 === strpos($value, $placeholderUniquePrefix)) {
+                if (str_starts_with($value, $placeholderUniquePrefix)) {
                     return [];
                 }
             }
diff --git a/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php b/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php
index bec08b0db653bb9494cb236b6d3751c67d59b12b..61348387be2d37324ba2d66647da13b77da1053f 100644
--- a/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php
+++ b/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php
@@ -280,7 +280,7 @@ public function canBeEnabled()
             ->treatNullLike(['enabled' => true])
             ->beforeNormalization()
                 ->ifArray()
-                ->then(function ($v) {
+                ->then(function (array $v) {
                     $v['enabled'] = $v['enabled'] ?? true;
 
                     return $v;
diff --git a/vendor/symfony/config/Definition/Builder/ExprBuilder.php b/vendor/symfony/config/Definition/Builder/ExprBuilder.php
index 5db229dccab7f759039c635e75a9031f6042f99f..d102e56efc37a05b3e1ae91bbd88bfb32bbd1ba6 100644
--- a/vendor/symfony/config/Definition/Builder/ExprBuilder.php
+++ b/vendor/symfony/config/Definition/Builder/ExprBuilder.php
@@ -37,7 +37,7 @@ public function __construct(NodeDefinition $node)
      */
     public function always(\Closure $then = null)
     {
-        $this->ifPart = function ($v) { return true; };
+        $this->ifPart = function () { return true; };
 
         if (null !== $then) {
             $this->thenPart = $then;
@@ -91,7 +91,7 @@ public function ifNull()
     /**
      * Tests if the value is empty.
      *
-     * @return ExprBuilder
+     * @return $this
      */
     public function ifEmpty()
     {
@@ -168,7 +168,7 @@ public function then(\Closure $closure)
      */
     public function thenEmptyArray()
     {
-        $this->thenPart = function ($v) { return []; };
+        $this->thenPart = function () { return []; };
 
         return $this;
     }
@@ -200,7 +200,7 @@ public function thenInvalid($message)
      */
     public function thenUnset()
     {
-        $this->thenPart = function ($v) { throw new UnsetKeyException('Unsetting key.'); };
+        $this->thenPart = function () { throw new UnsetKeyException('Unsetting key.'); };
 
         return $this;
     }
diff --git a/vendor/symfony/config/Definition/Builder/NumericNodeDefinition.php b/vendor/symfony/config/Definition/Builder/NumericNodeDefinition.php
index 390b1136567e6ce3e175ffffc28ba6af92688388..c4bff1756fb0d420240eac94e1d519e724abbc0e 100644
--- a/vendor/symfony/config/Definition/Builder/NumericNodeDefinition.php
+++ b/vendor/symfony/config/Definition/Builder/NumericNodeDefinition.php
@@ -26,7 +26,7 @@ abstract class NumericNodeDefinition extends ScalarNodeDefinition
     /**
      * Ensures that the value is smaller than the given reference.
      *
-     * @param mixed $max
+     * @param int|float $max
      *
      * @return $this
      *
@@ -45,7 +45,7 @@ public function max($max)
     /**
      * Ensures that the value is bigger than the given reference.
      *
-     * @param mixed $min
+     * @param int|float $min
      *
      * @return $this
      *
diff --git a/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php b/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php
index 29e4076f97ae808eb4f62ab4e82e385465c9be4d..a6b6240c77a54c5a1b5f1cec8545477aaea63278 100644
--- a/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php
+++ b/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php
@@ -49,7 +49,7 @@ private function writeNode(NodeInterface $node, int $depth = 0, bool $root = fal
 
         // xml remapping
         if ($node->getParent()) {
-            $remapping = array_filter($node->getParent()->getXmlRemappings(), function ($mapping) use ($rootName) {
+            $remapping = array_filter($node->getParent()->getXmlRemappings(), function (array $mapping) use ($rootName) {
                 return $rootName === $mapping[1];
             });
 
diff --git a/vendor/symfony/config/Definition/EnumNode.php b/vendor/symfony/config/Definition/EnumNode.php
index 23fc508a78fa9c605182397f584346e5ba20c051..822e6b57f16426029234e26923ccbd2c6000237a 100644
--- a/vendor/symfony/config/Definition/EnumNode.php
+++ b/vendor/symfony/config/Definition/EnumNode.php
@@ -38,6 +38,9 @@ public function getValues()
         return $this->values;
     }
 
+    /**
+     * {@inheritdoc}
+     */
     protected function finalizeValue($value)
     {
         $value = parent::finalizeValue($value);
diff --git a/vendor/symfony/config/Definition/NumericNode.php b/vendor/symfony/config/Definition/NumericNode.php
index 19c96e8af764ceb3113262bec7c50b0dad6de1a6..50d137c2d71fbfd9be01189459c64931a6015526 100644
--- a/vendor/symfony/config/Definition/NumericNode.php
+++ b/vendor/symfony/config/Definition/NumericNode.php
@@ -23,6 +23,10 @@ class NumericNode extends ScalarNode
     protected $min;
     protected $max;
 
+    /**
+     * @param int|float|null $min
+     * @param int|float|null $max
+     */
     public function __construct(?string $name, NodeInterface $parent = null, $min = null, $max = null, string $pathSeparator = BaseNode::DEFAULT_PATH_SEPARATOR)
     {
         parent::__construct($name, $parent, $pathSeparator);
diff --git a/vendor/symfony/config/Definition/PrototypedArrayNode.php b/vendor/symfony/config/Definition/PrototypedArrayNode.php
index 72d3578be7a09de05cb8c784bfd57b2284dbbcc7..03822236772f81a377de989a09e2130619c14508 100644
--- a/vendor/symfony/config/Definition/PrototypedArrayNode.php
+++ b/vendor/symfony/config/Definition/PrototypedArrayNode.php
@@ -173,14 +173,7 @@ public function addChild(NodeInterface $node)
     }
 
     /**
-     * Finalizes the value of this node.
-     *
-     * @param mixed $value
-     *
-     * @return mixed The finalized value
-     *
-     * @throws UnsetKeyException
-     * @throws InvalidConfigurationException if the node doesn't have enough children
+     * {@inheritdoc}
      */
     protected function finalizeValue($value)
     {
@@ -208,13 +201,8 @@ protected function finalizeValue($value)
     }
 
     /**
-     * Normalizes the value.
-     *
-     * @param mixed $value The value to normalize
-     *
-     * @return mixed The normalized value
+     * {@inheritdoc}
      *
-     * @throws InvalidConfigurationException
      * @throws DuplicateKeyException
      */
     protected function normalizeValue($value)
@@ -282,15 +270,7 @@ protected function normalizeValue($value)
     }
 
     /**
-     * Merges values together.
-     *
-     * @param mixed $leftSide  The left side to merge
-     * @param mixed $rightSide The right side to merge
-     *
-     * @return mixed The merged values
-     *
-     * @throws InvalidConfigurationException
-     * @throws \RuntimeException
+     * {@inheritdoc}
      */
     protected function mergeValues($leftSide, $rightSide)
     {
diff --git a/vendor/symfony/config/Definition/ScalarNode.php b/vendor/symfony/config/Definition/ScalarNode.php
index 5ad28ec4c53ab9fb60e30ccd9f17d37a6eea5d9c..7a5adf1b7819df2f3c274db203843ee54ba39d72 100644
--- a/vendor/symfony/config/Definition/ScalarNode.php
+++ b/vendor/symfony/config/Definition/ScalarNode.php
@@ -32,7 +32,7 @@ class ScalarNode extends VariableNode
      */
     protected function validateType($value)
     {
-        if (!is_scalar($value) && null !== $value) {
+        if (!\is_scalar($value) && null !== $value) {
             $ex = new InvalidTypeException(sprintf('Invalid type for path "%s". Expected scalar, but got %s.', $this->getPath(), \gettype($value)));
             if ($hint = $this->getInfo()) {
                 $ex->addHint($hint);
diff --git a/vendor/symfony/config/Exception/FileLoaderLoadException.php b/vendor/symfony/config/Exception/FileLoaderLoadException.php
index e53106a11aa0fe3ab7af723e4364a09014985c9f..2c815192dad0efd963b47e9d9db9424215456899 100644
--- a/vendor/symfony/config/Exception/FileLoaderLoadException.php
+++ b/vendor/symfony/config/Exception/FileLoaderLoadException.php
@@ -34,7 +34,7 @@ public function __construct(string $resource, string $sourceResource = null, ?in
             // Include the previous exception, to help the user see what might be the underlying cause
 
             // Trim the trailing period of the previous message. We only want 1 period remove so no rtrim...
-            if ('.' === substr($previous->getMessage(), -1)) {
+            if (str_ends_with($previous->getMessage(), '.')) {
                 $trimmedMessage = substr($previous->getMessage(), 0, -1);
                 $message .= sprintf('%s', $trimmedMessage).' in ';
             } else {
diff --git a/vendor/symfony/config/LICENSE b/vendor/symfony/config/LICENSE
index 9ff2d0d6306da5990f3e30de9ac7d41907a63f0d..88bf75bb4d6a2898be0558b61cfe48996d33ffbf 100644
--- a/vendor/symfony/config/LICENSE
+++ b/vendor/symfony/config/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2021 Fabien Potencier
+Copyright (c) 2004-2022 Fabien Potencier
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/config/Loader/FileLoader.php b/vendor/symfony/config/Loader/FileLoader.php
index 5ead5961f6ab381ce91ec402aa225fc0e71d996a..f4cdb8aa838de43abc92d02cb4a23d091ba16c22 100644
--- a/vendor/symfony/config/Loader/FileLoader.php
+++ b/vendor/symfony/config/Loader/FileLoader.php
@@ -71,14 +71,14 @@ public function getLocator()
      * @throws FileLoaderImportCircularReferenceException
      * @throws FileLocatorFileNotFoundException
      */
-    public function import($resource, $type = null, $ignoreErrors = false, $sourceResource = null/*, $exclude = null*/)
+    public function import($resource, $type = null, $ignoreErrors = false, $sourceResource = null/* , $exclude = null */)
     {
-        if (\func_num_args() < 5 && __CLASS__ !== static::class && 0 !== strpos(static::class, 'Symfony\Component\\') && __CLASS__ !== (new \ReflectionMethod($this, __FUNCTION__))->getDeclaringClass()->getName() && !$this instanceof \PHPUnit\Framework\MockObject\MockObject && !$this instanceof \Prophecy\Prophecy\ProphecySubjectInterface && !$this instanceof \Mockery\MockInterface) {
+        if (\func_num_args() < 5 && __CLASS__ !== static::class && !str_starts_with(static::class, 'Symfony\Component\\') && __CLASS__ !== (new \ReflectionMethod($this, __FUNCTION__))->getDeclaringClass()->getName() && !$this instanceof \PHPUnit\Framework\MockObject\MockObject && !$this instanceof \Prophecy\Prophecy\ProphecySubjectInterface && !$this instanceof \Mockery\MockInterface) {
             @trigger_error(sprintf('The "%s()" method will have a new "$exclude = null" argument in version 5.0, not defining it is deprecated since Symfony 4.4.', __METHOD__), \E_USER_DEPRECATED);
         }
         $exclude = \func_num_args() >= 5 ? func_get_arg(4) : null;
 
-        if (\is_string($resource) && \strlen($resource) !== ($i = strcspn($resource, '*?{[')) && false === strpos($resource, "\n")) {
+        if (\is_string($resource) && \strlen($resource) !== ($i = strcspn($resource, '*?{[')) && !str_contains($resource, "\n")) {
             $excluded = [];
             foreach ((array) $exclude as $pattern) {
                 foreach ($this->glob($pattern, true, $_, false, true) as $path => $info) {
@@ -88,7 +88,7 @@ public function import($resource, $type = null, $ignoreErrors = false, $sourceRe
             }
 
             $ret = [];
-            $isSubpath = 0 !== $i && false !== strpos(substr($resource, 0, $i), '/');
+            $isSubpath = 0 !== $i && str_contains(substr($resource, 0, $i), '/');
             foreach ($this->glob($resource, false, $_, $ignoreErrors || !$isSubpath, false, $excluded) as $path => $info) {
                 if (null !== $res = $this->doImport($path, 'glob' === $type ? null : $type, $ignoreErrors, $sourceResource)) {
                     $ret[] = $res;
@@ -112,7 +112,7 @@ protected function glob(string $pattern, bool $recursive, &$resource = null, boo
         if (\strlen($pattern) === $i = strcspn($pattern, '*?{[')) {
             $prefix = $pattern;
             $pattern = '';
-        } elseif (0 === $i || false === strpos(substr($pattern, 0, $i), '/')) {
+        } elseif (0 === $i || !str_contains(substr($pattern, 0, $i), '/')) {
             $prefix = '.';
             $pattern = '/'.$pattern;
         } else {
diff --git a/vendor/symfony/config/Resource/ClassExistenceResource.php b/vendor/symfony/config/Resource/ClassExistenceResource.php
index c77e343b5c306a3d206a4cbeee6fb3de11d34111..f04b767e7f704e294770a84760654d0f2ee7ed36 100644
--- a/vendor/symfony/config/Resource/ClassExistenceResource.php
+++ b/vendor/symfony/config/Resource/ClassExistenceResource.php
@@ -38,13 +38,10 @@ public function __construct(string $resource, bool $exists = null)
     {
         $this->resource = $resource;
         if (null !== $exists) {
-            $this->exists = [(bool) $exists, null];
+            $this->exists = [$exists, null];
         }
     }
 
-    /**
-     * {@inheritdoc}
-     */
     public function __toString()
     {
         return $this->resource;
diff --git a/vendor/symfony/config/Resource/ComposerResource.php b/vendor/symfony/config/Resource/ComposerResource.php
index 822766b75b1cb3c51352af827a9d59cc15f56490..aee6f02b20979055d15f4ffeb0ce65bee0a9d8f0 100644
--- a/vendor/symfony/config/Resource/ComposerResource.php
+++ b/vendor/symfony/config/Resource/ComposerResource.php
@@ -35,9 +35,6 @@ public function getVendors()
         return array_keys($this->vendors);
     }
 
-    /**
-     * {@inheritdoc}
-     */
     public function __toString()
     {
         return __CLASS__;
@@ -58,7 +55,7 @@ private static function refresh()
         self::$runtimeVendors = [];
 
         foreach (get_declared_classes() as $class) {
-            if ('C' === $class[0] && 0 === strpos($class, 'ComposerAutoloaderInit')) {
+            if ('C' === $class[0] && str_starts_with($class, 'ComposerAutoloaderInit')) {
                 $r = new \ReflectionClass($class);
                 $v = \dirname($r->getFileName(), 2);
                 if (file_exists($v.'/composer/installed.json')) {
diff --git a/vendor/symfony/config/Resource/DirectoryResource.php b/vendor/symfony/config/Resource/DirectoryResource.php
index 3d703db7f6ebe835e7d6cf44efc1c7c18a730b18..a29bd5ee981391e0b1154d2026405a696bdaf1ce 100644
--- a/vendor/symfony/config/Resource/DirectoryResource.php
+++ b/vendor/symfony/config/Resource/DirectoryResource.php
@@ -39,9 +39,6 @@ public function __construct(string $resource, string $pattern = null)
         }
     }
 
-    /**
-     * {@inheritdoc}
-     */
     public function __toString()
     {
         return md5(serialize([$this->resource, $this->pattern]));
@@ -86,7 +83,7 @@ public function isFresh($timestamp)
 
             // always monitor directories for changes, except the .. entries
             // (otherwise deleted files wouldn't get detected)
-            if ($file->isDir() && '/..' === substr($file, -3)) {
+            if ($file->isDir() && str_ends_with($file, '/..')) {
                 continue;
             }
 
diff --git a/vendor/symfony/config/Resource/FileExistenceResource.php b/vendor/symfony/config/Resource/FileExistenceResource.php
index 57234161588c7e00ff288650c4df5e639cd3b436..760c061bf49da019e9901ba4a06ad5e6865aea40 100644
--- a/vendor/symfony/config/Resource/FileExistenceResource.php
+++ b/vendor/symfony/config/Resource/FileExistenceResource.php
@@ -36,9 +36,6 @@ public function __construct(string $resource)
         $this->exists = file_exists($resource);
     }
 
-    /**
-     * {@inheritdoc}
-     */
     public function __toString()
     {
         return $this->resource;
diff --git a/vendor/symfony/config/Resource/FileResource.php b/vendor/symfony/config/Resource/FileResource.php
index 95fe8a0bf802c18bcd9362bf6440e1b1abbfd51d..96d7d97317eb9868a98f465dea3cc3c3140d2405 100644
--- a/vendor/symfony/config/Resource/FileResource.php
+++ b/vendor/symfony/config/Resource/FileResource.php
@@ -41,9 +41,6 @@ public function __construct(string $resource)
         }
     }
 
-    /**
-     * {@inheritdoc}
-     */
     public function __toString()
     {
         return $this->resource;
diff --git a/vendor/symfony/config/Resource/GlobResource.php b/vendor/symfony/config/Resource/GlobResource.php
index f825a9291155809a102ef558af899170920bec94..57e528462cc90757c68cfe8dec0b1684ac50d103 100644
--- a/vendor/symfony/config/Resource/GlobResource.php
+++ b/vendor/symfony/config/Resource/GlobResource.php
@@ -60,9 +60,6 @@ public function getPrefix()
         return $this->prefix;
     }
 
-    /**
-     * {@inheritdoc}
-     */
     public function __toString()
     {
         return 'glob.'.$this->prefix.(int) $this->recursive.$this->pattern.(int) $this->forExclusion.implode("\0", $this->excludedPrefixes);
@@ -105,6 +102,7 @@ public function __wakeup(): void
     /**
      * @return \Traversable
      */
+    #[\ReturnTypeWillChange]
     public function getIterator()
     {
         if (!file_exists($this->prefix) || (!$this->recursive && '' === $this->pattern)) {
@@ -113,10 +111,12 @@ public function getIterator()
         $prefix = str_replace('\\', '/', $this->prefix);
         $paths = null;
 
-        if (0 !== strpos($this->prefix, 'phar://') && false === strpos($this->pattern, '/**/')) {
-            if ($this->globBrace || false === strpos($this->pattern, '{')) {
+        if ('' === $this->pattern && is_file($prefix)) {
+            $paths = [$this->prefix];
+        } elseif (!str_starts_with($this->prefix, 'phar://') && !str_contains($this->pattern, '/**/')) {
+            if ($this->globBrace || !str_contains($this->pattern, '{')) {
                 $paths = glob($this->prefix.$this->pattern, \GLOB_NOSORT | $this->globBrace);
-            } elseif (false === strpos($this->pattern, '\\') || !preg_match('/\\\\[,{}]/', $this->pattern)) {
+            } elseif (!str_contains($this->pattern, '\\') || !preg_match('/\\\\[,{}]/', $this->pattern)) {
                 foreach ($this->expandGlob($this->pattern) as $p) {
                     $paths[] = glob($this->prefix.$p, \GLOB_NOSORT);
                 }
@@ -125,7 +125,7 @@ public function getIterator()
         }
 
         if (null !== $paths) {
-            sort($paths);
+            natsort($paths);
             foreach ($paths as $path) {
                 if ($this->excludedPrefixes) {
                     $normalizedPath = str_replace('\\', '/', $path);
@@ -158,7 +158,7 @@ function (\SplFileInfo $file, $path) {
                     ),
                     \RecursiveIteratorIterator::LEAVES_ONLY
                 ));
-                uasort($files, 'strnatcmp');
+                uksort($files, 'strnatcmp');
 
                 foreach ($files as $path => $info) {
                     if ($info->isFile()) {
@@ -174,14 +174,21 @@ function (\SplFileInfo $file, $path) {
             throw new \LogicException(sprintf('Extended glob pattern "%s" cannot be used as the Finder component is not installed.', $this->pattern));
         }
 
+        if (is_file($prefix = $this->prefix)) {
+            $prefix = \dirname($prefix);
+            $pattern = basename($prefix).$this->pattern;
+        } else {
+            $pattern = $this->pattern;
+        }
+
         $finder = new Finder();
-        $regex = Glob::toRegex($this->pattern);
+        $regex = Glob::toRegex($pattern);
         if ($this->recursive) {
             $regex = substr_replace($regex, '(/|$)', -2, 1);
         }
 
-        $prefixLen = \strlen($this->prefix);
-        foreach ($finder->followLinks()->sortByName()->in($this->prefix) as $path => $info) {
+        $prefixLen = \strlen($prefix);
+        foreach ($finder->followLinks()->sortByName()->in($prefix) as $path => $info) {
             $normalizedPath = str_replace('\\', '/', $path);
             if (!preg_match($regex, substr($normalizedPath, $prefixLen)) || !$info->isFile()) {
                 continue;
@@ -229,7 +236,7 @@ private function expandGlob(string $pattern): array
 
         $j = 0;
         foreach ($patterns as $i => $p) {
-            if (false !== strpos($p, '{')) {
+            if (str_contains($p, '{')) {
                 $p = $this->expandGlob($p);
                 array_splice($paths, $i + $j, 1, $p);
                 $j += \count($p) - 1;
diff --git a/vendor/symfony/config/Resource/ReflectionClassResource.php b/vendor/symfony/config/Resource/ReflectionClassResource.php
index 2b58bd663258d73a06d90a15fdf7381754bce1d1..f966178955bd1845bee3ebf27f820718f01ce296 100644
--- a/vendor/symfony/config/Resource/ReflectionClassResource.php
+++ b/vendor/symfony/config/Resource/ReflectionClassResource.php
@@ -83,7 +83,7 @@ private function loadFiles(\ReflectionClass $class)
             $file = $class->getFileName();
             if (false !== $file && file_exists($file)) {
                 foreach ($this->excludedVendors as $vendor) {
-                    if (0 === strpos($file, $vendor) && false !== strpbrk(substr($file, \strlen($vendor), 1), '/'.\DIRECTORY_SEPARATOR)) {
+                    if (str_starts_with($file, $vendor) && false !== strpbrk(substr($file, \strlen($vendor), 1), '/'.\DIRECTORY_SEPARATOR)) {
                         $file = false;
                         break;
                     }
@@ -119,6 +119,15 @@ private function computeHash(): string
 
     private function generateSignature(\ReflectionClass $class): iterable
     {
+        if (\PHP_VERSION_ID >= 80000) {
+            $attributes = [];
+            foreach ($class->getAttributes() as $a) {
+                $attributes[] = [$a->getName(), \PHP_VERSION_ID >= 80100 ? (string) $a : $a->getArguments()];
+            }
+            yield print_r($attributes, true);
+            $attributes = [];
+        }
+
         yield $class->getDocComment();
         yield (int) $class->isFinal();
         yield (int) $class->isAbstract();
@@ -135,6 +144,14 @@ private function generateSignature(\ReflectionClass $class): iterable
             $defaults = $class->getDefaultProperties();
 
             foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED) as $p) {
+                if (\PHP_VERSION_ID >= 80000) {
+                    foreach ($p->getAttributes() as $a) {
+                        $attributes[] = [$a->getName(), \PHP_VERSION_ID >= 80100 ? (string) $a : $a->getArguments()];
+                    }
+                    yield print_r($attributes, true);
+                    $attributes = [];
+                }
+
                 yield $p->getDocComment();
                 yield $p->isDefault() ? '<default>' : '';
                 yield $p->isPublic() ? 'public' : 'protected';
@@ -144,17 +161,41 @@ private function generateSignature(\ReflectionClass $class): iterable
             }
         }
 
+        $defined = \Closure::bind(static function ($c) { return \defined($c); }, null, $class->name);
+
         foreach ($class->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) as $m) {
+            if (\PHP_VERSION_ID >= 80000) {
+                foreach ($m->getAttributes() as $a) {
+                    $attributes[] = [$a->getName(), \PHP_VERSION_ID >= 80100 ? (string) $a : $a->getArguments()];
+                }
+                yield print_r($attributes, true);
+                $attributes = [];
+            }
+
             $defaults = [];
             $parametersWithUndefinedConstants = [];
             foreach ($m->getParameters() as $p) {
+                if (\PHP_VERSION_ID >= 80000) {
+                    foreach ($p->getAttributes() as $a) {
+                        $attributes[] = [$a->getName(), \PHP_VERSION_ID >= 80100 ? (string) $a : $a->getArguments()];
+                    }
+                    yield print_r($attributes, true);
+                    $attributes = [];
+                }
+
                 if (!$p->isDefaultValueAvailable()) {
                     $defaults[$p->name] = null;
 
                     continue;
                 }
 
-                if (!$p->isDefaultValueConstant() || \defined($p->getDefaultValueConstantName())) {
+                if (\PHP_VERSION_ID >= 80100) {
+                    $defaults[$p->name] = (string) $p;
+
+                    continue;
+                }
+
+                if (!$p->isDefaultValueConstant() || $defined($p->getDefaultValueConstantName())) {
                     $defaults[$p->name] = $p->getDefaultValue();
 
                     continue;
diff --git a/vendor/symfony/config/Resource/ResourceInterface.php b/vendor/symfony/config/Resource/ResourceInterface.php
index d98fd427a25eb64e12805fa9d51ea9c9e535c2c2..9a0cd9a47fe72506d8a40d59a251ec9eb97dece9 100644
--- a/vendor/symfony/config/Resource/ResourceInterface.php
+++ b/vendor/symfony/config/Resource/ResourceInterface.php
@@ -26,8 +26,6 @@ interface ResourceInterface
      * to be identical for different ResourceInterface instances referring to the same
      * resource; and it should be unlikely to collide with that of other, unrelated
      * resource instances.
-     *
-     * @return string A string representation unique to the underlying Resource
      */
     public function __toString();
 }
diff --git a/vendor/symfony/config/ResourceCheckerConfigCache.php b/vendor/symfony/config/ResourceCheckerConfigCache.php
index d41b3c43c743e1661a0457c9a6582e75f065b364..5131173138fe4d63d35e19f1af48daf5ac044e18 100644
--- a/vendor/symfony/config/ResourceCheckerConfigCache.php
+++ b/vendor/symfony/config/ResourceCheckerConfigCache.php
@@ -137,7 +137,7 @@ public function write($content, array $metadata = null)
             }
         }
 
-        if (\function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN)) {
+        if (\function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN)) {
             @opcache_invalidate($this->file, true);
         }
     }
diff --git a/vendor/symfony/config/Util/Exception/InvalidXmlException.php b/vendor/symfony/config/Util/Exception/InvalidXmlException.php
index a335bbd2eed7c2afcc3f85e75f35eb46c43392cb..155571cecb969d5c4e1e817e441dd627a7960a6e 100644
--- a/vendor/symfony/config/Util/Exception/InvalidXmlException.php
+++ b/vendor/symfony/config/Util/Exception/InvalidXmlException.php
@@ -1,4 +1,5 @@
 <?php
+
 /*
  * This file is part of the Symfony package.
  *
diff --git a/vendor/symfony/config/Util/XmlUtils.php b/vendor/symfony/config/Util/XmlUtils.php
index 12caa486bfc4c6687d9f04871900640a12451911..e0324149440714ba75e5cda8a062b022ccc1258e 100644
--- a/vendor/symfony/config/Util/XmlUtils.php
+++ b/vendor/symfony/config/Util/XmlUtils.php
@@ -236,15 +236,11 @@ public static function phpize($value)
             case 'null' === $lowercaseValue:
                 return null;
             case ctype_digit($value):
-                $raw = $value;
-                $cast = (int) $value;
-
-                return '0' == $value[0] ? octdec($value) : (((string) $raw === (string) $cast) ? $cast : $raw);
             case isset($value[1]) && '-' === $value[0] && ctype_digit(substr($value, 1)):
                 $raw = $value;
                 $cast = (int) $value;
 
-                return '0' == $value[1] ? octdec($value) : (((string) $raw === (string) $cast) ? $cast : $raw);
+                return self::isOctal($value) ? \intval($value, 8) : (($raw === (string) $cast) ? $cast : $raw);
             case 'true' === $lowercaseValue:
                 return true;
             case 'false' === $lowercaseValue:
@@ -281,4 +277,13 @@ protected static function getXmlErrors($internalErrors)
 
         return $errors;
     }
+
+    private static function isOctal(string $str): bool
+    {
+        if ('-' === $str[0]) {
+            $str = substr($str, 1);
+        }
+
+        return $str === '0'.decoct(\intval($str, 8));
+    }
 }
diff --git a/vendor/symfony/config/composer.json b/vendor/symfony/config/composer.json
index 13e4cd409f3ace38517e01ea479b44c561a50641..90c3f6bdf3f3259c37e280221e0dd269012a79c2 100644
--- a/vendor/symfony/config/composer.json
+++ b/vendor/symfony/config/composer.json
@@ -19,6 +19,7 @@
         "php": ">=7.1.3",
         "symfony/filesystem": "^3.4|^4.0|^5.0",
         "symfony/polyfill-ctype": "~1.8",
+        "symfony/polyfill-php80": "^1.16",
         "symfony/polyfill-php81": "^1.22"
     },
     "require-dev": {
diff --git a/vendor/symfony/filesystem/Filesystem.php b/vendor/symfony/filesystem/Filesystem.php
index f8dbb983fc52564b394c692c6c49fd5de15fa971..fd1dbf39b2e06f3be866dfd5a04e1eeddb9bbc9f 100644
--- a/vendor/symfony/filesystem/Filesystem.php
+++ b/vendor/symfony/filesystem/Filesystem.php
@@ -180,7 +180,7 @@ public function remove($files)
                 if (!self::box('rmdir', $file) && file_exists($file)) {
                     throw new IOException(sprintf('Failed to remove directory "%s": ', $file).self::$lastError);
                 }
-            } elseif (!self::box('unlink', $file) && (false !== strpos(self::$lastError, 'Permission denied') || file_exists($file))) {
+            } elseif (!self::box('unlink', $file) && (str_contains(self::$lastError, 'Permission denied') || file_exists($file))) {
                 throw new IOException(sprintf('Failed to remove file "%s": ', $file).self::$lastError);
             }
         }
@@ -318,6 +318,8 @@ private function isReadable(string $filename): bool
      */
     public function symlink($originDir, $targetDir, $copyOnWindows = false)
     {
+        self::assertFunctionExists('symlink');
+
         if ('\\' === \DIRECTORY_SEPARATOR) {
             $originDir = strtr($originDir, '/', '\\');
             $targetDir = strtr($targetDir, '/', '\\');
@@ -354,6 +356,8 @@ public function symlink($originDir, $targetDir, $copyOnWindows = false)
      */
     public function hardlink($originFile, $targetFiles)
     {
+        self::assertFunctionExists('link');
+
         if (!$this->exists($originFile)) {
             throw new FileNotFoundException(null, 0, null, $originFile);
         }
@@ -382,7 +386,7 @@ public function hardlink($originFile, $targetFiles)
     private function linkException(string $origin, string $target, string $linkType)
     {
         if (self::$lastError) {
-            if ('\\' === \DIRECTORY_SEPARATOR && false !== strpos(self::$lastError, 'error code(1314)')) {
+            if ('\\' === \DIRECTORY_SEPARATOR && str_contains(self::$lastError, 'error code(1314)')) {
                 throw new IOException(sprintf('Unable to create "%s" link due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?', $linkType), 0, null, $target);
             }
         }
@@ -678,10 +682,6 @@ public function dumpFile($filename, $content)
             $this->mkdir($dir);
         }
 
-        if (!is_writable($dir)) {
-            throw new IOException(sprintf('Unable to write to the "%s" directory.', $dir), 0, null, $dir);
-        }
-
         // Will create a temp file with 0600 access rights
         // when the filesystem supports chmod.
         $tmpFile = $this->tempnam($dir, basename($filename));
@@ -721,10 +721,6 @@ public function appendToFile($filename, $content)
             $this->mkdir($dir);
         }
 
-        if (!is_writable($dir)) {
-            throw new IOException(sprintf('Unable to write to the "%s" directory.', $dir), 0, null, $dir);
-        }
-
         if (false === @file_put_contents($filename, $content, \FILE_APPEND)) {
             throw new IOException(sprintf('Failed to write file "%s".', $filename), 0, null, $filename);
         }
@@ -732,7 +728,7 @@ public function appendToFile($filename, $content)
 
     private function toIterable($files): iterable
     {
-        return \is_array($files) || $files instanceof \Traversable ? $files : [$files];
+        return is_iterable($files) ? $files : [$files];
     }
 
     /**
@@ -745,13 +741,22 @@ private function getSchemeAndHierarchy(string $filename): array
         return 2 === \count($components) ? [$components[0], $components[1]] : [null, $components[0]];
     }
 
+    private static function assertFunctionExists(string $func): void
+    {
+        if (!\function_exists($func)) {
+            throw new IOException(sprintf('Unable to perform filesystem operation because the "%s()" function has been disabled.', $func));
+        }
+    }
+
     /**
      * @param mixed ...$args
      *
      * @return mixed
      */
-    private static function box(callable $func, ...$args)
+    private static function box(string $func, ...$args)
     {
+        self::assertFunctionExists($func);
+
         self::$lastError = null;
         set_error_handler(__CLASS__.'::handleError');
         try {
@@ -769,7 +774,7 @@ private static function box(callable $func, ...$args)
     /**
      * @internal
      */
-    public static function handleError($type, $msg)
+    public static function handleError(int $type, string $msg)
     {
         self::$lastError = $msg;
     }
diff --git a/vendor/symfony/filesystem/LICENSE b/vendor/symfony/filesystem/LICENSE
index 9ff2d0d6306da5990f3e30de9ac7d41907a63f0d..88bf75bb4d6a2898be0558b61cfe48996d33ffbf 100644
--- a/vendor/symfony/filesystem/LICENSE
+++ b/vendor/symfony/filesystem/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2021 Fabien Potencier
+Copyright (c) 2004-2022 Fabien Potencier
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/filesystem/composer.json b/vendor/symfony/filesystem/composer.json
index 9feb1013ef4536eb3c674ac6d7b425f11404e6b7..c943180d0c3b200154da68fbc7db6d7536bf885d 100644
--- a/vendor/symfony/filesystem/composer.json
+++ b/vendor/symfony/filesystem/composer.json
@@ -17,7 +17,8 @@
     ],
     "require": {
         "php": ">=7.1.3",
-        "symfony/polyfill-ctype": "~1.8"
+        "symfony/polyfill-ctype": "~1.8",
+        "symfony/polyfill-php80": "^1.16"
     },
     "autoload": {
         "psr-4": { "Symfony\\Component\\Filesystem\\": "" },
diff --git a/vendor/symfony/framework-bundle/CHANGELOG.md b/vendor/symfony/framework-bundle/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..7a7e049dcfd08bf46bea319bb842ee78c3310fda
--- /dev/null
+++ b/vendor/symfony/framework-bundle/CHANGELOG.md
@@ -0,0 +1,392 @@
+CHANGELOG
+=========
+
+4.4.0
+-----
+
+ * Added `lint:container` command to check that services wiring matches type declarations
+ * Added `MailerAssertionsTrait`
+ * Deprecated support for `templating` engine in `TemplateController`, use Twig instead
+ * Deprecated the `$parser` argument of `ControllerResolver::__construct()` and `DelegatingLoader::__construct()`
+ * Deprecated the `controller_name_converter` and `resolve_controller_name_subscriber` services
+ * The `ControllerResolver` and `DelegatingLoader` classes have been marked as `final`
+ * Added support for configuring chained cache pools
+ * Deprecated calling `WebTestCase::createClient()` while a kernel has been booted, ensure the kernel is shut down before calling the method
+ * Deprecated `routing.loader.service`, use `routing.loader.container` instead.
+ * Not tagging service route loaders with `routing.route_loader` has been deprecated.
+ * Overriding the methods `KernelTestCase::tearDown()` and `WebTestCase::tearDown()` without the `void` return-type is deprecated.
+ * Added new `error_controller` configuration to handle system exceptions
+ * Added sort option for `translation:update` command.
+ * [BC Break] The `framework.messenger.routing.senders` config key is not deeply merged anymore.
+ * Added `secrets:*` commands to deal with secrets seamlessly.
+ * Made `framework.session.handler_id` accept a DSN
+ * Marked the `RouterDataCollector` class as `@final`.
+ * [BC Break] The `framework.messenger.buses.<name>.middleware` config key is not deeply merged anymore.
+
+4.3.0
+-----
+
+ * Deprecated the `framework.templating` option, configure the Twig bundle instead.
+ * Added `WebTestAssertionsTrait` (included by default in `WebTestCase`)
+ * Renamed `Client` to `KernelBrowser`
+ * Not passing the project directory to the constructor of the `AssetsInstallCommand` is deprecated. This argument will
+   be mandatory in 5.0.
+ * Deprecated the "Psr\SimpleCache\CacheInterface" / "cache.app.simple" service, use "Symfony\Contracts\Cache\CacheInterface" / "cache.app" instead
+ * Added the ability to specify a custom `serializer` option for each
+   transport under`framework.messenger.transports`.
+ * Added the `RegisterLocaleAwareServicesPass` and configured the `LocaleAwareListener`
+ * [BC Break] When using Messenger, the default transport changed from
+   using Symfony's serializer service to use `PhpSerializer`, which uses
+   PHP's native `serialize()` and `unserialize()` functions. To use the
+   original serialization method, set the `framework.messenger.default_serializer`
+   config option to `messenger.transport.symfony_serializer`. Or set the
+   `serializer` option under one specific `transport`.
+ * [BC Break] The `framework.messenger.serializer` config key changed to
+   `framework.messenger.default_serializer`, which holds the string service
+   id and `framework.messenger.symfony_serializer`, which configures the
+   options if you're using Symfony's serializer.
+ * [BC Break] Removed the `framework.messenger.routing.send_and_handle` configuration.
+   Instead of setting it to true, configure a `SyncTransport` and route messages to it.
+ * Added information about deprecated aliases in `debug:autowiring` 
+ * Added php ini session options `sid_length` and `sid_bits_per_character` 
+   to the `session` section of the configuration
+ * Added support for Translator paths, Twig paths in translation commands.
+ * Added support for PHP files with translations in translation commands.
+ * Added support for boolean container parameters within routes.
+ * Added the `messenger:setup-transports` command to setup messenger transports
+ * Added a `InMemoryTransport` to Messenger. Use it with a DSN starting with `in-memory://`.
+ * Added `framework.property_access.throw_exception_on_invalid_property_path` config option.
+ * Added `cache:pool:list` command to list all available cache pools.
+
+4.2.0
+-----
+
+ * Added a `AbstractController::addLink()` method to add Link headers to the current response
+ * Allowed configuring taggable cache pools via a new `framework.cache.pools.tags` option (bool|service-id)
+ * Allowed configuring PDO-based cache pools via a new `cache.adapter.pdo` abstract service
+ * Deprecated auto-injection of the container in AbstractController instances, register them as service subscribers instead
+ * Deprecated processing of services tagged `security.expression_language_provider` in favor of a new `AddExpressionLanguageProvidersPass` in SecurityBundle.
+ * Deprecated the `Symfony\Bundle\FrameworkBundle\Controller\Controller` class in favor of `Symfony\Bundle\FrameworkBundle\Controller\AbstractController`.
+ * Enabled autoconfiguration for `Psr\Log\LoggerAwareInterface`
+ * Added new "auto" mode for `framework.session.cookie_secure` to turn it on when HTTPS is used
+ * Removed the `framework.messenger.encoder` and `framework.messenger.decoder` options. Use the `framework.messenger.serializer.id` option to replace the Messenger serializer.
+ * Deprecated the `ContainerAwareCommand` class in favor of `Symfony\Component\Console\Command\Command`
+ * Made `debug:container` and `debug:autowiring` ignore backslashes in service ids
+ * Deprecated the `Templating\Helper\TranslatorHelper::transChoice()` method, use the `trans()` one instead with a `%count%` parameter
+ * Deprecated `CacheCollectorPass`. Use `Symfony\Component\Cache\DependencyInjection\CacheCollectorPass` instead.
+ * Deprecated `CachePoolClearerPass`. Use `Symfony\Component\Cache\DependencyInjection\CachePoolClearerPass` instead.
+ * Deprecated `CachePoolPass`. Use `Symfony\Component\Cache\DependencyInjection\CachePoolPass` instead.
+ * Deprecated `CachePoolPrunerPass`. Use `Symfony\Component\Cache\DependencyInjection\CachePoolPrunerPass` instead.
+ * Deprecated support for legacy translations directories `src/Resources/translations/` and `src/Resources/<BundleName>/translations/`, use `translations/` instead.
+ * Deprecated support for the legacy directory structure in `translation:update` and `debug:translation` commands.
+
+4.1.0
+-----
+
+ * Allowed to pass an optional `LoggerInterface $logger` instance to the `Router`
+ * Added a new `parameter_bag` service with related autowiring aliases to access parameters as-a-service
+ * Allowed the `Router` to work with any PSR-11 container
+ * Added option in workflow dump command to label graph with a custom label
+ * Using a `RouterInterface` that does not implement the `WarmableInterface` is deprecated.
+ * Warming up a router in `RouterCacheWarmer` that does not implement the `WarmableInterface` is deprecated and will not
+   be supported anymore in 5.0.
+ * The `RequestDataCollector` class has been deprecated. Use the `Symfony\Component\HttpKernel\DataCollector\RequestDataCollector` class instead.
+ * The `RedirectController` class allows for 307/308 HTTP status codes
+ * Deprecated `bundle:controller:action` syntax to reference controllers. Use `serviceOrFqcn::method` instead where `serviceOrFqcn`
+   is either the service ID or the FQCN of the controller.
+ * Deprecated `Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser`
+ * The `container.service_locator` tag of `ServiceLocator`s is now autoconfigured.
+ * Add the ability to search a route in `debug:router`.
+ * Add the ability to use SameSite cookies for sessions.
+
+4.0.0
+-----
+
+ * The default `type` option of the `framework.workflows.*` configuration entries is `state_machine`
+ * removed `AddConsoleCommandPass`, `AddConstraintValidatorsPass`,
+   `AddValidatorInitializersPass`, `CompilerDebugDumpPass`,  `ConfigCachePass`,
+   `ControllerArgumentValueResolverPass`, `FormPass`, `PropertyInfoPass`,
+   `RoutingResolverPass`, `SerializerPass`, `ValidateWorkflowsPass`
+ * made  `Translator::__construct()` `$defaultLocale` argument required
+ * removed `SessionListener`, `TestSessionListener`
+ * Removed `cache:clear` warmup part along with the `--no-optional-warmers` option
+ * Removed core form types services registration when unnecessary
+ * Removed `framework.serializer.cache` option and `serializer.mapping.cache.apc`, `serializer.mapping.cache.doctrine.apc` services
+ * Removed `ConstraintValidatorFactory`
+ * Removed class parameters related to routing
+ * Removed absolute template paths support in the template name parser
+ * Removed support of the `KERNEL_DIR` environment variable with `KernelTestCase::getKernelClass()`.
+ * Removed the `KernelTestCase::getPhpUnitXmlDir()` and `KernelTestCase::getPhpUnitCliConfigArgument()` methods.
+ * Removed the "framework.validation.cache" configuration option. Configure the "cache.validator" service under "framework.cache.pools" instead.
+ * Removed `PhpStringTokenParser`, use `Symfony\Component\Translation\Extractor\PhpStringTokenParser` instead.
+ * Removed `PhpExtractor`, use `Symfony\Component\Translation\Extractor\PhpExtractor` instead.
+ * Removed the `use_strict_mode` session option, it's is now enabled by default
+
+3.4.0
+-----
+
+ * Added `translator.default_path` option and parameter
+ * Session `use_strict_mode` is now enabled by default and the corresponding option has been deprecated
+ * Made the `cache:clear` command to *not* clear "app" PSR-6 cache pools anymore,
+   but to still clear "system" ones; use the `cache:pool:clear` command to clear "app" pools instead
+ * Always register a minimalist logger that writes in `stderr`
+ * Deprecated `profiler.matcher` option
+ * Added support for `EventSubscriberInterface` on `MicroKernelTrait`
+ * Removed `doctrine/cache` from the list of required dependencies in `composer.json`
+ * Deprecated `validator.mapping.cache.doctrine.apc` service
+ * The `symfony/stopwatch` dependency has been removed, require it via `composer
+   require symfony/stopwatch` in your `dev` environment.
+ * Deprecated using the `KERNEL_DIR` environment variable with `KernelTestCase::getKernelClass()`.
+ * Deprecated the `KernelTestCase::getPhpUnitXmlDir()` and `KernelTestCase::getPhpUnitCliConfigArgument()` methods.
+ * Deprecated `AddCacheClearerPass`, use tagged iterator arguments instead.
+ * Deprecated `AddCacheWarmerPass`, use tagged iterator arguments instead.
+ * Deprecated `TranslationDumperPass`, use
+   `Symfony\Component\Translation\DependencyInjection\TranslationDumperPass` instead
+ * Deprecated `TranslationExtractorPass`, use
+   `Symfony\Component\Translation\DependencyInjection\TranslationExtractorPass` instead
+ * Deprecated `TranslatorPass`, use
+   `Symfony\Component\Translation\DependencyInjection\TranslatorPass` instead
+ * Added `command` attribute to the `console.command` tag which takes the command
+   name as value, using it makes the command lazy
+ * Added `cache:pool:prune` command to allow manual stale cache item pruning of supported PSR-6 and PSR-16 cache pool
+   implementations
+ * Deprecated `Symfony\Bundle\FrameworkBundle\Translation\TranslationLoader`, use
+   `Symfony\Component\Translation\Reader\TranslationReader` instead
+ * Deprecated `translation.loader` service, use `translation.reader` instead
+ * `AssetsInstallCommand::__construct()` now takes an instance of
+   `Symfony\Component\Filesystem\Filesystem` as first argument
+ * `CacheClearCommand::__construct()` now takes an instance of
+   `Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface` as
+    first argument
+ * `CachePoolClearCommand::__construct()` now takes an instance of
+   `Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer` as
+    first argument
+ * `EventDispatcherDebugCommand::__construct()` now takes an instance of
+   `Symfony\Component\EventDispatcher\EventDispatcherInterface` as
+    first argument
+ * `RouterDebugCommand::__construct()` now takes an instance of
+   `Symfony\Component\Routing\RouterInterface` as
+    first argument
+ * `RouterMatchCommand::__construct()` now takes an instance of
+   `Symfony\Component\Routing\RouterInterface` as
+    first argument
+ * `TranslationDebugCommand::__construct()` now takes an instance of
+   `Symfony\Component\Translation\TranslatorInterface` as
+    first argument
+ * `TranslationUpdateCommand::__construct()` now takes an instance of
+   `Symfony\Component\Translation\TranslatorInterface` as
+    first argument
+ * `AssetsInstallCommand`, `CacheClearCommand`, `CachePoolClearCommand`,
+   `EventDispatcherDebugCommand`, `RouterDebugCommand`, `RouterMatchCommand`,
+   `TranslationDebugCommand`, `TranslationUpdateCommand`, `XliffLintCommand`
+    and `YamlLintCommand` classes have been marked as final
+ * Added `asset.request_context.base_path` and `asset.request_context.secure` parameters
+   to provide a default request context in case the stack is empty (similar to `router.request_context.*` parameters)
+ * Display environment variables managed by `Dotenv` in `AboutCommand`
+
+3.3.0
+-----
+
+ * Not defining the `type` option of the `framework.workflows.*` configuration entries is deprecated.
+   The default value will be `state_machine` in Symfony 4.0.
+ * Deprecated the `CompilerDebugDumpPass` class
+ * Deprecated the "framework.trusted_proxies" configuration option and the corresponding "kernel.trusted_proxies" parameter
+ * Added a new version strategy option called "json_manifest_path"
+   that allows you to use the `JsonManifestVersionStrategy`.
+ * Added `Symfony\Bundle\FrameworkBundle\Controller\AbstractController`. It provides
+   the same helpers as the `Controller` class, but does not allow accessing the dependency
+   injection container, in order to encourage explicit dependency declarations.
+ * Added support for the `controller.service_arguments` tag, for injecting services into controllers' actions
+ * Changed default configuration for
+   assets/forms/validation/translation/serialization/csrf from `canBeEnabled()` to
+   `canBeDisabled()` when Flex is used
+ * The server:* commands and their associated router files were moved to WebServerBundle
+ * Translation related services are not loaded anymore when the `framework.translator` option
+   is disabled.
+ * Added `GlobalVariables::getToken()`
+ * Deprecated `Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConsoleCommandPass`. Use `Symfony\Component\Console\DependencyInjection\AddConsoleCommandPass` instead.
+ * Added configurable paths for validation files
+ * Deprecated `SerializerPass`, use `Symfony\Component\Serializer\DependencyInjection\SerializerPass` instead
+ * Deprecated `FormPass`, use `Symfony\Component\Form\DependencyInjection\FormPass` instead
+ * Deprecated `SessionListener`
+ * Deprecated `TestSessionListener`
+ * Deprecated `Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ConfigCachePass`.
+   Use tagged iterator arguments instead.
+ * Deprecated `PropertyInfoPass`, use `Symfony\Component\PropertyInfo\DependencyInjection\PropertyInfoPass` instead
+ * Deprecated `ControllerArgumentValueResolverPass`. Use
+   `Symfony\Component\HttpKernel\DependencyInjection\ControllerArgumentValueResolverPass` instead
+ * Deprecated `RoutingResolverPass`, use `Symfony\Component\Routing\DependencyInjection\RoutingResolverPass` instead
+ * [BC BREAK] The `server:run`, `server:start`, `server:stop` and
+   `server:status` console commands have been moved to a dedicated bundle.
+   Require `symfony/web-server-bundle` in your composer.json and register
+   `Symfony\Bundle\WebServerBundle\WebServerBundle` in your AppKernel to use them.
+ * Added `$defaultLocale` as 3rd argument of `Translator::__construct()`
+   making `Translator` works with any PSR-11 container
+ * Added `framework.serializer.mapping` config option allowing to define custom
+   serialization mapping files and directories
+ * Deprecated `AddValidatorInitializersPass`, use
+   `Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass` instead
+ * Deprecated `AddConstraintValidatorsPass`, use
+   `Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass` instead
+ * Deprecated `ValidateWorkflowsPass`, use
+   `Symfony\Component\Workflow\DependencyInjection\ValidateWorkflowsPass` instead
+ * Deprecated `ConstraintValidatorFactory`, use
+   `Symfony\Component\Validator\ContainerConstraintValidatorFactory` instead.
+ * Deprecated `PhpStringTokenParser`, use
+   `Symfony\Component\Translation\Extractor\PhpStringTokenParser` instead.
+ * Deprecated `PhpExtractor`, use
+   `Symfony\Component\Translation\Extractor\PhpExtractor` instead.
+
+3.2.0
+-----
+
+ * Removed `doctrine/annotations` from the list of required dependencies in `composer.json`
+ * Removed `symfony/security-core` and `symfony/security-csrf` from the list of required dependencies in `composer.json`
+ * Removed `symfony/templating` from the list of required dependencies in `composer.json`
+ * Removed `symfony/translation` from the list of required dependencies in `composer.json`
+ * Removed `symfony/asset` from the list of required dependencies in `composer.json`
+ * The `Resources/public/images/*` files have been removed.
+ * The `Resources/public/css/*.css` files have been removed (they are now inlined in TwigBundle).
+ * Added possibility to prioritize form type extensions with `'priority'` attribute on tags `form.type_extension`
+
+3.1.0
+-----
+
+ * Added `Controller::json` to simplify creating JSON responses when using the Serializer component
+ * Deprecated absolute template paths support in the template name parser
+ * Deprecated using core form types without dependencies as services
+ * Added `Symfony\Component\HttpHernel\DataCollector\RequestDataCollector::onKernelResponse()`
+ * Added `Symfony\Bundle\FrameworkBundle\DataCollector\RequestDataCollector`
+ * The `framework.serializer.cache` option and the service `serializer.mapping.cache.apc` have been
+   deprecated. APCu should now be automatically used when available.
+
+3.0.0
+-----
+
+ * removed `validator.api` parameter
+ * removed `alias` option of the `form.type` tag
+
+2.8.0
+-----
+
+ * Deprecated the `alias` option of the `form.type_extension` tag in favor of the
+   `extended_type`/`extended-type` option
+ * Deprecated the `alias` option of the `form.type` tag
+ * Deprecated the Shell
+
+2.7.0
+-----
+
+ * Added possibility to extract translation messages from a file or files besides extracting from a directory
+ * Added `TranslationsCacheWarmer` to create catalogues at warmup
+
+2.6.0
+-----
+
+ * Added helper commands (`server:start`, `server:stop` and `server:status`) to control the built-in web
+   server in the background
+ * Added `Controller::isCsrfTokenValid` helper
+ * Added configuration for the PropertyAccess component
+ * Added `Controller::redirectToRoute` helper
+ * Added `Controller::addFlash` helper
+ * Added `Controller::isGranted` helper
+ * Added `Controller::denyAccessUnlessGranted` helper
+ * Deprecated `app.security` in twig as `app.user` and `is_granted()` are already available
+
+2.5.0
+-----
+
+ * Added `translation:debug` command
+ * Added `--no-backup` option to `translation:update` command
+ * Added `config:debug` command
+ * Added `yaml:lint` command
+ * Deprecated the `RouterApacheDumperCommand` which will be removed in Symfony 3.0.
+
+2.4.0
+-----
+
+ * allowed multiple IP addresses in profiler matcher settings
+ * added stopwatch helper to time templates with the WebProfilerBundle
+ * added service definition for "security.secure_random" service
+ * added service definitions for the new Security CSRF sub-component
+
+2.3.0
+-----
+
+ * [BC BREAK] added a way to disable the profiler (when disabling the profiler, it is now completely removed)
+   To get the same "disabled" behavior as before, set `enabled` to `true` and `collect` to `false`
+ * [BC BREAK] the `Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\RegisterKernelListenersPass` was moved
+   to `Component\HttpKernel\DependencyInjection\RegisterListenersPass`
+ * added ControllerNameParser::build() which converts a controller short notation (a:b:c) to a class::method notation
+ * added possibility to run PHP built-in server in production environment
+ * added possibility to load the serializer component in the service container
+ * added route debug information when using the `router:match` command
+ * added `TimedPhpEngine`
+ * added `--clean` option to the `translation:update` command
+ * added `http_method_override` option
+ * added support for default templates per render tag
+ * added FormHelper::form(), FormHelper::start() and FormHelper::end()
+ * deprecated FormHelper::enctype() in favor of FormHelper::start()
+ * RedirectController actions now receive the Request instance via the method signature.
+
+2.2.0
+-----
+
+ * added a new `uri_signer` service to help sign URIs
+ * deprecated `Symfony\Bundle\FrameworkBundle\HttpKernel::render()` and `Symfony\Bundle\FrameworkBundle\HttpKernel::forward()`
+ * deprecated the `Symfony\Bundle\FrameworkBundle\HttpKernel` class in favor of `Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel`
+ * added support for adding new HTTP content rendering strategies (like ESI and Hinclude)
+   in the DIC via the `kernel.fragment_renderer` tag
+ * [BC BREAK] restricted the `Symfony\Bundle\FrameworkBundle\HttpKernel::render()` method to only accept URIs or ControllerReference instances
+   * `Symfony\Bundle\FrameworkBundle\HttpKernel::render()` method signature changed and the first argument
+     must now be a URI or a ControllerReference instance (the `generateInternalUri()` method was removed)
+   * The internal routes (`Resources/config/routing/internal.xml`) have been removed and replaced with a listener (`Symfony\Component\HttpKernel\EventListener\FragmentListener`)
+   * The `render` method of the `actions` templating helper signature and arguments changed
+ * replaced Symfony\Bundle\FrameworkBundle\Controller\TraceableControllerResolver by Symfony\Component\HttpKernel\Controller\TraceableControllerResolver
+ * replaced Symfony\Component\HttpKernel\Debug\ContainerAwareTraceableEventDispatcher by Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher
+ * added Client::enableProfiler()
+ * a new parameter has been added to the DIC: `router.request_context.base_url`
+   You can customize it for your functional tests or for generating URLs with
+   the right base URL when your are in the CLI context.
+ * added support for default templates per render tag
+
+2.1.0
+-----
+
+ * moved the translation files to the Form and Validator components
+ * changed the default extension for XLIFF files from .xliff to .xlf
+ * moved Symfony\Bundle\FrameworkBundle\ContainerAwareEventDispatcher to Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher
+ * moved Symfony\Bundle\FrameworkBundle\Debug\TraceableEventDispatcher to Symfony\Component\EventDispatcher\ContainerAwareTraceableEventDispatcher
+ * added a router:match command
+ * added a config:dump-reference command
+ * added a server:run command
+ * added kernel.event_subscriber tag
+ * added a way to create relative symlinks when running assets:install command (--relative option)
+ * added Controller::getUser()
+ * [BC BREAK] assets_base_urls and base_urls merging strategy has changed
+ * changed the default profiler storage to use the filesystem instead of SQLite
+ * added support for placeholders in route defaults and requirements (replaced
+   by the value set in the service container)
+ * added Filesystem component as a dependency
+ * added support for hinclude (use ``standalone: 'js'`` in render tag)
+ * session options: lifetime, path, domain, secure, httponly were deprecated.
+   Prefixed versions should now be used instead: cookie_lifetime, cookie_path,
+   cookie_domain, cookie_secure, cookie_httponly
+ * [BC BREAK] following session options: 'lifetime', 'path', 'domain', 'secure',
+   'httponly' are now prefixed with cookie_ when dumped to the container
+ * Added `handler_id` configuration under `session` key to represent `session.handler`
+   service, defaults to `session.handler.native_file`.
+ * Added `gc_maxlifetime`, `gc_probability`, and `gc_divisor` to session
+   configuration. This means session garbage collection has a
+  `gc_probability`/`gc_divisor` chance of being run. The `gc_maxlifetime` defines
+   how long a session can idle for. It is different from cookie lifetime which
+   declares how long a cookie can be stored on the remote client.
+ * Removed 'auto_start' configuration parameter from session config. The session will
+   start on demand.
+ * [BC BREAK] TemplateNameParser::parseFromFilename() has been moved to a dedicated
+   parser: TemplateFilenameParser::parse().
+ * [BC BREAK] Kernel parameters are replaced by their value wherever they appear
+   in Route patterns, requirements and defaults. Use '%%' as the escaped value for '%'.
+ * [BC BREAK] Switched behavior of flash messages to expire flash messages on retrieval
+   using Symfony\Component\HttpFoundation\Session\Flash\FlashBag as opposed to on
+   next pageload regardless of whether they are displayed or not.
diff --git a/vendor/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php b/vendor/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1b94bdfcdf9166ef7f0ad069e4f922369003117
--- /dev/null
+++ b/vendor/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php
@@ -0,0 +1,86 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\Adapter\NullAdapter;
+use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
+use Symfony\Component\Config\Resource\ClassExistenceResource;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
+
+abstract class AbstractPhpFileCacheWarmer implements CacheWarmerInterface
+{
+    private $phpArrayFile;
+
+    /**
+     * @param string $phpArrayFile The PHP file where metadata are cached
+     */
+    public function __construct(string $phpArrayFile)
+    {
+        $this->phpArrayFile = $phpArrayFile;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isOptional()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function warmUp($cacheDir)
+    {
+        $arrayAdapter = new ArrayAdapter();
+
+        spl_autoload_register([ClassExistenceResource::class, 'throwOnRequiredClass']);
+        try {
+            if (!$this->doWarmUp($cacheDir, $arrayAdapter)) {
+                return;
+            }
+        } finally {
+            spl_autoload_unregister([ClassExistenceResource::class, 'throwOnRequiredClass']);
+        }
+
+        // the ArrayAdapter stores the values serialized
+        // to avoid mutation of the data after it was written to the cache
+        // so here we un-serialize the values first
+        $values = array_map(function ($val) { return null !== $val ? unserialize($val) : null; }, $arrayAdapter->getValues());
+
+        $this->warmUpPhpArrayAdapter(new PhpArrayAdapter($this->phpArrayFile, new NullAdapter()), $values);
+    }
+
+    protected function warmUpPhpArrayAdapter(PhpArrayAdapter $phpArrayAdapter, array $values)
+    {
+        $phpArrayAdapter->warmUp($values);
+    }
+
+    /**
+     * @internal
+     */
+    final protected function ignoreAutoloadException(string $class, \Exception $exception): void
+    {
+        try {
+            ClassExistenceResource::throwOnRequiredClass($class, $exception);
+        } catch (\ReflectionException $e) {
+        }
+    }
+
+    /**
+     * @param string $cacheDir
+     *
+     * @return bool false if there is nothing to warm-up
+     */
+    abstract protected function doWarmUp($cacheDir, ArrayAdapter $arrayAdapter);
+}
diff --git a/vendor/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php b/vendor/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php
new file mode 100644
index 0000000000000000000000000000000000000000..8ed3f618f902a31d77f03750eb3ff7f2bc309fe3
--- /dev/null
+++ b/vendor/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+use Doctrine\Common\Annotations\AnnotationException;
+use Doctrine\Common\Annotations\CachedReader;
+use Doctrine\Common\Annotations\PsrCachedReader;
+use Doctrine\Common\Annotations\Reader;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
+use Symfony\Component\Cache\DoctrineProvider;
+
+/**
+ * Warms up annotation caches for classes found in composer's autoload class map
+ * and declared in DI bundle extensions using the addAnnotatedClassesToCache method.
+ *
+ * @author Titouan Galopin <galopintitouan@gmail.com>
+ */
+class AnnotationsCacheWarmer extends AbstractPhpFileCacheWarmer
+{
+    private $annotationReader;
+    private $excludeRegexp;
+    private $debug;
+
+    /**
+     * @param string $phpArrayFile  The PHP file where annotations are cached
+     * @param string $excludeRegexp
+     * @param bool   $debug
+     */
+    public function __construct(Reader $annotationReader, string $phpArrayFile, $excludeRegexp = null, $debug = false)
+    {
+        if ($excludeRegexp instanceof CacheItemPoolInterface) {
+            @trigger_error(sprintf('The CacheItemPoolInterface $fallbackPool argument of "%s()" is deprecated since Symfony 4.2, you should not pass it anymore.', __METHOD__), \E_USER_DEPRECATED);
+            $excludeRegexp = $debug;
+            $debug = 4 < \func_num_args() && func_get_arg(4);
+        }
+        parent::__construct($phpArrayFile);
+        $this->annotationReader = $annotationReader;
+        $this->excludeRegexp = $excludeRegexp;
+        $this->debug = $debug;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doWarmUp($cacheDir, ArrayAdapter $arrayAdapter)
+    {
+        $annotatedClassPatterns = $cacheDir.'/annotations.map';
+
+        if (!is_file($annotatedClassPatterns)) {
+            return true;
+        }
+
+        $annotatedClasses = include $annotatedClassPatterns;
+        $reader = class_exists(PsrCachedReader::class)
+            ? new PsrCachedReader($this->annotationReader, $arrayAdapter, $this->debug)
+            : new CachedReader($this->annotationReader, new DoctrineProvider($arrayAdapter), $this->debug)
+        ;
+
+        foreach ($annotatedClasses as $class) {
+            if (null !== $this->excludeRegexp && preg_match($this->excludeRegexp, $class)) {
+                continue;
+            }
+            try {
+                $this->readAllComponents($reader, $class);
+            } catch (\Exception $e) {
+                $this->ignoreAutoloadException($class, $e);
+            }
+        }
+
+        return true;
+    }
+
+    protected function warmUpPhpArrayAdapter(PhpArrayAdapter $phpArrayAdapter, array $values)
+    {
+        // make sure we don't cache null values
+        $values = array_filter($values, function ($val) { return null !== $val; });
+
+        parent::warmUpPhpArrayAdapter($phpArrayAdapter, $values);
+    }
+
+    private function readAllComponents(Reader $reader, string $class)
+    {
+        $reflectionClass = new \ReflectionClass($class);
+
+        try {
+            $reader->getClassAnnotations($reflectionClass);
+        } catch (AnnotationException $e) {
+            /*
+             * Ignore any AnnotationException to not break the cache warming process if an Annotation is badly
+             * configured or could not be found / read / etc.
+             *
+             * In particular cases, an Annotation in your code can be used and defined only for a specific
+             * environment but is always added to the annotations.map file by some Symfony default behaviors,
+             * and you always end up with a not found Annotation.
+             */
+        }
+
+        foreach ($reflectionClass->getMethods() as $reflectionMethod) {
+            try {
+                $reader->getMethodAnnotations($reflectionMethod);
+            } catch (AnnotationException $e) {
+            }
+        }
+
+        foreach ($reflectionClass->getProperties() as $reflectionProperty) {
+            try {
+                $reader->getPropertyAnnotations($reflectionProperty);
+            } catch (AnnotationException $e) {
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php b/vendor/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php
new file mode 100644
index 0000000000000000000000000000000000000000..61d9f21a5aaf538197b2d1e2a98857e3d5684dea
--- /dev/null
+++ b/vendor/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+use Psr\Container\ContainerInterface;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\CompatibilityServiceSubscriberInterface as ServiceSubscriberInterface;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
+use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
+use Symfony\Component\Routing\RouterInterface;
+
+/**
+ * Generates the router matcher and generator classes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @final
+ */
+class RouterCacheWarmer implements CacheWarmerInterface, ServiceSubscriberInterface
+{
+    private $container;
+
+    public function __construct(ContainerInterface $container)
+    {
+        // As this cache warmer is optional, dependencies should be lazy-loaded, that's why a container should be injected.
+        $this->container = $container;
+    }
+
+    /**
+     * Warms up the cache.
+     *
+     * @param string $cacheDir The cache directory
+     */
+    public function warmUp($cacheDir)
+    {
+        $router = $this->container->get('router');
+
+        if ($router instanceof WarmableInterface) {
+            $router->warmUp($cacheDir);
+
+            return;
+        }
+
+        @trigger_error(sprintf('Passing a %s without implementing %s is deprecated since Symfony 4.1.', RouterInterface::class, WarmableInterface::class), \E_USER_DEPRECATED);
+    }
+
+    /**
+     * Checks whether this warmer is optional or not.
+     *
+     * @return bool always true
+     */
+    public function isOptional(): bool
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedServices(): array
+    {
+        return [
+            'router' => RouterInterface::class,
+        ];
+    }
+}
diff --git a/vendor/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php b/vendor/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php
new file mode 100644
index 0000000000000000000000000000000000000000..c73203927db8395dca9ba20719743a6c31a09122
--- /dev/null
+++ b/vendor/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php
@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+use Doctrine\Common\Annotations\AnnotationException;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Serializer\Mapping\Factory\CacheClassMetadataFactory;
+use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
+use Symfony\Component\Serializer\Mapping\Loader\LoaderChain;
+use Symfony\Component\Serializer\Mapping\Loader\LoaderInterface;
+use Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader;
+use Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader;
+
+/**
+ * Warms up XML and YAML serializer metadata.
+ *
+ * @author Titouan Galopin <galopintitouan@gmail.com>
+ */
+class SerializerCacheWarmer extends AbstractPhpFileCacheWarmer
+{
+    private $loaders;
+
+    /**
+     * @param LoaderInterface[] $loaders      The serializer metadata loaders
+     * @param string            $phpArrayFile The PHP file where metadata are cached
+     */
+    public function __construct(array $loaders, string $phpArrayFile)
+    {
+        if (2 < \func_num_args() && func_get_arg(2) instanceof CacheItemPoolInterface) {
+            @trigger_error(sprintf('The CacheItemPoolInterface $fallbackPool argument of "%s()" is deprecated since Symfony 4.2, you should not pass it anymore.', __METHOD__), \E_USER_DEPRECATED);
+        }
+        parent::__construct($phpArrayFile);
+        $this->loaders = $loaders;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doWarmUp($cacheDir, ArrayAdapter $arrayAdapter)
+    {
+        if (!class_exists(CacheClassMetadataFactory::class) || !method_exists(XmlFileLoader::class, 'getMappedClasses') || !method_exists(YamlFileLoader::class, 'getMappedClasses')) {
+            return false;
+        }
+
+        $metadataFactory = new CacheClassMetadataFactory(new ClassMetadataFactory(new LoaderChain($this->loaders)), $arrayAdapter);
+
+        foreach ($this->extractSupportedLoaders($this->loaders) as $loader) {
+            foreach ($loader->getMappedClasses() as $mappedClass) {
+                try {
+                    $metadataFactory->getMetadataFor($mappedClass);
+                } catch (AnnotationException $e) {
+                    // ignore failing annotations
+                } catch (\Exception $e) {
+                    $this->ignoreAutoloadException($mappedClass, $e);
+                }
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * @param LoaderInterface[] $loaders
+     *
+     * @return XmlFileLoader[]|YamlFileLoader[]
+     */
+    private function extractSupportedLoaders(array $loaders): array
+    {
+        $supportedLoaders = [];
+
+        foreach ($loaders as $loader) {
+            if ($loader instanceof XmlFileLoader || $loader instanceof YamlFileLoader) {
+                $supportedLoaders[] = $loader;
+            } elseif ($loader instanceof LoaderChain) {
+                $supportedLoaders = array_merge($supportedLoaders, $this->extractSupportedLoaders($loader->getLoaders()));
+            }
+        }
+
+        return $supportedLoaders;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/CacheWarmer/TemplateFinder.php b/vendor/symfony/framework-bundle/CacheWarmer/TemplateFinder.php
new file mode 100644
index 0000000000000000000000000000000000000000..80099b44ae58aff9fa730712754ca25066a3f4bc
--- /dev/null
+++ b/vendor/symfony/framework-bundle/CacheWarmer/TemplateFinder.php
@@ -0,0 +1,111 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+@trigger_error('The '.TemplateFinder::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\HttpKernel\Bundle\BundleInterface;
+use Symfony\Component\HttpKernel\KernelInterface;
+use Symfony\Component\Templating\TemplateNameParserInterface;
+use Symfony\Component\Templating\TemplateReferenceInterface;
+
+/**
+ * Finds all the templates.
+ *
+ * @author Victor Berchet <victor@suumit.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class TemplateFinder implements TemplateFinderInterface
+{
+    private $kernel;
+    private $parser;
+    private $rootDir;
+    private $templates;
+
+    /**
+     * @param string $rootDir The directory where global templates can be stored
+     */
+    public function __construct(KernelInterface $kernel, TemplateNameParserInterface $parser, string $rootDir)
+    {
+        $this->kernel = $kernel;
+        $this->parser = $parser;
+        $this->rootDir = $rootDir;
+    }
+
+    /**
+     * Find all the templates in the bundle and in the kernel Resources folder.
+     *
+     * @return TemplateReferenceInterface[]
+     */
+    public function findAllTemplates()
+    {
+        if (null !== $this->templates) {
+            return $this->templates;
+        }
+
+        $templates = [];
+
+        foreach ($this->kernel->getBundles() as $bundle) {
+            $templates = array_merge($templates, $this->findTemplatesInBundle($bundle));
+        }
+
+        $templates = array_merge($templates, $this->findTemplatesInFolder($this->rootDir.'/views'));
+
+        return $this->templates = $templates;
+    }
+
+    /**
+     * Find templates in the given directory.
+     *
+     * @return TemplateReferenceInterface[]
+     */
+    private function findTemplatesInFolder(string $dir): array
+    {
+        $templates = [];
+
+        if (is_dir($dir)) {
+            $finder = new Finder();
+            foreach ($finder->files()->followLinks()->in($dir) as $file) {
+                $template = $this->parser->parse($file->getRelativePathname());
+                if (false !== $template) {
+                    $templates[] = $template;
+                }
+            }
+        }
+
+        return $templates;
+    }
+
+    /**
+     * Find templates in the given bundle.
+     *
+     * @param BundleInterface $bundle The bundle where to look for templates
+     *
+     * @return TemplateReferenceInterface[]
+     */
+    private function findTemplatesInBundle(BundleInterface $bundle): array
+    {
+        $name = $bundle->getName();
+        $templates = array_unique(array_merge(
+            $this->findTemplatesInFolder($bundle->getPath().'/Resources/views'),
+            $this->findTemplatesInFolder($this->rootDir.'/'.$name.'/views')
+        ));
+
+        foreach ($templates as $i => $template) {
+            $templates[$i] = $template->set('bundle', $name);
+        }
+
+        return $templates;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/CacheWarmer/TemplateFinderInterface.php b/vendor/symfony/framework-bundle/CacheWarmer/TemplateFinderInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..51dc25942d3ae9653a48fb60645fcc2f955bc550
--- /dev/null
+++ b/vendor/symfony/framework-bundle/CacheWarmer/TemplateFinderInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+@trigger_error('The '.TemplateFinderInterface::class.' interface is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+/**
+ * Interface for finding all the templates.
+ *
+ * @author Victor Berchet <victor@suumit.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+interface TemplateFinderInterface
+{
+    /**
+     * Find all the templates.
+     *
+     * @return array An array of templates of type TemplateReferenceInterface
+     */
+    public function findAllTemplates();
+}
diff --git a/vendor/symfony/framework-bundle/CacheWarmer/TemplatePathsCacheWarmer.php b/vendor/symfony/framework-bundle/CacheWarmer/TemplatePathsCacheWarmer.php
new file mode 100644
index 0000000000000000000000000000000000000000..80deb310698353f03cfdd2faee8512a48935bba4
--- /dev/null
+++ b/vendor/symfony/framework-bundle/CacheWarmer/TemplatePathsCacheWarmer.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+@trigger_error('The '.TemplatePathsCacheWarmer::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Bundle\FrameworkBundle\Templating\Loader\TemplateLocator;
+use Symfony\Component\Filesystem\Filesystem;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer;
+
+/**
+ * Computes the association between template names and their paths on the disk.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class TemplatePathsCacheWarmer extends CacheWarmer
+{
+    protected $finder;
+    protected $locator;
+
+    public function __construct(TemplateFinderInterface $finder, TemplateLocator $locator)
+    {
+        $this->finder = $finder;
+        $this->locator = $locator;
+    }
+
+    /**
+     * Warms up the cache.
+     *
+     * @param string $cacheDir The cache directory
+     */
+    public function warmUp($cacheDir)
+    {
+        $filesystem = new Filesystem();
+        $templates = [];
+
+        foreach ($this->finder->findAllTemplates() as $template) {
+            $templates[$template->getLogicalName()] = rtrim($filesystem->makePathRelative($this->locator->locate($template), $cacheDir), '/');
+        }
+
+        $templates = str_replace("' => '", "' => __DIR__.'/", var_export($templates, true));
+
+        $this->writeCacheFile($cacheDir.'/templates.php', sprintf("<?php return %s;\n", $templates));
+    }
+
+    /**
+     * Checks whether this warmer is optional or not.
+     *
+     * @return bool always true
+     */
+    public function isOptional()
+    {
+        return true;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.php b/vendor/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.php
new file mode 100644
index 0000000000000000000000000000000000000000..c8a246bca353d96d76b9dc44bbf6f446e9d9a7ff
--- /dev/null
+++ b/vendor/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+use Psr\Container\ContainerInterface;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\CompatibilityServiceSubscriberInterface as ServiceSubscriberInterface;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
+use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
+
+/**
+ * Generates the catalogues for translations.
+ *
+ * @author Xavier Leune <xavier.leune@gmail.com>
+ */
+class TranslationsCacheWarmer implements CacheWarmerInterface, ServiceSubscriberInterface
+{
+    private $container;
+    private $translator;
+
+    public function __construct(ContainerInterface $container)
+    {
+        // As this cache warmer is optional, dependencies should be lazy-loaded, that's why a container should be injected.
+        $this->container = $container;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function warmUp($cacheDir)
+    {
+        if (null === $this->translator) {
+            $this->translator = $this->container->get('translator');
+        }
+
+        if ($this->translator instanceof WarmableInterface) {
+            $this->translator->warmUp($cacheDir);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isOptional()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedServices()
+    {
+        return [
+            'translator' => TranslatorInterface::class,
+        ];
+    }
+}
diff --git a/vendor/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php b/vendor/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php
new file mode 100644
index 0000000000000000000000000000000000000000..ec2c8df4ae5eb977a9e78f957c4068ab0b25ac52
--- /dev/null
+++ b/vendor/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+use Doctrine\Common\Annotations\AnnotationException;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
+use Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory;
+use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
+use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
+use Symfony\Component\Validator\Mapping\Loader\XmlFileLoader;
+use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader;
+use Symfony\Component\Validator\ValidatorBuilder;
+use Symfony\Component\Validator\ValidatorBuilderInterface;
+
+/**
+ * Warms up XML and YAML validator metadata.
+ *
+ * @author Titouan Galopin <galopintitouan@gmail.com>
+ */
+class ValidatorCacheWarmer extends AbstractPhpFileCacheWarmer
+{
+    private $validatorBuilder;
+
+    /**
+     * @param ValidatorBuilder $validatorBuilder
+     * @param string           $phpArrayFile     The PHP file where metadata are cached
+     */
+    public function __construct($validatorBuilder, string $phpArrayFile)
+    {
+        if (!$validatorBuilder instanceof ValidatorBuilder && !$validatorBuilder instanceof ValidatorBuilderInterface) {
+            throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be an instance of "%s", "%s" given.', __METHOD__, ValidatorBuilder::class, \is_object($validatorBuilder) ? \get_class($validatorBuilder) : \gettype($validatorBuilder)));
+        }
+        if (2 < \func_num_args() && func_get_arg(2) instanceof CacheItemPoolInterface) {
+            @trigger_error(sprintf('The CacheItemPoolInterface $fallbackPool argument of "%s()" is deprecated since Symfony 4.2, you should not pass it anymore.', __METHOD__), \E_USER_DEPRECATED);
+        }
+        parent::__construct($phpArrayFile);
+        $this->validatorBuilder = $validatorBuilder;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doWarmUp($cacheDir, ArrayAdapter $arrayAdapter)
+    {
+        if (!method_exists($this->validatorBuilder, 'getLoaders')) {
+            return false;
+        }
+
+        $loaders = $this->validatorBuilder->getLoaders();
+        $metadataFactory = new LazyLoadingMetadataFactory(new LoaderChain($loaders), $arrayAdapter);
+
+        foreach ($this->extractSupportedLoaders($loaders) as $loader) {
+            foreach ($loader->getMappedClasses() as $mappedClass) {
+                try {
+                    if ($metadataFactory->hasMetadataFor($mappedClass)) {
+                        $metadataFactory->getMetadataFor($mappedClass);
+                    }
+                } catch (AnnotationException $e) {
+                    // ignore failing annotations
+                } catch (\Exception $e) {
+                    $this->ignoreAutoloadException($mappedClass, $e);
+                }
+            }
+        }
+
+        return true;
+    }
+
+    protected function warmUpPhpArrayAdapter(PhpArrayAdapter $phpArrayAdapter, array $values)
+    {
+        // make sure we don't cache null values
+        $values = array_filter($values, function ($val) { return null !== $val; });
+
+        parent::warmUpPhpArrayAdapter($phpArrayAdapter, $values);
+    }
+
+    /**
+     * @param LoaderInterface[] $loaders
+     *
+     * @return XmlFileLoader[]|YamlFileLoader[]
+     */
+    private function extractSupportedLoaders(array $loaders): array
+    {
+        $supportedLoaders = [];
+
+        foreach ($loaders as $loader) {
+            if ($loader instanceof XmlFileLoader || $loader instanceof YamlFileLoader) {
+                $supportedLoaders[] = $loader;
+            } elseif ($loader instanceof LoaderChain) {
+                $supportedLoaders = array_merge($supportedLoaders, $this->extractSupportedLoaders($loader->getLoaders()));
+            }
+        }
+
+        return $supportedLoaders;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Client.php b/vendor/symfony/framework-bundle/Client.php
new file mode 100644
index 0000000000000000000000000000000000000000..97b19cce3a499e11be3432c481b6397ca3396d82
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Client.php
@@ -0,0 +1,207 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle;
+
+use Symfony\Component\BrowserKit\CookieJar;
+use Symfony\Component\BrowserKit\History;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelBrowser;
+use Symfony\Component\HttpKernel\KernelInterface;
+use Symfony\Component\HttpKernel\Profiler\Profile as HttpProfile;
+
+/**
+ * Client simulates a browser and makes requests to a Kernel object.
+ *
+ * @deprecated since Symfony 4.3, use KernelBrowser instead.
+ */
+class Client extends HttpKernelBrowser
+{
+    private $hasPerformedRequest = false;
+    private $profiler = false;
+    private $reboot = true;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(KernelInterface $kernel, array $server = [], History $history = null, CookieJar $cookieJar = null)
+    {
+        parent::__construct($kernel, $server, $history, $cookieJar);
+    }
+
+    /**
+     * Returns the container.
+     *
+     * @return ContainerInterface|null Returns null when the Kernel has been shutdown or not started yet
+     */
+    public function getContainer()
+    {
+        return $this->kernel->getContainer();
+    }
+
+    /**
+     * Returns the kernel.
+     *
+     * @return KernelInterface
+     */
+    public function getKernel()
+    {
+        return $this->kernel;
+    }
+
+    /**
+     * Gets the profile associated with the current Response.
+     *
+     * @return HttpProfile|false|null A Profile instance
+     */
+    public function getProfile()
+    {
+        if (null === $this->response || !$this->kernel->getContainer()->has('profiler')) {
+            return false;
+        }
+
+        return $this->kernel->getContainer()->get('profiler')->loadProfileFromResponse($this->response);
+    }
+
+    /**
+     * Enables the profiler for the very next request.
+     *
+     * If the profiler is not enabled, the call to this method does nothing.
+     */
+    public function enableProfiler()
+    {
+        if ($this->kernel->getContainer()->has('profiler')) {
+            $this->profiler = true;
+        }
+    }
+
+    /**
+     * Disables kernel reboot between requests.
+     *
+     * By default, the Client reboots the Kernel for each request. This method
+     * allows to keep the same kernel across requests.
+     */
+    public function disableReboot()
+    {
+        $this->reboot = false;
+    }
+
+    /**
+     * Enables kernel reboot between requests.
+     */
+    public function enableReboot()
+    {
+        $this->reboot = true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param Request $request A Request instance
+     *
+     * @return Response A Response instance
+     */
+    protected function doRequest($request)
+    {
+        // avoid shutting down the Kernel if no request has been performed yet
+        // WebTestCase::createClient() boots the Kernel but do not handle a request
+        if ($this->hasPerformedRequest && $this->reboot) {
+            $this->kernel->boot();
+            $this->kernel->shutdown();
+        } else {
+            $this->hasPerformedRequest = true;
+        }
+
+        if ($this->profiler) {
+            $this->profiler = false;
+
+            $this->kernel->boot();
+            $this->kernel->getContainer()->get('profiler')->enable();
+        }
+
+        return parent::doRequest($request);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param Request $request A Request instance
+     *
+     * @return Response A Response instance
+     */
+    protected function doRequestInProcess($request)
+    {
+        $response = parent::doRequestInProcess($request);
+
+        $this->profiler = false;
+
+        return $response;
+    }
+
+    /**
+     * Returns the script to execute when the request must be insulated.
+     *
+     * It assumes that the autoloader is named 'autoload.php' and that it is
+     * stored in the same directory as the kernel (this is the case for the
+     * Symfony Standard Edition). If this is not your case, create your own
+     * client and override this method.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return string The script content
+     */
+    protected function getScript($request)
+    {
+        $kernel = var_export(serialize($this->kernel), true);
+        $request = var_export(serialize($request), true);
+        $errorReporting = error_reporting();
+
+        $requires = '';
+        foreach (get_declared_classes() as $class) {
+            if (str_starts_with($class, 'ComposerAutoloaderInit')) {
+                $r = new \ReflectionClass($class);
+                $file = \dirname($r->getFileName(), 2).'/autoload.php';
+                if (file_exists($file)) {
+                    $requires .= 'require_once '.var_export($file, true).";\n";
+                }
+            }
+        }
+
+        if (!$requires) {
+            throw new \RuntimeException('Composer autoloader not found.');
+        }
+
+        $requires .= 'require_once '.var_export((new \ReflectionObject($this->kernel))->getFileName(), true).";\n";
+
+        $profilerCode = '';
+        if ($this->profiler) {
+            $profilerCode = '$kernel->getContainer()->get(\'profiler\')->enable();';
+        }
+
+        $code = <<<EOF
+<?php
+
+error_reporting($errorReporting);
+
+$requires
+
+\$kernel = unserialize($kernel);
+\$kernel->boot();
+$profilerCode
+
+\$request = unserialize($request);
+EOF;
+
+        return $code.$this->getHandleScript();
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/AboutCommand.php b/vendor/symfony/framework-bundle/Command/AboutCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..23cd6ac8eceb3002409bd9d894b11a0248416599
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/AboutCommand.php
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\Helper;
+use Symfony\Component\Console\Helper\TableSeparator;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\HttpKernel\Kernel;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * A console command to display information about the current installation.
+ *
+ * @author Roland Franssen <franssen.roland@gmail.com>
+ *
+ * @final
+ */
+class AboutCommand extends Command
+{
+    protected static $defaultName = 'about';
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDescription('Display information about the current project')
+            ->setHelp(<<<'EOT'
+The <info>%command.name%</info> command displays information about the current Symfony project.
+
+The <info>PHP</info> section displays important configuration that could affect your application. The values might
+be different between web and CLI.
+
+The <info>Environment</info> section displays the current environment variables managed by Symfony Dotenv. It will not
+be shown if no variables were found. The values might be different between web and CLI.
+EOT
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+
+        /** @var KernelInterface $kernel */
+        $kernel = $this->getApplication()->getKernel();
+
+        $rows = [
+            ['<info>Symfony</>'],
+            new TableSeparator(),
+            ['Version', Kernel::VERSION],
+            ['Long-Term Support', 4 === Kernel::MINOR_VERSION ? 'Yes' : 'No'],
+            ['End of maintenance', Kernel::END_OF_MAINTENANCE.(self::isExpired(Kernel::END_OF_MAINTENANCE) ? ' <error>Expired</>' : '')],
+            ['End of life', Kernel::END_OF_LIFE.(self::isExpired(Kernel::END_OF_LIFE) ? ' <error>Expired</>' : '')],
+            new TableSeparator(),
+            ['<info>Kernel</>'],
+            new TableSeparator(),
+            ['Type', \get_class($kernel)],
+            ['Environment', $kernel->getEnvironment()],
+            ['Debug', $kernel->isDebug() ? 'true' : 'false'],
+            ['Charset', $kernel->getCharset()],
+            ['Cache directory', self::formatPath($kernel->getCacheDir(), $kernel->getProjectDir()).' (<comment>'.self::formatFileSize($kernel->getCacheDir()).'</>)'],
+            ['Log directory', self::formatPath($kernel->getLogDir(), $kernel->getProjectDir()).' (<comment>'.self::formatFileSize($kernel->getLogDir()).'</>)'],
+            new TableSeparator(),
+            ['<info>PHP</>'],
+            new TableSeparator(),
+            ['Version', \PHP_VERSION],
+            ['Architecture', (\PHP_INT_SIZE * 8).' bits'],
+            ['Intl locale', class_exists(\Locale::class, false) && \Locale::getDefault() ? \Locale::getDefault() : 'n/a'],
+            ['Timezone', date_default_timezone_get().' (<comment>'.(new \DateTime())->format(\DateTime::W3C).'</>)'],
+            ['OPcache', \extension_loaded('Zend OPcache') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN) ? 'true' : 'false'],
+            ['APCu', \extension_loaded('apcu') && filter_var(\ini_get('apc.enabled'), \FILTER_VALIDATE_BOOLEAN) ? 'true' : 'false'],
+            ['Xdebug', \extension_loaded('xdebug') ? 'true' : 'false'],
+        ];
+
+        if ($dotenv = self::getDotenvVars()) {
+            $rows = array_merge($rows, [
+                new TableSeparator(),
+                ['<info>Environment (.env)</>'],
+                new TableSeparator(),
+            ], array_map(function ($value, $name) {
+                return [$name, $value];
+            }, $dotenv, array_keys($dotenv)));
+        }
+
+        $io->table([], $rows);
+
+        return 0;
+    }
+
+    private static function formatPath(string $path, string $baseDir): string
+    {
+        return preg_replace('~^'.preg_quote($baseDir, '~').'~', '.', $path);
+    }
+
+    private static function formatFileSize(string $path): string
+    {
+        if (is_file($path)) {
+            $size = filesize($path) ?: 0;
+        } else {
+            $size = 0;
+            foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS | \RecursiveDirectoryIterator::FOLLOW_SYMLINKS)) as $file) {
+                if ($file->isReadable()) {
+                    $size += $file->getSize();
+                }
+            }
+        }
+
+        return Helper::formatMemory($size);
+    }
+
+    private static function isExpired(string $date): bool
+    {
+        $date = \DateTime::createFromFormat('d/m/Y', '01/'.$date);
+
+        return false !== $date && new \DateTime() > $date->modify('last day of this month 23:59:59');
+    }
+
+    private static function getDotenvVars(): array
+    {
+        $vars = [];
+        foreach (explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? '') as $name) {
+            if ('' !== $name && isset($_ENV[$name])) {
+                $vars[$name] = $_ENV[$name];
+            }
+        }
+
+        return $vars;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/AbstractConfigCommand.php b/vendor/symfony/framework-bundle/Command/AbstractConfigCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..0ff799ba9bbc3ef137a3f0561dcde10de01b003d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/AbstractConfigCommand.php
@@ -0,0 +1,141 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+use Symfony\Component\Console\Exception\LogicException;
+use Symfony\Component\Console\Helper\Table;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\StyleInterface;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
+
+/**
+ * A console command for dumping available configuration reference.
+ *
+ * @author Kevin Bond <kevinbond@gmail.com>
+ * @author Wouter J <waldio.webdesign@gmail.com>
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ */
+abstract class AbstractConfigCommand extends ContainerDebugCommand
+{
+    /**
+     * @param OutputInterface|StyleInterface $output
+     */
+    protected function listBundles($output)
+    {
+        $title = 'Available registered bundles with their extension alias if available';
+        $headers = ['Bundle name', 'Extension alias'];
+        $rows = [];
+
+        $bundles = $this->getApplication()->getKernel()->getBundles();
+        usort($bundles, function ($bundleA, $bundleB) {
+            return strcmp($bundleA->getName(), $bundleB->getName());
+        });
+
+        foreach ($bundles as $bundle) {
+            $extension = $bundle->getContainerExtension();
+            $rows[] = [$bundle->getName(), $extension ? $extension->getAlias() : ''];
+        }
+
+        if ($output instanceof StyleInterface) {
+            $output->title($title);
+            $output->table($headers, $rows);
+        } else {
+            $output->writeln($title);
+            $table = new Table($output);
+            $table->setHeaders($headers)->setRows($rows)->render();
+        }
+    }
+
+    /**
+     * @return ExtensionInterface
+     */
+    protected function findExtension($name)
+    {
+        $bundles = $this->initializeBundles();
+        $minScore = \INF;
+
+        foreach ($bundles as $bundle) {
+            if ($name === $bundle->getName()) {
+                if (!$bundle->getContainerExtension()) {
+                    throw new \LogicException(sprintf('Bundle "%s" does not have a container extension.', $name));
+                }
+
+                return $bundle->getContainerExtension();
+            }
+
+            $distance = levenshtein($name, $bundle->getName());
+
+            if ($distance < $minScore) {
+                $guess = $bundle->getName();
+                $minScore = $distance;
+            }
+        }
+
+        $container = $this->getContainerBuilder();
+
+        if ($container->hasExtension($name)) {
+            return $container->getExtension($name);
+        }
+
+        foreach ($container->getExtensions() as $extension) {
+            $distance = levenshtein($name, $extension->getAlias());
+
+            if ($distance < $minScore) {
+                $guess = $extension->getAlias();
+                $minScore = $distance;
+            }
+        }
+
+        if (!str_ends_with($name, 'Bundle')) {
+            $message = sprintf('No extensions with configuration available for "%s".', $name);
+        } else {
+            $message = sprintf('No extension with alias "%s" is enabled.', $name);
+        }
+
+        if (isset($guess) && $minScore < 3) {
+            $message .= sprintf("\n\nDid you mean \"%s\"?", $guess);
+        }
+
+        throw new LogicException($message);
+    }
+
+    public function validateConfiguration(ExtensionInterface $extension, $configuration)
+    {
+        if (!$configuration) {
+            throw new \LogicException(sprintf('The extension with alias "%s" does not have its getConfiguration() method setup.', $extension->getAlias()));
+        }
+
+        if (!$configuration instanceof ConfigurationInterface) {
+            throw new \LogicException(sprintf('Configuration class "%s" should implement ConfigurationInterface in order to be dumpable.', \get_class($configuration)));
+        }
+    }
+
+    private function initializeBundles()
+    {
+        // Re-build bundle manually to initialize DI extensions that can be extended by other bundles in their build() method
+        // as this method is not called when the container is loaded from the cache.
+        $container = $this->getContainerBuilder();
+        $bundles = $this->getApplication()->getKernel()->getBundles();
+        foreach ($bundles as $bundle) {
+            if ($extension = $bundle->getContainerExtension()) {
+                $container->registerExtension($extension);
+            }
+        }
+
+        foreach ($bundles as $bundle) {
+            $bundle->build($container);
+        }
+
+        return $bundles;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/AssetsInstallCommand.php b/vendor/symfony/framework-bundle/Command/AssetsInstallCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..c3e1456b3863d56e0b9da07768af94e081e2e620
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/AssetsInstallCommand.php
@@ -0,0 +1,282 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Filesystem\Exception\IOException;
+use Symfony\Component\Filesystem\Filesystem;
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\HttpKernel\Bundle\BundleInterface;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * Command that places bundle web assets into a given directory.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Gábor Egyed <gabor.egyed@gmail.com>
+ *
+ * @final
+ */
+class AssetsInstallCommand extends Command
+{
+    public const METHOD_COPY = 'copy';
+    public const METHOD_ABSOLUTE_SYMLINK = 'absolute symlink';
+    public const METHOD_RELATIVE_SYMLINK = 'relative symlink';
+
+    protected static $defaultName = 'assets:install';
+
+    private $filesystem;
+    private $projectDir;
+
+    public function __construct(Filesystem $filesystem, string $projectDir = null)
+    {
+        parent::__construct();
+
+        if (null === $projectDir) {
+            @trigger_error(sprintf('Not passing the project directory to the constructor of %s is deprecated since Symfony 4.3 and will not be supported in 5.0.', __CLASS__), \E_USER_DEPRECATED);
+        }
+
+        $this->filesystem = $filesystem;
+        $this->projectDir = $projectDir;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('target', InputArgument::OPTIONAL, 'The target directory', null),
+            ])
+            ->addOption('symlink', null, InputOption::VALUE_NONE, 'Symlink the assets instead of copying them')
+            ->addOption('relative', null, InputOption::VALUE_NONE, 'Make relative symlinks')
+            ->addOption('no-cleanup', null, InputOption::VALUE_NONE, 'Do not remove the assets of the bundles that no longer exist')
+            ->setDescription('Install bundle\'s web assets under a public directory')
+            ->setHelp(<<<'EOT'
+The <info>%command.name%</info> command installs bundle assets into a given
+directory (e.g. the <comment>public</comment> directory).
+
+  <info>php %command.full_name% public</info>
+
+A "bundles" directory will be created inside the target directory and the
+"Resources/public" directory of each bundle will be copied into it.
+
+To create a symlink to each bundle instead of copying its assets, use the
+<info>--symlink</info> option (will fall back to hard copies when symbolic links aren't possible:
+
+  <info>php %command.full_name% public --symlink</info>
+
+To make symlink relative, add the <info>--relative</info> option:
+
+  <info>php %command.full_name% public --symlink --relative</info>
+
+EOT
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        /** @var KernelInterface $kernel */
+        $kernel = $this->getApplication()->getKernel();
+        $targetArg = rtrim($input->getArgument('target') ?? '', '/');
+        if (!$targetArg) {
+            $targetArg = $this->getPublicDirectory($kernel->getContainer());
+        }
+
+        if (!is_dir($targetArg)) {
+            $targetArg = $kernel->getProjectDir().'/'.$targetArg;
+
+            if (!is_dir($targetArg)) {
+                throw new InvalidArgumentException(sprintf('The target directory "%s" does not exist.', $targetArg));
+            }
+        }
+
+        $bundlesDir = $targetArg.'/bundles/';
+
+        $io = new SymfonyStyle($input, $output);
+        $io->newLine();
+
+        if ($input->getOption('relative')) {
+            $expectedMethod = self::METHOD_RELATIVE_SYMLINK;
+            $io->text('Trying to install assets as <info>relative symbolic links</info>.');
+        } elseif ($input->getOption('symlink')) {
+            $expectedMethod = self::METHOD_ABSOLUTE_SYMLINK;
+            $io->text('Trying to install assets as <info>absolute symbolic links</info>.');
+        } else {
+            $expectedMethod = self::METHOD_COPY;
+            $io->text('Installing assets as <info>hard copies</info>.');
+        }
+
+        $io->newLine();
+
+        $rows = [];
+        $copyUsed = false;
+        $exitCode = 0;
+        $validAssetDirs = [];
+        /** @var BundleInterface $bundle */
+        foreach ($kernel->getBundles() as $bundle) {
+            if (!is_dir($originDir = $bundle->getPath().'/Resources/public') && !is_dir($originDir = $bundle->getPath().'/public')) {
+                continue;
+            }
+
+            $assetDir = preg_replace('/bundle$/', '', strtolower($bundle->getName()));
+            $targetDir = $bundlesDir.$assetDir;
+            $validAssetDirs[] = $assetDir;
+
+            if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
+                $message = sprintf("%s\n-> %s", $bundle->getName(), $targetDir);
+            } else {
+                $message = $bundle->getName();
+            }
+
+            try {
+                $this->filesystem->remove($targetDir);
+
+                if (self::METHOD_RELATIVE_SYMLINK === $expectedMethod) {
+                    $method = $this->relativeSymlinkWithFallback($originDir, $targetDir);
+                } elseif (self::METHOD_ABSOLUTE_SYMLINK === $expectedMethod) {
+                    $method = $this->absoluteSymlinkWithFallback($originDir, $targetDir);
+                } else {
+                    $method = $this->hardCopy($originDir, $targetDir);
+                }
+
+                if (self::METHOD_COPY === $method) {
+                    $copyUsed = true;
+                }
+
+                if ($method === $expectedMethod) {
+                    $rows[] = [sprintf('<fg=green;options=bold>%s</>', '\\' === \DIRECTORY_SEPARATOR ? 'OK' : "\xE2\x9C\x94" /* HEAVY CHECK MARK (U+2714) */), $message, $method];
+                } else {
+                    $rows[] = [sprintf('<fg=yellow;options=bold>%s</>', '\\' === \DIRECTORY_SEPARATOR ? 'WARNING' : '!'), $message, $method];
+                }
+            } catch (\Exception $e) {
+                $exitCode = 1;
+                $rows[] = [sprintf('<fg=red;options=bold>%s</>', '\\' === \DIRECTORY_SEPARATOR ? 'ERROR' : "\xE2\x9C\x98" /* HEAVY BALLOT X (U+2718) */), $message, $e->getMessage()];
+            }
+        }
+        // remove the assets of the bundles that no longer exist
+        if (!$input->getOption('no-cleanup') && is_dir($bundlesDir)) {
+            $dirsToRemove = Finder::create()->depth(0)->directories()->exclude($validAssetDirs)->in($bundlesDir);
+            $this->filesystem->remove($dirsToRemove);
+        }
+
+        if ($rows) {
+            $io->table(['', 'Bundle', 'Method / Error'], $rows);
+        }
+
+        if (0 !== $exitCode) {
+            $io->error('Some errors occurred while installing assets.');
+        } else {
+            if ($copyUsed) {
+                $io->note('Some assets were installed via copy. If you make changes to these assets you have to run this command again.');
+            }
+            $io->success($rows ? 'All assets were successfully installed.' : 'No assets were provided by any bundle.');
+        }
+
+        return $exitCode;
+    }
+
+    /**
+     * Try to create relative symlink.
+     *
+     * Falling back to absolute symlink and finally hard copy.
+     */
+    private function relativeSymlinkWithFallback(string $originDir, string $targetDir): string
+    {
+        try {
+            $this->symlink($originDir, $targetDir, true);
+            $method = self::METHOD_RELATIVE_SYMLINK;
+        } catch (IOException $e) {
+            $method = $this->absoluteSymlinkWithFallback($originDir, $targetDir);
+        }
+
+        return $method;
+    }
+
+    /**
+     * Try to create absolute symlink.
+     *
+     * Falling back to hard copy.
+     */
+    private function absoluteSymlinkWithFallback(string $originDir, string $targetDir): string
+    {
+        try {
+            $this->symlink($originDir, $targetDir);
+            $method = self::METHOD_ABSOLUTE_SYMLINK;
+        } catch (IOException $e) {
+            // fall back to copy
+            $method = $this->hardCopy($originDir, $targetDir);
+        }
+
+        return $method;
+    }
+
+    /**
+     * Creates symbolic link.
+     *
+     * @throws IOException if link can not be created
+     */
+    private function symlink(string $originDir, string $targetDir, bool $relative = false)
+    {
+        if ($relative) {
+            $this->filesystem->mkdir(\dirname($targetDir));
+            $originDir = $this->filesystem->makePathRelative($originDir, realpath(\dirname($targetDir)));
+        }
+        $this->filesystem->symlink($originDir, $targetDir);
+        if (!file_exists($targetDir)) {
+            throw new IOException(sprintf('Symbolic link "%s" was created but appears to be broken.', $targetDir), 0, null, $targetDir);
+        }
+    }
+
+    /**
+     * Copies origin to target.
+     */
+    private function hardCopy(string $originDir, string $targetDir): string
+    {
+        $this->filesystem->mkdir($targetDir, 0777);
+        // We use a custom iterator to ignore VCS files
+        $this->filesystem->mirror($originDir, $targetDir, Finder::create()->ignoreDotFiles(false)->in($originDir));
+
+        return self::METHOD_COPY;
+    }
+
+    private function getPublicDirectory(ContainerInterface $container): string
+    {
+        $defaultPublicDir = 'public';
+
+        if (null === $this->projectDir && !$container->hasParameter('kernel.project_dir')) {
+            return $defaultPublicDir;
+        }
+
+        $composerFilePath = ($this->projectDir ?? $container->getParameter('kernel.project_dir')).'/composer.json';
+
+        if (!file_exists($composerFilePath)) {
+            return $defaultPublicDir;
+        }
+
+        $composerConfig = json_decode(file_get_contents($composerFilePath), true);
+
+        return $composerConfig['extra']['public-dir'] ?? $defaultPublicDir;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/CacheClearCommand.php b/vendor/symfony/framework-bundle/Command/CacheClearCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..d112c9b086c0fafb757f253cb1a5eb96012dfc4c
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/CacheClearCommand.php
@@ -0,0 +1,209 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+use Symfony\Component\Filesystem\Exception\IOException;
+use Symfony\Component\Filesystem\Filesystem;
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
+use Symfony\Component\HttpKernel\RebootableInterface;
+
+/**
+ * Clear and Warmup the cache.
+ *
+ * @author Francis Besset <francis.besset@gmail.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @final
+ */
+class CacheClearCommand extends Command
+{
+    protected static $defaultName = 'cache:clear';
+
+    private $cacheClearer;
+    private $filesystem;
+
+    public function __construct(CacheClearerInterface $cacheClearer, Filesystem $filesystem = null)
+    {
+        parent::__construct();
+
+        $this->cacheClearer = $cacheClearer;
+        $this->filesystem = $filesystem ?? new Filesystem();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputOption('no-warmup', '', InputOption::VALUE_NONE, 'Do not warm up the cache'),
+                new InputOption('no-optional-warmers', '', InputOption::VALUE_NONE, 'Skip optional cache warmers (faster)'),
+            ])
+            ->setDescription('Clear the cache')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command clears and warms up the application cache for a given environment
+and debug mode:
+
+  <info>php %command.full_name% --env=dev</info>
+  <info>php %command.full_name% --env=prod --no-debug</info>
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $fs = $this->filesystem;
+        $io = new SymfonyStyle($input, $output);
+
+        $kernel = $this->getApplication()->getKernel();
+        $realCacheDir = $kernel->getContainer()->getParameter('kernel.cache_dir');
+        // the old cache dir name must not be longer than the real one to avoid exceeding
+        // the maximum length of a directory or file path within it (esp. Windows MAX_PATH)
+        $oldCacheDir = substr($realCacheDir, 0, -1).(str_ends_with($realCacheDir, '~') ? '+' : '~');
+        $fs->remove($oldCacheDir);
+
+        if (!is_writable($realCacheDir)) {
+            throw new RuntimeException(sprintf('Unable to write in the "%s" directory.', $realCacheDir));
+        }
+
+        $io->comment(sprintf('Clearing the cache for the <info>%s</info> environment with debug <info>%s</info>', $kernel->getEnvironment(), var_export($kernel->isDebug(), true)));
+        $this->cacheClearer->clear($realCacheDir);
+
+        // The current event dispatcher is stale, let's not use it anymore
+        $this->getApplication()->setDispatcher(new EventDispatcher());
+
+        $containerFile = (new \ReflectionObject($kernel->getContainer()))->getFileName();
+        $containerDir = basename(\dirname($containerFile));
+
+        // the warmup cache dir name must have the same length as the real one
+        // to avoid the many problems in serialized resources files
+        $warmupDir = substr($realCacheDir, 0, -1).('_' === substr($realCacheDir, -1) ? '-' : '_');
+
+        if ($output->isVerbose() && $fs->exists($warmupDir)) {
+            $io->comment('Clearing outdated warmup directory...');
+        }
+        $fs->remove($warmupDir);
+
+        if ($_SERVER['REQUEST_TIME'] <= filemtime($containerFile) && filemtime($containerFile) <= time()) {
+            if ($output->isVerbose()) {
+                $io->comment('Cache is fresh.');
+            }
+            if (!$input->getOption('no-warmup') && !$input->getOption('no-optional-warmers')) {
+                if ($output->isVerbose()) {
+                    $io->comment('Warming up optional cache...');
+                }
+                $warmer = $kernel->getContainer()->get('cache_warmer');
+                // non optional warmers already ran during container compilation
+                $warmer->enableOnlyOptionalWarmers();
+                $warmer->warmUp($realCacheDir);
+            }
+        } else {
+            $fs->mkdir($warmupDir);
+
+            if (!$input->getOption('no-warmup')) {
+                if ($output->isVerbose()) {
+                    $io->comment('Warming up cache...');
+                }
+                $this->warmup($warmupDir, $realCacheDir, !$input->getOption('no-optional-warmers'));
+            }
+
+            if (!$fs->exists($warmupDir.'/'.$containerDir)) {
+                $fs->rename($realCacheDir.'/'.$containerDir, $warmupDir.'/'.$containerDir);
+                touch($warmupDir.'/'.$containerDir.'.legacy');
+            }
+
+            if ('/' === \DIRECTORY_SEPARATOR && $mounts = @file('/proc/mounts')) {
+                foreach ($mounts as $mount) {
+                    $mount = \array_slice(explode(' ', $mount), 1, -3);
+                    if (!\in_array(array_pop($mount), ['vboxsf', 'nfs'])) {
+                        continue;
+                    }
+                    $mount = implode(' ', $mount).'/';
+
+                    if (str_starts_with($realCacheDir, $mount)) {
+                        $io->note('For better performances, you should move the cache and log directories to a non-shared folder of the VM.');
+                        $oldCacheDir = false;
+                        break;
+                    }
+                }
+            }
+
+            if ($oldCacheDir) {
+                $fs->rename($realCacheDir, $oldCacheDir);
+            } else {
+                $fs->remove($realCacheDir);
+            }
+            $fs->rename($warmupDir, $realCacheDir);
+
+            if ($output->isVerbose()) {
+                $io->comment('Removing old cache directory...');
+            }
+
+            try {
+                $fs->remove($oldCacheDir);
+            } catch (IOException $e) {
+                if ($output->isVerbose()) {
+                    $io->warning($e->getMessage());
+                }
+            }
+        }
+
+        if ($output->isVerbose()) {
+            $io->comment('Finished');
+        }
+
+        $io->success(sprintf('Cache for the "%s" environment (debug=%s) was successfully cleared.', $kernel->getEnvironment(), var_export($kernel->isDebug(), true)));
+
+        return 0;
+    }
+
+    private function warmup(string $warmupDir, string $realCacheDir, bool $enableOptionalWarmers = true)
+    {
+        // create a temporary kernel
+        $kernel = $this->getApplication()->getKernel();
+        if (!$kernel instanceof RebootableInterface) {
+            throw new \LogicException('Calling "cache:clear" with a kernel that does not implement "Symfony\Component\HttpKernel\RebootableInterface" is not supported.');
+        }
+        $kernel->reboot($warmupDir);
+
+        // warmup temporary dir
+        if ($enableOptionalWarmers) {
+            $warmer = $kernel->getContainer()->get('cache_warmer');
+            // non optional warmers already ran during container compilation
+            $warmer->enableOnlyOptionalWarmers();
+            $warmer->warmUp($warmupDir);
+        }
+
+        // fix references to cached files with the real cache directory name
+        $search = [$warmupDir, str_replace('\\', '\\\\', $warmupDir)];
+        $replace = str_replace('\\', '/', $realCacheDir);
+        foreach (Finder::create()->files()->in($warmupDir) as $file) {
+            $content = str_replace($search, $replace, file_get_contents($file), $count);
+            if ($count) {
+                file_put_contents($file, $content);
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/CachePoolClearCommand.php b/vendor/symfony/framework-bundle/Command/CachePoolClearCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..123617e58b18910eee74851f2c01ebfbf37ba501
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/CachePoolClearCommand.php
@@ -0,0 +1,105 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer;
+
+/**
+ * Clear cache pools.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+final class CachePoolClearCommand extends Command
+{
+    protected static $defaultName = 'cache:pool:clear';
+
+    private $poolClearer;
+
+    public function __construct(Psr6CacheClearer $poolClearer)
+    {
+        parent::__construct();
+
+        $this->poolClearer = $poolClearer;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('pools', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'A list of cache pools or cache pool clearers'),
+            ])
+            ->setDescription('Clear cache pools')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command clears the given cache pools or cache pool clearers.
+
+    %command.full_name% <cache pool or clearer 1> [...<cache pool or clearer N>]
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+        $kernel = $this->getApplication()->getKernel();
+        $pools = [];
+        $clearers = [];
+
+        foreach ($input->getArgument('pools') as $id) {
+            if ($this->poolClearer->hasPool($id)) {
+                $pools[$id] = $id;
+            } else {
+                $pool = $kernel->getContainer()->get($id);
+
+                if ($pool instanceof CacheItemPoolInterface) {
+                    $pools[$id] = $pool;
+                } elseif ($pool instanceof Psr6CacheClearer) {
+                    $clearers[$id] = $pool;
+                } else {
+                    throw new InvalidArgumentException(sprintf('"%s" is not a cache pool nor a cache clearer.', $id));
+                }
+            }
+        }
+
+        foreach ($clearers as $id => $clearer) {
+            $io->comment(sprintf('Calling cache clearer: <info>%s</info>', $id));
+            $clearer->clear($kernel->getContainer()->getParameter('kernel.cache_dir'));
+        }
+
+        foreach ($pools as $id => $pool) {
+            $io->comment(sprintf('Clearing cache pool: <info>%s</info>', $id));
+
+            if ($pool instanceof CacheItemPoolInterface) {
+                $pool->clear();
+            } else {
+                $this->poolClearer->clearPool($id);
+            }
+        }
+
+        $io->success('Cache was successfully cleared.');
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/CachePoolDeleteCommand.php b/vendor/symfony/framework-bundle/Command/CachePoolDeleteCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..922ec2dd7e94b33a0f4ae667b692d475506d6352
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/CachePoolDeleteCommand.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer;
+
+/**
+ * Delete an item from a cache pool.
+ *
+ * @author Pierre du Plessis <pdples@gmail.com>
+ */
+final class CachePoolDeleteCommand extends Command
+{
+    protected static $defaultName = 'cache:pool:delete';
+
+    private $poolClearer;
+
+    public function __construct(Psr6CacheClearer $poolClearer)
+    {
+        parent::__construct();
+
+        $this->poolClearer = $poolClearer;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('pool', InputArgument::REQUIRED, 'The cache pool from which to delete an item'),
+                new InputArgument('key', InputArgument::REQUIRED, 'The cache key to delete from the pool'),
+            ])
+            ->setDescription('Delete an item from a cache pool')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> deletes an item from a given cache pool.
+
+    %command.full_name% <pool> <key>
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+        $pool = $input->getArgument('pool');
+        $key = $input->getArgument('key');
+        $cachePool = $this->poolClearer->getPool($pool);
+
+        if (!$cachePool->hasItem($key)) {
+            $io->note(sprintf('Cache item "%s" does not exist in cache pool "%s".', $key, $pool));
+
+            return 0;
+        }
+
+        if (!$cachePool->deleteItem($key)) {
+            throw new \Exception(sprintf('Cache item "%s" could not be deleted.', $key));
+        }
+
+        $io->success(sprintf('Cache item "%s" was successfully deleted.', $key));
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/CachePoolListCommand.php b/vendor/symfony/framework-bundle/Command/CachePoolListCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b725411d5015d68a1320b9944f11e0e4e95feb2
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/CachePoolListCommand.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * List available cache pools.
+ *
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+final class CachePoolListCommand extends Command
+{
+    protected static $defaultName = 'cache:pool:list';
+
+    private $poolNames;
+
+    public function __construct(array $poolNames)
+    {
+        parent::__construct();
+
+        $this->poolNames = $poolNames;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDescription('List available cache pools')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command lists all available cache pools.
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+
+        $io->table(['Pool name'], array_map(function ($pool) {
+            return [$pool];
+        }, $this->poolNames));
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/CachePoolPruneCommand.php b/vendor/symfony/framework-bundle/Command/CachePoolPruneCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb9af73064cb459f30e33531daa328312b8c3434
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/CachePoolPruneCommand.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * Cache pool pruner command.
+ *
+ * @author Rob Frawley 2nd <rmf@src.run>
+ */
+final class CachePoolPruneCommand extends Command
+{
+    protected static $defaultName = 'cache:pool:prune';
+
+    private $pools;
+
+    /**
+     * @param iterable|PruneableInterface[] $pools
+     */
+    public function __construct(iterable $pools)
+    {
+        parent::__construct();
+
+        $this->pools = $pools;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDescription('Prune cache pools')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command deletes all expired items from all pruneable pools.
+
+    %command.full_name%
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+
+        foreach ($this->pools as $name => $pool) {
+            $io->comment(sprintf('Pruning cache pool: <info>%s</info>', $name));
+            $pool->prune();
+        }
+
+        $io->success('Successfully pruned cache pool(s).');
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/CacheWarmupCommand.php b/vendor/symfony/framework-bundle/Command/CacheWarmupCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..50b51f90734c1e5945d6fa1ddb6d9440169ab7d5
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/CacheWarmupCommand.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate;
+
+/**
+ * Warmup the cache.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @final
+ */
+class CacheWarmupCommand extends Command
+{
+    protected static $defaultName = 'cache:warmup';
+
+    private $cacheWarmer;
+
+    public function __construct(CacheWarmerAggregate $cacheWarmer)
+    {
+        parent::__construct();
+
+        $this->cacheWarmer = $cacheWarmer;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputOption('no-optional-warmers', '', InputOption::VALUE_NONE, 'Skip optional cache warmers (faster)'),
+            ])
+            ->setDescription('Warm up an empty cache')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command warms up the cache.
+
+Before running this command, the cache must be empty.
+
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+
+        $kernel = $this->getApplication()->getKernel();
+        $io->comment(sprintf('Warming up the cache for the <info>%s</info> environment with debug <info>%s</info>', $kernel->getEnvironment(), var_export($kernel->isDebug(), true)));
+
+        if (!$input->getOption('no-optional-warmers')) {
+            $this->cacheWarmer->enableOptionalWarmers();
+        }
+
+        $this->cacheWarmer->warmUp($kernel->getContainer()->getParameter('kernel.cache_dir'));
+
+        $io->success(sprintf('Cache for the "%s" environment (debug=%s) was successfully warmed.', $kernel->getEnvironment(), var_export($kernel->isDebug(), true)));
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/ConfigDebugCommand.php b/vendor/symfony/framework-bundle/Command/ConfigDebugCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..063932dee5782c2a145f5c96bc5fd6a48acb2d58
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/ConfigDebugCommand.php
@@ -0,0 +1,180 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\Console\Exception\LogicException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\Compiler\ValidateEnvPlaceholdersPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * A console command for dumping available configuration reference.
+ *
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ *
+ * @final
+ */
+class ConfigDebugCommand extends AbstractConfigCommand
+{
+    protected static $defaultName = 'debug:config';
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('name', InputArgument::OPTIONAL, 'The bundle name or the extension alias'),
+                new InputArgument('path', InputArgument::OPTIONAL, 'The configuration option path'),
+            ])
+            ->setDescription('Dump the current configuration for an extension')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command dumps the current configuration for an
+extension/bundle.
+
+Either the extension alias or bundle name can be used:
+
+  <info>php %command.full_name% framework</info>
+  <info>php %command.full_name% FrameworkBundle</info>
+
+For dumping a specific option, add its path as second argument:
+
+  <info>php %command.full_name% framework serializer.enabled</info>
+
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+        $errorIo = $io->getErrorStyle();
+
+        if (null === $name = $input->getArgument('name')) {
+            $this->listBundles($errorIo);
+            $errorIo->comment('Provide the name of a bundle as the first argument of this command to dump its configuration. (e.g. <comment>debug:config FrameworkBundle</comment>)');
+            $errorIo->comment('For dumping a specific option, add its path as the second argument of this command. (e.g. <comment>debug:config FrameworkBundle serializer</comment> to dump the <comment>framework.serializer</comment> configuration)');
+
+            return 0;
+        }
+
+        $extension = $this->findExtension($name);
+        $extensionAlias = $extension->getAlias();
+        $container = $this->compileContainer();
+
+        $config = $container->resolveEnvPlaceholders(
+            $container->getParameterBag()->resolveValue(
+                $this->getConfigForExtension($extension, $container)
+            )
+        );
+
+        if (null === $path = $input->getArgument('path')) {
+            $io->title(
+                sprintf('Current configuration for %s', $name === $extensionAlias ? sprintf('extension with alias "%s"', $extensionAlias) : sprintf('"%s"', $name))
+            );
+
+            $io->writeln(Yaml::dump([$extensionAlias => $config], 10));
+
+            return 0;
+        }
+
+        try {
+            $config = $this->getConfigForPath($config, $path, $extensionAlias);
+        } catch (LogicException $e) {
+            $errorIo->error($e->getMessage());
+
+            return 1;
+        }
+
+        $io->title(sprintf('Current configuration for "%s.%s"', $extensionAlias, $path));
+
+        $io->writeln(Yaml::dump($config, 10));
+
+        return 0;
+    }
+
+    private function compileContainer(): ContainerBuilder
+    {
+        $kernel = clone $this->getApplication()->getKernel();
+        $kernel->boot();
+
+        $method = new \ReflectionMethod($kernel, 'buildContainer');
+        $method->setAccessible(true);
+        $container = $method->invoke($kernel);
+        $container->getCompiler()->compile($container);
+
+        return $container;
+    }
+
+    /**
+     * Iterate over configuration until the last step of the given path.
+     *
+     * @throws LogicException If the configuration does not exist
+     *
+     * @return mixed
+     */
+    private function getConfigForPath(array $config, string $path, string $alias)
+    {
+        $steps = explode('.', $path);
+
+        foreach ($steps as $step) {
+            if (!\array_key_exists($step, $config)) {
+                throw new LogicException(sprintf('Unable to find configuration for "%s.%s".', $alias, $path));
+            }
+
+            $config = $config[$step];
+        }
+
+        return $config;
+    }
+
+    private function getConfigForExtension(ExtensionInterface $extension, ContainerBuilder $container): array
+    {
+        $extensionAlias = $extension->getAlias();
+
+        $extensionConfig = [];
+        foreach ($container->getCompilerPassConfig()->getPasses() as $pass) {
+            if ($pass instanceof ValidateEnvPlaceholdersPass) {
+                $extensionConfig = $pass->getExtensionConfig();
+                break;
+            }
+        }
+
+        if (isset($extensionConfig[$extensionAlias])) {
+            return $extensionConfig[$extensionAlias];
+        }
+
+        // Fall back to default config if the extension has one
+
+        if (!$extension instanceof ConfigurationExtensionInterface) {
+            throw new \LogicException(sprintf('The extension with alias "%s" does not have configuration.', $extensionAlias));
+        }
+
+        $configs = $container->getExtensionConfig($extensionAlias);
+        $configuration = $extension->getConfiguration($configs, $container);
+        $this->validateConfiguration($extension, $configuration);
+
+        return (new Processor())->processConfiguration($configuration, $configs);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php b/vendor/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..17690f7c99401625f6b1965d15216555321cb7e4
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php
@@ -0,0 +1,135 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Config\Definition\Dumper\XmlReferenceDumper;
+use Symfony\Component\Config\Definition\Dumper\YamlReferenceDumper;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * A console command for dumping available configuration reference.
+ *
+ * @author Kevin Bond <kevinbond@gmail.com>
+ * @author Wouter J <waldio.webdesign@gmail.com>
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ *
+ * @final
+ */
+class ConfigDumpReferenceCommand extends AbstractConfigCommand
+{
+    protected static $defaultName = 'config:dump-reference';
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('name', InputArgument::OPTIONAL, 'The Bundle name or the extension alias'),
+                new InputArgument('path', InputArgument::OPTIONAL, 'The configuration option path'),
+                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (yaml or xml)', 'yaml'),
+            ])
+            ->setDescription('Dump the default configuration for an extension')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command dumps the default configuration for an
+extension/bundle.
+
+Either the extension alias or bundle name can be used:
+
+  <info>php %command.full_name% framework</info>
+  <info>php %command.full_name% FrameworkBundle</info>
+
+With the <info>--format</info> option specifies the format of the configuration,
+this is either <comment>yaml</comment> or <comment>xml</comment>.
+When the option is not provided, <comment>yaml</comment> is used.
+
+  <info>php %command.full_name% FrameworkBundle --format=xml</info>
+
+For dumping a specific option, add its path as second argument (only available for the yaml format):
+
+  <info>php %command.full_name% framework profiler.matcher</info>
+
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws \LogicException
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+        $errorIo = $io->getErrorStyle();
+
+        if (null === $name = $input->getArgument('name')) {
+            $this->listBundles($errorIo);
+            $errorIo->comment([
+                'Provide the name of a bundle as the first argument of this command to dump its default configuration. (e.g. <comment>config:dump-reference FrameworkBundle</comment>)',
+                'For dumping a specific option, add its path as the second argument of this command. (e.g. <comment>config:dump-reference FrameworkBundle profiler.matcher</comment> to dump the <comment>framework.profiler.matcher</comment> configuration)',
+            ]);
+
+            return 0;
+        }
+
+        $extension = $this->findExtension($name);
+
+        $configuration = $extension->getConfiguration([], $this->getContainerBuilder());
+
+        $this->validateConfiguration($extension, $configuration);
+
+        $format = $input->getOption('format');
+        $path = $input->getArgument('path');
+
+        if (null !== $path && 'yaml' !== $format) {
+            $errorIo->error('The "path" option is only available for the "yaml" format.');
+
+            return 1;
+        }
+
+        if ($name === $extension->getAlias()) {
+            $message = sprintf('Default configuration for extension with alias: "%s"', $name);
+        } else {
+            $message = sprintf('Default configuration for "%s"', $name);
+        }
+
+        if (null !== $path) {
+            $message .= sprintf(' at path "%s"', $path);
+        }
+
+        switch ($format) {
+            case 'yaml':
+                $io->writeln(sprintf('# %s', $message));
+                $dumper = new YamlReferenceDumper();
+                break;
+            case 'xml':
+                $io->writeln(sprintf('<!-- %s -->', $message));
+                $dumper = new XmlReferenceDumper();
+                break;
+            default:
+                $io->writeln($message);
+                throw new InvalidArgumentException('Only the yaml and xml formats are supported.');
+        }
+
+        $io->writeln(null === $path ? $dumper->dump($configuration, $extension->getNamespace()) : $dumper->dumpAtPath($configuration, $path));
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/ContainerAwareCommand.php b/vendor/symfony/framework-bundle/Command/ContainerAwareCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae7e928b1ff796d90056fe4c0eb8fcc0e58df0fa
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/ContainerAwareCommand.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2, use "%s" with dependency injection instead.', ContainerAwareCommand::class, Command::class), \E_USER_DEPRECATED);
+
+/**
+ * Command.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since Symfony 4.2, use {@see Command} instead.
+ */
+abstract class ContainerAwareCommand extends Command implements ContainerAwareInterface
+{
+    /**
+     * @var ContainerInterface|null
+     */
+    private $container;
+
+    /**
+     * @return ContainerInterface
+     *
+     * @throws \LogicException
+     */
+    protected function getContainer()
+    {
+        if (null === $this->container) {
+            $application = $this->getApplication();
+            if (null === $application) {
+                throw new \LogicException('The container cannot be retrieved as the application instance is not yet set.');
+            }
+
+            $this->container = $application->getKernel()->getContainer();
+        }
+
+        return $this->container;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->container = $container;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/ContainerDebugCommand.php b/vendor/symfony/framework-bundle/Command/ContainerDebugCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..c75ba398a67a4830145b96e53d27c106c8b5efa1
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/ContainerDebugCommand.php
@@ -0,0 +1,304 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Console\Helper\DescriptorHelper;
+use Symfony\Component\Config\ConfigCache;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+
+/**
+ * A console command for retrieving information about services.
+ *
+ * @author Ryan Weaver <ryan@thatsquality.com>
+ *
+ * @internal
+ */
+class ContainerDebugCommand extends Command
+{
+    protected static $defaultName = 'debug:container';
+
+    /**
+     * @var ContainerBuilder|null
+     */
+    protected $containerBuilder;
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('name', InputArgument::OPTIONAL, 'A service name (foo)'),
+                new InputOption('show-private', null, InputOption::VALUE_NONE, 'Show public *and* private services (deprecated)'),
+                new InputOption('show-arguments', null, InputOption::VALUE_NONE, 'Show arguments in services'),
+                new InputOption('show-hidden', null, InputOption::VALUE_NONE, 'Show hidden (internal) services'),
+                new InputOption('tag', null, InputOption::VALUE_REQUIRED, 'Show all services with a specific tag'),
+                new InputOption('tags', null, InputOption::VALUE_NONE, 'Display tagged services for an application'),
+                new InputOption('parameter', null, InputOption::VALUE_REQUIRED, 'Display a specific parameter for an application'),
+                new InputOption('parameters', null, InputOption::VALUE_NONE, 'Display parameters for an application'),
+                new InputOption('types', null, InputOption::VALUE_NONE, 'Display types (classes/interfaces) available in the container'),
+                new InputOption('env-var', null, InputOption::VALUE_REQUIRED, 'Display a specific environment variable used in the container'),
+                new InputOption('env-vars', null, InputOption::VALUE_NONE, 'Display environment variables used in the container'),
+                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
+                new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw description'),
+            ])
+            ->setDescription('Display current services for an application')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command displays all configured <comment>public</comment> services:
+
+  <info>php %command.full_name%</info>
+
+To get specific information about a service, specify its name:
+
+  <info>php %command.full_name% validator</info>
+
+To get specific information about a service including all its arguments, use the <info>--show-arguments</info> flag:
+
+  <info>php %command.full_name% validator --show-arguments</info>
+
+To see available types that can be used for autowiring, use the <info>--types</info> flag:
+
+  <info>php %command.full_name% --types</info>
+
+To see environment variables used by the container, use the <info>--env-vars</info> flag:
+
+  <info>php %command.full_name% --env-vars</info>
+
+Display a specific environment variable by specifying its name with the <info>--env-var</info> option:
+
+  <info>php %command.full_name% --env-var=APP_ENV</info>
+
+Use the --tags option to display tagged <comment>public</comment> services grouped by tag:
+
+  <info>php %command.full_name% --tags</info>
+
+Find all services with a specific tag by specifying the tag name with the <info>--tag</info> option:
+
+  <info>php %command.full_name% --tag=form.type</info>
+
+Use the <info>--parameters</info> option to display all parameters:
+
+  <info>php %command.full_name% --parameters</info>
+
+Display a specific parameter by specifying its name with the <info>--parameter</info> option:
+
+  <info>php %command.full_name% --parameter=kernel.debug</info>
+
+By default, internal services are hidden. You can display them
+using the <info>--show-hidden</info> flag:
+
+  <info>php %command.full_name% --show-hidden</info>
+
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        if ($input->getOption('show-private')) {
+            @trigger_error('The "--show-private" option no longer has any effect and is deprecated since Symfony 4.1.', \E_USER_DEPRECATED);
+        }
+
+        $io = new SymfonyStyle($input, $output);
+        $errorIo = $io->getErrorStyle();
+
+        $this->validateInput($input);
+        $object = $this->getContainerBuilder();
+
+        if ($input->getOption('env-vars')) {
+            $options = ['env-vars' => true];
+        } elseif ($envVar = $input->getOption('env-var')) {
+            $options = ['env-vars' => true, 'name' => $envVar];
+        } elseif ($input->getOption('types')) {
+            $options = [];
+            $options['filter'] = [$this, 'filterToServiceTypes'];
+        } elseif ($input->getOption('parameters')) {
+            $parameters = [];
+            foreach ($object->getParameterBag()->all() as $k => $v) {
+                $parameters[$k] = $object->resolveEnvPlaceholders($v);
+            }
+            $object = new ParameterBag($parameters);
+            $options = [];
+        } elseif ($parameter = $input->getOption('parameter')) {
+            $options = ['parameter' => $parameter];
+        } elseif ($input->getOption('tags')) {
+            $options = ['group_by' => 'tags'];
+        } elseif ($tag = $input->getOption('tag')) {
+            $options = ['tag' => $tag];
+        } elseif ($name = $input->getArgument('name')) {
+            $name = $this->findProperServiceName($input, $errorIo, $object, $name, $input->getOption('show-hidden'));
+            $options = ['id' => $name];
+        } else {
+            $options = [];
+        }
+
+        $helper = new DescriptorHelper();
+        $options['format'] = $input->getOption('format');
+        $options['show_arguments'] = $input->getOption('show-arguments');
+        $options['show_hidden'] = $input->getOption('show-hidden');
+        $options['raw_text'] = $input->getOption('raw');
+        $options['output'] = $io;
+        $options['is_debug'] = $this->getApplication()->getKernel()->isDebug();
+
+        try {
+            $helper->describe($io, $object, $options);
+
+            if (isset($options['id']) && isset($this->getApplication()->getKernel()->getContainer()->getRemovedIds()[$options['id']])) {
+                $errorIo->note(sprintf('The "%s" service or alias has been removed or inlined when the container was compiled.', $options['id']));
+            }
+        } catch (ServiceNotFoundException $e) {
+            if ('' !== $e->getId() && '@' === $e->getId()[0]) {
+                throw new ServiceNotFoundException($e->getId(), $e->getSourceId(), null, [substr($e->getId(), 1)]);
+            }
+
+            throw $e;
+        }
+
+        if (!$input->getArgument('name') && !$input->getOption('tag') && !$input->getOption('parameter') && !$input->getOption('env-vars') && !$input->getOption('env-var') && $input->isInteractive()) {
+            if ($input->getOption('tags')) {
+                $errorIo->comment('To search for a specific tag, re-run this command with a search term. (e.g. <comment>debug:container --tag=form.type</comment>)');
+            } elseif ($input->getOption('parameters')) {
+                $errorIo->comment('To search for a specific parameter, re-run this command with a search term. (e.g. <comment>debug:container --parameter=kernel.debug</comment>)');
+            } else {
+                $errorIo->comment('To search for a specific service, re-run this command with a search term. (e.g. <comment>debug:container log</comment>)');
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * Validates input arguments and options.
+     *
+     * @throws \InvalidArgumentException
+     */
+    protected function validateInput(InputInterface $input)
+    {
+        $options = ['tags', 'tag', 'parameters', 'parameter'];
+
+        $optionsCount = 0;
+        foreach ($options as $option) {
+            if ($input->getOption($option)) {
+                ++$optionsCount;
+            }
+        }
+
+        $name = $input->getArgument('name');
+        if ((null !== $name) && ($optionsCount > 0)) {
+            throw new InvalidArgumentException('The options tags, tag, parameters & parameter can not be combined with the service name argument.');
+        } elseif ((null === $name) && $optionsCount > 1) {
+            throw new InvalidArgumentException('The options tags, tag, parameters & parameter can not be combined together.');
+        }
+    }
+
+    /**
+     * Loads the ContainerBuilder from the cache.
+     *
+     * @throws \LogicException
+     */
+    protected function getContainerBuilder(): ContainerBuilder
+    {
+        if ($this->containerBuilder) {
+            return $this->containerBuilder;
+        }
+
+        $kernel = $this->getApplication()->getKernel();
+
+        if (!$kernel->isDebug() || !(new ConfigCache($kernel->getContainer()->getParameter('debug.container.dump'), true))->isFresh()) {
+            $buildContainer = \Closure::bind(function () { return $this->buildContainer(); }, $kernel, \get_class($kernel));
+            $container = $buildContainer();
+            $container->getCompilerPassConfig()->setRemovingPasses([]);
+            $container->getCompilerPassConfig()->setAfterRemovingPasses([]);
+            $container->compile();
+        } else {
+            (new XmlFileLoader($container = new ContainerBuilder(), new FileLocator()))->load($kernel->getContainer()->getParameter('debug.container.dump'));
+            $locatorPass = new ServiceLocatorTagPass();
+            $locatorPass->process($container);
+        }
+
+        return $this->containerBuilder = $container;
+    }
+
+    private function findProperServiceName(InputInterface $input, SymfonyStyle $io, ContainerBuilder $builder, string $name, bool $showHidden): string
+    {
+        $name = ltrim($name, '\\');
+
+        if ($builder->has($name) || !$input->isInteractive()) {
+            return $name;
+        }
+
+        $matchingServices = $this->findServiceIdsContaining($builder, $name, $showHidden);
+        if (empty($matchingServices)) {
+            throw new InvalidArgumentException(sprintf('No services found that match "%s".', $name));
+        }
+
+        if (1 === \count($matchingServices)) {
+            return $matchingServices[0];
+        }
+
+        return $io->choice('Select one of the following services to display its information', $matchingServices);
+    }
+
+    private function findServiceIdsContaining(ContainerBuilder $builder, string $name, bool $showHidden): array
+    {
+        $serviceIds = $builder->getServiceIds();
+        $foundServiceIds = $foundServiceIdsIgnoringBackslashes = [];
+        foreach ($serviceIds as $serviceId) {
+            if (!$showHidden && str_starts_with($serviceId, '.')) {
+                continue;
+            }
+            if (false !== stripos(str_replace('\\', '', $serviceId), $name)) {
+                $foundServiceIdsIgnoringBackslashes[] = $serviceId;
+            }
+            if (false !== stripos($serviceId, $name)) {
+                $foundServiceIds[] = $serviceId;
+            }
+        }
+
+        return $foundServiceIds ?: $foundServiceIdsIgnoringBackslashes;
+    }
+
+    /**
+     * @internal
+     */
+    public function filterToServiceTypes(string $serviceId): bool
+    {
+        // filter out things that could not be valid class names
+        if (!preg_match('/(?(DEFINE)(?<V>[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+))^(?&V)(?:\\\\(?&V))*+(?: \$(?&V))?$/', $serviceId)) {
+            return false;
+        }
+
+        // if the id has a \, assume it is a class
+        if (str_contains($serviceId, '\\')) {
+            return true;
+        }
+
+        return class_exists($serviceId) || interface_exists($serviceId, false);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/ContainerLintCommand.php b/vendor/symfony/framework-bundle/Command/ContainerLintCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..8225825ae360dcfcf0078f358467131ea77718e7
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/ContainerLintCommand.php
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Config\ConfigCache;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\Compiler\CheckTypeDeclarationsPass;
+use Symfony\Component\DependencyInjection\Compiler\PassConfig;
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
+use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
+use Symfony\Component\HttpKernel\Kernel;
+
+final class ContainerLintCommand extends Command
+{
+    protected static $defaultName = 'lint:container';
+
+    /**
+     * @var ContainerBuilder
+     */
+    private $containerBuilder;
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDescription('Ensure that arguments injected into services match type declarations')
+            ->setHelp('This command parses service definitions and ensures that injected values match the type declarations of each services\' class.')
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+        $errorIo = $io->getErrorStyle();
+
+        try {
+            $container = $this->getContainerBuilder();
+        } catch (RuntimeException $e) {
+            $errorIo->error($e->getMessage());
+
+            return 2;
+        }
+
+        $container->setParameter('container.build_time', time());
+
+        $container->compile();
+
+        return 0;
+    }
+
+    private function getContainerBuilder(): ContainerBuilder
+    {
+        if ($this->containerBuilder) {
+            return $this->containerBuilder;
+        }
+
+        $kernel = $this->getApplication()->getKernel();
+        $kernelContainer = $kernel->getContainer();
+
+        if (!$kernel->isDebug() || !(new ConfigCache($kernelContainer->getParameter('debug.container.dump'), true))->isFresh()) {
+            if (!$kernel instanceof Kernel) {
+                throw new RuntimeException(sprintf('This command does not support the application kernel: "%s" does not extend "%s".', \get_class($kernel), Kernel::class));
+            }
+
+            $buildContainer = \Closure::bind(function (): ContainerBuilder {
+                $this->initializeBundles();
+
+                return $this->buildContainer();
+            }, $kernel, \get_class($kernel));
+            $container = $buildContainer();
+
+            $skippedIds = [];
+        } else {
+            if (!$kernelContainer instanceof Container) {
+                throw new RuntimeException(sprintf('This command does not support the application container: "%s" does not extend "%s".', \get_class($kernelContainer), Container::class));
+            }
+
+            (new XmlFileLoader($container = new ContainerBuilder($parameterBag = new EnvPlaceholderParameterBag()), new FileLocator()))->load($kernelContainer->getParameter('debug.container.dump'));
+
+            $refl = new \ReflectionProperty($parameterBag, 'resolved');
+            $refl->setAccessible(true);
+            $refl->setValue($parameterBag, true);
+
+            $skippedIds = [];
+            foreach ($container->getServiceIds() as $serviceId) {
+                if (str_starts_with($serviceId, '.errored.')) {
+                    $skippedIds[$serviceId] = true;
+                }
+            }
+        }
+
+        $container->setParameter('container.build_hash', 'lint_container');
+        $container->setParameter('container.build_id', 'lint_container');
+
+        $container->addCompilerPass(new CheckTypeDeclarationsPass(true, $skippedIds), PassConfig::TYPE_AFTER_REMOVING, -100);
+
+        return $this->containerBuilder = $container;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/DebugAutowiringCommand.php b/vendor/symfony/framework-bundle/Command/DebugAutowiringCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5023749a3078b42e897f911837333463ae449f4
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/DebugAutowiringCommand.php
@@ -0,0 +1,162 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Console\Descriptor\Descriptor;
+use Symfony\Component\Console\Formatter\OutputFormatterStyle;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
+
+/**
+ * A console command for autowiring information.
+ *
+ * @author Ryan Weaver <ryan@knpuniversity.com>
+ *
+ * @internal
+ */
+class DebugAutowiringCommand extends ContainerDebugCommand
+{
+    protected static $defaultName = 'debug:autowiring';
+    private $supportsHref;
+    private $fileLinkFormatter;
+
+    public function __construct(string $name = null, FileLinkFormatter $fileLinkFormatter = null)
+    {
+        $this->supportsHref = method_exists(OutputFormatterStyle::class, 'setHref');
+        $this->fileLinkFormatter = $fileLinkFormatter;
+        parent::__construct($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('search', InputArgument::OPTIONAL, 'A search filter'),
+                new InputOption('all', null, InputOption::VALUE_NONE, 'Show also services that are not aliased'),
+            ])
+            ->setDescription('List classes/interfaces you can use for autowiring')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command displays the classes and interfaces that
+you can use as type-hints for autowiring:
+
+  <info>php %command.full_name%</info>
+
+You can also pass a search term to filter the list:
+
+  <info>php %command.full_name% log</info>
+
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+        $errorIo = $io->getErrorStyle();
+
+        $builder = $this->getContainerBuilder();
+        $serviceIds = $builder->getServiceIds();
+        $serviceIds = array_filter($serviceIds, [$this, 'filterToServiceTypes']);
+
+        if ($search = $input->getArgument('search')) {
+            $serviceIds = array_filter($serviceIds, function ($serviceId) use ($search) {
+                return false !== stripos(str_replace('\\', '', $serviceId), $search) && !str_starts_with($serviceId, '.');
+            });
+
+            if (empty($serviceIds)) {
+                $errorIo->error(sprintf('No autowirable classes or interfaces found matching "%s"', $search));
+
+                return 1;
+            }
+        }
+
+        uasort($serviceIds, 'strnatcmp');
+
+        $io->title('Autowirable Types');
+        $io->text('The following classes & interfaces can be used as type-hints when autowiring:');
+        if ($search) {
+            $io->text(sprintf('(only showing classes/interfaces matching <comment>%s</comment>)', $search));
+        }
+        $hasAlias = [];
+        $all = $input->getOption('all');
+        $previousId = '-';
+        $serviceIdsNb = 0;
+        foreach ($serviceIds as $serviceId) {
+            $text = [];
+            $resolvedServiceId = $serviceId;
+            if (!str_starts_with($serviceId, $previousId)) {
+                $text[] = '';
+                if ('' !== $description = Descriptor::getClassDescription($serviceId, $resolvedServiceId)) {
+                    if (isset($hasAlias[$serviceId])) {
+                        continue;
+                    }
+                    $text[] = $description;
+                }
+                $previousId = $serviceId.' $';
+            }
+
+            $serviceLine = sprintf('<fg=yellow>%s</>', $serviceId);
+            if ($this->supportsHref && '' !== $fileLink = $this->getFileLink($serviceId)) {
+                $serviceLine = sprintf('<fg=yellow;href=%s>%s</>', $fileLink, $serviceId);
+            }
+
+            if ($builder->hasAlias($serviceId)) {
+                $hasAlias[$serviceId] = true;
+                $serviceAlias = $builder->getAlias($serviceId);
+                $serviceLine .= ' <fg=cyan>('.$serviceAlias.')</>';
+
+                if ($serviceAlias->isDeprecated()) {
+                    $serviceLine .= ' - <fg=magenta>deprecated</>';
+                }
+            } elseif (!$all) {
+                ++$serviceIdsNb;
+                continue;
+            }
+            $text[] = $serviceLine;
+            $io->text($text);
+        }
+
+        $io->newLine();
+
+        if (0 < $serviceIdsNb) {
+            $io->text(sprintf('%s more concrete service%s would be displayed when adding the "--all" option.', $serviceIdsNb, $serviceIdsNb > 1 ? 's' : ''));
+        }
+        if ($all) {
+            $io->text('Pro-tip: use interfaces in your type-hints instead of classes to benefit from the dependency inversion principle.');
+        }
+
+        $io->newLine();
+
+        return 0;
+    }
+
+    private function getFileLink(string $class): string
+    {
+        if (null === $this->fileLinkFormatter
+            || (null === $r = $this->getContainerBuilder()->getReflectionClass($class, false))) {
+            return '';
+        }
+
+        return (string) $this->fileLinkFormatter->format($r->getFileName(), $r->getStartLine());
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/EventDispatcherDebugCommand.php b/vendor/symfony/framework-bundle/Command/EventDispatcherDebugCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd0a1ccb800e78474136b60d5266cb303256b0e1
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/EventDispatcherDebugCommand.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Console\Helper\DescriptorHelper;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * A console command for retrieving information about event dispatcher.
+ *
+ * @author Matthieu Auger <mail@matthieuauger.com>
+ *
+ * @final
+ */
+class EventDispatcherDebugCommand extends Command
+{
+    protected static $defaultName = 'debug:event-dispatcher';
+    private $dispatcher;
+
+    public function __construct(EventDispatcherInterface $dispatcher)
+    {
+        parent::__construct();
+
+        $this->dispatcher = $dispatcher;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('event', InputArgument::OPTIONAL, 'An event name'),
+                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format  (txt, xml, json, or md)', 'txt'),
+                new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw description'),
+            ])
+            ->setDescription('Display configured listeners for an application')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command displays all configured listeners:
+
+  <info>php %command.full_name%</info>
+
+To get specific listeners for an event, specify its name:
+
+  <info>php %command.full_name% kernel.request</info>
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws \LogicException
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+
+        $options = [];
+        if ($event = $input->getArgument('event')) {
+            if (!$this->dispatcher->hasListeners($event)) {
+                $io->getErrorStyle()->warning(sprintf('The event "%s" does not have any registered listeners.', $event));
+
+                return 0;
+            }
+
+            $options = ['event' => $event];
+        }
+
+        $helper = new DescriptorHelper();
+        $options['format'] = $input->getOption('format');
+        $options['raw_text'] = $input->getOption('raw');
+        $options['output'] = $io;
+        $helper->describe($io, $this->dispatcher, $options);
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/RouterDebugCommand.php b/vendor/symfony/framework-bundle/Command/RouterDebugCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..7758bc949fb45e2d575e942d6d69797fa62ad7cb
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/RouterDebugCommand.php
@@ -0,0 +1,149 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Console\Helper\DescriptorHelper;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RouterInterface;
+
+/**
+ * A console command for retrieving information about routes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ *
+ * @final
+ */
+class RouterDebugCommand extends Command
+{
+    protected static $defaultName = 'debug:router';
+    private $router;
+    private $fileLinkFormatter;
+
+    public function __construct(RouterInterface $router, FileLinkFormatter $fileLinkFormatter = null)
+    {
+        parent::__construct();
+
+        $this->router = $router;
+        $this->fileLinkFormatter = $fileLinkFormatter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('name', InputArgument::OPTIONAL, 'A route name'),
+                new InputOption('show-controllers', null, InputOption::VALUE_NONE, 'Show assigned controllers in overview'),
+                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
+                new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw route(s)'),
+            ])
+            ->setDescription('Display current routes for an application')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> displays the configured routes:
+
+  <info>php %command.full_name%</info>
+
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws InvalidArgumentException When route does not exist
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+        $name = $input->getArgument('name');
+        $helper = new DescriptorHelper($this->fileLinkFormatter);
+        $routes = $this->router->getRouteCollection();
+
+        if ($name) {
+            $route = $routes->get($name);
+            $matchingRoutes = $this->findRouteNameContaining($name, $routes);
+
+            if (!$input->isInteractive() && !$route && \count($matchingRoutes) > 1) {
+                $helper->describe($io, $this->findRouteContaining($name, $routes), [
+                    'format' => $input->getOption('format'),
+                    'raw_text' => $input->getOption('raw'),
+                    'show_controllers' => $input->getOption('show-controllers'),
+                    'output' => $io,
+                ]);
+
+                return 0;
+            }
+
+            if (!$route && $matchingRoutes) {
+                $default = 1 === \count($matchingRoutes) ? $matchingRoutes[0] : null;
+                $name = $io->choice('Select one of the matching routes', $matchingRoutes, $default);
+                $route = $routes->get($name);
+            }
+
+            if (!$route) {
+                throw new InvalidArgumentException(sprintf('The route "%s" does not exist.', $name));
+            }
+
+            $helper->describe($io, $route, [
+                'format' => $input->getOption('format'),
+                'raw_text' => $input->getOption('raw'),
+                'name' => $name,
+                'output' => $io,
+            ]);
+        } else {
+            $helper->describe($io, $routes, [
+                'format' => $input->getOption('format'),
+                'raw_text' => $input->getOption('raw'),
+                'show_controllers' => $input->getOption('show-controllers'),
+                'output' => $io,
+            ]);
+        }
+
+        return 0;
+    }
+
+    private function findRouteNameContaining(string $name, RouteCollection $routes): array
+    {
+        $foundRoutesNames = [];
+        foreach ($routes as $routeName => $route) {
+            if (false !== stripos($routeName, $name)) {
+                $foundRoutesNames[] = $routeName;
+            }
+        }
+
+        return $foundRoutesNames;
+    }
+
+    private function findRouteContaining(string $name, RouteCollection $routes): RouteCollection
+    {
+        $foundRoutes = new RouteCollection();
+        foreach ($routes as $routeName => $route) {
+            if (false !== stripos($routeName, $name)) {
+                $foundRoutes->add($routeName, $route);
+            }
+        }
+
+        return $foundRoutes;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/RouterMatchCommand.php b/vendor/symfony/framework-bundle/Command/RouterMatchCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..8dd5b545b40c9054df667787195c205a8c858261
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/RouterMatchCommand.php
@@ -0,0 +1,119 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Routing\Matcher\TraceableUrlMatcher;
+use Symfony\Component\Routing\RouterInterface;
+
+/**
+ * A console command to test route matching.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @final
+ */
+class RouterMatchCommand extends Command
+{
+    protected static $defaultName = 'router:match';
+
+    private $router;
+
+    public function __construct(RouterInterface $router)
+    {
+        parent::__construct();
+
+        $this->router = $router;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('path_info', InputArgument::REQUIRED, 'A path info'),
+                new InputOption('method', null, InputOption::VALUE_REQUIRED, 'Set the HTTP method'),
+                new InputOption('scheme', null, InputOption::VALUE_REQUIRED, 'Set the URI scheme (usually http or https)'),
+                new InputOption('host', null, InputOption::VALUE_REQUIRED, 'Set the URI host'),
+            ])
+            ->setDescription('Help debug routes by simulating a path info match')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> shows which routes match a given request and which don't and for what reason:
+
+  <info>php %command.full_name% /foo</info>
+
+or
+
+  <info>php %command.full_name% /foo --method POST --scheme https --host symfony.com --verbose</info>
+
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+
+        $context = $this->router->getContext();
+        if (null !== $method = $input->getOption('method')) {
+            $context->setMethod($method);
+        }
+        if (null !== $scheme = $input->getOption('scheme')) {
+            $context->setScheme($scheme);
+        }
+        if (null !== $host = $input->getOption('host')) {
+            $context->setHost($host);
+        }
+
+        $matcher = new TraceableUrlMatcher($this->router->getRouteCollection(), $context);
+
+        $traces = $matcher->getTraces($input->getArgument('path_info'));
+
+        $io->newLine();
+
+        $matches = false;
+        foreach ($traces as $trace) {
+            if (TraceableUrlMatcher::ROUTE_ALMOST_MATCHES == $trace['level']) {
+                $io->text(sprintf('Route <info>"%s"</> almost matches but %s', $trace['name'], lcfirst($trace['log'])));
+            } elseif (TraceableUrlMatcher::ROUTE_MATCHES == $trace['level']) {
+                $io->success(sprintf('Route "%s" matches', $trace['name']));
+
+                $routerDebugCommand = $this->getApplication()->find('debug:router');
+                $routerDebugCommand->run(new ArrayInput(['name' => $trace['name']]), $output);
+
+                $matches = true;
+            } elseif ($input->getOption('verbose')) {
+                $io->text(sprintf('Route "%s" does not match: %s', $trace['name'], $trace['log']));
+            }
+        }
+
+        if (!$matches) {
+            $io->error(sprintf('None of the routes match the path "%s"', $input->getArgument('path_info')));
+
+            return 1;
+        }
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php b/vendor/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d8820443a2c172424aaf6b9012098bf73e902e5
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Secrets\AbstractVault;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+final class SecretsDecryptToLocalCommand extends Command
+{
+    protected static $defaultName = 'secrets:decrypt-to-local';
+
+    private $vault;
+    private $localVault;
+
+    public function __construct(AbstractVault $vault, AbstractVault $localVault = null)
+    {
+        $this->vault = $vault;
+        $this->localVault = $localVault;
+
+        parent::__construct();
+    }
+
+    protected function configure()
+    {
+        $this
+            ->setDescription('Decrypt all secrets and stores them in the local vault.')
+            ->addOption('force', 'f', InputOption::VALUE_NONE, 'Force overriding of secrets that already exist in the local vault')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command decrypts all secrets and copies them in the local vault.
+
+    <info>%command.full_name%</info>
+
+When the option <info>--force</info> is provided, secrets that already exist in the local vault are overriden.
+
+    <info>%command.full_name% --force</info>
+EOF
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output);
+
+        if (null === $this->localVault) {
+            $io->error('The local vault is disabled.');
+
+            return 1;
+        }
+
+        $secrets = $this->vault->list(true);
+
+        if (!$input->getOption('force')) {
+            foreach ($this->localVault->list() as $k => $v) {
+                unset($secrets[$k]);
+            }
+        }
+
+        foreach ($secrets as $k => $v) {
+            if (null === $v) {
+                $io->error($this->vault->getLastMessage() ?? sprintf('Secret "%s" has been skipped as there was an error reading it.', $k));
+                continue;
+            }
+
+            $this->localVault->seal($k, $v);
+        }
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php b/vendor/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..14e7c51e6df53d4aca3d56225d7509e10c2ab191
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php
@@ -0,0 +1,78 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Secrets\AbstractVault;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+final class SecretsEncryptFromLocalCommand extends Command
+{
+    protected static $defaultName = 'secrets:encrypt-from-local';
+
+    private $vault;
+    private $localVault;
+
+    public function __construct(AbstractVault $vault, AbstractVault $localVault = null)
+    {
+        $this->vault = $vault;
+        $this->localVault = $localVault;
+
+        parent::__construct();
+    }
+
+    protected function configure()
+    {
+        $this
+            ->setDescription('Encrypt all local secrets to the vault.')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command encrypts all locally overridden secrets to the vault.
+
+    <info>%command.full_name%</info>
+EOF
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output);
+
+        if (null === $this->localVault) {
+            $io->error('The local vault is disabled.');
+
+            return 1;
+        }
+
+        foreach ($this->vault->list(true) as $name => $value) {
+            $localValue = $this->localVault->reveal($name);
+
+            if (null !== $localValue && $value !== $localValue) {
+                $this->vault->seal($name, $localValue);
+            } elseif (null !== $message = $this->localVault->getLastMessage()) {
+                $io->error($message);
+
+                return 1;
+            }
+        }
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php b/vendor/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..f0497815627cd820c1b5dbc5ce05ffacfe63d5b5
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php
@@ -0,0 +1,125 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Secrets\AbstractVault;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * @author Tobias Schultze <http://tobion.de>
+ * @author Jérémy Derussé <jeremy@derusse.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+final class SecretsGenerateKeysCommand extends Command
+{
+    protected static $defaultName = 'secrets:generate-keys';
+
+    private $vault;
+    private $localVault;
+
+    public function __construct(AbstractVault $vault, AbstractVault $localVault = null)
+    {
+        $this->vault = $vault;
+        $this->localVault = $localVault;
+
+        parent::__construct();
+    }
+
+    protected function configure()
+    {
+        $this
+            ->setDescription('Generate new encryption keys.')
+            ->addOption('local', 'l', InputOption::VALUE_NONE, 'Update the local vault.')
+            ->addOption('rotate', 'r', InputOption::VALUE_NONE, 'Re-encrypt existing secrets with the newly generated keys.')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command generates a new encryption key.
+
+    <info>%command.full_name%</info>
+
+If encryption keys already exist, the command must be called with
+the <info>--rotate</info> option in order to override those keys and re-encrypt
+existing secrets.
+
+    <info>%command.full_name% --rotate</info>
+EOF
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output);
+        $vault = $input->getOption('local') ? $this->localVault : $this->vault;
+
+        if (null === $vault) {
+            $io->success('The local vault is disabled.');
+
+            return 1;
+        }
+
+        if (!$input->getOption('rotate')) {
+            if ($vault->generateKeys()) {
+                $io->success($vault->getLastMessage());
+
+                if ($this->vault === $vault) {
+                    $io->caution('DO NOT COMMIT THE DECRYPTION KEY FOR THE PROD ENVIRONMENT⚠️');
+                }
+
+                return 0;
+            }
+
+            $io->warning($vault->getLastMessage());
+
+            return 1;
+        }
+
+        $secrets = [];
+        foreach ($vault->list(true) as $name => $value) {
+            if (null === $value) {
+                $io->error($vault->getLastMessage());
+
+                return 1;
+            }
+
+            $secrets[$name] = $value;
+        }
+
+        if (!$vault->generateKeys(true)) {
+            $io->warning($vault->getLastMessage());
+
+            return 1;
+        }
+
+        $io->success($vault->getLastMessage());
+
+        if ($secrets) {
+            foreach ($secrets as $name => $value) {
+                $vault->seal($name, $value);
+            }
+
+            $io->comment('Existing secrets have been rotated to the new keys.');
+        }
+
+        if ($this->vault === $vault) {
+            $io->caution('DO NOT COMMIT THE DECRYPTION KEY FOR THE PROD ENVIRONMENT⚠️');
+        }
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/SecretsListCommand.php b/vendor/symfony/framework-bundle/Command/SecretsListCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..4586677f785dfa4941e0fba0281c3865966bec52
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/SecretsListCommand.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Secrets\AbstractVault;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\Dumper;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * @author Tobias Schultze <http://tobion.de>
+ * @author Jérémy Derussé <jeremy@derusse.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+final class SecretsListCommand extends Command
+{
+    protected static $defaultName = 'secrets:list';
+
+    private $vault;
+    private $localVault;
+
+    public function __construct(AbstractVault $vault, AbstractVault $localVault = null)
+    {
+        $this->vault = $vault;
+        $this->localVault = $localVault;
+
+        parent::__construct();
+    }
+
+    protected function configure()
+    {
+        $this
+            ->setDescription('List all secrets.')
+            ->addOption('reveal', 'r', InputOption::VALUE_NONE, 'Display decrypted values alongside names')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command list all stored secrets.
+
+    <info>%command.full_name%</info>
+
+When the option <info>--reveal</info> is provided, the decrypted secrets are also displayed.
+
+    <info>%command.full_name% --reveal</info>
+EOF
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output);
+
+        $io->comment('Use <info>"%env(<name>)%"</info> to reference a secret in a config file.');
+
+        if (!$reveal = $input->getOption('reveal')) {
+            $io->comment(sprintf('To reveal the secrets run <info>php %s %s --reveal</info>', $_SERVER['PHP_SELF'], $this->getName()));
+        }
+
+        $secrets = $this->vault->list($reveal);
+        $localSecrets = null !== $this->localVault ? $this->localVault->list($reveal) : null;
+
+        $rows = [];
+
+        $dump = new Dumper($output);
+        $dump = static function (?string $v) use ($dump) {
+            return null === $v ? '******' : $dump($v);
+        };
+
+        foreach ($secrets as $name => $value) {
+            $rows[$name] = [$name, $dump($value)];
+        }
+
+        if (null !== $message = $this->vault->getLastMessage()) {
+            $io->comment($message);
+        }
+
+        foreach ($localSecrets ?? [] as $name => $value) {
+            if (isset($rows[$name])) {
+                $rows[$name][] = $dump($value);
+            }
+        }
+
+        if (null !== $this->localVault && null !== $message = $this->localVault->getLastMessage()) {
+            $io->comment($message);
+        }
+
+        (new SymfonyStyle($input, $output))
+            ->table(['Secret', 'Value'] + (null !== $localSecrets ? [2 => 'Local Value'] : []), $rows);
+
+        $io->comment("Local values override secret values.\nUse <info>secrets:set --local</info> to define them.");
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/SecretsRemoveCommand.php b/vendor/symfony/framework-bundle/Command/SecretsRemoveCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..f4c40a8fdec8c01775e6c96b7a5a228310543dac
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/SecretsRemoveCommand.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Secrets\AbstractVault;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * @author Jérémy Derussé <jeremy@derusse.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+final class SecretsRemoveCommand extends Command
+{
+    protected static $defaultName = 'secrets:remove';
+
+    private $vault;
+    private $localVault;
+
+    public function __construct(AbstractVault $vault, AbstractVault $localVault = null)
+    {
+        $this->vault = $vault;
+        $this->localVault = $localVault;
+
+        parent::__construct();
+    }
+
+    protected function configure()
+    {
+        $this
+            ->setDescription('Remove a secret from the vault.')
+            ->addArgument('name', InputArgument::REQUIRED, 'The name of the secret')
+            ->addOption('local', 'l', InputOption::VALUE_NONE, 'Update the local vault.')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command removes a secret from the vault.
+
+    <info>%command.full_name% <name></info>
+EOF
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output);
+        $vault = $input->getOption('local') ? $this->localVault : $this->vault;
+
+        if (null === $vault) {
+            $io->success('The local vault is disabled.');
+
+            return 1;
+        }
+
+        if ($vault->remove($name = $input->getArgument('name'))) {
+            $io->success($vault->getLastMessage() ?? 'Secret was removed from the vault.');
+        } else {
+            $io->comment($vault->getLastMessage() ?? 'Secret was not found in the vault.');
+        }
+
+        if ($this->vault === $vault && null !== $this->localVault->reveal($name)) {
+            $io->comment('Note that this secret is overridden in the local vault.');
+        }
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/SecretsSetCommand.php b/vendor/symfony/framework-bundle/Command/SecretsSetCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad7559d3f7ce3b72a004730955ad24d68fda18fb
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/SecretsSetCommand.php
@@ -0,0 +1,139 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Secrets\AbstractVault;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * @author Tobias Schultze <http://tobion.de>
+ * @author Jérémy Derussé <jeremy@derusse.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+final class SecretsSetCommand extends Command
+{
+    protected static $defaultName = 'secrets:set';
+
+    private $vault;
+    private $localVault;
+
+    public function __construct(AbstractVault $vault, AbstractVault $localVault = null)
+    {
+        $this->vault = $vault;
+        $this->localVault = $localVault;
+
+        parent::__construct();
+    }
+
+    protected function configure()
+    {
+        $this
+            ->setDescription('Set a secret in the vault.')
+            ->addArgument('name', InputArgument::REQUIRED, 'The name of the secret')
+            ->addArgument('file', InputArgument::OPTIONAL, 'A file where to read the secret from or "-" for reading from STDIN')
+            ->addOption('local', 'l', InputOption::VALUE_NONE, 'Update the local vault.')
+            ->addOption('random', 'r', InputOption::VALUE_OPTIONAL, 'Generate a random value.', false)
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command stores a secret in the vault.
+
+    <info>%command.full_name% <name></info>
+
+To reference secrets in services.yaml or any other config
+files, use <info>"%env(<name>)%"</info>.
+
+By default, the secret value should be entered interactively.
+Alternatively, provide a file where to read the secret from:
+
+    <info>php %command.full_name% <name> filename</info>
+
+Use "-" as a file name to read from STDIN:
+
+    <info>cat filename | php %command.full_name% <name> -</info>
+
+Use <info>--local</info> to override secrets for local needs.
+EOF
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $errOutput = $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output;
+        $io = new SymfonyStyle($input, $errOutput);
+        $name = $input->getArgument('name');
+        $vault = $input->getOption('local') ? $this->localVault : $this->vault;
+
+        if (null === $vault) {
+            $io->error('The local vault is disabled.');
+
+            return 1;
+        }
+
+        if ($this->localVault === $vault && !\array_key_exists($name, $this->vault->list())) {
+            $io->error(sprintf('Secret "%s" does not exist in the vault, you cannot override it locally.', $name));
+
+            return 1;
+        }
+
+        if (0 < $random = $input->getOption('random') ?? 16) {
+            $value = strtr(substr(base64_encode(random_bytes($random)), 0, $random), '+/', '-_');
+        } elseif (!$file = $input->getArgument('file')) {
+            $value = $io->askHidden('Please type the secret value');
+
+            if (null === $value) {
+                $io->warning('No value provided: using empty string');
+                $value = '';
+            }
+        } elseif ('-' === $file) {
+            $value = file_get_contents('php://stdin');
+        } elseif (is_file($file) && is_readable($file)) {
+            $value = file_get_contents($file);
+        } elseif (!is_file($file)) {
+            throw new \InvalidArgumentException(sprintf('File not found: "%s".', $file));
+        } elseif (!is_readable($file)) {
+            throw new \InvalidArgumentException(sprintf('File is not readable: "%s".', $file));
+        }
+
+        if ($vault->generateKeys()) {
+            $io->success($vault->getLastMessage());
+
+            if ($this->vault === $vault) {
+                $io->caution('DO NOT COMMIT THE DECRYPTION KEY FOR THE PROD ENVIRONMENT⚠️');
+            }
+        }
+
+        $vault->seal($name, $value);
+
+        $io->success($vault->getLastMessage() ?? 'Secret was successfully stored in the vault.');
+
+        if (0 < $random) {
+            $errOutput->write(' // The generated random value is: <comment>');
+            $output->write($value);
+            $errOutput->writeln('</comment>');
+            $io->newLine();
+        }
+
+        if ($this->vault === $vault && null !== $this->localVault->reveal($name)) {
+            $io->comment('Note that this secret is overridden in the local vault.');
+        }
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/TranslationDebugCommand.php b/vendor/symfony/framework-bundle/Command/TranslationDebugCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..984c72e59f7956ae5b440348374fa5e49e12dc6e
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/TranslationDebugCommand.php
@@ -0,0 +1,397 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\HttpKernel\KernelInterface;
+use Symfony\Component\Translation\Catalogue\MergeOperation;
+use Symfony\Component\Translation\DataCollectorTranslator;
+use Symfony\Component\Translation\Extractor\ExtractorInterface;
+use Symfony\Component\Translation\LoggingTranslator;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\Reader\TranslationReaderInterface;
+use Symfony\Component\Translation\Translator;
+use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
+
+/**
+ * Helps finding unused or missing translation messages in a given locale
+ * and comparing them with the fallback ones.
+ *
+ * @author Florian Voutzinos <florian@voutzinos.com>
+ *
+ * @final
+ */
+class TranslationDebugCommand extends Command
+{
+    public const MESSAGE_MISSING = 0;
+    public const MESSAGE_UNUSED = 1;
+    public const MESSAGE_EQUALS_FALLBACK = 2;
+
+    protected static $defaultName = 'debug:translation';
+
+    private $translator;
+    private $reader;
+    private $extractor;
+    private $defaultTransPath;
+    private $defaultViewsPath;
+    private $transPaths;
+    private $viewsPaths;
+
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function __construct($translator, TranslationReaderInterface $reader, ExtractorInterface $extractor, string $defaultTransPath = null, string $defaultViewsPath = null, array $transPaths = [], array $viewsPaths = [])
+    {
+        if (!$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) {
+            throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be an instance of "%s", "%s" given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
+        }
+        parent::__construct();
+
+        $this->translator = $translator;
+        $this->reader = $reader;
+        $this->extractor = $extractor;
+        $this->defaultTransPath = $defaultTransPath;
+        $this->defaultViewsPath = $defaultViewsPath;
+        $this->transPaths = $transPaths;
+        $this->viewsPaths = $viewsPaths;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('locale', InputArgument::REQUIRED, 'The locale'),
+                new InputArgument('bundle', InputArgument::OPTIONAL, 'The bundle name or directory where to load the messages'),
+                new InputOption('domain', null, InputOption::VALUE_OPTIONAL, 'The messages domain'),
+                new InputOption('only-missing', null, InputOption::VALUE_NONE, 'Display only missing messages'),
+                new InputOption('only-unused', null, InputOption::VALUE_NONE, 'Display only unused messages'),
+                new InputOption('all', null, InputOption::VALUE_NONE, 'Load messages from all registered bundles'),
+            ])
+            ->setDescription('Display translation messages information')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command helps finding unused or missing translation
+messages and comparing them with the fallback ones by inspecting the
+templates and translation files of a given bundle or the default translations directory.
+
+You can display information about bundle translations in a specific locale:
+
+  <info>php %command.full_name% en AcmeDemoBundle</info>
+
+You can also specify a translation domain for the search:
+
+  <info>php %command.full_name% --domain=messages en AcmeDemoBundle</info>
+
+You can only display missing messages:
+
+  <info>php %command.full_name% --only-missing en AcmeDemoBundle</info>
+
+You can only display unused messages:
+
+  <info>php %command.full_name% --only-unused en AcmeDemoBundle</info>
+
+You can display information about application translations in a specific locale:
+
+  <info>php %command.full_name% en</info>
+
+You can display information about translations in all registered bundles in a specific locale:
+
+  <info>php %command.full_name% --all en</info>
+
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+
+        $locale = $input->getArgument('locale');
+        $domain = $input->getOption('domain');
+        /** @var KernelInterface $kernel */
+        $kernel = $this->getApplication()->getKernel();
+        $rootDir = $kernel->getContainer()->getParameter('kernel.root_dir');
+
+        // Define Root Paths
+        $transPaths = $this->transPaths;
+        if (is_dir($dir = $rootDir.'/Resources/translations')) {
+            if ($dir !== $this->defaultTransPath) {
+                $notice = sprintf('Storing translations in the "%s" directory is deprecated since Symfony 4.2, ', $dir);
+                @trigger_error($notice.($this->defaultTransPath ? sprintf('use the "%s" directory instead.', $this->defaultTransPath) : 'configure and use "framework.translator.default_path" instead.'), \E_USER_DEPRECATED);
+            }
+            $transPaths[] = $dir;
+        }
+        if ($this->defaultTransPath) {
+            $transPaths[] = $this->defaultTransPath;
+        }
+        $viewsPaths = $this->viewsPaths;
+        if (is_dir($dir = $rootDir.'/Resources/views')) {
+            if ($dir !== $this->defaultViewsPath) {
+                $notice = sprintf('Loading Twig templates from the "%s" directory is deprecated since Symfony 4.2, ', $dir);
+                @trigger_error($notice.($this->defaultViewsPath ? sprintf('use the "%s" directory instead.', $this->defaultViewsPath) : 'configure and use "twig.default_path" instead.'), \E_USER_DEPRECATED);
+            }
+            $viewsPaths[] = $dir;
+        }
+        if ($this->defaultViewsPath) {
+            $viewsPaths[] = $this->defaultViewsPath;
+        }
+
+        // Override with provided Bundle info
+        if (null !== $input->getArgument('bundle')) {
+            try {
+                $bundle = $kernel->getBundle($input->getArgument('bundle'));
+                $bundleDir = $bundle->getPath();
+                $transPaths = [is_dir($bundleDir.'/Resources/translations') ? $bundleDir.'/Resources/translations' : $bundleDir.'/translations'];
+                $viewsPaths = [is_dir($bundleDir.'/Resources/views') ? $bundleDir.'/Resources/views' : $bundleDir.'/templates'];
+                if ($this->defaultTransPath) {
+                    $transPaths[] = $this->defaultTransPath;
+                }
+                if (is_dir($dir = sprintf('%s/Resources/%s/translations', $rootDir, $bundle->getName()))) {
+                    $transPaths[] = $dir;
+                    $notice = sprintf('Storing translations files for "%s" in the "%s" directory is deprecated since Symfony 4.2, ', $dir, $bundle->getName());
+                    @trigger_error($notice.($this->defaultTransPath ? sprintf('use the "%s" directory instead.', $this->defaultTransPath) : 'configure and use "framework.translator.default_path" instead.'), \E_USER_DEPRECATED);
+                }
+                if ($this->defaultViewsPath) {
+                    $viewsPaths[] = $this->defaultViewsPath;
+                }
+                if (is_dir($dir = sprintf('%s/Resources/%s/views', $rootDir, $bundle->getName()))) {
+                    $viewsPaths[] = $dir;
+                    $notice = sprintf('Loading Twig templates for "%s" from the "%s" directory is deprecated since Symfony 4.2, ', $bundle->getName(), $dir);
+                    @trigger_error($notice.($this->defaultViewsPath ? sprintf('use the "%s" directory instead.', $this->defaultViewsPath) : 'configure and use "twig.default_path" instead.'), \E_USER_DEPRECATED);
+                }
+            } catch (\InvalidArgumentException $e) {
+                // such a bundle does not exist, so treat the argument as path
+                $path = $input->getArgument('bundle');
+
+                $transPaths = [$path.'/translations'];
+                if (is_dir($dir = $path.'/Resources/translations')) {
+                    if ($dir !== $this->defaultTransPath) {
+                        @trigger_error(sprintf('Storing translations in the "%s" directory is deprecated since Symfony 4.2, use the "%s" directory instead.', $dir, $path.'/translations'), \E_USER_DEPRECATED);
+                    }
+                    $transPaths[] = $dir;
+                }
+
+                $viewsPaths = [$path.'/templates'];
+                if (is_dir($dir = $path.'/Resources/views')) {
+                    if ($dir !== $this->defaultViewsPath) {
+                        @trigger_error(sprintf('Loading Twig templates from the "%s" directory is deprecated since Symfony 4.2, use the "%s" directory instead.', $dir, $path.'/templates'), \E_USER_DEPRECATED);
+                    }
+                    $viewsPaths[] = $dir;
+                }
+
+                if (!is_dir($transPaths[0]) && !isset($transPaths[1])) {
+                    throw new InvalidArgumentException(sprintf('"%s" is neither an enabled bundle nor a directory.', $transPaths[0]));
+                }
+            }
+        } elseif ($input->getOption('all')) {
+            foreach ($kernel->getBundles() as $bundle) {
+                $bundleDir = $bundle->getPath();
+                $transPaths[] = is_dir($bundleDir.'/Resources/translations') ? $bundleDir.'/Resources/translations' : $bundle->getPath().'/translations';
+                $viewsPaths[] = is_dir($bundleDir.'/Resources/views') ? $bundleDir.'/Resources/views' : $bundle->getPath().'/templates';
+                if (is_dir($deprecatedPath = sprintf('%s/Resources/%s/translations', $rootDir, $bundle->getName()))) {
+                    $transPaths[] = $deprecatedPath;
+                    $notice = sprintf('Storing translations files for "%s" in the "%s" directory is deprecated since Symfony 4.2, ', $bundle->getName(), $deprecatedPath);
+                    @trigger_error($notice.($this->defaultTransPath ? sprintf('use the "%s" directory instead.', $this->defaultTransPath) : 'configure and use "framework.translator.default_path" instead.'), \E_USER_DEPRECATED);
+                }
+                if (is_dir($deprecatedPath = sprintf('%s/Resources/%s/views', $rootDir, $bundle->getName()))) {
+                    $viewsPaths[] = $deprecatedPath;
+                    $notice = sprintf('Loading Twig templates for "%s" from the "%s" directory is deprecated since Symfony 4.2, ', $bundle->getName(), $deprecatedPath);
+                    @trigger_error($notice.($this->defaultViewsPath ? sprintf('use the "%s" directory instead.', $this->defaultViewsPath) : 'configure and use "twig.default_path" instead.'), \E_USER_DEPRECATED);
+                }
+            }
+        }
+
+        // Extract used messages
+        $extractedCatalogue = $this->extractMessages($locale, $viewsPaths);
+
+        // Load defined messages
+        $currentCatalogue = $this->loadCurrentMessages($locale, $transPaths);
+
+        // Merge defined and extracted messages to get all message ids
+        $mergeOperation = new MergeOperation($extractedCatalogue, $currentCatalogue);
+        $allMessages = $mergeOperation->getResult()->all($domain);
+        if (null !== $domain) {
+            $allMessages = [$domain => $allMessages];
+        }
+
+        // No defined or extracted messages
+        if (empty($allMessages) || null !== $domain && empty($allMessages[$domain])) {
+            $outputMessage = sprintf('No defined or extracted messages for locale "%s"', $locale);
+
+            if (null !== $domain) {
+                $outputMessage .= sprintf(' and domain "%s"', $domain);
+            }
+
+            $io->getErrorStyle()->warning($outputMessage);
+
+            return 0;
+        }
+
+        // Load the fallback catalogues
+        $fallbackCatalogues = $this->loadFallbackCatalogues($locale, $transPaths);
+
+        // Display header line
+        $headers = ['State', 'Domain', 'Id', sprintf('Message Preview (%s)', $locale)];
+        foreach ($fallbackCatalogues as $fallbackCatalogue) {
+            $headers[] = sprintf('Fallback Message Preview (%s)', $fallbackCatalogue->getLocale());
+        }
+        $rows = [];
+        // Iterate all message ids and determine their state
+        foreach ($allMessages as $domain => $messages) {
+            foreach (array_keys($messages) as $messageId) {
+                $value = $currentCatalogue->get($messageId, $domain);
+                $states = [];
+
+                if ($extractedCatalogue->defines($messageId, $domain)) {
+                    if (!$currentCatalogue->defines($messageId, $domain)) {
+                        $states[] = self::MESSAGE_MISSING;
+                    }
+                } elseif ($currentCatalogue->defines($messageId, $domain)) {
+                    $states[] = self::MESSAGE_UNUSED;
+                }
+
+                if (!\in_array(self::MESSAGE_UNUSED, $states) && true === $input->getOption('only-unused')
+                    || !\in_array(self::MESSAGE_MISSING, $states) && true === $input->getOption('only-missing')) {
+                    continue;
+                }
+
+                foreach ($fallbackCatalogues as $fallbackCatalogue) {
+                    if ($fallbackCatalogue->defines($messageId, $domain) && $value === $fallbackCatalogue->get($messageId, $domain)) {
+                        $states[] = self::MESSAGE_EQUALS_FALLBACK;
+
+                        break;
+                    }
+                }
+
+                $row = [$this->formatStates($states), $domain, $this->formatId($messageId), $this->sanitizeString($value)];
+                foreach ($fallbackCatalogues as $fallbackCatalogue) {
+                    $row[] = $this->sanitizeString($fallbackCatalogue->get($messageId, $domain));
+                }
+
+                $rows[] = $row;
+            }
+        }
+
+        $io->table($headers, $rows);
+
+        return 0;
+    }
+
+    private function formatState(int $state): string
+    {
+        if (self::MESSAGE_MISSING === $state) {
+            return '<error> missing </error>';
+        }
+
+        if (self::MESSAGE_UNUSED === $state) {
+            return '<comment> unused </comment>';
+        }
+
+        if (self::MESSAGE_EQUALS_FALLBACK === $state) {
+            return '<info> fallback </info>';
+        }
+
+        return $state;
+    }
+
+    private function formatStates(array $states): string
+    {
+        $result = [];
+        foreach ($states as $state) {
+            $result[] = $this->formatState($state);
+        }
+
+        return implode(' ', $result);
+    }
+
+    private function formatId(string $id): string
+    {
+        return sprintf('<fg=cyan;options=bold>%s</>', $id);
+    }
+
+    private function sanitizeString(string $string, int $length = 40): string
+    {
+        $string = trim(preg_replace('/\s+/', ' ', $string));
+
+        if (false !== $encoding = mb_detect_encoding($string, null, true)) {
+            if (mb_strlen($string, $encoding) > $length) {
+                return mb_substr($string, 0, $length - 3, $encoding).'...';
+            }
+        } elseif (\strlen($string) > $length) {
+            return substr($string, 0, $length - 3).'...';
+        }
+
+        return $string;
+    }
+
+    private function extractMessages(string $locale, array $transPaths): MessageCatalogue
+    {
+        $extractedCatalogue = new MessageCatalogue($locale);
+        foreach ($transPaths as $path) {
+            if (is_dir($path) || is_file($path)) {
+                $this->extractor->extract($path, $extractedCatalogue);
+            }
+        }
+
+        return $extractedCatalogue;
+    }
+
+    private function loadCurrentMessages(string $locale, array $transPaths): MessageCatalogue
+    {
+        $currentCatalogue = new MessageCatalogue($locale);
+        foreach ($transPaths as $path) {
+            if (is_dir($path)) {
+                $this->reader->read($path, $currentCatalogue);
+            }
+        }
+
+        return $currentCatalogue;
+    }
+
+    /**
+     * @return MessageCatalogue[]
+     */
+    private function loadFallbackCatalogues(string $locale, array $transPaths): array
+    {
+        $fallbackCatalogues = [];
+        if ($this->translator instanceof Translator || $this->translator instanceof DataCollectorTranslator || $this->translator instanceof LoggingTranslator) {
+            foreach ($this->translator->getFallbackLocales() as $fallbackLocale) {
+                if ($fallbackLocale === $locale) {
+                    continue;
+                }
+
+                $fallbackCatalogue = new MessageCatalogue($fallbackLocale);
+                foreach ($transPaths as $path) {
+                    if (is_dir($path)) {
+                        $this->reader->read($path, $fallbackCatalogue);
+                    }
+                }
+                $fallbackCatalogues[] = $fallbackCatalogue;
+            }
+        }
+
+        return $fallbackCatalogues;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/TranslationUpdateCommand.php b/vendor/symfony/framework-bundle/Command/TranslationUpdateCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..1004ae7899dc699078b0b25e03ffbb55bfab5877
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/TranslationUpdateCommand.php
@@ -0,0 +1,385 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\HttpKernel\KernelInterface;
+use Symfony\Component\Translation\Catalogue\MergeOperation;
+use Symfony\Component\Translation\Catalogue\TargetOperation;
+use Symfony\Component\Translation\Extractor\ExtractorInterface;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\MessageCatalogueInterface;
+use Symfony\Component\Translation\Reader\TranslationReaderInterface;
+use Symfony\Component\Translation\Writer\TranslationWriterInterface;
+
+/**
+ * A command that parses templates to extract translation messages and adds them
+ * into the translation files.
+ *
+ * @author Michel Salib <michelsalib@hotmail.com>
+ *
+ * @final
+ */
+class TranslationUpdateCommand extends Command
+{
+    private const ASC = 'asc';
+    private const DESC = 'desc';
+    private const SORT_ORDERS = [self::ASC, self::DESC];
+
+    protected static $defaultName = 'translation:update';
+
+    private $writer;
+    private $reader;
+    private $extractor;
+    private $defaultLocale;
+    private $defaultTransPath;
+    private $defaultViewsPath;
+    private $transPaths;
+    private $viewsPaths;
+
+    public function __construct(TranslationWriterInterface $writer, TranslationReaderInterface $reader, ExtractorInterface $extractor, string $defaultLocale, string $defaultTransPath = null, string $defaultViewsPath = null, array $transPaths = [], array $viewsPaths = [])
+    {
+        parent::__construct();
+
+        $this->writer = $writer;
+        $this->reader = $reader;
+        $this->extractor = $extractor;
+        $this->defaultLocale = $defaultLocale;
+        $this->defaultTransPath = $defaultTransPath;
+        $this->defaultViewsPath = $defaultViewsPath;
+        $this->transPaths = $transPaths;
+        $this->viewsPaths = $viewsPaths;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('locale', InputArgument::REQUIRED, 'The locale'),
+                new InputArgument('bundle', InputArgument::OPTIONAL, 'The bundle name or directory where to load the messages'),
+                new InputOption('prefix', null, InputOption::VALUE_OPTIONAL, 'Override the default prefix', '__'),
+                new InputOption('output-format', null, InputOption::VALUE_OPTIONAL, 'Override the default output format', 'xlf'),
+                new InputOption('dump-messages', null, InputOption::VALUE_NONE, 'Should the messages be dumped in the console'),
+                new InputOption('force', null, InputOption::VALUE_NONE, 'Should the update be done'),
+                new InputOption('no-backup', null, InputOption::VALUE_NONE, 'Should backup be disabled'),
+                new InputOption('clean', null, InputOption::VALUE_NONE, 'Should clean not found messages'),
+                new InputOption('domain', null, InputOption::VALUE_OPTIONAL, 'Specify the domain to update'),
+                new InputOption('xliff-version', null, InputOption::VALUE_OPTIONAL, 'Override the default xliff version', '1.2'),
+                new InputOption('sort', null, InputOption::VALUE_OPTIONAL, 'Return list of messages sorted alphabetically', 'asc'),
+            ])
+            ->setDescription('Update the translation file')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command extracts translation strings from templates
+of a given bundle or the default translations directory. It can display them or merge
+the new ones into the translation files.
+
+When new translation strings are found it can automatically add a prefix to the translation
+message.
+
+Example running against a Bundle (AcmeBundle)
+
+  <info>php %command.full_name% --dump-messages en AcmeBundle</info>
+  <info>php %command.full_name% --force --prefix="new_" fr AcmeBundle</info>
+
+Example running against default messages directory
+
+  <info>php %command.full_name% --dump-messages en</info>
+  <info>php %command.full_name% --force --prefix="new_" fr</info>
+
+You can sort the output with the <comment>--sort</> flag:
+
+    <info>php %command.full_name% --dump-messages --sort=asc en AcmeBundle</info>
+    <info>php %command.full_name% --dump-messages --sort=desc fr</info>
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $io = new SymfonyStyle($input, $output);
+        $errorIo = $io->getErrorStyle();
+
+        // check presence of force or dump-message
+        if (true !== $input->getOption('force') && true !== $input->getOption('dump-messages')) {
+            $errorIo->error('You must choose one of --force or --dump-messages');
+
+            return 1;
+        }
+
+        // check format
+        $supportedFormats = $this->writer->getFormats();
+        if (!\in_array($input->getOption('output-format'), $supportedFormats, true)) {
+            $errorIo->error(['Wrong output format', 'Supported formats are: '.implode(', ', $supportedFormats).'.']);
+
+            return 1;
+        }
+        /** @var KernelInterface $kernel */
+        $kernel = $this->getApplication()->getKernel();
+        $rootDir = $kernel->getContainer()->getParameter('kernel.root_dir');
+
+        // Define Root Paths
+        $transPaths = $this->transPaths;
+        if (is_dir($dir = $rootDir.'/Resources/translations')) {
+            if ($dir !== $this->defaultTransPath) {
+                $notice = sprintf('Storing translations in the "%s" directory is deprecated since Symfony 4.2, ', $dir);
+                @trigger_error($notice.($this->defaultTransPath ? sprintf('use the "%s" directory instead.', $this->defaultTransPath) : 'configure and use "framework.translator.default_path" instead.'), \E_USER_DEPRECATED);
+            }
+            $transPaths[] = $dir;
+        }
+        if ($this->defaultTransPath) {
+            $transPaths[] = $this->defaultTransPath;
+        }
+        $viewsPaths = $this->viewsPaths;
+        if (is_dir($dir = $rootDir.'/Resources/views')) {
+            if ($dir !== $this->defaultViewsPath) {
+                $notice = sprintf('Storing templates in the "%s" directory is deprecated since Symfony 4.2, ', $dir);
+                @trigger_error($notice.($this->defaultViewsPath ? sprintf('use the "%s" directory instead.', $this->defaultViewsPath) : 'configure and use "twig.default_path" instead.'), \E_USER_DEPRECATED);
+            }
+            $viewsPaths[] = $dir;
+        }
+        if ($this->defaultViewsPath) {
+            $viewsPaths[] = $this->defaultViewsPath;
+        }
+        $currentName = 'default directory';
+
+        // Override with provided Bundle info
+        if (null !== $input->getArgument('bundle')) {
+            try {
+                $foundBundle = $kernel->getBundle($input->getArgument('bundle'));
+                $bundleDir = $foundBundle->getPath();
+                $transPaths = [is_dir($bundleDir.'/Resources/translations') ? $bundleDir.'/Resources/translations' : $bundleDir.'/translations'];
+                $viewsPaths = [is_dir($bundleDir.'/Resources/views') ? $bundleDir.'/Resources/views' : $bundleDir.'/templates'];
+                if ($this->defaultTransPath) {
+                    $transPaths[] = $this->defaultTransPath;
+                }
+                if (is_dir($dir = sprintf('%s/Resources/%s/translations', $rootDir, $foundBundle->getName()))) {
+                    $transPaths[] = $dir;
+                    $notice = sprintf('Storing translations files for "%s" in the "%s" directory is deprecated since Symfony 4.2, ', $foundBundle->getName(), $dir);
+                    @trigger_error($notice.($this->defaultTransPath ? sprintf('use the "%s" directory instead.', $this->defaultTransPath) : 'configure and use "framework.translator.default_path" instead.'), \E_USER_DEPRECATED);
+                }
+                if ($this->defaultViewsPath) {
+                    $viewsPaths[] = $this->defaultViewsPath;
+                }
+                if (is_dir($dir = sprintf('%s/Resources/%s/views', $rootDir, $foundBundle->getName()))) {
+                    $viewsPaths[] = $dir;
+                    $notice = sprintf('Storing templates for "%s" in the "%s" directory is deprecated since Symfony 4.2, ', $foundBundle->getName(), $dir);
+                    @trigger_error($notice.($this->defaultViewsPath ? sprintf('use the "%s" directory instead.', $this->defaultViewsPath) : 'configure and use "twig.default_path" instead.'), \E_USER_DEPRECATED);
+                }
+                $currentName = $foundBundle->getName();
+            } catch (\InvalidArgumentException $e) {
+                // such a bundle does not exist, so treat the argument as path
+                $path = $input->getArgument('bundle');
+
+                $transPaths = [$path.'/translations'];
+                if (is_dir($dir = $path.'/Resources/translations')) {
+                    if ($dir !== $this->defaultTransPath) {
+                        @trigger_error(sprintf('Storing translations in the "%s" directory is deprecated since Symfony 4.2, use the "%s" directory instead.', $dir, $path.'/translations'), \E_USER_DEPRECATED);
+                    }
+                    $transPaths[] = $dir;
+                }
+
+                $viewsPaths = [$path.'/templates'];
+                if (is_dir($dir = $path.'/Resources/views')) {
+                    if ($dir !== $this->defaultViewsPath) {
+                        @trigger_error(sprintf('Storing templates in the "%s" directory is deprecated since Symfony 4.2, use the "%s" directory instead.', $dir, $path.'/templates'), \E_USER_DEPRECATED);
+                    }
+                    $viewsPaths[] = $dir;
+                }
+
+                if (!is_dir($transPaths[0]) && !isset($transPaths[1])) {
+                    throw new InvalidArgumentException(sprintf('"%s" is neither an enabled bundle nor a directory.', $transPaths[0]));
+                }
+            }
+        }
+
+        $io->title('Translation Messages Extractor and Dumper');
+        $io->comment(sprintf('Generating "<info>%s</info>" translation files for "<info>%s</info>"', $input->getArgument('locale'), $currentName));
+
+        // load any messages from templates
+        $extractedCatalogue = new MessageCatalogue($input->getArgument('locale'));
+        $io->comment('Parsing templates...');
+        $this->extractor->setPrefix($input->getOption('prefix'));
+        foreach ($viewsPaths as $path) {
+            if (is_dir($path) || is_file($path)) {
+                $this->extractor->extract($path, $extractedCatalogue);
+            }
+        }
+
+        // load any existing messages from the translation files
+        $currentCatalogue = new MessageCatalogue($input->getArgument('locale'));
+        $io->comment('Loading translation files...');
+        foreach ($transPaths as $path) {
+            if (is_dir($path)) {
+                $this->reader->read($path, $currentCatalogue);
+            }
+        }
+
+        if (null !== $domain = $input->getOption('domain')) {
+            $currentCatalogue = $this->filterCatalogue($currentCatalogue, $domain);
+            $extractedCatalogue = $this->filterCatalogue($extractedCatalogue, $domain);
+        }
+
+        // process catalogues
+        $operation = $input->getOption('clean')
+            ? new TargetOperation($currentCatalogue, $extractedCatalogue)
+            : new MergeOperation($currentCatalogue, $extractedCatalogue);
+
+        // Exit if no messages found.
+        if (!\count($operation->getDomains())) {
+            $errorIo->warning('No translation messages were found.');
+
+            return 0;
+        }
+
+        $resultMessage = 'Translation files were successfully updated';
+
+        // move new messages to intl domain when possible
+        if (class_exists(\MessageFormatter::class)) {
+            foreach ($operation->getDomains() as $domain) {
+                $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX;
+                $newMessages = $operation->getNewMessages($domain);
+
+                if ([] === $newMessages || ([] === $currentCatalogue->all($intlDomain) && [] !== $currentCatalogue->all($domain))) {
+                    continue;
+                }
+
+                $result = $operation->getResult();
+                $allIntlMessages = $result->all($intlDomain);
+                $currentMessages = array_diff_key($newMessages, $result->all($domain));
+                $result->replace($currentMessages, $domain);
+                $result->replace($allIntlMessages + $newMessages, $intlDomain);
+            }
+        }
+
+        // show compiled list of messages
+        if (true === $input->getOption('dump-messages')) {
+            $extractedMessagesCount = 0;
+            $io->newLine();
+            foreach ($operation->getDomains() as $domain) {
+                $newKeys = array_keys($operation->getNewMessages($domain));
+                $allKeys = array_keys($operation->getMessages($domain));
+
+                $list = array_merge(
+                    array_diff($allKeys, $newKeys),
+                    array_map(function ($id) {
+                        return sprintf('<fg=green>%s</>', $id);
+                    }, $newKeys),
+                    array_map(function ($id) {
+                        return sprintf('<fg=red>%s</>', $id);
+                    }, array_keys($operation->getObsoleteMessages($domain)))
+                );
+
+                $domainMessagesCount = \count($list);
+
+                if ($sort = $input->getOption('sort')) {
+                    $sort = strtolower($sort);
+                    if (!\in_array($sort, self::SORT_ORDERS, true)) {
+                        $errorIo->error(['Wrong sort order', 'Supported formats are: '.implode(', ', self::SORT_ORDERS).'.']);
+
+                        return 1;
+                    }
+
+                    if (self::DESC === $sort) {
+                        rsort($list);
+                    } else {
+                        sort($list);
+                    }
+                }
+
+                $io->section(sprintf('Messages extracted for domain "<info>%s</info>" (%d message%s)', $domain, $domainMessagesCount, $domainMessagesCount > 1 ? 's' : ''));
+                $io->listing($list);
+
+                $extractedMessagesCount += $domainMessagesCount;
+            }
+
+            if ('xlf' === $input->getOption('output-format')) {
+                $io->comment(sprintf('Xliff output version is <info>%s</info>', $input->getOption('xliff-version')));
+            }
+
+            $resultMessage = sprintf('%d message%s successfully extracted', $extractedMessagesCount, $extractedMessagesCount > 1 ? 's were' : ' was');
+        }
+
+        if (true === $input->getOption('no-backup')) {
+            $this->writer->disableBackup();
+        }
+
+        // save the files
+        if (true === $input->getOption('force')) {
+            $io->comment('Writing files...');
+
+            $bundleTransPath = false;
+            foreach ($transPaths as $path) {
+                if (is_dir($path)) {
+                    $bundleTransPath = $path;
+                }
+            }
+
+            if (!$bundleTransPath) {
+                $bundleTransPath = end($transPaths);
+            }
+
+            $this->writer->write($operation->getResult(), $input->getOption('output-format'), ['path' => $bundleTransPath, 'default_locale' => $this->defaultLocale, 'xliff_version' => $input->getOption('xliff-version')]);
+
+            if (true === $input->getOption('dump-messages')) {
+                $resultMessage .= ' and translation files were updated';
+            }
+        }
+
+        $io->success($resultMessage.'.');
+
+        return 0;
+    }
+
+    private function filterCatalogue(MessageCatalogue $catalogue, string $domain): MessageCatalogue
+    {
+        $filteredCatalogue = new MessageCatalogue($catalogue->getLocale());
+
+        // extract intl-icu messages only
+        $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX;
+        if ($intlMessages = $catalogue->all($intlDomain)) {
+            $filteredCatalogue->add($intlMessages, $intlDomain);
+        }
+
+        // extract all messages and subtract intl-icu messages
+        if ($messages = array_diff($catalogue->all($domain), $intlMessages)) {
+            $filteredCatalogue->add($messages, $domain);
+        }
+        foreach ($catalogue->getResources() as $resource) {
+            $filteredCatalogue->addResource($resource);
+        }
+        if ($metadata = $catalogue->getMetadata('', $intlDomain)) {
+            foreach ($metadata as $k => $v) {
+                $filteredCatalogue->setMetadata($k, $v, $intlDomain);
+            }
+        }
+        if ($metadata = $catalogue->getMetadata('', $domain)) {
+            foreach ($metadata as $k => $v) {
+                $filteredCatalogue->setMetadata($k, $v, $domain);
+            }
+        }
+
+        return $filteredCatalogue;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/WorkflowDumpCommand.php b/vendor/symfony/framework-bundle/Command/WorkflowDumpCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..ecdca7cb394526e73b3f1c205f85cf2463550863
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/WorkflowDumpCommand.php
@@ -0,0 +1,103 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Workflow\Dumper\GraphvizDumper;
+use Symfony\Component\Workflow\Dumper\PlantUmlDumper;
+use Symfony\Component\Workflow\Dumper\StateMachineGraphvizDumper;
+use Symfony\Component\Workflow\Marking;
+
+/**
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ *
+ * @final
+ */
+class WorkflowDumpCommand extends Command
+{
+    protected static $defaultName = 'workflow:dump';
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setDefinition([
+                new InputArgument('name', InputArgument::REQUIRED, 'A workflow name'),
+                new InputArgument('marking', InputArgument::IS_ARRAY, 'A marking (a list of places)'),
+                new InputOption('label', 'l', InputOption::VALUE_REQUIRED, 'Label a graph'),
+                new InputOption('dump-format', null, InputOption::VALUE_REQUIRED, 'The dump format [dot|puml]', 'dot'),
+            ])
+            ->setDescription('Dump a workflow')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command dumps the graphical representation of a
+workflow in different formats
+
+<info>DOT</info>:  %command.full_name% <workflow name> | dot -Tpng > workflow.png
+<info>PUML</info>: %command.full_name% <workflow name> --dump-format=puml | java -jar plantuml.jar -p > workflow.png
+
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $container = $this->getApplication()->getKernel()->getContainer();
+        $serviceId = $input->getArgument('name');
+
+        if ($container->has('workflow.'.$serviceId)) {
+            $workflow = $container->get('workflow.'.$serviceId);
+            $type = 'workflow';
+        } elseif ($container->has('state_machine.'.$serviceId)) {
+            $workflow = $container->get('state_machine.'.$serviceId);
+            $type = 'state_machine';
+        } else {
+            throw new InvalidArgumentException(sprintf('No service found for "workflow.%1$s" nor "state_machine.%1$s".', $serviceId));
+        }
+
+        if ('puml' === $input->getOption('dump-format')) {
+            $transitionType = 'workflow' === $type ? PlantUmlDumper::WORKFLOW_TRANSITION : PlantUmlDumper::STATEMACHINE_TRANSITION;
+            $dumper = new PlantUmlDumper($transitionType);
+        } elseif ('workflow' === $type) {
+            $dumper = new GraphvizDumper();
+        } else {
+            $dumper = new StateMachineGraphvizDumper();
+        }
+
+        $marking = new Marking();
+
+        foreach ($input->getArgument('marking') as $place) {
+            $marking->mark($place);
+        }
+
+        $options = [
+            'name' => $serviceId,
+            'nofooter' => true,
+            'graph' => [
+                'label' => $input->getOption('label'),
+            ],
+        ];
+        $output->writeln($dumper->dump($workflow->getDefinition(), $marking, $options));
+
+        return 0;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/XliffLintCommand.php b/vendor/symfony/framework-bundle/Command/XliffLintCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..648e210d4807dd60bcb813c3366e2b9408400973
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/XliffLintCommand.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Translation\Command\XliffLintCommand as BaseLintCommand;
+
+/**
+ * Validates XLIFF files syntax and outputs encountered errors.
+ *
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ * @author Robin Chalas <robin.chalas@gmail.com>
+ * @author Javier Eguiluz <javier.eguiluz@gmail.com>
+ *
+ * @final
+ */
+class XliffLintCommand extends BaseLintCommand
+{
+    protected static $defaultName = 'lint:xliff';
+
+    public function __construct()
+    {
+        $directoryIteratorProvider = function ($directory, $default) {
+            if (!is_dir($directory)) {
+                $directory = $this->getApplication()->getKernel()->locateResource($directory);
+            }
+
+            return $default($directory);
+        };
+
+        $isReadableProvider = function ($fileOrDirectory, $default) {
+            return str_starts_with($fileOrDirectory, '@') || $default($fileOrDirectory);
+        };
+
+        parent::__construct(null, $directoryIteratorProvider, $isReadableProvider);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        parent::configure();
+
+        $this->setHelp($this->getHelp().<<<'EOF'
+
+Or find all files in a bundle:
+
+  <info>php %command.full_name% @AcmeDemoBundle</info>
+
+EOF
+        );
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Command/YamlLintCommand.php b/vendor/symfony/framework-bundle/Command/YamlLintCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..86787361aa274b6a4aed1a244c7073e5e1680d3d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Command/YamlLintCommand.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Yaml\Command\LintCommand as BaseLintCommand;
+
+/**
+ * Validates YAML files syntax and outputs encountered errors.
+ *
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ * @author Robin Chalas <robin.chalas@gmail.com>
+ *
+ * @final
+ */
+class YamlLintCommand extends BaseLintCommand
+{
+    protected static $defaultName = 'lint:yaml';
+
+    public function __construct()
+    {
+        $directoryIteratorProvider = function ($directory, $default) {
+            if (!is_dir($directory)) {
+                $directory = $this->getApplication()->getKernel()->locateResource($directory);
+            }
+
+            return $default($directory);
+        };
+
+        $isReadableProvider = function ($fileOrDirectory, $default) {
+            return str_starts_with($fileOrDirectory, '@') || $default($fileOrDirectory);
+        };
+
+        parent::__construct(null, $directoryIteratorProvider, $isReadableProvider);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        parent::configure();
+
+        $this->setHelp($this->getHelp().<<<'EOF'
+
+Or find all files in a bundle:
+
+  <info>php %command.full_name% @AcmeDemoBundle</info>
+
+EOF
+        );
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Console/Application.php b/vendor/symfony/framework-bundle/Console/Application.php
new file mode 100644
index 0000000000000000000000000000000000000000..20fb6e05f73de1986fcb8d35812bb492aec36f59
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Console/Application.php
@@ -0,0 +1,221 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Console;
+
+use Symfony\Component\Console\Application as BaseApplication;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Command\ListCommand;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Debug\Exception\FatalThrowableError;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+use Symfony\Component\HttpKernel\Kernel;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Application extends BaseApplication
+{
+    private $kernel;
+    private $commandsRegistered = false;
+    private $registrationErrors = [];
+
+    public function __construct(KernelInterface $kernel)
+    {
+        $this->kernel = $kernel;
+
+        parent::__construct('Symfony', Kernel::VERSION);
+
+        $inputDefinition = $this->getDefinition();
+        $inputDefinition->addOption(new InputOption('--env', '-e', InputOption::VALUE_REQUIRED, 'The Environment name.', $kernel->getEnvironment()));
+        $inputDefinition->addOption(new InputOption('--no-debug', null, InputOption::VALUE_NONE, 'Switches off debug mode.'));
+    }
+
+    /**
+     * Gets the Kernel associated with this Console.
+     *
+     * @return KernelInterface A KernelInterface instance
+     */
+    public function getKernel()
+    {
+        return $this->kernel;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if ($this->kernel->getContainer()->has('services_resetter')) {
+            $this->kernel->getContainer()->get('services_resetter')->reset();
+        }
+    }
+
+    /**
+     * Runs the current application.
+     *
+     * @return int 0 if everything went fine, or an error code
+     */
+    public function doRun(InputInterface $input, OutputInterface $output)
+    {
+        $this->registerCommands();
+
+        if ($this->registrationErrors) {
+            $this->renderRegistrationErrors($input, $output);
+        }
+
+        $this->setDispatcher($this->kernel->getContainer()->get('event_dispatcher'));
+
+        return parent::doRun($input, $output);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)
+    {
+        if (!$command instanceof ListCommand) {
+            if ($this->registrationErrors) {
+                $this->renderRegistrationErrors($input, $output);
+                $this->registrationErrors = [];
+            }
+
+            return parent::doRunCommand($command, $input, $output);
+        }
+
+        $returnCode = parent::doRunCommand($command, $input, $output);
+
+        if ($this->registrationErrors) {
+            $this->renderRegistrationErrors($input, $output);
+            $this->registrationErrors = [];
+        }
+
+        return $returnCode;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function find($name)
+    {
+        $this->registerCommands();
+
+        return parent::find($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($name)
+    {
+        $this->registerCommands();
+
+        $command = parent::get($name);
+
+        if ($command instanceof ContainerAwareInterface) {
+            $command->setContainer($this->kernel->getContainer());
+        }
+
+        return $command;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function all($namespace = null)
+    {
+        $this->registerCommands();
+
+        return parent::all($namespace);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getLongVersion()
+    {
+        return parent::getLongVersion().sprintf(' (env: <comment>%s</>, debug: <comment>%s</>) <bg=blue;fg=yellow>#StandWith</><bg=yellow;fg=blue>Ukraine</> <href=https://sf.to/ukraine>https://sf.to/ukraine</>', $this->kernel->getEnvironment(), $this->kernel->isDebug() ? 'true' : 'false');
+    }
+
+    public function add(Command $command)
+    {
+        $this->registerCommands();
+
+        return parent::add($command);
+    }
+
+    protected function registerCommands()
+    {
+        if ($this->commandsRegistered) {
+            return;
+        }
+
+        $this->commandsRegistered = true;
+
+        $this->kernel->boot();
+
+        $container = $this->kernel->getContainer();
+
+        foreach ($this->kernel->getBundles() as $bundle) {
+            if ($bundle instanceof Bundle) {
+                try {
+                    $bundle->registerCommands($this);
+                } catch (\Throwable $e) {
+                    $this->registrationErrors[] = $e;
+                }
+            }
+        }
+
+        if ($container->has('console.command_loader')) {
+            $this->setCommandLoader($container->get('console.command_loader'));
+        }
+
+        if ($container->hasParameter('console.command.ids')) {
+            $lazyCommandIds = $container->hasParameter('console.lazy_command.ids') ? $container->getParameter('console.lazy_command.ids') : [];
+            foreach ($container->getParameter('console.command.ids') as $id) {
+                if (!isset($lazyCommandIds[$id])) {
+                    try {
+                        $this->add($container->get($id));
+                    } catch (\Throwable $e) {
+                        $this->registrationErrors[] = $e;
+                    }
+                }
+            }
+        }
+    }
+
+    private function renderRegistrationErrors(InputInterface $input, OutputInterface $output)
+    {
+        if ($output instanceof ConsoleOutputInterface) {
+            $output = $output->getErrorOutput();
+        }
+
+        (new SymfonyStyle($input, $output))->warning('Some commands could not be registered:');
+
+        foreach ($this->registrationErrors as $error) {
+            if (method_exists($this, 'doRenderThrowable')) {
+                $this->doRenderThrowable($error, $output);
+            } else {
+                if (!$error instanceof \Exception) {
+                    $error = new FatalThrowableError($error);
+                }
+
+                $this->doRenderException($error, $output);
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Console/Descriptor/Descriptor.php b/vendor/symfony/framework-bundle/Console/Descriptor/Descriptor.php
new file mode 100644
index 0000000000000000000000000000000000000000..5e90f7ba9f8d0e68e6b498b40966cffbb8ccdc81
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Console/Descriptor/Descriptor.php
@@ -0,0 +1,375 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Console\Descriptor;
+
+use Symfony\Component\Config\Resource\ClassExistenceResource;
+use Symfony\Component\Console\Descriptor\DescriptorInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
+ */
+abstract class Descriptor implements DescriptorInterface
+{
+    /**
+     * @var OutputInterface
+     */
+    protected $output;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function describe(OutputInterface $output, $object, array $options = [])
+    {
+        $this->output = $output;
+
+        switch (true) {
+            case $object instanceof RouteCollection:
+                $this->describeRouteCollection($object, $options);
+                break;
+            case $object instanceof Route:
+                $this->describeRoute($object, $options);
+                break;
+            case $object instanceof ParameterBag:
+                $this->describeContainerParameters($object, $options);
+                break;
+            case $object instanceof ContainerBuilder && !empty($options['env-vars']):
+                $this->describeContainerEnvVars($this->getContainerEnvVars($object), $options);
+                break;
+            case $object instanceof ContainerBuilder && isset($options['group_by']) && 'tags' === $options['group_by']:
+                $this->describeContainerTags($object, $options);
+                break;
+            case $object instanceof ContainerBuilder && isset($options['id']):
+                $this->describeContainerService($this->resolveServiceDefinition($object, $options['id']), $options, $object);
+                break;
+            case $object instanceof ContainerBuilder && isset($options['parameter']):
+                $this->describeContainerParameter($object->resolveEnvPlaceholders($object->getParameter($options['parameter'])), $options);
+                break;
+            case $object instanceof ContainerBuilder:
+                $this->describeContainerServices($object, $options);
+                break;
+            case $object instanceof Definition:
+                $this->describeContainerDefinition($object, $options);
+                break;
+            case $object instanceof Alias:
+                $this->describeContainerAlias($object, $options);
+                break;
+            case $object instanceof EventDispatcherInterface:
+                $this->describeEventDispatcherListeners($object, $options);
+                break;
+            case \is_callable($object):
+                $this->describeCallable($object, $options);
+                break;
+            default:
+                throw new \InvalidArgumentException(sprintf('Object of type "%s" is not describable.', \get_class($object)));
+        }
+    }
+
+    protected function getOutput(): OutputInterface
+    {
+        return $this->output;
+    }
+
+    protected function write(string $content, bool $decorated = false)
+    {
+        $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW);
+    }
+
+    abstract protected function describeRouteCollection(RouteCollection $routes, array $options = []);
+
+    abstract protected function describeRoute(Route $route, array $options = []);
+
+    abstract protected function describeContainerParameters(ParameterBag $parameters, array $options = []);
+
+    abstract protected function describeContainerTags(ContainerBuilder $builder, array $options = []);
+
+    /**
+     * Describes a container service by its name.
+     *
+     * Common options are:
+     * * name: name of described service
+     *
+     * @param Definition|Alias|object $service
+     */
+    abstract protected function describeContainerService($service, array $options = [], ContainerBuilder $builder = null);
+
+    /**
+     * Describes container services.
+     *
+     * Common options are:
+     * * tag: filters described services by given tag
+     */
+    abstract protected function describeContainerServices(ContainerBuilder $builder, array $options = []);
+
+    abstract protected function describeContainerDefinition(Definition $definition, array $options = []);
+
+    abstract protected function describeContainerAlias(Alias $alias, array $options = [], ContainerBuilder $builder = null);
+
+    abstract protected function describeContainerParameter($parameter, array $options = []);
+
+    abstract protected function describeContainerEnvVars(array $envs, array $options = []);
+
+    /**
+     * Describes event dispatcher listeners.
+     *
+     * Common options are:
+     * * name: name of listened event
+     */
+    abstract protected function describeEventDispatcherListeners(EventDispatcherInterface $eventDispatcher, array $options = []);
+
+    /**
+     * Describes a callable.
+     *
+     * @param mixed $callable
+     */
+    abstract protected function describeCallable($callable, array $options = []);
+
+    /**
+     * Formats a value as string.
+     *
+     * @param mixed $value
+     */
+    protected function formatValue($value): string
+    {
+        if ($value instanceof \UnitEnum) {
+            return ltrim(var_export($value, true), '\\');
+        }
+
+        if (\is_object($value)) {
+            return sprintf('object(%s)', \get_class($value));
+        }
+
+        if (\is_string($value)) {
+            return $value;
+        }
+
+        return preg_replace("/\n\s*/s", '', var_export($value, true));
+    }
+
+    /**
+     * Formats a parameter.
+     *
+     * @param mixed $value
+     */
+    protected function formatParameter($value): string
+    {
+        if ($value instanceof \UnitEnum) {
+            return ltrim(var_export($value, true), '\\');
+        }
+
+        // Recursively search for enum values, so we can replace it
+        // before json_encode (which will not display anything for \UnitEnum otherwise)
+        if (\is_array($value)) {
+            array_walk_recursive($value, static function (&$value) {
+                if ($value instanceof \UnitEnum) {
+                    $value = ltrim(var_export($value, true), '\\');
+                }
+            });
+        }
+
+        if (\is_bool($value) || \is_array($value) || (null === $value)) {
+            $jsonString = json_encode($value);
+
+            if (preg_match('/^(.{60})./us', $jsonString, $matches)) {
+                return $matches[1].'...';
+            }
+
+            return $jsonString;
+        }
+
+        return (string) $value;
+    }
+
+    /**
+     * @return mixed
+     */
+    protected function resolveServiceDefinition(ContainerBuilder $builder, string $serviceId)
+    {
+        if ($builder->hasDefinition($serviceId)) {
+            return $builder->getDefinition($serviceId);
+        }
+
+        // Some service IDs don't have a Definition, they're aliases
+        if ($builder->hasAlias($serviceId)) {
+            return $builder->getAlias($serviceId);
+        }
+
+        if ('service_container' === $serviceId) {
+            return (new Definition(ContainerInterface::class))->setPublic(true)->setSynthetic(true);
+        }
+
+        // the service has been injected in some special way, just return the service
+        return $builder->get($serviceId);
+    }
+
+    protected function findDefinitionsByTag(ContainerBuilder $builder, bool $showHidden): array
+    {
+        $definitions = [];
+        $tags = $builder->findTags();
+        asort($tags);
+
+        foreach ($tags as $tag) {
+            foreach ($builder->findTaggedServiceIds($tag) as $serviceId => $attributes) {
+                $definition = $this->resolveServiceDefinition($builder, $serviceId);
+
+                if ($showHidden xor '.' === ($serviceId[0] ?? null)) {
+                    continue;
+                }
+
+                if (!isset($definitions[$tag])) {
+                    $definitions[$tag] = [];
+                }
+
+                $definitions[$tag][$serviceId] = $definition;
+            }
+        }
+
+        return $definitions;
+    }
+
+    protected function sortParameters(ParameterBag $parameters)
+    {
+        $parameters = $parameters->all();
+        ksort($parameters);
+
+        return $parameters;
+    }
+
+    protected function sortServiceIds(array $serviceIds)
+    {
+        asort($serviceIds);
+
+        return $serviceIds;
+    }
+
+    protected function sortTaggedServicesByPriority(array $services): array
+    {
+        $maxPriority = [];
+        foreach ($services as $service => $tags) {
+            $maxPriority[$service] = \PHP_INT_MIN;
+            foreach ($tags as $tag) {
+                $currentPriority = $tag['priority'] ?? 0;
+                if ($maxPriority[$service] < $currentPriority) {
+                    $maxPriority[$service] = $currentPriority;
+                }
+            }
+        }
+        uasort($maxPriority, function ($a, $b) {
+            return $b <=> $a;
+        });
+
+        return array_keys($maxPriority);
+    }
+
+    protected function sortTagsByPriority(array $tags): array
+    {
+        $sortedTags = [];
+        foreach ($tags as $tagName => $tag) {
+            $sortedTags[$tagName] = $this->sortByPriority($tag);
+        }
+
+        return $sortedTags;
+    }
+
+    protected function sortByPriority(array $tag): array
+    {
+        usort($tag, function ($a, $b) {
+            return ($b['priority'] ?? 0) <=> ($a['priority'] ?? 0);
+        });
+
+        return $tag;
+    }
+
+    public static function getClassDescription(string $class, string &$resolvedClass = null): string
+    {
+        $resolvedClass = $class;
+        try {
+            $resource = new ClassExistenceResource($class, false);
+
+            // isFresh() will explode ONLY if a parent class/trait does not exist
+            $resource->isFresh(0);
+
+            $r = new \ReflectionClass($class);
+            $resolvedClass = $r->name;
+
+            if ($docComment = $r->getDocComment()) {
+                $docComment = preg_split('#\n\s*\*\s*[\n@]#', substr($docComment, 3, -2), 2)[0];
+
+                return trim(preg_replace('#\s*\n\s*\*\s*#', ' ', $docComment));
+            }
+        } catch (\ReflectionException $e) {
+        }
+
+        return '';
+    }
+
+    private function getContainerEnvVars(ContainerBuilder $container): array
+    {
+        if (!$container->hasParameter('debug.container.dump')) {
+            return [];
+        }
+
+        if (!is_file($container->getParameter('debug.container.dump'))) {
+            return [];
+        }
+
+        $file = file_get_contents($container->getParameter('debug.container.dump'));
+        preg_match_all('{%env\(((?:\w++:)*+\w++)\)%}', $file, $envVars);
+        $envVars = array_unique($envVars[1]);
+
+        $bag = $container->getParameterBag();
+        $getDefaultParameter = function (string $name) {
+            return parent::get($name);
+        };
+        $getDefaultParameter = $getDefaultParameter->bindTo($bag, \get_class($bag));
+
+        $getEnvReflection = new \ReflectionMethod($container, 'getEnv');
+        $getEnvReflection->setAccessible(true);
+
+        $envs = [];
+
+        foreach ($envVars as $env) {
+            $processor = 'string';
+            if (false !== $i = strrpos($name = $env, ':')) {
+                $name = substr($env, $i + 1);
+                $processor = substr($env, 0, $i);
+            }
+            $defaultValue = ($hasDefault = $container->hasParameter("env($name)")) ? $getDefaultParameter("env($name)") : null;
+            if (false === ($runtimeValue = $_ENV[$name] ?? $_SERVER[$name] ?? getenv($name))) {
+                $runtimeValue = null;
+            }
+            $processedValue = ($hasRuntime = null !== $runtimeValue) || $hasDefault ? $getEnvReflection->invoke($container, $env) : null;
+            $envs["$name$processor"] = [
+                'name' => $name,
+                'processor' => $processor,
+                'default_available' => $hasDefault,
+                'default_value' => $defaultValue,
+                'runtime_available' => $hasRuntime,
+                'runtime_value' => $runtimeValue,
+                'processed_value' => $processedValue,
+            ];
+        }
+        ksort($envs);
+
+        return array_values($envs);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Console/Descriptor/JsonDescriptor.php b/vendor/symfony/framework-bundle/Console/Descriptor/JsonDescriptor.php
new file mode 100644
index 0000000000000000000000000000000000000000..64841b1a25d4e956866ab4dd445c93b2a24ce89a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Console/Descriptor/JsonDescriptor.php
@@ -0,0 +1,389 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Console\Descriptor;
+
+use Symfony\Component\Console\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
+ */
+class JsonDescriptor extends Descriptor
+{
+    protected function describeRouteCollection(RouteCollection $routes, array $options = [])
+    {
+        $data = [];
+        foreach ($routes->all() as $name => $route) {
+            $data[$name] = $this->getRouteData($route);
+        }
+
+        $this->writeData($data, $options);
+    }
+
+    protected function describeRoute(Route $route, array $options = [])
+    {
+        $this->writeData($this->getRouteData($route), $options);
+    }
+
+    protected function describeContainerParameters(ParameterBag $parameters, array $options = [])
+    {
+        $this->writeData($this->sortParameters($parameters), $options);
+    }
+
+    protected function describeContainerTags(ContainerBuilder $builder, array $options = [])
+    {
+        $showHidden = isset($options['show_hidden']) && $options['show_hidden'];
+        $data = [];
+
+        foreach ($this->findDefinitionsByTag($builder, $showHidden) as $tag => $definitions) {
+            $data[$tag] = [];
+            foreach ($definitions as $definition) {
+                $data[$tag][] = $this->getContainerDefinitionData($definition, true);
+            }
+        }
+
+        $this->writeData($data, $options);
+    }
+
+    protected function describeContainerService($service, array $options = [], ContainerBuilder $builder = null)
+    {
+        if (!isset($options['id'])) {
+            throw new \InvalidArgumentException('An "id" option must be provided.');
+        }
+
+        if ($service instanceof Alias) {
+            $this->describeContainerAlias($service, $options, $builder);
+        } elseif ($service instanceof Definition) {
+            $this->writeData($this->getContainerDefinitionData($service, isset($options['omit_tags']) && $options['omit_tags'], isset($options['show_arguments']) && $options['show_arguments']), $options);
+        } else {
+            $this->writeData(\get_class($service), $options);
+        }
+    }
+
+    protected function describeContainerServices(ContainerBuilder $builder, array $options = [])
+    {
+        $serviceIds = isset($options['tag']) && $options['tag']
+            ? $this->sortTaggedServicesByPriority($builder->findTaggedServiceIds($options['tag']))
+            : $this->sortServiceIds($builder->getServiceIds());
+        $showHidden = isset($options['show_hidden']) && $options['show_hidden'];
+        $omitTags = isset($options['omit_tags']) && $options['omit_tags'];
+        $showArguments = isset($options['show_arguments']) && $options['show_arguments'];
+        $data = ['definitions' => [], 'aliases' => [], 'services' => []];
+
+        if (isset($options['filter'])) {
+            $serviceIds = array_filter($serviceIds, $options['filter']);
+        }
+
+        foreach ($serviceIds as $serviceId) {
+            $service = $this->resolveServiceDefinition($builder, $serviceId);
+
+            if ($showHidden xor '.' === ($serviceId[0] ?? null)) {
+                continue;
+            }
+
+            if ($service instanceof Alias) {
+                $data['aliases'][$serviceId] = $this->getContainerAliasData($service);
+            } elseif ($service instanceof Definition) {
+                $data['definitions'][$serviceId] = $this->getContainerDefinitionData($service, $omitTags, $showArguments);
+            } else {
+                $data['services'][$serviceId] = \get_class($service);
+            }
+        }
+
+        $this->writeData($data, $options);
+    }
+
+    protected function describeContainerDefinition(Definition $definition, array $options = [])
+    {
+        $this->writeData($this->getContainerDefinitionData($definition, isset($options['omit_tags']) && $options['omit_tags'], isset($options['show_arguments']) && $options['show_arguments']), $options);
+    }
+
+    protected function describeContainerAlias(Alias $alias, array $options = [], ContainerBuilder $builder = null)
+    {
+        if (!$builder) {
+            $this->writeData($this->getContainerAliasData($alias), $options);
+
+            return;
+        }
+
+        $this->writeData(
+            [$this->getContainerAliasData($alias), $this->getContainerDefinitionData($builder->getDefinition((string) $alias), isset($options['omit_tags']) && $options['omit_tags'], isset($options['show_arguments']) && $options['show_arguments'])],
+            array_merge($options, ['id' => (string) $alias])
+        );
+    }
+
+    protected function describeEventDispatcherListeners(EventDispatcherInterface $eventDispatcher, array $options = [])
+    {
+        $this->writeData($this->getEventDispatcherListenersData($eventDispatcher, $options['event'] ?? null), $options);
+    }
+
+    protected function describeCallable($callable, array $options = [])
+    {
+        $this->writeData($this->getCallableData($callable), $options);
+    }
+
+    protected function describeContainerParameter($parameter, array $options = [])
+    {
+        $key = $options['parameter'] ?? '';
+
+        $this->writeData([$key => $parameter], $options);
+    }
+
+    protected function describeContainerEnvVars(array $envs, array $options = [])
+    {
+        throw new LogicException('Using the JSON format to debug environment variables is not supported.');
+    }
+
+    private function writeData(array $data, array $options)
+    {
+        $flags = $options['json_encoding'] ?? 0;
+
+        // Recursively search for enum values, so we can replace it
+        // before json_encode (which will not display anything for \UnitEnum otherwise)
+        array_walk_recursive($data, static function (&$value) {
+            if ($value instanceof \UnitEnum) {
+                $value = ltrim(var_export($value, true), '\\');
+            }
+        });
+
+        $this->write(json_encode($data, $flags | \JSON_PRETTY_PRINT)."\n");
+    }
+
+    protected function getRouteData(Route $route): array
+    {
+        $data = [
+            'path' => $route->getPath(),
+            'pathRegex' => $route->compile()->getRegex(),
+            'host' => '' !== $route->getHost() ? $route->getHost() : 'ANY',
+            'hostRegex' => '' !== $route->getHost() ? $route->compile()->getHostRegex() : '',
+            'scheme' => $route->getSchemes() ? implode('|', $route->getSchemes()) : 'ANY',
+            'method' => $route->getMethods() ? implode('|', $route->getMethods()) : 'ANY',
+            'class' => \get_class($route),
+            'defaults' => $route->getDefaults(),
+            'requirements' => $route->getRequirements() ?: 'NO CUSTOM',
+            'options' => $route->getOptions(),
+        ];
+
+        if ('' !== $route->getCondition()) {
+            $data['condition'] = $route->getCondition();
+        }
+
+        return $data;
+    }
+
+    private function getContainerDefinitionData(Definition $definition, bool $omitTags = false, bool $showArguments = false): array
+    {
+        $data = [
+            'class' => (string) $definition->getClass(),
+            'public' => $definition->isPublic() && !$definition->isPrivate(),
+            'synthetic' => $definition->isSynthetic(),
+            'lazy' => $definition->isLazy(),
+            'shared' => $definition->isShared(),
+            'abstract' => $definition->isAbstract(),
+            'autowire' => $definition->isAutowired(),
+            'autoconfigure' => $definition->isAutoconfigured(),
+        ];
+
+        if ('' !== $classDescription = $this->getClassDescription((string) $definition->getClass())) {
+            $data['description'] = $classDescription;
+        }
+
+        if ($showArguments) {
+            $data['arguments'] = $this->describeValue($definition->getArguments(), $omitTags, $showArguments);
+        }
+
+        $data['file'] = $definition->getFile();
+
+        if ($factory = $definition->getFactory()) {
+            if (\is_array($factory)) {
+                if ($factory[0] instanceof Reference) {
+                    $data['factory_service'] = (string) $factory[0];
+                } elseif ($factory[0] instanceof Definition) {
+                    throw new \InvalidArgumentException('Factory is not describable.');
+                } else {
+                    $data['factory_class'] = $factory[0];
+                }
+                $data['factory_method'] = $factory[1];
+            } else {
+                $data['factory_function'] = $factory;
+            }
+        }
+
+        $calls = $definition->getMethodCalls();
+        if (\count($calls) > 0) {
+            $data['calls'] = [];
+            foreach ($calls as $callData) {
+                $data['calls'][] = $callData[0];
+            }
+        }
+
+        if (!$omitTags) {
+            $data['tags'] = [];
+            foreach ($this->sortTagsByPriority($definition->getTags()) as $tagName => $tagData) {
+                foreach ($tagData as $parameters) {
+                    $data['tags'][] = ['name' => $tagName, 'parameters' => $parameters];
+                }
+            }
+        }
+
+        return $data;
+    }
+
+    private function getContainerAliasData(Alias $alias): array
+    {
+        return [
+            'service' => (string) $alias,
+            'public' => $alias->isPublic() && !$alias->isPrivate(),
+        ];
+    }
+
+    private function getEventDispatcherListenersData(EventDispatcherInterface $eventDispatcher, string $event = null): array
+    {
+        $data = [];
+
+        $registeredListeners = $eventDispatcher->getListeners($event);
+        if (null !== $event) {
+            foreach ($registeredListeners as $listener) {
+                $l = $this->getCallableData($listener);
+                $l['priority'] = $eventDispatcher->getListenerPriority($event, $listener);
+                $data[] = $l;
+            }
+        } else {
+            ksort($registeredListeners);
+
+            foreach ($registeredListeners as $eventListened => $eventListeners) {
+                foreach ($eventListeners as $eventListener) {
+                    $l = $this->getCallableData($eventListener);
+                    $l['priority'] = $eventDispatcher->getListenerPriority($eventListened, $eventListener);
+                    $data[$eventListened][] = $l;
+                }
+            }
+        }
+
+        return $data;
+    }
+
+    private function getCallableData($callable): array
+    {
+        $data = [];
+
+        if (\is_array($callable)) {
+            $data['type'] = 'function';
+
+            if (\is_object($callable[0])) {
+                $data['name'] = $callable[1];
+                $data['class'] = \get_class($callable[0]);
+            } else {
+                if (!str_starts_with($callable[1], 'parent::')) {
+                    $data['name'] = $callable[1];
+                    $data['class'] = $callable[0];
+                    $data['static'] = true;
+                } else {
+                    $data['name'] = substr($callable[1], 8);
+                    $data['class'] = $callable[0];
+                    $data['static'] = true;
+                    $data['parent'] = true;
+                }
+            }
+
+            return $data;
+        }
+
+        if (\is_string($callable)) {
+            $data['type'] = 'function';
+
+            if (!str_contains($callable, '::')) {
+                $data['name'] = $callable;
+            } else {
+                $callableParts = explode('::', $callable);
+
+                $data['name'] = $callableParts[1];
+                $data['class'] = $callableParts[0];
+                $data['static'] = true;
+            }
+
+            return $data;
+        }
+
+        if ($callable instanceof \Closure) {
+            $data['type'] = 'closure';
+
+            $r = new \ReflectionFunction($callable);
+            if (str_contains($r->name, '{closure}')) {
+                return $data;
+            }
+            $data['name'] = $r->name;
+
+            if ($class = $r->getClosureScopeClass()) {
+                $data['class'] = $class->name;
+                if (!$r->getClosureThis()) {
+                    $data['static'] = true;
+                }
+            }
+
+            return $data;
+        }
+
+        if (method_exists($callable, '__invoke')) {
+            $data['type'] = 'object';
+            $data['name'] = \get_class($callable);
+
+            return $data;
+        }
+
+        throw new \InvalidArgumentException('Callable is not describable.');
+    }
+
+    private function describeValue($value, bool $omitTags, bool $showArguments)
+    {
+        if (\is_array($value)) {
+            $data = [];
+            foreach ($value as $k => $v) {
+                $data[$k] = $this->describeValue($v, $omitTags, $showArguments);
+            }
+
+            return $data;
+        }
+
+        if ($value instanceof ServiceClosureArgument) {
+            $value = $value->getValues()[0];
+        }
+
+        if ($value instanceof Reference) {
+            return [
+                'type' => 'service',
+                'id' => (string) $value,
+            ];
+        }
+
+        if ($value instanceof ArgumentInterface) {
+            return $this->describeValue($value->getValues(), $omitTags, $showArguments);
+        }
+
+        if ($value instanceof Definition) {
+            return $this->getContainerDefinitionData($value, $omitTags, $showArguments);
+        }
+
+        return $value;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Console/Descriptor/MarkdownDescriptor.php b/vendor/symfony/framework-bundle/Console/Descriptor/MarkdownDescriptor.php
new file mode 100644
index 0000000000000000000000000000000000000000..a2360a094ee9a2ceaf9b5f9331705b4057100de3
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Console/Descriptor/MarkdownDescriptor.php
@@ -0,0 +1,377 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Console\Descriptor;
+
+use Symfony\Component\Console\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
+ */
+class MarkdownDescriptor extends Descriptor
+{
+    protected function describeRouteCollection(RouteCollection $routes, array $options = [])
+    {
+        $first = true;
+        foreach ($routes->all() as $name => $route) {
+            if ($first) {
+                $first = false;
+            } else {
+                $this->write("\n\n");
+            }
+            $this->describeRoute($route, ['name' => $name]);
+        }
+        $this->write("\n");
+    }
+
+    protected function describeRoute(Route $route, array $options = [])
+    {
+        $output = '- Path: '.$route->getPath()
+            ."\n".'- Path Regex: '.$route->compile()->getRegex()
+            ."\n".'- Host: '.('' !== $route->getHost() ? $route->getHost() : 'ANY')
+            ."\n".'- Host Regex: '.('' !== $route->getHost() ? $route->compile()->getHostRegex() : '')
+            ."\n".'- Scheme: '.($route->getSchemes() ? implode('|', $route->getSchemes()) : 'ANY')
+            ."\n".'- Method: '.($route->getMethods() ? implode('|', $route->getMethods()) : 'ANY')
+            ."\n".'- Class: '.\get_class($route)
+            ."\n".'- Defaults: '.$this->formatRouterConfig($route->getDefaults())
+            ."\n".'- Requirements: '.($route->getRequirements() ? $this->formatRouterConfig($route->getRequirements()) : 'NO CUSTOM')
+            ."\n".'- Options: '.$this->formatRouterConfig($route->getOptions());
+
+        if ('' !== $route->getCondition()) {
+            $output .= "\n".'- Condition: '.$route->getCondition();
+        }
+
+        $this->write(isset($options['name'])
+            ? $options['name']."\n".str_repeat('-', \strlen($options['name']))."\n\n".$output
+            : $output);
+        $this->write("\n");
+    }
+
+    protected function describeContainerParameters(ParameterBag $parameters, array $options = [])
+    {
+        $this->write("Container parameters\n====================\n");
+        foreach ($this->sortParameters($parameters) as $key => $value) {
+            $this->write(sprintf("\n- `%s`: `%s`", $key, $this->formatParameter($value)));
+        }
+    }
+
+    protected function describeContainerTags(ContainerBuilder $builder, array $options = [])
+    {
+        $showHidden = isset($options['show_hidden']) && $options['show_hidden'];
+        $this->write("Container tags\n==============");
+
+        foreach ($this->findDefinitionsByTag($builder, $showHidden) as $tag => $definitions) {
+            $this->write("\n\n".$tag."\n".str_repeat('-', \strlen($tag)));
+            foreach ($definitions as $serviceId => $definition) {
+                $this->write("\n\n");
+                $this->describeContainerDefinition($definition, ['omit_tags' => true, 'id' => $serviceId]);
+            }
+        }
+    }
+
+    protected function describeContainerService($service, array $options = [], ContainerBuilder $builder = null)
+    {
+        if (!isset($options['id'])) {
+            throw new \InvalidArgumentException('An "id" option must be provided.');
+        }
+
+        $childOptions = array_merge($options, ['id' => $options['id'], 'as_array' => true]);
+
+        if ($service instanceof Alias) {
+            $this->describeContainerAlias($service, $childOptions, $builder);
+        } elseif ($service instanceof Definition) {
+            $this->describeContainerDefinition($service, $childOptions);
+        } else {
+            $this->write(sprintf('**`%s`:** `%s`', $options['id'], \get_class($service)));
+        }
+    }
+
+    protected function describeContainerServices(ContainerBuilder $builder, array $options = [])
+    {
+        $showHidden = isset($options['show_hidden']) && $options['show_hidden'];
+
+        $title = $showHidden ? 'Hidden services' : 'Services';
+        if (isset($options['tag'])) {
+            $title .= ' with tag `'.$options['tag'].'`';
+        }
+        $this->write($title."\n".str_repeat('=', \strlen($title)));
+
+        $serviceIds = isset($options['tag']) && $options['tag']
+            ? $this->sortTaggedServicesByPriority($builder->findTaggedServiceIds($options['tag']))
+            : $this->sortServiceIds($builder->getServiceIds());
+        $showArguments = isset($options['show_arguments']) && $options['show_arguments'];
+        $services = ['definitions' => [], 'aliases' => [], 'services' => []];
+
+        if (isset($options['filter'])) {
+            $serviceIds = array_filter($serviceIds, $options['filter']);
+        }
+
+        foreach ($serviceIds as $serviceId) {
+            $service = $this->resolveServiceDefinition($builder, $serviceId);
+
+            if ($showHidden xor '.' === ($serviceId[0] ?? null)) {
+                continue;
+            }
+
+            if ($service instanceof Alias) {
+                $services['aliases'][$serviceId] = $service;
+            } elseif ($service instanceof Definition) {
+                $services['definitions'][$serviceId] = $service;
+            } else {
+                $services['services'][$serviceId] = $service;
+            }
+        }
+
+        if (!empty($services['definitions'])) {
+            $this->write("\n\nDefinitions\n-----------\n");
+            foreach ($services['definitions'] as $id => $service) {
+                $this->write("\n");
+                $this->describeContainerDefinition($service, ['id' => $id, 'show_arguments' => $showArguments]);
+            }
+        }
+
+        if (!empty($services['aliases'])) {
+            $this->write("\n\nAliases\n-------\n");
+            foreach ($services['aliases'] as $id => $service) {
+                $this->write("\n");
+                $this->describeContainerAlias($service, ['id' => $id]);
+            }
+        }
+
+        if (!empty($services['services'])) {
+            $this->write("\n\nServices\n--------\n");
+            foreach ($services['services'] as $id => $service) {
+                $this->write("\n");
+                $this->write(sprintf('- `%s`: `%s`', $id, \get_class($service)));
+            }
+        }
+    }
+
+    protected function describeContainerDefinition(Definition $definition, array $options = [])
+    {
+        $output = '';
+
+        if ('' !== $classDescription = $this->getClassDescription((string) $definition->getClass())) {
+            $output .= '- Description: `'.$classDescription.'`'."\n";
+        }
+
+        $output .= '- Class: `'.$definition->getClass().'`'
+            ."\n".'- Public: '.($definition->isPublic() && !$definition->isPrivate() ? 'yes' : 'no')
+            ."\n".'- Synthetic: '.($definition->isSynthetic() ? 'yes' : 'no')
+            ."\n".'- Lazy: '.($definition->isLazy() ? 'yes' : 'no')
+            ."\n".'- Shared: '.($definition->isShared() ? 'yes' : 'no')
+            ."\n".'- Abstract: '.($definition->isAbstract() ? 'yes' : 'no')
+            ."\n".'- Autowired: '.($definition->isAutowired() ? 'yes' : 'no')
+            ."\n".'- Autoconfigured: '.($definition->isAutoconfigured() ? 'yes' : 'no')
+        ;
+
+        if (isset($options['show_arguments']) && $options['show_arguments']) {
+            $output .= "\n".'- Arguments: '.($definition->getArguments() ? 'yes' : 'no');
+        }
+
+        if ($definition->getFile()) {
+            $output .= "\n".'- File: `'.$definition->getFile().'`';
+        }
+
+        if ($factory = $definition->getFactory()) {
+            if (\is_array($factory)) {
+                if ($factory[0] instanceof Reference) {
+                    $output .= "\n".'- Factory Service: `'.$factory[0].'`';
+                } elseif ($factory[0] instanceof Definition) {
+                    throw new \InvalidArgumentException('Factory is not describable.');
+                } else {
+                    $output .= "\n".'- Factory Class: `'.$factory[0].'`';
+                }
+                $output .= "\n".'- Factory Method: `'.$factory[1].'`';
+            } else {
+                $output .= "\n".'- Factory Function: `'.$factory.'`';
+            }
+        }
+
+        $calls = $definition->getMethodCalls();
+        foreach ($calls as $callData) {
+            $output .= "\n".'- Call: `'.$callData[0].'`';
+        }
+
+        if (!(isset($options['omit_tags']) && $options['omit_tags'])) {
+            foreach ($this->sortTagsByPriority($definition->getTags()) as $tagName => $tagData) {
+                foreach ($tagData as $parameters) {
+                    $output .= "\n".'- Tag: `'.$tagName.'`';
+                    foreach ($parameters as $name => $value) {
+                        $output .= "\n".'    - '.ucfirst($name).': '.$value;
+                    }
+                }
+            }
+        }
+
+        $this->write(isset($options['id']) ? sprintf("### %s\n\n%s\n", $options['id'], $output) : $output);
+    }
+
+    protected function describeContainerAlias(Alias $alias, array $options = [], ContainerBuilder $builder = null)
+    {
+        $output = '- Service: `'.$alias.'`'
+            ."\n".'- Public: '.($alias->isPublic() && !$alias->isPrivate() ? 'yes' : 'no');
+
+        if (!isset($options['id'])) {
+            $this->write($output);
+
+            return;
+        }
+
+        $this->write(sprintf("### %s\n\n%s\n", $options['id'], $output));
+
+        if (!$builder) {
+            return;
+        }
+
+        $this->write("\n");
+        $this->describeContainerDefinition($builder->getDefinition((string) $alias), array_merge($options, ['id' => (string) $alias]));
+    }
+
+    protected function describeContainerParameter($parameter, array $options = [])
+    {
+        $this->write(isset($options['parameter']) ? sprintf("%s\n%s\n\n%s", $options['parameter'], str_repeat('=', \strlen($options['parameter'])), $this->formatParameter($parameter)) : $parameter);
+    }
+
+    protected function describeContainerEnvVars(array $envs, array $options = [])
+    {
+        throw new LogicException('Using the markdown format to debug environment variables is not supported.');
+    }
+
+    protected function describeEventDispatcherListeners(EventDispatcherInterface $eventDispatcher, array $options = [])
+    {
+        $event = $options['event'] ?? null;
+
+        $title = 'Registered listeners';
+        if (null !== $event) {
+            $title .= sprintf(' for event `%s` ordered by descending priority', $event);
+        }
+
+        $this->write(sprintf('# %s', $title)."\n");
+
+        $registeredListeners = $eventDispatcher->getListeners($event);
+        if (null !== $event) {
+            foreach ($registeredListeners as $order => $listener) {
+                $this->write("\n".sprintf('## Listener %d', $order + 1)."\n");
+                $this->describeCallable($listener);
+                $this->write(sprintf('- Priority: `%d`', $eventDispatcher->getListenerPriority($event, $listener))."\n");
+            }
+        } else {
+            ksort($registeredListeners);
+
+            foreach ($registeredListeners as $eventListened => $eventListeners) {
+                $this->write("\n".sprintf('## %s', $eventListened)."\n");
+
+                foreach ($eventListeners as $order => $eventListener) {
+                    $this->write("\n".sprintf('### Listener %d', $order + 1)."\n");
+                    $this->describeCallable($eventListener);
+                    $this->write(sprintf('- Priority: `%d`', $eventDispatcher->getListenerPriority($eventListened, $eventListener))."\n");
+                }
+            }
+        }
+    }
+
+    protected function describeCallable($callable, array $options = [])
+    {
+        $string = '';
+
+        if (\is_array($callable)) {
+            $string .= "\n- Type: `function`";
+
+            if (\is_object($callable[0])) {
+                $string .= "\n".sprintf('- Name: `%s`', $callable[1]);
+                $string .= "\n".sprintf('- Class: `%s`', \get_class($callable[0]));
+            } else {
+                if (!str_starts_with($callable[1], 'parent::')) {
+                    $string .= "\n".sprintf('- Name: `%s`', $callable[1]);
+                    $string .= "\n".sprintf('- Class: `%s`', $callable[0]);
+                    $string .= "\n- Static: yes";
+                } else {
+                    $string .= "\n".sprintf('- Name: `%s`', substr($callable[1], 8));
+                    $string .= "\n".sprintf('- Class: `%s`', $callable[0]);
+                    $string .= "\n- Static: yes";
+                    $string .= "\n- Parent: yes";
+                }
+            }
+
+            return $this->write($string."\n");
+        }
+
+        if (\is_string($callable)) {
+            $string .= "\n- Type: `function`";
+
+            if (!str_contains($callable, '::')) {
+                $string .= "\n".sprintf('- Name: `%s`', $callable);
+            } else {
+                $callableParts = explode('::', $callable);
+
+                $string .= "\n".sprintf('- Name: `%s`', $callableParts[1]);
+                $string .= "\n".sprintf('- Class: `%s`', $callableParts[0]);
+                $string .= "\n- Static: yes";
+            }
+
+            return $this->write($string."\n");
+        }
+
+        if ($callable instanceof \Closure) {
+            $string .= "\n- Type: `closure`";
+
+            $r = new \ReflectionFunction($callable);
+            if (str_contains($r->name, '{closure}')) {
+                return $this->write($string."\n");
+            }
+            $string .= "\n".sprintf('- Name: `%s`', $r->name);
+
+            if ($class = $r->getClosureScopeClass()) {
+                $string .= "\n".sprintf('- Class: `%s`', $class->name);
+                if (!$r->getClosureThis()) {
+                    $string .= "\n- Static: yes";
+                }
+            }
+
+            return $this->write($string."\n");
+        }
+
+        if (method_exists($callable, '__invoke')) {
+            $string .= "\n- Type: `object`";
+            $string .= "\n".sprintf('- Name: `%s`', \get_class($callable));
+
+            return $this->write($string."\n");
+        }
+
+        throw new \InvalidArgumentException('Callable is not describable.');
+    }
+
+    private function formatRouterConfig(array $array): string
+    {
+        if (!$array) {
+            return 'NONE';
+        }
+
+        $string = '';
+        ksort($array);
+        foreach ($array as $name => $value) {
+            $string .= "\n".'    - `'.$name.'`: '.$this->formatValue($value);
+        }
+
+        return $string;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Console/Descriptor/TextDescriptor.php b/vendor/symfony/framework-bundle/Console/Descriptor/TextDescriptor.php
new file mode 100644
index 0000000000000000000000000000000000000000..67669e5a3c3cc964fda017014b5bc92124078ea7
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Console/Descriptor/TextDescriptor.php
@@ -0,0 +1,576 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Console\Descriptor;
+
+use Symfony\Component\Console\Formatter\OutputFormatter;
+use Symfony\Component\Console\Helper\Dumper;
+use Symfony\Component\Console\Helper\Table;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
+use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
+ */
+class TextDescriptor extends Descriptor
+{
+    private $fileLinkFormatter;
+
+    public function __construct(FileLinkFormatter $fileLinkFormatter = null)
+    {
+        $this->fileLinkFormatter = $fileLinkFormatter;
+    }
+
+    protected function describeRouteCollection(RouteCollection $routes, array $options = [])
+    {
+        $showControllers = isset($options['show_controllers']) && $options['show_controllers'];
+
+        $tableHeaders = ['Name', 'Method', 'Scheme', 'Host', 'Path'];
+        if ($showControllers) {
+            $tableHeaders[] = 'Controller';
+        }
+
+        $tableRows = [];
+        foreach ($routes->all() as $name => $route) {
+            $controller = $route->getDefault('_controller');
+
+            $row = [
+                $name,
+                $route->getMethods() ? implode('|', $route->getMethods()) : 'ANY',
+                $route->getSchemes() ? implode('|', $route->getSchemes()) : 'ANY',
+                '' !== $route->getHost() ? $route->getHost() : 'ANY',
+                $this->formatControllerLink($controller, $route->getPath()),
+            ];
+
+            if ($showControllers) {
+                $row[] = $controller ? $this->formatControllerLink($controller, $this->formatCallable($controller)) : '';
+            }
+
+            $tableRows[] = $row;
+        }
+
+        if (isset($options['output'])) {
+            $options['output']->table($tableHeaders, $tableRows);
+        } else {
+            $table = new Table($this->getOutput());
+            $table->setHeaders($tableHeaders)->setRows($tableRows);
+            $table->render();
+        }
+    }
+
+    protected function describeRoute(Route $route, array $options = [])
+    {
+        $tableHeaders = ['Property', 'Value'];
+        $tableRows = [
+            ['Route Name', $options['name'] ?? ''],
+            ['Path', $route->getPath()],
+            ['Path Regex', $route->compile()->getRegex()],
+            ['Host', '' !== $route->getHost() ? $route->getHost() : 'ANY'],
+            ['Host Regex', '' !== $route->getHost() ? $route->compile()->getHostRegex() : ''],
+            ['Scheme', $route->getSchemes() ? implode('|', $route->getSchemes()) : 'ANY'],
+            ['Method', $route->getMethods() ? implode('|', $route->getMethods()) : 'ANY'],
+            ['Requirements', $route->getRequirements() ? $this->formatRouterConfig($route->getRequirements()) : 'NO CUSTOM'],
+            ['Class', \get_class($route)],
+            ['Defaults', $this->formatRouterConfig($route->getDefaults())],
+            ['Options', $this->formatRouterConfig($route->getOptions())],
+        ];
+
+        if ('' !== $route->getCondition()) {
+            $tableRows[] = ['Condition', $route->getCondition()];
+        }
+
+        $table = new Table($this->getOutput());
+        $table->setHeaders($tableHeaders)->setRows($tableRows);
+        $table->render();
+    }
+
+    protected function describeContainerParameters(ParameterBag $parameters, array $options = [])
+    {
+        $tableHeaders = ['Parameter', 'Value'];
+
+        $tableRows = [];
+        foreach ($this->sortParameters($parameters) as $parameter => $value) {
+            $tableRows[] = [$parameter, $this->formatParameter($value)];
+        }
+
+        $options['output']->title('Symfony Container Parameters');
+        $options['output']->table($tableHeaders, $tableRows);
+    }
+
+    protected function describeContainerTags(ContainerBuilder $builder, array $options = [])
+    {
+        $showHidden = isset($options['show_hidden']) && $options['show_hidden'];
+
+        if ($showHidden) {
+            $options['output']->title('Symfony Container Hidden Tags');
+        } else {
+            $options['output']->title('Symfony Container Tags');
+        }
+
+        foreach ($this->findDefinitionsByTag($builder, $showHidden) as $tag => $definitions) {
+            $options['output']->section(sprintf('"%s" tag', $tag));
+            $options['output']->listing(array_keys($definitions));
+        }
+    }
+
+    protected function describeContainerService($service, array $options = [], ContainerBuilder $builder = null)
+    {
+        if (!isset($options['id'])) {
+            throw new \InvalidArgumentException('An "id" option must be provided.');
+        }
+
+        if ($service instanceof Alias) {
+            $this->describeContainerAlias($service, $options, $builder);
+        } elseif ($service instanceof Definition) {
+            $this->describeContainerDefinition($service, $options);
+        } else {
+            $options['output']->title(sprintf('Information for Service "<info>%s</info>"', $options['id']));
+            $options['output']->table(
+                ['Service ID', 'Class'],
+                [
+                    [$options['id'] ?? '-', \get_class($service)],
+                ]
+            );
+        }
+    }
+
+    protected function describeContainerServices(ContainerBuilder $builder, array $options = [])
+    {
+        $showHidden = isset($options['show_hidden']) && $options['show_hidden'];
+        $showTag = $options['tag'] ?? null;
+
+        if ($showHidden) {
+            $title = 'Symfony Container Hidden Services';
+        } else {
+            $title = 'Symfony Container Services';
+        }
+
+        if ($showTag) {
+            $title .= sprintf(' Tagged with "%s" Tag', $options['tag']);
+        }
+
+        $options['output']->title($title);
+
+        $serviceIds = isset($options['tag']) && $options['tag']
+            ? $this->sortTaggedServicesByPriority($builder->findTaggedServiceIds($options['tag']))
+            : $this->sortServiceIds($builder->getServiceIds());
+        $maxTags = [];
+
+        if (isset($options['filter'])) {
+            $serviceIds = array_filter($serviceIds, $options['filter']);
+        }
+
+        foreach ($serviceIds as $key => $serviceId) {
+            $definition = $this->resolveServiceDefinition($builder, $serviceId);
+
+            // filter out hidden services unless shown explicitly
+            if ($showHidden xor '.' === ($serviceId[0] ?? null)) {
+                unset($serviceIds[$key]);
+                continue;
+            }
+
+            if ($definition instanceof Definition) {
+                if ($showTag) {
+                    $tags = $definition->getTag($showTag);
+                    foreach ($tags as $tag) {
+                        foreach ($tag as $key => $value) {
+                            if (!isset($maxTags[$key])) {
+                                $maxTags[$key] = \strlen($key);
+                            }
+                            if (\strlen($value) > $maxTags[$key]) {
+                                $maxTags[$key] = \strlen($value);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        $tagsCount = \count($maxTags);
+        $tagsNames = array_keys($maxTags);
+
+        $tableHeaders = array_merge(['Service ID'], $tagsNames, ['Class name']);
+        $tableRows = [];
+        $rawOutput = isset($options['raw_text']) && $options['raw_text'];
+        foreach ($serviceIds as $serviceId) {
+            $definition = $this->resolveServiceDefinition($builder, $serviceId);
+
+            $styledServiceId = $rawOutput ? $serviceId : sprintf('<fg=cyan>%s</fg=cyan>', OutputFormatter::escape($serviceId));
+            if ($definition instanceof Definition) {
+                if ($showTag) {
+                    foreach ($this->sortByPriority($definition->getTag($showTag)) as $key => $tag) {
+                        $tagValues = [];
+                        foreach ($tagsNames as $tagName) {
+                            $tagValues[] = $tag[$tagName] ?? '';
+                        }
+                        if (0 === $key) {
+                            $tableRows[] = array_merge([$serviceId], $tagValues, [$definition->getClass()]);
+                        } else {
+                            $tableRows[] = array_merge(['  "'], $tagValues, ['']);
+                        }
+                    }
+                } else {
+                    $tableRows[] = [$styledServiceId, $definition->getClass()];
+                }
+            } elseif ($definition instanceof Alias) {
+                $alias = $definition;
+                $tableRows[] = array_merge([$styledServiceId, sprintf('alias for "%s"', $alias)], $tagsCount ? array_fill(0, $tagsCount, '') : []);
+            } else {
+                $tableRows[] = array_merge([$styledServiceId, \get_class($definition)], $tagsCount ? array_fill(0, $tagsCount, '') : []);
+            }
+        }
+
+        $options['output']->table($tableHeaders, $tableRows);
+    }
+
+    protected function describeContainerDefinition(Definition $definition, array $options = [])
+    {
+        if (isset($options['id'])) {
+            $options['output']->title(sprintf('Information for Service "<info>%s</info>"', $options['id']));
+        }
+
+        if ('' !== $classDescription = $this->getClassDescription((string) $definition->getClass())) {
+            $options['output']->text($classDescription."\n");
+        }
+
+        $tableHeaders = ['Option', 'Value'];
+
+        $tableRows[] = ['Service ID', $options['id'] ?? '-'];
+        $tableRows[] = ['Class', $definition->getClass() ?: '-'];
+
+        $omitTags = isset($options['omit_tags']) && $options['omit_tags'];
+        if (!$omitTags && ($tags = $definition->getTags())) {
+            $tagInformation = [];
+            foreach ($tags as $tagName => $tagData) {
+                foreach ($tagData as $tagParameters) {
+                    $parameters = array_map(function ($key, $value) {
+                        return sprintf('<info>%s</info>: %s', $key, $value);
+                    }, array_keys($tagParameters), array_values($tagParameters));
+                    $parameters = implode(', ', $parameters);
+
+                    if ('' === $parameters) {
+                        $tagInformation[] = sprintf('%s', $tagName);
+                    } else {
+                        $tagInformation[] = sprintf('%s (%s)', $tagName, $parameters);
+                    }
+                }
+            }
+            $tagInformation = implode("\n", $tagInformation);
+        } else {
+            $tagInformation = '-';
+        }
+        $tableRows[] = ['Tags', $tagInformation];
+
+        $calls = $definition->getMethodCalls();
+        if (\count($calls) > 0) {
+            $callInformation = [];
+            foreach ($calls as $call) {
+                $callInformation[] = $call[0];
+            }
+            $tableRows[] = ['Calls', implode(', ', $callInformation)];
+        }
+
+        $tableRows[] = ['Public', $definition->isPublic() && !$definition->isPrivate() ? 'yes' : 'no'];
+        $tableRows[] = ['Synthetic', $definition->isSynthetic() ? 'yes' : 'no'];
+        $tableRows[] = ['Lazy', $definition->isLazy() ? 'yes' : 'no'];
+        $tableRows[] = ['Shared', $definition->isShared() ? 'yes' : 'no'];
+        $tableRows[] = ['Abstract', $definition->isAbstract() ? 'yes' : 'no'];
+        $tableRows[] = ['Autowired', $definition->isAutowired() ? 'yes' : 'no'];
+        $tableRows[] = ['Autoconfigured', $definition->isAutoconfigured() ? 'yes' : 'no'];
+
+        if ($definition->getFile()) {
+            $tableRows[] = ['Required File', $definition->getFile() ?: '-'];
+        }
+
+        if ($factory = $definition->getFactory()) {
+            if (\is_array($factory)) {
+                if ($factory[0] instanceof Reference) {
+                    $tableRows[] = ['Factory Service', $factory[0]];
+                } elseif ($factory[0] instanceof Definition) {
+                    throw new \InvalidArgumentException('Factory is not describable.');
+                } else {
+                    $tableRows[] = ['Factory Class', $factory[0]];
+                }
+                $tableRows[] = ['Factory Method', $factory[1]];
+            } else {
+                $tableRows[] = ['Factory Function', $factory];
+            }
+        }
+
+        $showArguments = isset($options['show_arguments']) && $options['show_arguments'];
+        $argumentsInformation = [];
+        if ($showArguments && ($arguments = $definition->getArguments())) {
+            foreach ($arguments as $argument) {
+                if ($argument instanceof ServiceClosureArgument) {
+                    $argument = $argument->getValues()[0];
+                }
+                if ($argument instanceof Reference) {
+                    $argumentsInformation[] = sprintf('Service(%s)', (string) $argument);
+                } elseif ($argument instanceof IteratorArgument) {
+                    if ($argument instanceof TaggedIteratorArgument) {
+                        $argumentsInformation[] = sprintf('Tagged Iterator for "%s"%s', $argument->getTag(), $options['is_debug'] ? '' : sprintf(' (%d element(s))', \count($argument->getValues())));
+                    } else {
+                        $argumentsInformation[] = sprintf('Iterator (%d element(s))', \count($argument->getValues()));
+                    }
+
+                    foreach ($argument->getValues() as $ref) {
+                        $argumentsInformation[] = sprintf('- Service(%s)', $ref);
+                    }
+                } elseif ($argument instanceof ServiceLocatorArgument) {
+                    $argumentsInformation[] = sprintf('Service locator (%d element(s))', \count($argument->getValues()));
+                } elseif ($argument instanceof Definition) {
+                    $argumentsInformation[] = 'Inlined Service';
+                } elseif ($argument instanceof \UnitEnum) {
+                    $argumentsInformation[] = ltrim(var_export($argument, true), '\\');
+                } else {
+                    $argumentsInformation[] = \is_array($argument) ? sprintf('Array (%d element(s))', \count($argument)) : $argument;
+                }
+            }
+
+            $tableRows[] = ['Arguments', implode("\n", $argumentsInformation)];
+        }
+
+        $options['output']->table($tableHeaders, $tableRows);
+    }
+
+    protected function describeContainerAlias(Alias $alias, array $options = [], ContainerBuilder $builder = null)
+    {
+        if ($alias->isPublic() && !$alias->isPrivate()) {
+            $options['output']->comment(sprintf('This service is a <info>public</info> alias for the service <info>%s</info>', (string) $alias));
+        } else {
+            $options['output']->comment(sprintf('This service is a <comment>private</comment> alias for the service <info>%s</info>', (string) $alias));
+        }
+
+        if (!$builder) {
+            return;
+        }
+
+        $this->describeContainerDefinition($builder->getDefinition((string) $alias), array_merge($options, ['id' => (string) $alias]));
+    }
+
+    protected function describeContainerParameter($parameter, array $options = [])
+    {
+        $options['output']->table(
+            ['Parameter', 'Value'],
+            [
+                [$options['parameter'], $this->formatParameter($parameter),
+            ],
+        ]);
+    }
+
+    protected function describeContainerEnvVars(array $envs, array $options = [])
+    {
+        $dump = new Dumper($this->output);
+        $options['output']->title('Symfony Container Environment Variables');
+
+        if (null !== $name = $options['name'] ?? null) {
+            $options['output']->comment('Displaying detailed environment variable usage matching '.$name);
+
+            $matches = false;
+            foreach ($envs as $env) {
+                if ($name === $env['name'] || false !== stripos($env['name'], $name)) {
+                    $matches = true;
+                    $options['output']->section('%env('.$env['processor'].':'.$env['name'].')%');
+                    $options['output']->table([], [
+                        ['<info>Default value</>', $env['default_available'] ? $dump($env['default_value']) : 'n/a'],
+                        ['<info>Real value</>', $env['runtime_available'] ? $dump($env['runtime_value']) : 'n/a'],
+                        ['<info>Processed value</>', $env['default_available'] || $env['runtime_available'] ? $dump($env['processed_value']) : 'n/a'],
+                    ]);
+                }
+            }
+
+            if (!$matches) {
+                $options['output']->block('None of the environment variables match this name.');
+            } else {
+                $options['output']->comment('Note real values might be different between web and CLI.');
+            }
+
+            return;
+        }
+
+        if (!$envs) {
+            $options['output']->block('No environment variables are being used.');
+
+            return;
+        }
+
+        $rows = [];
+        $missing = [];
+        foreach ($envs as $env) {
+            if (isset($rows[$env['name']])) {
+                continue;
+            }
+
+            $rows[$env['name']] = [
+                $env['name'],
+                $env['default_available'] ? $dump($env['default_value']) : 'n/a',
+                $env['runtime_available'] ? $dump($env['runtime_value']) : 'n/a',
+            ];
+            if (!$env['default_available'] && !$env['runtime_available']) {
+                $missing[$env['name']] = true;
+            }
+        }
+
+        $options['output']->table(['Name', 'Default value', 'Real value'], $rows);
+        $options['output']->comment('Note real values might be different between web and CLI.');
+
+        if ($missing) {
+            $options['output']->warning('The following variables are missing:');
+            $options['output']->listing(array_keys($missing));
+        }
+    }
+
+    protected function describeEventDispatcherListeners(EventDispatcherInterface $eventDispatcher, array $options = [])
+    {
+        $event = $options['event'] ?? null;
+
+        if (null !== $event) {
+            $title = sprintf('Registered Listeners for "%s" Event', $event);
+        } else {
+            $title = 'Registered Listeners Grouped by Event';
+        }
+
+        $options['output']->title($title);
+
+        $registeredListeners = $eventDispatcher->getListeners($event);
+        if (null !== $event) {
+            $this->renderEventListenerTable($eventDispatcher, $event, $registeredListeners, $options['output']);
+        } else {
+            ksort($registeredListeners);
+            foreach ($registeredListeners as $eventListened => $eventListeners) {
+                $options['output']->section(sprintf('"%s" event', $eventListened));
+                $this->renderEventListenerTable($eventDispatcher, $eventListened, $eventListeners, $options['output']);
+            }
+        }
+    }
+
+    protected function describeCallable($callable, array $options = [])
+    {
+        $this->writeText($this->formatCallable($callable), $options);
+    }
+
+    private function renderEventListenerTable(EventDispatcherInterface $eventDispatcher, string $event, array $eventListeners, SymfonyStyle $io)
+    {
+        $tableHeaders = ['Order', 'Callable', 'Priority'];
+        $tableRows = [];
+
+        foreach ($eventListeners as $order => $listener) {
+            $tableRows[] = [sprintf('#%d', $order + 1), $this->formatCallable($listener), $eventDispatcher->getListenerPriority($event, $listener)];
+        }
+
+        $io->table($tableHeaders, $tableRows);
+    }
+
+    private function formatRouterConfig(array $config): string
+    {
+        if (empty($config)) {
+            return 'NONE';
+        }
+
+        ksort($config);
+
+        $configAsString = '';
+        foreach ($config as $key => $value) {
+            $configAsString .= sprintf("\n%s: %s", $key, $this->formatValue($value));
+        }
+
+        return trim($configAsString);
+    }
+
+    private function formatControllerLink($controller, string $anchorText): string
+    {
+        if (null === $this->fileLinkFormatter) {
+            return $anchorText;
+        }
+
+        try {
+            if (null === $controller) {
+                return $anchorText;
+            } elseif (\is_array($controller)) {
+                $r = new \ReflectionMethod($controller[0], $controller[1]);
+            } elseif ($controller instanceof \Closure) {
+                $r = new \ReflectionFunction($controller);
+            } elseif (method_exists($controller, '__invoke')) {
+                $r = new \ReflectionMethod($controller, '__invoke');
+            } elseif (!\is_string($controller)) {
+                return $anchorText;
+            } elseif (str_contains($controller, '::')) {
+                $r = new \ReflectionMethod($controller);
+            } else {
+                $r = new \ReflectionFunction($controller);
+            }
+        } catch (\ReflectionException $e) {
+            return $anchorText;
+        }
+
+        $fileLink = $this->fileLinkFormatter->format($r->getFileName(), $r->getStartLine());
+        if ($fileLink) {
+            return sprintf('<href=%s>%s</>', $fileLink, $anchorText);
+        }
+
+        return $anchorText;
+    }
+
+    private function formatCallable($callable): string
+    {
+        if (\is_array($callable)) {
+            if (\is_object($callable[0])) {
+                return sprintf('%s::%s()', \get_class($callable[0]), $callable[1]);
+            }
+
+            return sprintf('%s::%s()', $callable[0], $callable[1]);
+        }
+
+        if (\is_string($callable)) {
+            return sprintf('%s()', $callable);
+        }
+
+        if ($callable instanceof \Closure) {
+            $r = new \ReflectionFunction($callable);
+            if (str_contains($r->name, '{closure}')) {
+                return 'Closure()';
+            }
+            if ($class = $r->getClosureScopeClass()) {
+                return sprintf('%s::%s()', $class->name, $r->name);
+            }
+
+            return $r->name.'()';
+        }
+
+        if (method_exists($callable, '__invoke')) {
+            return sprintf('%s::__invoke()', \get_class($callable));
+        }
+
+        throw new \InvalidArgumentException('Callable is not describable.');
+    }
+
+    private function writeText(string $content, array $options = [])
+    {
+        $this->write(
+            isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content,
+            isset($options['raw_output']) ? !$options['raw_output'] : true
+        );
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.php b/vendor/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.php
new file mode 100644
index 0000000000000000000000000000000000000000..65e3dbc17b077fa51c8f6b327f06622516dca6df
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.php
@@ -0,0 +1,534 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Console\Descriptor;
+
+use Symfony\Component\Console\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
+ */
+class XmlDescriptor extends Descriptor
+{
+    protected function describeRouteCollection(RouteCollection $routes, array $options = [])
+    {
+        $this->writeDocument($this->getRouteCollectionDocument($routes));
+    }
+
+    protected function describeRoute(Route $route, array $options = [])
+    {
+        $this->writeDocument($this->getRouteDocument($route, $options['name'] ?? null));
+    }
+
+    protected function describeContainerParameters(ParameterBag $parameters, array $options = [])
+    {
+        $this->writeDocument($this->getContainerParametersDocument($parameters));
+    }
+
+    protected function describeContainerTags(ContainerBuilder $builder, array $options = [])
+    {
+        $this->writeDocument($this->getContainerTagsDocument($builder, isset($options['show_hidden']) && $options['show_hidden']));
+    }
+
+    protected function describeContainerService($service, array $options = [], ContainerBuilder $builder = null)
+    {
+        if (!isset($options['id'])) {
+            throw new \InvalidArgumentException('An "id" option must be provided.');
+        }
+
+        $this->writeDocument($this->getContainerServiceDocument($service, $options['id'], $builder, isset($options['show_arguments']) && $options['show_arguments']));
+    }
+
+    protected function describeContainerServices(ContainerBuilder $builder, array $options = [])
+    {
+        $this->writeDocument($this->getContainerServicesDocument($builder, $options['tag'] ?? null, isset($options['show_hidden']) && $options['show_hidden'], isset($options['show_arguments']) && $options['show_arguments'], $options['filter'] ?? null));
+    }
+
+    protected function describeContainerDefinition(Definition $definition, array $options = [])
+    {
+        $this->writeDocument($this->getContainerDefinitionDocument($definition, $options['id'] ?? null, isset($options['omit_tags']) && $options['omit_tags'], isset($options['show_arguments']) && $options['show_arguments']));
+    }
+
+    protected function describeContainerAlias(Alias $alias, array $options = [], ContainerBuilder $builder = null)
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($dom->importNode($this->getContainerAliasDocument($alias, $options['id'] ?? null)->childNodes->item(0), true));
+
+        if (!$builder) {
+            $this->writeDocument($dom);
+
+            return;
+        }
+
+        $dom->appendChild($dom->importNode($this->getContainerDefinitionDocument($builder->getDefinition((string) $alias), (string) $alias)->childNodes->item(0), true));
+
+        $this->writeDocument($dom);
+    }
+
+    protected function describeEventDispatcherListeners(EventDispatcherInterface $eventDispatcher, array $options = [])
+    {
+        $this->writeDocument($this->getEventDispatcherListenersDocument($eventDispatcher, $options['event'] ?? null));
+    }
+
+    protected function describeCallable($callable, array $options = [])
+    {
+        $this->writeDocument($this->getCallableDocument($callable));
+    }
+
+    protected function describeContainerParameter($parameter, array $options = [])
+    {
+        $this->writeDocument($this->getContainerParameterDocument($parameter, $options));
+    }
+
+    protected function describeContainerEnvVars(array $envs, array $options = [])
+    {
+        throw new LogicException('Using the XML format to debug environment variables is not supported.');
+    }
+
+    private function writeDocument(\DOMDocument $dom)
+    {
+        $dom->formatOutput = true;
+        $this->write($dom->saveXML());
+    }
+
+    private function getRouteCollectionDocument(RouteCollection $routes): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($routesXML = $dom->createElement('routes'));
+
+        foreach ($routes->all() as $name => $route) {
+            $routeXML = $this->getRouteDocument($route, $name);
+            $routesXML->appendChild($routesXML->ownerDocument->importNode($routeXML->childNodes->item(0), true));
+        }
+
+        return $dom;
+    }
+
+    private function getRouteDocument(Route $route, string $name = null): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($routeXML = $dom->createElement('route'));
+
+        if ($name) {
+            $routeXML->setAttribute('name', $name);
+        }
+
+        $routeXML->setAttribute('class', \get_class($route));
+
+        $routeXML->appendChild($pathXML = $dom->createElement('path'));
+        $pathXML->setAttribute('regex', $route->compile()->getRegex());
+        $pathXML->appendChild(new \DOMText($route->getPath()));
+
+        if ('' !== $route->getHost()) {
+            $routeXML->appendChild($hostXML = $dom->createElement('host'));
+            $hostXML->setAttribute('regex', $route->compile()->getHostRegex());
+            $hostXML->appendChild(new \DOMText($route->getHost()));
+        }
+
+        foreach ($route->getSchemes() as $scheme) {
+            $routeXML->appendChild($schemeXML = $dom->createElement('scheme'));
+            $schemeXML->appendChild(new \DOMText($scheme));
+        }
+
+        foreach ($route->getMethods() as $method) {
+            $routeXML->appendChild($methodXML = $dom->createElement('method'));
+            $methodXML->appendChild(new \DOMText($method));
+        }
+
+        if ($route->getDefaults()) {
+            $routeXML->appendChild($defaultsXML = $dom->createElement('defaults'));
+            foreach ($route->getDefaults() as $attribute => $value) {
+                $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
+                $defaultXML->setAttribute('key', $attribute);
+                $defaultXML->appendChild(new \DOMText($this->formatValue($value)));
+            }
+        }
+
+        $originRequirements = $requirements = $route->getRequirements();
+        unset($requirements['_scheme'], $requirements['_method']);
+        if ($requirements) {
+            $routeXML->appendChild($requirementsXML = $dom->createElement('requirements'));
+            foreach ($originRequirements as $attribute => $pattern) {
+                $requirementsXML->appendChild($requirementXML = $dom->createElement('requirement'));
+                $requirementXML->setAttribute('key', $attribute);
+                $requirementXML->appendChild(new \DOMText($pattern));
+            }
+        }
+
+        if ($route->getOptions()) {
+            $routeXML->appendChild($optionsXML = $dom->createElement('options'));
+            foreach ($route->getOptions() as $name => $value) {
+                $optionsXML->appendChild($optionXML = $dom->createElement('option'));
+                $optionXML->setAttribute('key', $name);
+                $optionXML->appendChild(new \DOMText($this->formatValue($value)));
+            }
+        }
+
+        if ('' !== $route->getCondition()) {
+            $routeXML->appendChild($conditionXML = $dom->createElement('condition'));
+            $conditionXML->appendChild(new \DOMText($route->getCondition()));
+        }
+
+        return $dom;
+    }
+
+    private function getContainerParametersDocument(ParameterBag $parameters): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($parametersXML = $dom->createElement('parameters'));
+
+        foreach ($this->sortParameters($parameters) as $key => $value) {
+            $parametersXML->appendChild($parameterXML = $dom->createElement('parameter'));
+            $parameterXML->setAttribute('key', $key);
+            $parameterXML->appendChild(new \DOMText($this->formatParameter($value)));
+        }
+
+        return $dom;
+    }
+
+    private function getContainerTagsDocument(ContainerBuilder $builder, bool $showHidden = false): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($containerXML = $dom->createElement('container'));
+
+        foreach ($this->findDefinitionsByTag($builder, $showHidden) as $tag => $definitions) {
+            $containerXML->appendChild($tagXML = $dom->createElement('tag'));
+            $tagXML->setAttribute('name', $tag);
+
+            foreach ($definitions as $serviceId => $definition) {
+                $definitionXML = $this->getContainerDefinitionDocument($definition, $serviceId, true);
+                $tagXML->appendChild($dom->importNode($definitionXML->childNodes->item(0), true));
+            }
+        }
+
+        return $dom;
+    }
+
+    private function getContainerServiceDocument($service, string $id, ContainerBuilder $builder = null, bool $showArguments = false): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+
+        if ($service instanceof Alias) {
+            $dom->appendChild($dom->importNode($this->getContainerAliasDocument($service, $id)->childNodes->item(0), true));
+            if ($builder) {
+                $dom->appendChild($dom->importNode($this->getContainerDefinitionDocument($builder->getDefinition((string) $service), (string) $service, false, $showArguments)->childNodes->item(0), true));
+            }
+        } elseif ($service instanceof Definition) {
+            $dom->appendChild($dom->importNode($this->getContainerDefinitionDocument($service, $id, false, $showArguments)->childNodes->item(0), true));
+        } else {
+            $dom->appendChild($serviceXML = $dom->createElement('service'));
+            $serviceXML->setAttribute('id', $id);
+            $serviceXML->setAttribute('class', \get_class($service));
+        }
+
+        return $dom;
+    }
+
+    private function getContainerServicesDocument(ContainerBuilder $builder, string $tag = null, bool $showHidden = false, bool $showArguments = false, callable $filter = null): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($containerXML = $dom->createElement('container'));
+
+        $serviceIds = $tag
+            ? $this->sortTaggedServicesByPriority($builder->findTaggedServiceIds($tag))
+            : $this->sortServiceIds($builder->getServiceIds());
+        if ($filter) {
+            $serviceIds = array_filter($serviceIds, $filter);
+        }
+
+        foreach ($serviceIds as $serviceId) {
+            $service = $this->resolveServiceDefinition($builder, $serviceId);
+
+            if ($showHidden xor '.' === ($serviceId[0] ?? null)) {
+                continue;
+            }
+
+            $serviceXML = $this->getContainerServiceDocument($service, $serviceId, null, $showArguments);
+            $containerXML->appendChild($containerXML->ownerDocument->importNode($serviceXML->childNodes->item(0), true));
+        }
+
+        return $dom;
+    }
+
+    private function getContainerDefinitionDocument(Definition $definition, string $id = null, bool $omitTags = false, bool $showArguments = false): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($serviceXML = $dom->createElement('definition'));
+
+        if ($id) {
+            $serviceXML->setAttribute('id', $id);
+        }
+
+        if ('' !== $classDescription = $this->getClassDescription((string) $definition->getClass())) {
+            $serviceXML->appendChild($descriptionXML = $dom->createElement('description'));
+            $descriptionXML->appendChild($dom->createCDATASection($classDescription));
+        }
+
+        $serviceXML->setAttribute('class', $definition->getClass() ?? '');
+
+        if ($factory = $definition->getFactory()) {
+            $serviceXML->appendChild($factoryXML = $dom->createElement('factory'));
+
+            if (\is_array($factory)) {
+                if ($factory[0] instanceof Reference) {
+                    $factoryXML->setAttribute('service', (string) $factory[0]);
+                } elseif ($factory[0] instanceof Definition) {
+                    throw new \InvalidArgumentException('Factory is not describable.');
+                } else {
+                    $factoryXML->setAttribute('class', $factory[0]);
+                }
+                $factoryXML->setAttribute('method', $factory[1]);
+            } else {
+                $factoryXML->setAttribute('function', $factory);
+            }
+        }
+
+        $serviceXML->setAttribute('public', $definition->isPublic() && !$definition->isPrivate() ? 'true' : 'false');
+        $serviceXML->setAttribute('synthetic', $definition->isSynthetic() ? 'true' : 'false');
+        $serviceXML->setAttribute('lazy', $definition->isLazy() ? 'true' : 'false');
+        $serviceXML->setAttribute('shared', $definition->isShared() ? 'true' : 'false');
+        $serviceXML->setAttribute('abstract', $definition->isAbstract() ? 'true' : 'false');
+        $serviceXML->setAttribute('autowired', $definition->isAutowired() ? 'true' : 'false');
+        $serviceXML->setAttribute('autoconfigured', $definition->isAutoconfigured() ? 'true' : 'false');
+        $serviceXML->setAttribute('file', $definition->getFile() ?? '');
+
+        $calls = $definition->getMethodCalls();
+        if (\count($calls) > 0) {
+            $serviceXML->appendChild($callsXML = $dom->createElement('calls'));
+            foreach ($calls as $callData) {
+                $callsXML->appendChild($callXML = $dom->createElement('call'));
+                $callXML->setAttribute('method', $callData[0]);
+                if ($callData[2] ?? false) {
+                    $callXML->setAttribute('returns-clone', 'true');
+                }
+            }
+        }
+
+        if ($showArguments) {
+            foreach ($this->getArgumentNodes($definition->getArguments(), $dom) as $node) {
+                $serviceXML->appendChild($node);
+            }
+        }
+
+        if (!$omitTags) {
+            if ($tags = $this->sortTagsByPriority($definition->getTags())) {
+                $serviceXML->appendChild($tagsXML = $dom->createElement('tags'));
+                foreach ($tags as $tagName => $tagData) {
+                    foreach ($tagData as $parameters) {
+                        $tagsXML->appendChild($tagXML = $dom->createElement('tag'));
+                        $tagXML->setAttribute('name', $tagName);
+                        foreach ($parameters as $name => $value) {
+                            $tagXML->appendChild($parameterXML = $dom->createElement('parameter'));
+                            $parameterXML->setAttribute('name', $name);
+                            $parameterXML->appendChild(new \DOMText($this->formatParameter($value)));
+                        }
+                    }
+                }
+            }
+        }
+
+        return $dom;
+    }
+
+    /**
+     * @return \DOMNode[]
+     */
+    private function getArgumentNodes(array $arguments, \DOMDocument $dom): array
+    {
+        $nodes = [];
+
+        foreach ($arguments as $argumentKey => $argument) {
+            $argumentXML = $dom->createElement('argument');
+
+            if (\is_string($argumentKey)) {
+                $argumentXML->setAttribute('key', $argumentKey);
+            }
+
+            if ($argument instanceof ServiceClosureArgument) {
+                $argument = $argument->getValues()[0];
+            }
+
+            if ($argument instanceof Reference) {
+                $argumentXML->setAttribute('type', 'service');
+                $argumentXML->setAttribute('id', (string) $argument);
+            } elseif ($argument instanceof IteratorArgument || $argument instanceof ServiceLocatorArgument) {
+                $argumentXML->setAttribute('type', $argument instanceof IteratorArgument ? 'iterator' : 'service_locator');
+
+                foreach ($this->getArgumentNodes($argument->getValues(), $dom) as $childArgumentXML) {
+                    $argumentXML->appendChild($childArgumentXML);
+                }
+            } elseif ($argument instanceof Definition) {
+                $argumentXML->appendChild($dom->importNode($this->getContainerDefinitionDocument($argument, null, false, true)->childNodes->item(0), true));
+            } elseif (\is_array($argument)) {
+                $argumentXML->setAttribute('type', 'collection');
+
+                foreach ($this->getArgumentNodes($argument, $dom) as $childArgumentXML) {
+                    $argumentXML->appendChild($childArgumentXML);
+                }
+            } elseif ($argument instanceof \UnitEnum) {
+                $argumentXML->setAttribute('type', 'constant');
+                $argumentXML->appendChild(new \DOMText(ltrim(var_export($argument, true), '\\')));
+            } else {
+                $argumentXML->appendChild(new \DOMText($argument));
+            }
+
+            $nodes[] = $argumentXML;
+        }
+
+        return $nodes;
+    }
+
+    private function getContainerAliasDocument(Alias $alias, string $id = null): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($aliasXML = $dom->createElement('alias'));
+
+        if ($id) {
+            $aliasXML->setAttribute('id', $id);
+        }
+
+        $aliasXML->setAttribute('service', (string) $alias);
+        $aliasXML->setAttribute('public', $alias->isPublic() && !$alias->isPrivate() ? 'true' : 'false');
+
+        return $dom;
+    }
+
+    private function getContainerParameterDocument($parameter, array $options = []): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($parameterXML = $dom->createElement('parameter'));
+
+        if (isset($options['parameter'])) {
+            $parameterXML->setAttribute('key', $options['parameter']);
+        }
+
+        $parameterXML->appendChild(new \DOMText($this->formatParameter($parameter)));
+
+        return $dom;
+    }
+
+    private function getEventDispatcherListenersDocument(EventDispatcherInterface $eventDispatcher, string $event = null): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($eventDispatcherXML = $dom->createElement('event-dispatcher'));
+
+        $registeredListeners = $eventDispatcher->getListeners($event);
+        if (null !== $event) {
+            $this->appendEventListenerDocument($eventDispatcher, $event, $eventDispatcherXML, $registeredListeners);
+        } else {
+            ksort($registeredListeners);
+
+            foreach ($registeredListeners as $eventListened => $eventListeners) {
+                $eventDispatcherXML->appendChild($eventXML = $dom->createElement('event'));
+                $eventXML->setAttribute('name', $eventListened);
+
+                $this->appendEventListenerDocument($eventDispatcher, $eventListened, $eventXML, $eventListeners);
+            }
+        }
+
+        return $dom;
+    }
+
+    private function appendEventListenerDocument(EventDispatcherInterface $eventDispatcher, string $event, \DOMElement $element, array $eventListeners)
+    {
+        foreach ($eventListeners as $listener) {
+            $callableXML = $this->getCallableDocument($listener);
+            $callableXML->childNodes->item(0)->setAttribute('priority', $eventDispatcher->getListenerPriority($event, $listener));
+
+            $element->appendChild($element->ownerDocument->importNode($callableXML->childNodes->item(0), true));
+        }
+    }
+
+    private function getCallableDocument($callable): \DOMDocument
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($callableXML = $dom->createElement('callable'));
+
+        if (\is_array($callable)) {
+            $callableXML->setAttribute('type', 'function');
+
+            if (\is_object($callable[0])) {
+                $callableXML->setAttribute('name', $callable[1]);
+                $callableXML->setAttribute('class', \get_class($callable[0]));
+            } else {
+                if (!str_starts_with($callable[1], 'parent::')) {
+                    $callableXML->setAttribute('name', $callable[1]);
+                    $callableXML->setAttribute('class', $callable[0]);
+                    $callableXML->setAttribute('static', 'true');
+                } else {
+                    $callableXML->setAttribute('name', substr($callable[1], 8));
+                    $callableXML->setAttribute('class', $callable[0]);
+                    $callableXML->setAttribute('static', 'true');
+                    $callableXML->setAttribute('parent', 'true');
+                }
+            }
+
+            return $dom;
+        }
+
+        if (\is_string($callable)) {
+            $callableXML->setAttribute('type', 'function');
+
+            if (!str_contains($callable, '::')) {
+                $callableXML->setAttribute('name', $callable);
+            } else {
+                $callableParts = explode('::', $callable);
+
+                $callableXML->setAttribute('name', $callableParts[1]);
+                $callableXML->setAttribute('class', $callableParts[0]);
+                $callableXML->setAttribute('static', 'true');
+            }
+
+            return $dom;
+        }
+
+        if ($callable instanceof \Closure) {
+            $callableXML->setAttribute('type', 'closure');
+
+            $r = new \ReflectionFunction($callable);
+            if (str_contains($r->name, '{closure}')) {
+                return $dom;
+            }
+            $callableXML->setAttribute('name', $r->name);
+
+            if ($class = $r->getClosureScopeClass()) {
+                $callableXML->setAttribute('class', $class->name);
+                if (!$r->getClosureThis()) {
+                    $callableXML->setAttribute('static', 'true');
+                }
+            }
+
+            return $dom;
+        }
+
+        if (method_exists($callable, '__invoke')) {
+            $callableXML->setAttribute('type', 'object');
+            $callableXML->setAttribute('name', \get_class($callable));
+
+            return $dom;
+        }
+
+        throw new \InvalidArgumentException('Callable is not describable.');
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Console/Helper/DescriptorHelper.php b/vendor/symfony/framework-bundle/Console/Helper/DescriptorHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f17c999424d3f9789185cfc63bd69e22713120b
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Console/Helper/DescriptorHelper.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Console\Helper;
+
+use Symfony\Bundle\FrameworkBundle\Console\Descriptor\JsonDescriptor;
+use Symfony\Bundle\FrameworkBundle\Console\Descriptor\MarkdownDescriptor;
+use Symfony\Bundle\FrameworkBundle\Console\Descriptor\TextDescriptor;
+use Symfony\Bundle\FrameworkBundle\Console\Descriptor\XmlDescriptor;
+use Symfony\Component\Console\Helper\DescriptorHelper as BaseDescriptorHelper;
+use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
+
+/**
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
+ */
+class DescriptorHelper extends BaseDescriptorHelper
+{
+    public function __construct(FileLinkFormatter $fileLinkFormatter = null)
+    {
+        $this
+            ->register('txt', new TextDescriptor($fileLinkFormatter))
+            ->register('xml', new XmlDescriptor())
+            ->register('json', new JsonDescriptor())
+            ->register('md', new MarkdownDescriptor())
+        ;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Controller/AbstractController.php b/vendor/symfony/framework-bundle/Controller/AbstractController.php
new file mode 100644
index 0000000000000000000000000000000000000000..5a2112daf9ed21efa55d41d9d4c176cd8a28651f
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Controller/AbstractController.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Controller;
+
+use Doctrine\Persistence\ManagerRegistry;
+use Psr\Container\ContainerInterface;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
+use Symfony\Component\Form\FormFactoryInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Session\SessionInterface;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\Messenger\MessageBusInterface;
+use Symfony\Component\Routing\RouterInterface;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
+use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
+use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
+use Symfony\Component\Serializer\SerializerInterface;
+use Symfony\Component\Templating\EngineInterface;
+use Symfony\Contracts\Service\ServiceSubscriberInterface;
+use Twig\Environment;
+
+/**
+ * Provides common features needed in controllers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class AbstractController implements ServiceSubscriberInterface
+{
+    use ControllerTrait;
+
+    /**
+     * @var ContainerInterface
+     */
+    protected $container;
+
+    /**
+     * @internal
+     * @required
+     */
+    public function setContainer(ContainerInterface $container): ?ContainerInterface
+    {
+        $previous = $this->container;
+        $this->container = $container;
+
+        return $previous;
+    }
+
+    /**
+     * Gets a container parameter by its name.
+     *
+     * @return array|bool|float|int|string|\UnitEnum|null
+     *
+     * @final
+     */
+    protected function getParameter(string $name)
+    {
+        if (!$this->container->has('parameter_bag')) {
+            throw new ServiceNotFoundException('parameter_bag.', null, null, [], sprintf('The "%s::getParameter()" method is missing a parameter bag to work properly. Did you forget to register your controller as a service subscriber? This can be fixed either by using autoconfiguration or by manually wiring a "parameter_bag" in the service locator passed to the controller.', static::class));
+        }
+
+        return $this->container->get('parameter_bag')->get($name);
+    }
+
+    public static function getSubscribedServices()
+    {
+        return [
+            'router' => '?'.RouterInterface::class,
+            'request_stack' => '?'.RequestStack::class,
+            'http_kernel' => '?'.HttpKernelInterface::class,
+            'serializer' => '?'.SerializerInterface::class,
+            'session' => '?'.SessionInterface::class,
+            'security.authorization_checker' => '?'.AuthorizationCheckerInterface::class,
+            'templating' => '?'.EngineInterface::class,
+            'twig' => '?'.Environment::class,
+            'doctrine' => '?'.ManagerRegistry::class,
+            'form.factory' => '?'.FormFactoryInterface::class,
+            'security.token_storage' => '?'.TokenStorageInterface::class,
+            'security.csrf.token_manager' => '?'.CsrfTokenManagerInterface::class,
+            'parameter_bag' => '?'.ContainerBagInterface::class,
+            'message_bus' => '?'.MessageBusInterface::class,
+            'messenger.default_bus' => '?'.MessageBusInterface::class,
+        ];
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Controller/Controller.php b/vendor/symfony/framework-bundle/Controller/Controller.php
new file mode 100644
index 0000000000000000000000000000000000000000..a7d8f9425c0d0d4643ecd7ff77affb58570d54a4
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Controller/Controller.php
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Controller;
+
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerAwareTrait;
+
+/**
+ * Controller is a simple implementation of a Controller.
+ *
+ * It provides methods to common features needed in controllers.
+ *
+ * @deprecated since Symfony 4.2, use "Symfony\Bundle\FrameworkBundle\Controller\AbstractController" instead.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class Controller implements ContainerAwareInterface
+{
+    use ContainerAwareTrait;
+    use ControllerTrait;
+
+    /**
+     * Gets a container configuration parameter by its name.
+     *
+     * @return array|bool|float|int|string|\UnitEnum|null
+     *
+     * @final
+     */
+    protected function getParameter(string $name)
+    {
+        return $this->container->getParameter($name);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Controller/ControllerNameParser.php b/vendor/symfony/framework-bundle/Controller/ControllerNameParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..34e4382ad8f967479e29b0f7132ca6330c4b315d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Controller/ControllerNameParser.php
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Controller;
+
+use Symfony\Component\HttpKernel\Bundle\BundleInterface;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * ControllerNameParser converts controller from the short notation a:b:c
+ * (BlogBundle:Post:index) to a fully-qualified class::method string
+ * (Bundle\BlogBundle\Controller\PostController::indexAction).
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since Symfony 4.1
+ */
+class ControllerNameParser
+{
+    protected $kernel;
+
+    public function __construct(KernelInterface $kernel, bool $triggerDeprecation = true)
+    {
+        $this->kernel = $kernel;
+
+        if ($triggerDeprecation) {
+            @trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.1.', __CLASS__), \E_USER_DEPRECATED);
+        }
+    }
+
+    /**
+     * Converts a short notation a:b:c to a class::method.
+     *
+     * @param string $controller A short notation controller (a:b:c)
+     *
+     * @return string A string in the class::method notation
+     *
+     * @throws \InvalidArgumentException when the specified bundle is not enabled
+     *                                   or the controller cannot be found
+     */
+    public function parse($controller)
+    {
+        if (2 > \func_num_args() || func_get_arg(1)) {
+            @trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.1.', __CLASS__), \E_USER_DEPRECATED);
+        }
+
+        $parts = explode(':', $controller);
+        if (3 !== \count($parts) || \in_array('', $parts, true)) {
+            throw new \InvalidArgumentException(sprintf('The "%s" controller is not a valid "a:b:c" controller string.', $controller));
+        }
+
+        $originalController = $controller;
+        [$bundleName, $controller, $action] = $parts;
+        $controller = str_replace('/', '\\', $controller);
+
+        try {
+            // this throws an exception if there is no such bundle
+            $bundle = $this->kernel->getBundle($bundleName);
+        } catch (\InvalidArgumentException $e) {
+            $message = sprintf(
+                'The "%s" (from the _controller value "%s") does not exist or is not enabled in your kernel!',
+                $bundleName,
+                $originalController
+            );
+
+            if ($alternative = $this->findAlternative($bundleName)) {
+                $message .= sprintf(' Did you mean "%s:%s:%s"?', $alternative, $controller, $action);
+            }
+
+            throw new \InvalidArgumentException($message, 0, $e);
+        }
+
+        $try = $bundle->getNamespace().'\\Controller\\'.$controller.'Controller';
+        if (class_exists($try)) {
+            return $try.'::'.$action.'Action';
+        }
+
+        throw new \InvalidArgumentException(sprintf('The _controller value "%s:%s:%s" maps to a "%s" class, but this class was not found. Create this class or check the spelling of the class and its namespace.', $bundleName, $controller, $action, $try));
+    }
+
+    /**
+     * Converts a class::method notation to a short one (a:b:c).
+     *
+     * @param string $controller A string in the class::method notation
+     *
+     * @return string A short notation controller (a:b:c)
+     *
+     * @throws \InvalidArgumentException when the controller is not valid or cannot be found in any bundle
+     */
+    public function build($controller)
+    {
+        @trigger_error(sprintf('The %s class is deprecated since Symfony 4.1.', __CLASS__), \E_USER_DEPRECATED);
+
+        if (0 === preg_match('#^(.*?\\\\Controller\\\\(.+)Controller)::(.+)Action$#', $controller, $match)) {
+            throw new \InvalidArgumentException(sprintf('The "%s" controller is not a valid "class::method" string.', $controller));
+        }
+
+        $className = $match[1];
+        $controllerName = $match[2];
+        $actionName = $match[3];
+        foreach ($this->kernel->getBundles() as $name => $bundle) {
+            if (!str_starts_with($className, $bundle->getNamespace())) {
+                continue;
+            }
+
+            return sprintf('%s:%s:%s', $name, $controllerName, $actionName);
+        }
+
+        throw new \InvalidArgumentException(sprintf('Unable to find a bundle that defines controller "%s".', $controller));
+    }
+
+    /**
+     * Attempts to find a bundle that is *similar* to the given bundle name.
+     */
+    private function findAlternative(string $nonExistentBundleName): ?string
+    {
+        $bundleNames = array_map(function (BundleInterface $b) {
+            return $b->getName();
+        }, $this->kernel->getBundles());
+
+        $alternative = null;
+        $shortest = null;
+        foreach ($bundleNames as $bundleName) {
+            // if there's a partial match, return it immediately
+            if (str_contains($bundleName, $nonExistentBundleName)) {
+                return $bundleName;
+            }
+
+            $lev = levenshtein($nonExistentBundleName, $bundleName);
+            if ($lev <= \strlen($nonExistentBundleName) / 3 && (null === $alternative || $lev < $shortest)) {
+                $alternative = $bundleName;
+                $shortest = $lev;
+            }
+        }
+
+        return $alternative;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Controller/ControllerResolver.php b/vendor/symfony/framework-bundle/Controller/ControllerResolver.php
new file mode 100644
index 0000000000000000000000000000000000000000..2883c80b1b0ba3733372d2898f7463475a86489f
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Controller/ControllerResolver.php
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Controller;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpKernel\Controller\ContainerControllerResolver;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @final since Symfony 4.4
+ */
+class ControllerResolver extends ContainerControllerResolver
+{
+    /**
+     * @deprecated since Symfony 4.4
+     */
+    protected $parser;
+
+    /**
+     * @param LoggerInterface|null $logger
+     */
+    public function __construct(ContainerInterface $container, $logger = null)
+    {
+        if ($logger instanceof ControllerNameParser) {
+            @trigger_error(sprintf('Passing a "%s" instance as 2nd argument to "%s()" is deprecated since Symfony 4.4, pass a "%s" instance or null instead.', ControllerNameParser::class, __METHOD__, LoggerInterface::class), \E_USER_DEPRECATED);
+            $this->parser = $logger;
+            $logger = 2 < \func_num_args() ? func_get_arg(2) : null;
+        } elseif (2 < \func_num_args() && func_get_arg(2) instanceof ControllerNameParser) {
+            $this->parser = func_get_arg(2);
+        } elseif ($logger && !$logger instanceof LoggerInterface) {
+            throw new \TypeError(sprintf('Argument 2 of "%s()" must be an instance of "%s" or null, "%s" given.', __METHOD__, LoggerInterface::class, \is_object($logger) ? \get_class($logger) : \gettype($logger)), \E_USER_DEPRECATED);
+        }
+
+        parent::__construct($container, $logger);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function createController($controller)
+    {
+        if ($this->parser && !str_contains($controller, '::') && 2 === substr_count($controller, ':')) {
+            // controller in the a:b:c notation then
+            $deprecatedNotation = $controller;
+            $controller = $this->parser->parse($deprecatedNotation, false);
+
+            @trigger_error(sprintf('Referencing controllers with %s is deprecated since Symfony 4.1. Use %s instead.', $deprecatedNotation, $controller), \E_USER_DEPRECATED);
+        }
+
+        return parent::createController($controller);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function instantiateController($class)
+    {
+        $controller = parent::instantiateController($class);
+
+        if ($controller instanceof ContainerAwareInterface) {
+            $controller->setContainer($this->container);
+        }
+        if ($controller instanceof AbstractController) {
+            if (null === $previousContainer = $controller->setContainer($this->container)) {
+                @trigger_error(sprintf('Auto-injection of the container for "%s" is deprecated since Symfony 4.2. Configure it as a service instead.', $class), \E_USER_DEPRECATED);
+            // To be uncommented on Symfony 5:
+                //throw new \LogicException(sprintf('"%s" has no container set, did you forget to define it as a service subscriber?', $class));
+            } else {
+                $controller->setContainer($previousContainer);
+            }
+        }
+
+        return $controller;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Controller/ControllerTrait.php b/vendor/symfony/framework-bundle/Controller/ControllerTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..8845e03d9a236fdcc6edfbebbfe5f268e2315e7e
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Controller/ControllerTrait.php
@@ -0,0 +1,440 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Controller;
+
+use Doctrine\Persistence\ManagerRegistry;
+use Psr\Container\ContainerInterface;
+use Psr\Link\LinkInterface;
+use Symfony\Component\Form\Extension\Core\Type\FormType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\FormInterface;
+use Symfony\Component\HttpFoundation\BinaryFileResponse;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\ResponseHeaderBag;
+use Symfony\Component\HttpFoundation\StreamedResponse;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\Messenger\Envelope;
+use Symfony\Component\Messenger\Stamp\StampInterface;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Security\Core\Exception\AccessDeniedException;
+use Symfony\Component\Security\Core\User\UserInterface;
+use Symfony\Component\Security\Csrf\CsrfToken;
+use Symfony\Component\WebLink\EventListener\AddLinkHeaderListener;
+use Symfony\Component\WebLink\GenericLinkProvider;
+
+/**
+ * Common features needed in controllers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ *
+ * @property ContainerInterface $container
+ */
+trait ControllerTrait
+{
+    /**
+     * Returns true if the service id is defined.
+     *
+     * @final
+     */
+    protected function has(string $id): bool
+    {
+        return $this->container->has($id);
+    }
+
+    /**
+     * Gets a container service by its id.
+     *
+     * @return object The service
+     *
+     * @final
+     */
+    protected function get(string $id)
+    {
+        return $this->container->get($id);
+    }
+
+    /**
+     * Generates a URL from the given parameters.
+     *
+     * @see UrlGeneratorInterface
+     *
+     * @final
+     */
+    protected function generateUrl(string $route, array $parameters = [], int $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH): string
+    {
+        return $this->container->get('router')->generate($route, $parameters, $referenceType);
+    }
+
+    /**
+     * Forwards the request to another controller.
+     *
+     * @param string $controller The controller name (a string like Bundle\BlogBundle\Controller\PostController::indexAction)
+     *
+     * @final
+     */
+    protected function forward(string $controller, array $path = [], array $query = []): Response
+    {
+        $request = $this->container->get('request_stack')->getCurrentRequest();
+        $path['_controller'] = $controller;
+        $subRequest = $request->duplicate($query, null, $path);
+
+        return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
+    }
+
+    /**
+     * Returns a RedirectResponse to the given URL.
+     *
+     * @final
+     */
+    protected function redirect(string $url, int $status = 302): RedirectResponse
+    {
+        return new RedirectResponse($url, $status);
+    }
+
+    /**
+     * Returns a RedirectResponse to the given route with the given parameters.
+     *
+     * @final
+     */
+    protected function redirectToRoute(string $route, array $parameters = [], int $status = 302): RedirectResponse
+    {
+        return $this->redirect($this->generateUrl($route, $parameters), $status);
+    }
+
+    /**
+     * Returns a JsonResponse that uses the serializer component if enabled, or json_encode.
+     *
+     * @final
+     */
+    protected function json($data, int $status = 200, array $headers = [], array $context = []): JsonResponse
+    {
+        if ($this->container->has('serializer')) {
+            $json = $this->container->get('serializer')->serialize($data, 'json', array_merge([
+                'json_encode_options' => JsonResponse::DEFAULT_ENCODING_OPTIONS,
+            ], $context));
+
+            return new JsonResponse($json, $status, $headers, true);
+        }
+
+        return new JsonResponse($data, $status, $headers);
+    }
+
+    /**
+     * Returns a BinaryFileResponse object with original or customized file name and disposition header.
+     *
+     * @param \SplFileInfo|string $file File object or path to file to be sent as response
+     *
+     * @final
+     */
+    protected function file($file, string $fileName = null, string $disposition = ResponseHeaderBag::DISPOSITION_ATTACHMENT): BinaryFileResponse
+    {
+        $response = new BinaryFileResponse($file);
+        $response->setContentDisposition($disposition, $fileName ?? $response->getFile()->getFilename());
+
+        return $response;
+    }
+
+    /**
+     * Adds a flash message to the current session for type.
+     *
+     * @throws \LogicException
+     *
+     * @final
+     */
+    protected function addFlash(string $type, $message)
+    {
+        if (!$this->container->has('session')) {
+            throw new \LogicException('You can not use the addFlash method if sessions are disabled. Enable them in "config/packages/framework.yaml".');
+        }
+
+        $this->container->get('session')->getFlashBag()->add($type, $message);
+    }
+
+    /**
+     * Checks if the attributes are granted against the current authentication token and optionally supplied subject.
+     *
+     * @throws \LogicException
+     *
+     * @final
+     */
+    protected function isGranted($attributes, $subject = null): bool
+    {
+        if (!$this->container->has('security.authorization_checker')) {
+            throw new \LogicException('The SecurityBundle is not registered in your application. Try running "composer require symfony/security-bundle".');
+        }
+
+        return $this->container->get('security.authorization_checker')->isGranted($attributes, $subject);
+    }
+
+    /**
+     * Throws an exception unless the attributes are granted against the current authentication token and optionally
+     * supplied subject.
+     *
+     * @throws AccessDeniedException
+     *
+     * @final
+     */
+    protected function denyAccessUnlessGranted($attributes, $subject = null, string $message = 'Access Denied.')
+    {
+        if (!$this->isGranted($attributes, $subject)) {
+            $exception = $this->createAccessDeniedException($message);
+            $exception->setAttributes($attributes);
+            $exception->setSubject($subject);
+
+            throw $exception;
+        }
+    }
+
+    /**
+     * Returns a rendered view.
+     *
+     * @final
+     */
+    protected function renderView(string $view, array $parameters = []): string
+    {
+        if ($this->container->has('templating') && $this->container->get('templating')->supports($view)) {
+            @trigger_error('Using the "templating" service is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+            return $this->container->get('templating')->render($view, $parameters);
+        }
+
+        if (!$this->container->has('twig')) {
+            throw new \LogicException('You can not use the "renderView" method if the Templating Component or the Twig Bundle are not available. Try running "composer require symfony/twig-bundle".');
+        }
+
+        return $this->container->get('twig')->render($view, $parameters);
+    }
+
+    /**
+     * Renders a view.
+     *
+     * @final
+     */
+    protected function render(string $view, array $parameters = [], Response $response = null): Response
+    {
+        if ($this->container->has('templating') && $this->container->get('templating')->supports($view)) {
+            @trigger_error('Using the "templating" service is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+            $content = $this->container->get('templating')->render($view, $parameters);
+        } elseif ($this->container->has('twig')) {
+            $content = $this->container->get('twig')->render($view, $parameters);
+        } else {
+            throw new \LogicException('You can not use the "render" method if the Templating Component or the Twig Bundle are not available. Try running "composer require symfony/twig-bundle".');
+        }
+
+        if (null === $response) {
+            $response = new Response();
+        }
+
+        $response->setContent($content);
+
+        return $response;
+    }
+
+    /**
+     * Streams a view.
+     *
+     * @final
+     */
+    protected function stream(string $view, array $parameters = [], StreamedResponse $response = null): StreamedResponse
+    {
+        if ($this->container->has('templating')) {
+            @trigger_error('Using the "templating" service is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+            $templating = $this->container->get('templating');
+
+            $callback = function () use ($templating, $view, $parameters) {
+                $templating->stream($view, $parameters);
+            };
+        } elseif ($this->container->has('twig')) {
+            $twig = $this->container->get('twig');
+
+            $callback = function () use ($twig, $view, $parameters) {
+                $twig->display($view, $parameters);
+            };
+        } else {
+            throw new \LogicException('You can not use the "stream" method if the Templating Component or the Twig Bundle are not available. Try running "composer require symfony/twig-bundle".');
+        }
+
+        if (null === $response) {
+            return new StreamedResponse($callback);
+        }
+
+        $response->setCallback($callback);
+
+        return $response;
+    }
+
+    /**
+     * Returns a NotFoundHttpException.
+     *
+     * This will result in a 404 response code. Usage example:
+     *
+     *     throw $this->createNotFoundException('Page not found!');
+     *
+     * @final
+     */
+    protected function createNotFoundException(string $message = 'Not Found', \Throwable $previous = null): NotFoundHttpException
+    {
+        return new NotFoundHttpException($message, $previous);
+    }
+
+    /**
+     * Returns an AccessDeniedException.
+     *
+     * This will result in a 403 response code. Usage example:
+     *
+     *     throw $this->createAccessDeniedException('Unable to access this page!');
+     *
+     * @throws \LogicException If the Security component is not available
+     *
+     * @final
+     */
+    protected function createAccessDeniedException(string $message = 'Access Denied.', \Throwable $previous = null): AccessDeniedException
+    {
+        if (!class_exists(AccessDeniedException::class)) {
+            throw new \LogicException('You can not use the "createAccessDeniedException" method if the Security component is not available. Try running "composer require symfony/security-bundle".');
+        }
+
+        return new AccessDeniedException($message, $previous);
+    }
+
+    /**
+     * Creates and returns a Form instance from the type of the form.
+     *
+     * @final
+     */
+    protected function createForm(string $type, $data = null, array $options = []): FormInterface
+    {
+        return $this->container->get('form.factory')->create($type, $data, $options);
+    }
+
+    /**
+     * Creates and returns a form builder instance.
+     *
+     * @final
+     */
+    protected function createFormBuilder($data = null, array $options = []): FormBuilderInterface
+    {
+        return $this->container->get('form.factory')->createBuilder(FormType::class, $data, $options);
+    }
+
+    /**
+     * Shortcut to return the Doctrine Registry service.
+     *
+     * @return ManagerRegistry
+     *
+     * @throws \LogicException If DoctrineBundle is not available
+     *
+     * @final
+     */
+    protected function getDoctrine()
+    {
+        if (!$this->container->has('doctrine')) {
+            throw new \LogicException('The DoctrineBundle is not registered in your application. Try running "composer require symfony/orm-pack".');
+        }
+
+        return $this->container->get('doctrine');
+    }
+
+    /**
+     * Get a user from the Security Token Storage.
+     *
+     * @return UserInterface|object|null
+     *
+     * @throws \LogicException If SecurityBundle is not available
+     *
+     * @see TokenInterface::getUser()
+     *
+     * @final
+     */
+    protected function getUser()
+    {
+        if (!$this->container->has('security.token_storage')) {
+            throw new \LogicException('The SecurityBundle is not registered in your application. Try running "composer require symfony/security-bundle".');
+        }
+
+        if (null === $token = $this->container->get('security.token_storage')->getToken()) {
+            return null;
+        }
+
+        if (!\is_object($user = $token->getUser())) {
+            // e.g. anonymous authentication
+            return null;
+        }
+
+        return $user;
+    }
+
+    /**
+     * Checks the validity of a CSRF token.
+     *
+     * @param string      $id    The id used when generating the token
+     * @param string|null $token The actual token sent with the request that should be validated
+     *
+     * @final
+     */
+    protected function isCsrfTokenValid(string $id, ?string $token): bool
+    {
+        if (!$this->container->has('security.csrf.token_manager')) {
+            throw new \LogicException('CSRF protection is not enabled in your application. Enable it with the "csrf_protection" key in "config/packages/framework.yaml".');
+        }
+
+        return $this->container->get('security.csrf.token_manager')->isTokenValid(new CsrfToken($id, $token));
+    }
+
+    /**
+     * Dispatches a message to the bus.
+     *
+     * @param object|Envelope  $message The message or the message pre-wrapped in an envelope
+     * @param StampInterface[] $stamps
+     *
+     * @final
+     */
+    protected function dispatchMessage($message, array $stamps = []): Envelope
+    {
+        if (!$this->container->has('messenger.default_bus')) {
+            $message = class_exists(Envelope::class) ? 'You need to define the "messenger.default_bus" configuration option.' : 'Try running "composer require symfony/messenger".';
+            throw new \LogicException('The message bus is not enabled in your application. '.$message);
+        }
+
+        return $this->container->get('messenger.default_bus')->dispatch($message, $stamps);
+    }
+
+    /**
+     * Adds a Link HTTP header to the current response.
+     *
+     * @see https://tools.ietf.org/html/rfc5988
+     *
+     * @final
+     */
+    protected function addLink(Request $request, LinkInterface $link)
+    {
+        if (!class_exists(AddLinkHeaderListener::class)) {
+            throw new \LogicException('You can not use the "addLink" method if the WebLink component is not available. Try running "composer require symfony/web-link".');
+        }
+
+        if (null === $linkProvider = $request->attributes->get('_links')) {
+            $request->attributes->set('_links', new GenericLinkProvider([$link]));
+
+            return;
+        }
+
+        $request->attributes->set('_links', $linkProvider->withLink($link));
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Controller/RedirectController.php b/vendor/symfony/framework-bundle/Controller/RedirectController.php
new file mode 100644
index 0000000000000000000000000000000000000000..109e83b6967ba589a3c0c0cf3475d96d0b2dee2a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Controller/RedirectController.php
@@ -0,0 +1,233 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Controller;
+
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+
+/**
+ * Redirects a request to another URL.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @final
+ */
+class RedirectController
+{
+    private $router;
+    private $httpPort;
+    private $httpsPort;
+
+    public function __construct(UrlGeneratorInterface $router = null, int $httpPort = null, int $httpsPort = null)
+    {
+        $this->router = $router;
+        $this->httpPort = $httpPort;
+        $this->httpsPort = $httpsPort;
+    }
+
+    /**
+     * Redirects to another route with the given name.
+     *
+     * The response status code is 302 if the permanent parameter is false (default),
+     * and 301 if the redirection is permanent.
+     *
+     * In case the route name is empty, the status code will be 404 when permanent is false
+     * and 410 otherwise.
+     *
+     * @param string     $route             The route name to redirect to
+     * @param bool       $permanent         Whether the redirection is permanent
+     * @param bool|array $ignoreAttributes  Whether to ignore attributes or an array of attributes to ignore
+     * @param bool       $keepRequestMethod Whether redirect action should keep HTTP request method
+     *
+     * @throws HttpException In case the route name is empty
+     */
+    public function redirectAction(Request $request, string $route, bool $permanent = false, $ignoreAttributes = false, bool $keepRequestMethod = false, bool $keepQueryParams = false): Response
+    {
+        if ('' == $route) {
+            throw new HttpException($permanent ? 410 : 404);
+        }
+
+        $attributes = [];
+        if (false === $ignoreAttributes || \is_array($ignoreAttributes)) {
+            $attributes = $request->attributes->get('_route_params');
+
+            if ($keepQueryParams) {
+                if ($query = $request->server->get('QUERY_STRING')) {
+                    $query = self::parseQuery($query);
+                } else {
+                    $query = $request->query->all();
+                }
+
+                $attributes = array_merge($query, $attributes);
+            }
+
+            unset($attributes['route'], $attributes['permanent'], $attributes['ignoreAttributes'], $attributes['keepRequestMethod'], $attributes['keepQueryParams']);
+            if ($ignoreAttributes) {
+                $attributes = array_diff_key($attributes, array_flip($ignoreAttributes));
+            }
+        }
+
+        if ($keepRequestMethod) {
+            $statusCode = $permanent ? 308 : 307;
+        } else {
+            $statusCode = $permanent ? 301 : 302;
+        }
+
+        return new RedirectResponse($this->router->generate($route, $attributes, UrlGeneratorInterface::ABSOLUTE_URL), $statusCode);
+    }
+
+    /**
+     * Redirects to a URL.
+     *
+     * The response status code is 302 if the permanent parameter is false (default),
+     * and 301 if the redirection is permanent.
+     *
+     * In case the path is empty, the status code will be 404 when permanent is false
+     * and 410 otherwise.
+     *
+     * @param string      $path              The absolute path or URL to redirect to
+     * @param bool        $permanent         Whether the redirect is permanent or not
+     * @param string|null $scheme            The URL scheme (null to keep the current one)
+     * @param int|null    $httpPort          The HTTP port (null to keep the current one for the same scheme or the default configured port)
+     * @param int|null    $httpsPort         The HTTPS port (null to keep the current one for the same scheme or the default configured port)
+     * @param bool        $keepRequestMethod Whether redirect action should keep HTTP request method
+     *
+     * @throws HttpException In case the path is empty
+     */
+    public function urlRedirectAction(Request $request, string $path, bool $permanent = false, string $scheme = null, int $httpPort = null, int $httpsPort = null, bool $keepRequestMethod = false): Response
+    {
+        if ('' == $path) {
+            throw new HttpException($permanent ? 410 : 404);
+        }
+
+        if ($keepRequestMethod) {
+            $statusCode = $permanent ? 308 : 307;
+        } else {
+            $statusCode = $permanent ? 301 : 302;
+        }
+
+        // redirect if the path is a full URL
+        if (parse_url($path, \PHP_URL_SCHEME)) {
+            return new RedirectResponse($path, $statusCode);
+        }
+
+        if (null === $scheme) {
+            $scheme = $request->getScheme();
+        }
+
+        if ($qs = $request->server->get('QUERY_STRING') ?: $request->getQueryString()) {
+            if (!str_contains($path, '?')) {
+                $qs = '?'.$qs;
+            } else {
+                $qs = '&'.$qs;
+            }
+        }
+
+        $port = '';
+        if ('http' === $scheme) {
+            if (null === $httpPort) {
+                if ('http' === $request->getScheme()) {
+                    $httpPort = $request->getPort();
+                } else {
+                    $httpPort = $this->httpPort;
+                }
+            }
+
+            if (null !== $httpPort && 80 != $httpPort) {
+                $port = ":$httpPort";
+            }
+        } elseif ('https' === $scheme) {
+            if (null === $httpsPort) {
+                if ('https' === $request->getScheme()) {
+                    $httpsPort = $request->getPort();
+                } else {
+                    $httpsPort = $this->httpsPort;
+                }
+            }
+
+            if (null !== $httpsPort && 443 != $httpsPort) {
+                $port = ":$httpsPort";
+            }
+        }
+
+        $url = $scheme.'://'.$request->getHost().$port.$request->getBaseUrl().$path.$qs;
+
+        return new RedirectResponse($url, $statusCode);
+    }
+
+    public function __invoke(Request $request): Response
+    {
+        $p = $request->attributes->get('_route_params', []);
+
+        if (\array_key_exists('route', $p)) {
+            if (\array_key_exists('path', $p)) {
+                throw new \RuntimeException(sprintf('Ambiguous redirection settings, use the "path" or "route" parameter, not both: "%s" and "%s" found respectively in "%s" routing configuration.', $p['path'], $p['route'], $request->attributes->get('_route')));
+            }
+
+            return $this->redirectAction($request, $p['route'], $p['permanent'] ?? false, $p['ignoreAttributes'] ?? false, $p['keepRequestMethod'] ?? false, $p['keepQueryParams'] ?? false);
+        }
+
+        if (\array_key_exists('path', $p)) {
+            return $this->urlRedirectAction($request, $p['path'], $p['permanent'] ?? false, $p['scheme'] ?? null, $p['httpPort'] ?? null, $p['httpsPort'] ?? null, $p['keepRequestMethod'] ?? false);
+        }
+
+        throw new \RuntimeException(sprintf('The parameter "path" or "route" is required to configure the redirect action in "%s" routing configuration.', $request->attributes->get('_route')));
+    }
+
+    private static function parseQuery(string $query)
+    {
+        $q = [];
+
+        foreach (explode('&', $query) as $v) {
+            if (false !== $i = strpos($v, "\0")) {
+                $v = substr($v, 0, $i);
+            }
+
+            if (false === $i = strpos($v, '=')) {
+                $k = urldecode($v);
+                $v = '';
+            } else {
+                $k = urldecode(substr($v, 0, $i));
+                $v = substr($v, $i);
+            }
+
+            if (false !== $i = strpos($k, "\0")) {
+                $k = substr($k, 0, $i);
+            }
+
+            $k = ltrim($k, ' ');
+
+            if (false === $i = strpos($k, '[')) {
+                $q[] = bin2hex($k).$v;
+            } else {
+                $q[] = bin2hex(substr($k, 0, $i)).rawurlencode(substr($k, $i)).$v;
+            }
+        }
+
+        parse_str(implode('&', $q), $q);
+
+        $query = [];
+
+        foreach ($q as $k => $v) {
+            if (false !== $i = strpos($k, '_')) {
+                $query[substr_replace($k, hex2bin(substr($k, 0, $i)).'[', 0, 1 + $i)] = $v;
+            } else {
+                $query[hex2bin($k)] = $v;
+            }
+        }
+
+        return $query;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Controller/TemplateController.php b/vendor/symfony/framework-bundle/Controller/TemplateController.php
new file mode 100644
index 0000000000000000000000000000000000000000..705adc8765a266070189cfe3a841bc03bdf7bcc4
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Controller/TemplateController.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Controller;
+
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Templating\EngineInterface;
+use Twig\Environment;
+
+/**
+ * TemplateController.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @final
+ */
+class TemplateController
+{
+    private $twig;
+    private $templating;
+
+    public function __construct(Environment $twig = null, EngineInterface $templating = null)
+    {
+        if (null !== $templating) {
+            @trigger_error(sprintf('Using a "%s" instance for "%s" is deprecated since version 4.4; use a \Twig\Environment instance instead.', EngineInterface::class, __CLASS__), \E_USER_DEPRECATED);
+        }
+
+        $this->twig = $twig;
+        $this->templating = $templating;
+    }
+
+    /**
+     * Renders a template.
+     *
+     * @param string    $template  The template name
+     * @param int|null  $maxAge    Max age for client caching
+     * @param int|null  $sharedAge Max age for shared (proxy) caching
+     * @param bool|null $private   Whether or not caching should apply for client caches only
+     */
+    public function templateAction(string $template, int $maxAge = null, int $sharedAge = null, bool $private = null): Response
+    {
+        if ($this->templating) {
+            $response = new Response($this->templating->render($template));
+        } elseif ($this->twig) {
+            $response = new Response($this->twig->render($template));
+        } else {
+            throw new \LogicException('You can not use the TemplateController if the Templating Component or the Twig Bundle are not available.');
+        }
+
+        if (null !== $maxAge) {
+            $response->setMaxAge($maxAge);
+        }
+
+        if (null !== $sharedAge) {
+            $response->setSharedMaxAge($sharedAge);
+        }
+
+        if ($private) {
+            $response->setPrivate();
+        } elseif (false === $private || (null === $private && (null !== $maxAge || null !== $sharedAge))) {
+            $response->setPublic();
+        }
+
+        return $response;
+    }
+
+    public function __invoke(string $template, int $maxAge = null, int $sharedAge = null, bool $private = null): Response
+    {
+        return $this->templateAction($template, $maxAge, $sharedAge, $private);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DataCollector/RequestDataCollector.php b/vendor/symfony/framework-bundle/DataCollector/RequestDataCollector.php
new file mode 100644
index 0000000000000000000000000000000000000000..a112f890d7a7aa80e82d3247a76d99e8452b4fba
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DataCollector/RequestDataCollector.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DataCollector;
+
+use Symfony\Component\HttpKernel\DataCollector\RequestDataCollector as BaseRequestDataCollector;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.1. Use %s instead.', RequestDataCollector::class, BaseRequestDataCollector::class), \E_USER_DEPRECATED);
+
+/**
+ * RequestDataCollector.
+ *
+ * @author Jules Pietri <jusles@heahprod.com>
+ *
+ * @deprecated since Symfony 4.1
+ */
+class RequestDataCollector extends BaseRequestDataCollector
+{
+}
diff --git a/vendor/symfony/framework-bundle/DataCollector/RouterDataCollector.php b/vendor/symfony/framework-bundle/DataCollector/RouterDataCollector.php
new file mode 100644
index 0000000000000000000000000000000000000000..60681f7291f5530ab8c529854d2d6697a5c58689
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DataCollector/RouterDataCollector.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DataCollector;
+
+use Symfony\Bundle\FrameworkBundle\Controller\RedirectController;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\DataCollector\RouterDataCollector as BaseRouterDataCollector;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @final since Symfony 4.4
+ */
+class RouterDataCollector extends BaseRouterDataCollector
+{
+    public function guessRoute(Request $request, $controller)
+    {
+        if (\is_array($controller)) {
+            $controller = $controller[0];
+        }
+
+        if ($controller instanceof RedirectController) {
+            return $request->attributes->get('_route');
+        }
+
+        return parent::guessRoute($request, $controller);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/CompatibilityServiceSubscriberInterface.php b/vendor/symfony/framework-bundle/DependencyInjection/CompatibilityServiceSubscriberInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..41d4aa81e99c143044e133d93b13290a93971304
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/CompatibilityServiceSubscriberInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ServiceSubscriberInterface as LegacyServiceSubscriberInterface;
+use Symfony\Contracts\Service\ServiceSubscriberInterface;
+
+if (interface_exists(LegacyServiceSubscriberInterface::class)) {
+    /**
+     * @internal
+     */
+    interface CompatibilityServiceSubscriberInterface extends LegacyServiceSubscriberInterface
+    {
+    }
+} else {
+    /**
+     * @internal
+     */
+    interface CompatibilityServiceSubscriberInterface extends ServiceSubscriberInterface
+    {
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..d7db6ebf050a45b858c012cb6594d89bf725efe0
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * @internal
+ */
+class AddAnnotationsCachedReaderPass implements CompilerPassInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        // "annotations.cached_reader" is wired late so that any passes using
+        // "annotation_reader" at build time don't get any cache
+        foreach ($container->findTaggedServiceIds('annotations.cached_reader') as $id => $tags) {
+            $reader = $container->getDefinition($id);
+            $properties = $reader->getProperties();
+
+            if (isset($properties['cacheProviderBackup'])) {
+                $provider = $properties['cacheProviderBackup']->getValues()[0];
+                unset($properties['cacheProviderBackup']);
+                $reader->setProperties($properties);
+                $reader->replaceArgument(1, $provider);
+            } elseif (4 <= \count($arguments = $reader->getArguments()) && $arguments[3] instanceof ServiceClosureArgument) {
+                $arguments[1] = $arguments[3]->getValues()[0];
+                unset($arguments[3]);
+                $reader->setArguments($arguments);
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..dbe88b064bddd9bf12aac820f5b27b6395e63fa7
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+class AddDebugLogProcessorPass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->hasDefinition('profiler')) {
+            return;
+        }
+        if (!$container->hasDefinition('monolog.logger_prototype')) {
+            return;
+        }
+        if (!$container->hasDefinition('debug.log_processor')) {
+            return;
+        }
+
+        $definition = $container->getDefinition('monolog.logger_prototype');
+        $definition->setConfigurator([__CLASS__, 'configureLogger']);
+        $definition->addMethodCall('pushProcessor', [new Reference('debug.log_processor')]);
+    }
+
+    public static function configureLogger($logger)
+    {
+        if (method_exists($logger, 'removeDebugLogger') && \in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) {
+            $logger->removeDebugLogger();
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c44205e3e55b666628dcab88543f22d514787bf
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Bundle\SecurityBundle\DependencyInjection\Compiler\AddExpressionLanguageProvidersPass as SecurityExpressionLanguageProvidersPass;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Registers the expression language providers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class AddExpressionLanguageProvidersPass implements CompilerPassInterface
+{
+    private $handleSecurityLanguageProviders;
+
+    public function __construct(bool $handleSecurityLanguageProviders = true)
+    {
+        if ($handleSecurityLanguageProviders) {
+            @trigger_error(sprintf('Registering services tagged "security.expression_language_provider" with "%s" is deprecated since Symfony 4.2, use the "%s" instead.', __CLASS__, SecurityExpressionLanguageProvidersPass::class), \E_USER_DEPRECATED);
+        }
+
+        $this->handleSecurityLanguageProviders = $handleSecurityLanguageProviders;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        // routing
+        if ($container->has('router')) {
+            $definition = $container->findDefinition('router');
+            foreach ($container->findTaggedServiceIds('routing.expression_language_provider', true) as $id => $attributes) {
+                $definition->addMethodCall('addExpressionLanguageProvider', [new Reference($id)]);
+            }
+        }
+
+        // security
+        if ($this->handleSecurityLanguageProviders && $container->has('security.expression_language')) {
+            $definition = $container->findDefinition('security.expression_language');
+            foreach ($container->findTaggedServiceIds('security.expression_language_provider', true) as $id => $attributes) {
+                $definition->addMethodCall('registerProvider', [new Reference($id)]);
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CacheCollectorPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CacheCollectorPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..93d13834bd3f6edf19a44451a256bbe6a2501bb9
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CacheCollectorPass.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\Cache\DependencyInjection\CacheCollectorPass as BaseCacheCollectorPass;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2, use "%s" instead.', CacheCollectorPass::class, BaseCacheCollectorPass::class), \E_USER_DEPRECATED);
+
+/**
+ * Inject a data collector to all the cache services to be able to get detailed statistics.
+ *
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ *
+ * @deprecated since Symfony 4.2, use Symfony\Component\Cache\DependencyInjection\CacheCollectorPass instead.
+ */
+class CacheCollectorPass extends BaseCacheCollectorPass
+{
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolClearerPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolClearerPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..58e23ace112cb418acd33ee66fc6459d5b338062
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolClearerPass.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\Cache\DependencyInjection\CachePoolClearerPass as BaseCachePoolClearerPass;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2, use "%s" instead.', CachePoolClearerPass::class, BaseCachePoolClearerPass::class), \E_USER_DEPRECATED);
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @deprecated since version 4.2, use Symfony\Component\Cache\DependencyInjection\CachePoolClearerPass instead.
+ */
+class CachePoolClearerPass extends BaseCachePoolClearerPass
+{
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..30be3be53bd2cee3cf69dd43f599f22ee38ff51b
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPass.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\Cache\DependencyInjection\CachePoolPass as BaseCachePoolPass;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2, use "%s" instead.', CachePoolPass::class, BaseCachePoolPass::class), \E_USER_DEPRECATED);
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @deprecated since version 4.2, use Symfony\Component\Cache\DependencyInjection\CachePoolPass instead.
+ */
+class CachePoolPass extends BaseCachePoolPass
+{
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPrunerPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPrunerPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..22237ec01cc6ba6be0817530fbefb789c5e576a7
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPrunerPass.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\Cache\DependencyInjection\CachePoolPrunerPass as BaseCachePoolPrunerPass;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2, use "%s" instead.', CachePoolPrunerPass::class, BaseCachePoolPrunerPass::class), \E_USER_DEPRECATED);
+
+/**
+ * @author Rob Frawley 2nd <rmf@src.run>
+ *
+ * @deprecated since Symfony 4.2, use Symfony\Component\Cache\DependencyInjection\CachePoolPrunerPass instead.
+ */
+class CachePoolPrunerPass extends BaseCachePoolPrunerPass
+{
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..0df5420c769eec7c4fd5cf8754f135ca4277da21
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\Config\ConfigCache;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Dumper\XmlDumper;
+
+/**
+ * Dumps the ContainerBuilder to a cache file so that it can be used by
+ * debugging tools such as the debug:container console command.
+ *
+ * @author Ryan Weaver <ryan@thatsquality.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ContainerBuilderDebugDumpPass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        $cache = new ConfigCache($container->getParameter('debug.container.dump'), true);
+        if (!$cache->isFresh()) {
+            $cache->write((new XmlDumper($container))->dump(), $container->getResources());
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..ee2bbb6521b170d4adf7f3c0e0a80735b41f2fc8
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * @author Christian Flothmann <christian.flothmann@sensiolabs.de>
+ */
+class DataCollectorTranslatorPass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->has('translator')) {
+            return;
+        }
+
+        $translatorClass = $container->getParameterBag()->resolveValue($container->findDefinition('translator')->getClass());
+
+        if (!is_subclass_of($translatorClass, 'Symfony\Component\Translation\TranslatorBagInterface')) {
+            $container->removeDefinition('translator.data_collector');
+            $container->removeDefinition('data_collector.translation');
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..80cbe52e6c4f45301f929c18ba908409e7df5aec
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\TranslatorBagInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
+
+/**
+ * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
+ */
+class LoggingTranslatorPass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->hasAlias('logger') || !$container->hasAlias('translator')) {
+            return;
+        }
+
+        if ($container->hasParameter('translator.logging') && $container->getParameter('translator.logging')) {
+            $translatorAlias = $container->getAlias('translator');
+            $definition = $container->getDefinition((string) $translatorAlias);
+            $class = $container->getParameterBag()->resolveValue($definition->getClass());
+
+            if (!$r = $container->getReflectionClass($class)) {
+                throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $translatorAlias));
+            }
+            if ($r->isSubclassOf(TranslatorInterface::class) && $r->isSubclassOf(TranslatorBagInterface::class)) {
+                $container->getDefinition('translator.logging')->setDecoratedService('translator');
+                $warmer = $container->getDefinition('translation.warmer');
+                $subscriberAttributes = $warmer->getTag('container.service_subscriber');
+                $warmer->clearTag('container.service_subscriber');
+
+                foreach ($subscriberAttributes as $k => $v) {
+                    if ((!isset($v['id']) || 'translator' !== $v['id']) && (!isset($v['key']) || 'translator' !== $v['key'])) {
+                        $warmer->addTag('container.service_subscriber', $v);
+                    }
+                }
+                $warmer->addTag('container.service_subscriber', ['key' => 'translator', 'id' => 'translator.logging.inner']);
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..78140985825cc669b0d9c7b5c09018c6b6267452
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Adds tagged data_collector services to profiler service.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ProfilerPass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        if (false === $container->hasDefinition('profiler')) {
+            return;
+        }
+
+        $definition = $container->getDefinition('profiler');
+
+        $collectors = new \SplPriorityQueue();
+        $order = \PHP_INT_MAX;
+        foreach ($container->findTaggedServiceIds('data_collector', true) as $id => $attributes) {
+            $priority = $attributes[0]['priority'] ?? 0;
+            $template = null;
+
+            if (isset($attributes[0]['template'])) {
+                if (!isset($attributes[0]['id'])) {
+                    throw new InvalidArgumentException(sprintf('Data collector service "%s" must have an id attribute in order to specify a template.', $id));
+                }
+                $template = [$attributes[0]['id'], $attributes[0]['template']];
+            }
+
+            $collectors->insert([$id, $template], [$priority, --$order]);
+        }
+
+        $templates = [];
+        foreach ($collectors as $collector) {
+            $definition->addMethodCall('add', [new Reference($collector[0])]);
+            $templates[$collector[0]] = $collector[1];
+        }
+
+        $container->setParameter('data_collector.templates', $templates);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/SessionPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/SessionPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f4950615fbce5e2385542b62a8288bfa158d351
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/SessionPass.php
@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * @internal to be removed in 6.0
+ */
+class SessionPass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->hasDefinition('session')) {
+            return;
+        }
+
+        $bags = [
+            'session.flash_bag' => $container->hasDefinition('session.flash_bag') ? $container->getDefinition('session.flash_bag') : null,
+            'session.attribute_bag' => $container->hasDefinition('session.attribute_bag') ? $container->getDefinition('session.attribute_bag') : null,
+        ];
+
+        foreach ($container->getDefinition('session')->getArguments() as $v) {
+            if (!$v instanceof Reference || !isset($bags[$bag = (string) $v]) || !\is_array($factory = $bags[$bag]->getFactory())) {
+                continue;
+            }
+
+            if ([0, 1] !== array_keys($factory) || !$factory[0] instanceof Reference || 'session' !== (string) $factory[0]) {
+                continue;
+            }
+
+            if ('get'.ucfirst(substr($bag, 8, -4)).'Bag' !== $factory[1]) {
+                continue;
+            }
+
+            $bags[$bag]->setFactory(null);
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/TemplatingPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/TemplatingPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..cbbce7e31eccfca29de3eb0dfa412dfe6beca042
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/TemplatingPass.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface as FrameworkBundleEngineInterface;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\Templating\EngineInterface as ComponentEngineInterface;
+
+/**
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class TemplatingPass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        if ($container->hasDefinition('templating')) {
+            return;
+        }
+
+        if ($container->hasAlias('templating')) {
+            $container->setAlias(ComponentEngineInterface::class, new Alias('templating', false));
+            $container->setAlias(FrameworkBundleEngineInterface::class, new Alias('templating', false));
+        }
+
+        if ($container->hasDefinition('templating.engine.php')) {
+            $refs = [];
+            $helpers = [];
+
+            foreach ($container->findTaggedServiceIds('templating.helper', true) as $id => $attributes) {
+                if (!$container->getDefinition($id)->isDeprecated()) {
+                    @trigger_error('The "templating.helper" tag is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+                }
+
+                if (isset($attributes[0]['alias'])) {
+                    $helpers[$attributes[0]['alias']] = $id;
+                    $refs[$id] = new Reference($id);
+                }
+            }
+
+            if (\count($helpers) > 0) {
+                $definition = $container->getDefinition('templating.engine.php');
+                $definition->addMethodCall('setHelpers', [$helpers]);
+
+                if ($container->hasDefinition('templating.engine.php.helpers_locator')) {
+                    $container->getDefinition('templating.engine.php.helpers_locator')->replaceArgument(0, $refs);
+                }
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..222b5c7b75af0585e9ddad2d88235db1a8095eaf
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class TestServiceContainerRealRefPass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->hasDefinition('test.private_services_locator')) {
+            return;
+        }
+
+        $privateContainer = $container->getDefinition('test.private_services_locator');
+        $definitions = $container->getDefinitions();
+        $privateServices = $privateContainer->getArgument(0);
+
+        foreach ($privateServices as $id => $argument) {
+            if (isset($definitions[$target = (string) $argument->getValues()[0]])) {
+                $argument->setValues([new Reference($target)]);
+            } else {
+                unset($privateServices[$id]);
+            }
+        }
+
+        $privateContainer->replaceArgument(0, $privateServices);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..57aa592a32fa5afb148d3194feb1691d914fc063
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class TestServiceContainerWeakRefPass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->hasDefinition('test.private_services_locator')) {
+            return;
+        }
+
+        $privateServices = [];
+        $definitions = $container->getDefinitions();
+        $hasErrors = method_exists(Definition::class, 'hasErrors') ? 'hasErrors' : 'getErrors';
+
+        foreach ($definitions as $id => $definition) {
+            if ($id && '.' !== $id[0] && (!$definition->isPublic() || $definition->isPrivate()) && !$definition->$hasErrors() && !$definition->isAbstract()) {
+                $privateServices[$id] = new Reference($id, ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE);
+            }
+        }
+
+        $aliases = $container->getAliases();
+
+        foreach ($aliases as $id => $alias) {
+            if ($id && '.' !== $id[0] && (!$alias->isPublic() || $alias->isPrivate())) {
+                while (isset($aliases[$target = (string) $alias])) {
+                    $alias = $aliases[$target];
+                }
+                if (isset($definitions[$target]) && !$definitions[$target]->$hasErrors() && !$definitions[$target]->isAbstract()) {
+                    $privateServices[$id] = new Reference($target, ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE);
+                }
+            }
+        }
+
+        if ($privateServices) {
+            $id = (string) ServiceLocatorTagPass::register($container, $privateServices);
+            $container->setDefinition('test.private_services_locator', $container->getDefinition($id))->setPublic(true);
+            $container->removeDefinition($id);
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..669d331c062f3b074f7842ca506f38431ef4310d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.php
@@ -0,0 +1,117 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Find all service tags which are defined, but not used and yield a warning log message.
+ *
+ * @author Florian Pfitzer <pfitzer@wurzel3.de>
+ */
+class UnusedTagsPass implements CompilerPassInterface
+{
+    private $knownTags = [
+        'annotations.cached_reader',
+        'auto_alias',
+        'cache.pool',
+        'cache.pool.clearer',
+        'config_cache.resource_checker',
+        'console.command',
+        'container.do_not_inline',
+        'container.env_var_loader',
+        'container.env_var_processor',
+        'container.hot_path',
+        'container.reversible',
+        'container.service_locator',
+        'container.service_locator_context',
+        'container.service_subscriber',
+        'controller.argument_value_resolver',
+        'controller.service_arguments',
+        'data_collector',
+        'form.type',
+        'form.type_extension',
+        'form.type_guesser',
+        'http_client.client',
+        'kernel.cache_clearer',
+        'kernel.cache_warmer',
+        'kernel.event_listener',
+        'kernel.event_subscriber',
+        'kernel.fragment_renderer',
+        'kernel.locale_aware',
+        'kernel.reset',
+        'mailer.transport_factory',
+        'messenger.bus',
+        'messenger.message_handler',
+        'messenger.receiver',
+        'messenger.transport_factory',
+        'mime.mime_type_guesser',
+        'monolog.logger',
+        'property_info.access_extractor',
+        'property_info.initializable_extractor',
+        'property_info.list_extractor',
+        'property_info.type_extractor',
+        'proxy',
+        'routing.expression_language_provider',
+        'routing.loader',
+        'routing.route_loader',
+        'security.expression_language_provider',
+        'security.remember_me_aware',
+        'security.voter',
+        'serializer.encoder',
+        'serializer.normalizer',
+        'templating.helper',
+        'translation.dumper',
+        'translation.extractor',
+        'translation.loader',
+        'twig.extension',
+        'twig.loader',
+        'twig.runtime',
+        'validator.auto_mapper',
+        'validator.constraint_validator',
+        'validator.initializer',
+        'workflow.definition',
+    ];
+
+    public function process(ContainerBuilder $container)
+    {
+        $tags = array_unique(array_merge($container->findTags(), $this->knownTags));
+
+        foreach ($container->findUnusedTags() as $tag) {
+            // skip known tags
+            if (\in_array($tag, $this->knownTags)) {
+                continue;
+            }
+
+            // check for typos
+            $candidates = [];
+            foreach ($tags as $definedTag) {
+                if ($definedTag === $tag) {
+                    continue;
+                }
+
+                if (str_contains($definedTag, $tag) || levenshtein($tag, $definedTag) <= \strlen($tag) / 3) {
+                    $candidates[] = $definedTag;
+                }
+            }
+
+            $services = array_keys($container->findTaggedServiceIds($tag));
+            $message = sprintf('Tag "%s" was defined on service(s) "%s", but was never used.', $tag, implode('", "', $services));
+            if (!empty($candidates)) {
+                $message .= sprintf(' Did you mean "%s"?', implode('", "', $candidates));
+            }
+
+            $container->log($this, $message);
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad62e19384976a928149d362dbcc57ae07c3b25b
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+
+/**
+ * @author Christian Flothmann <christian.flothmann@sensiolabs.de>
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ */
+class WorkflowGuardListenerPass implements CompilerPassInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->hasParameter('workflow.has_guard_listeners')) {
+            return;
+        }
+
+        $container->getParameterBag()->remove('workflow.has_guard_listeners');
+
+        $servicesNeeded = [
+            'security.token_storage',
+            'security.authorization_checker',
+            'security.authentication.trust_resolver',
+            'security.role_hierarchy',
+        ];
+
+        foreach ($servicesNeeded as $service) {
+            if (!$container->has($service)) {
+                throw new LogicException(sprintf('The "%s" service is needed to be able to use the workflow guard listener.', $service));
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/Configuration.php b/vendor/symfony/framework-bundle/DependencyInjection/Configuration.php
new file mode 100644
index 0000000000000000000000000000000000000000..3875db646ff21428d2ee4d8a29604942a643df7d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/Configuration.php
@@ -0,0 +1,1651 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection;
+
+use Doctrine\Common\Annotations\Annotation;
+use Doctrine\Common\Cache\Cache;
+use Doctrine\DBAL\Connection;
+use Symfony\Bundle\FullStack;
+use Symfony\Component\Asset\Package;
+use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+use Symfony\Component\Form\Form;
+use Symfony\Component\HttpClient\HttpClient;
+use Symfony\Component\HttpFoundation\Cookie;
+use Symfony\Component\Lock\Lock;
+use Symfony\Component\Lock\Store\SemaphoreStore;
+use Symfony\Component\Mailer\Mailer;
+use Symfony\Component\Messenger\MessageBusInterface;
+use Symfony\Component\PropertyInfo\PropertyInfoExtractorInterface;
+use Symfony\Component\Serializer\Serializer;
+use Symfony\Component\Translation\Translator;
+use Symfony\Component\Validator\Validation;
+use Symfony\Component\WebLink\HttpHeaderSerializer;
+
+/**
+ * FrameworkExtension configuration structure.
+ */
+class Configuration implements ConfigurationInterface
+{
+    private $debug;
+
+    /**
+     * @param bool $debug Whether debugging is enabled or not
+     */
+    public function __construct(bool $debug)
+    {
+        $this->debug = $debug;
+    }
+
+    /**
+     * Generates the configuration tree builder.
+     *
+     * @return TreeBuilder The tree builder
+     */
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder('framework');
+        $rootNode = $treeBuilder->getRootNode();
+
+        $rootNode
+            ->beforeNormalization()
+                ->ifTrue(function ($v) { return !isset($v['assets']) && isset($v['templating']) && class_exists(Package::class); })
+                ->then(function ($v) {
+                    $v['assets'] = [];
+
+                    return $v;
+                })
+            ->end()
+            ->children()
+                ->scalarNode('secret')->end()
+                ->scalarNode('http_method_override')
+                    ->info("Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. Note: When using the HttpCache, you need to call the method in your front controller instead")
+                    ->defaultTrue()
+                ->end()
+                ->scalarNode('ide')->defaultNull()->end()
+                ->booleanNode('test')->end()
+                ->scalarNode('default_locale')->defaultValue('en')->end()
+                ->arrayNode('trusted_hosts')
+                    ->beforeNormalization()->ifString()->then(function ($v) { return [$v]; })->end()
+                    ->prototype('scalar')->end()
+                ->end()
+                ->scalarNode('error_controller')
+                    ->defaultValue('error_controller')
+                ->end()
+            ->end()
+        ;
+
+        $this->addCsrfSection($rootNode);
+        $this->addFormSection($rootNode);
+        $this->addEsiSection($rootNode);
+        $this->addSsiSection($rootNode);
+        $this->addFragmentsSection($rootNode);
+        $this->addProfilerSection($rootNode);
+        $this->addWorkflowSection($rootNode);
+        $this->addRouterSection($rootNode);
+        $this->addSessionSection($rootNode);
+        $this->addRequestSection($rootNode);
+        $this->addTemplatingSection($rootNode);
+        $this->addAssetsSection($rootNode);
+        $this->addTranslatorSection($rootNode);
+        $this->addValidationSection($rootNode);
+        $this->addAnnotationsSection($rootNode);
+        $this->addSerializerSection($rootNode);
+        $this->addPropertyAccessSection($rootNode);
+        $this->addPropertyInfoSection($rootNode);
+        $this->addCacheSection($rootNode);
+        $this->addPhpErrorsSection($rootNode);
+        $this->addWebLinkSection($rootNode);
+        $this->addLockSection($rootNode);
+        $this->addMessengerSection($rootNode);
+        $this->addRobotsIndexSection($rootNode);
+        $this->addHttpClientSection($rootNode);
+        $this->addMailerSection($rootNode);
+        $this->addSecretsSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    private function addSecretsSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('secrets')
+                    ->canBeDisabled()
+                    ->children()
+                        ->scalarNode('vault_directory')->defaultValue('%kernel.project_dir%/config/secrets/%kernel.environment%')->cannotBeEmpty()->end()
+                        ->scalarNode('local_dotenv_file')->defaultValue('%kernel.project_dir%/.env.%kernel.environment%.local')->end()
+                        ->scalarNode('decryption_env_var')->defaultValue('base64:default::SYMFONY_DECRYPTION_SECRET')->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addCsrfSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('csrf_protection')
+                    ->treatFalseLike(['enabled' => false])
+                    ->treatTrueLike(['enabled' => true])
+                    ->treatNullLike(['enabled' => true])
+                    ->addDefaultsIfNotSet()
+                    ->children()
+                        // defaults to framework.session.enabled && !class_exists(FullStack::class) && interface_exists(CsrfTokenManagerInterface::class)
+                        ->booleanNode('enabled')->defaultNull()->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addFormSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('form')
+                    ->info('form configuration')
+                    ->{!class_exists(FullStack::class) && class_exists(Form::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                    ->children()
+                        ->arrayNode('csrf_protection')
+                            ->treatFalseLike(['enabled' => false])
+                            ->treatTrueLike(['enabled' => true])
+                            ->treatNullLike(['enabled' => true])
+                            ->addDefaultsIfNotSet()
+                            ->children()
+                                ->booleanNode('enabled')->defaultNull()->end() // defaults to framework.csrf_protection.enabled
+                                ->scalarNode('field_name')->defaultValue('_token')->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addEsiSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('esi')
+                    ->info('esi configuration')
+                    ->canBeEnabled()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addSsiSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('ssi')
+                    ->info('ssi configuration')
+                    ->canBeEnabled()
+                ->end()
+            ->end();
+    }
+
+    private function addFragmentsSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('fragments')
+                    ->info('fragments configuration')
+                    ->canBeEnabled()
+                    ->children()
+                        ->scalarNode('hinclude_default_template')->defaultNull()->end()
+                        ->scalarNode('path')->defaultValue('/_fragment')->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addProfilerSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('profiler')
+                    ->info('profiler configuration')
+                    ->canBeEnabled()
+                    ->children()
+                        ->booleanNode('collect')->defaultTrue()->end()
+                        ->booleanNode('only_exceptions')->defaultFalse()->end()
+                        ->booleanNode('only_master_requests')->defaultFalse()->end()
+                        ->scalarNode('dsn')->defaultValue('file:%kernel.cache_dir%/profiler')->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addWorkflowSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->fixXmlConfig('workflow')
+            ->children()
+                ->arrayNode('workflows')
+                    ->canBeEnabled()
+                    ->beforeNormalization()
+                        ->always(function ($v) {
+                            if (\is_array($v) && true === $v['enabled']) {
+                                $workflows = $v;
+                                unset($workflows['enabled']);
+
+                                if (1 === \count($workflows) && isset($workflows[0]['enabled']) && 1 === \count($workflows[0])) {
+                                    $workflows = [];
+                                }
+
+                                if (1 === \count($workflows) && isset($workflows['workflows']) && array_keys($workflows['workflows']) !== range(0, \count($workflows) - 1) && !empty(array_diff(array_keys($workflows['workflows']), ['audit_trail', 'type', 'marking_store', 'supports', 'support_strategy', 'initial_marking', 'places', 'transitions']))) {
+                                    $workflows = $workflows['workflows'];
+                                }
+
+                                foreach ($workflows as $key => $workflow) {
+                                    if (isset($workflow['enabled']) && false === $workflow['enabled']) {
+                                        throw new LogicException(sprintf('Cannot disable a single workflow. Remove the configuration for the workflow "%s" instead.', $workflow['name']));
+                                    }
+
+                                    unset($workflows[$key]['enabled']);
+                                }
+
+                                $v = [
+                                    'enabled' => true,
+                                    'workflows' => $workflows,
+                                ];
+                            }
+
+                            return $v;
+                        })
+                    ->end()
+                    ->children()
+                        ->arrayNode('workflows')
+                            ->useAttributeAsKey('name')
+                            ->prototype('array')
+                                ->beforeNormalization()
+                                    ->always(function ($v) {
+                                        if (isset($v['initial_place'])) {
+                                            $v['initial_marking'] = [$v['initial_place']];
+                                        }
+
+                                        return $v;
+                                    })
+                                ->end()
+                                ->fixXmlConfig('support')
+                                ->fixXmlConfig('place')
+                                ->fixXmlConfig('transition')
+                                ->children()
+                                    ->arrayNode('audit_trail')
+                                        ->canBeEnabled()
+                                    ->end()
+                                    ->enumNode('type')
+                                        ->values(['workflow', 'state_machine'])
+                                        ->defaultValue('state_machine')
+                                    ->end()
+                                    ->arrayNode('marking_store')
+                                        ->fixXmlConfig('argument')
+                                        ->children()
+                                            ->enumNode('type')
+                                                ->values(['multiple_state', 'single_state', 'method'])
+                                                ->validate()
+                                                    ->ifTrue(function ($v) { return 'method' !== $v; })
+                                                    ->then(function ($v) {
+                                                        @trigger_error('Passing something else than "method" has been deprecated in Symfony 4.3.', \E_USER_DEPRECATED);
+
+                                                        return $v;
+                                                    })
+                                                ->end()
+                                            ->end()
+                                            ->arrayNode('arguments')
+                                                ->setDeprecated('The "%path%.%node%" configuration key has been deprecated in Symfony 4.3. Use "property" instead.')
+                                                ->beforeNormalization()
+                                                    ->ifString()
+                                                    ->then(function ($v) { return [$v]; })
+                                                ->end()
+                                                ->requiresAtLeastOneElement()
+                                                ->prototype('scalar')
+                                                ->end()
+                                            ->end()
+                                            ->scalarNode('property')
+                                                ->defaultNull() // In Symfony 5.0, set "marking" as default property
+                                            ->end()
+                                            ->scalarNode('service')
+                                                ->cannotBeEmpty()
+                                            ->end()
+                                        ->end()
+                                        ->validate()
+                                            ->ifTrue(function ($v) { return isset($v['type']) && isset($v['service']); })
+                                            ->thenInvalid('"type" and "service" cannot be used together.')
+                                        ->end()
+                                        ->validate()
+                                            ->ifTrue(function ($v) { return !empty($v['arguments']) && isset($v['service']); })
+                                            ->thenInvalid('"arguments" and "service" cannot be used together.')
+                                        ->end()
+                                    ->end()
+                                    ->arrayNode('supports')
+                                        ->beforeNormalization()
+                                            ->ifString()
+                                            ->then(function ($v) { return [$v]; })
+                                        ->end()
+                                        ->prototype('scalar')
+                                            ->cannotBeEmpty()
+                                            ->validate()
+                                                ->ifTrue(function ($v) { return !class_exists($v) && !interface_exists($v, false); })
+                                                ->thenInvalid('The supported class or interface "%s" does not exist.')
+                                            ->end()
+                                        ->end()
+                                    ->end()
+                                    ->scalarNode('support_strategy')
+                                        ->cannotBeEmpty()
+                                    ->end()
+                                    ->scalarNode('initial_place')
+                                        ->setDeprecated('The "%path%.%node%" configuration key has been deprecated in Symfony 4.3, use the "initial_marking" configuration key instead.')
+                                        ->defaultNull()
+                                    ->end()
+                                    ->arrayNode('initial_marking')
+                                        ->beforeNormalization()->castToArray()->end()
+                                        ->defaultValue([])
+                                        ->prototype('scalar')->end()
+                                    ->end()
+                                    ->arrayNode('places')
+                                        ->beforeNormalization()
+                                            ->always()
+                                            ->then(function ($places) {
+                                                // It's an indexed array of shape  ['place1', 'place2']
+                                                if (isset($places[0]) && \is_string($places[0])) {
+                                                    return array_map(function (string $place) {
+                                                        return ['name' => $place];
+                                                    }, $places);
+                                                }
+
+                                                // It's an indexed array, we let the validation occur
+                                                if (isset($places[0]) && \is_array($places[0])) {
+                                                    return $places;
+                                                }
+
+                                                foreach ($places as $name => $place) {
+                                                    if (\is_array($place) && \array_key_exists('name', $place)) {
+                                                        continue;
+                                                    }
+                                                    $place['name'] = $name;
+                                                    $places[$name] = $place;
+                                                }
+
+                                                return array_values($places);
+                                            })
+                                        ->end()
+                                        ->isRequired()
+                                        ->requiresAtLeastOneElement()
+                                        ->prototype('array')
+                                            ->children()
+                                                ->scalarNode('name')
+                                                    ->isRequired()
+                                                    ->cannotBeEmpty()
+                                                ->end()
+                                                ->arrayNode('metadata')
+                                                    ->normalizeKeys(false)
+                                                    ->defaultValue([])
+                                                    ->example(['color' => 'blue', 'description' => 'Workflow to manage article.'])
+                                                    ->prototype('variable')
+                                                    ->end()
+                                                ->end()
+                                            ->end()
+                                        ->end()
+                                    ->end()
+                                    ->arrayNode('transitions')
+                                        ->beforeNormalization()
+                                            ->always()
+                                            ->then(function ($transitions) {
+                                                // It's an indexed array, we let the validation occur
+                                                if (isset($transitions[0]) && \is_array($transitions[0])) {
+                                                    return $transitions;
+                                                }
+
+                                                foreach ($transitions as $name => $transition) {
+                                                    if (\is_array($transition) && \array_key_exists('name', $transition)) {
+                                                        continue;
+                                                    }
+                                                    $transition['name'] = $name;
+                                                    $transitions[$name] = $transition;
+                                                }
+
+                                                return $transitions;
+                                            })
+                                        ->end()
+                                        ->isRequired()
+                                        ->requiresAtLeastOneElement()
+                                        ->prototype('array')
+                                            ->children()
+                                                ->scalarNode('name')
+                                                    ->isRequired()
+                                                    ->cannotBeEmpty()
+                                                ->end()
+                                                ->scalarNode('guard')
+                                                    ->cannotBeEmpty()
+                                                    ->info('An expression to block the transition')
+                                                    ->example('is_fully_authenticated() and is_granted(\'ROLE_JOURNALIST\') and subject.getTitle() == \'My first article\'')
+                                                ->end()
+                                                ->arrayNode('from')
+                                                    ->beforeNormalization()
+                                                        ->ifString()
+                                                        ->then(function ($v) { return [$v]; })
+                                                    ->end()
+                                                    ->requiresAtLeastOneElement()
+                                                    ->prototype('scalar')
+                                                        ->cannotBeEmpty()
+                                                    ->end()
+                                                ->end()
+                                                ->arrayNode('to')
+                                                    ->beforeNormalization()
+                                                        ->ifString()
+                                                        ->then(function ($v) { return [$v]; })
+                                                    ->end()
+                                                    ->requiresAtLeastOneElement()
+                                                    ->prototype('scalar')
+                                                        ->cannotBeEmpty()
+                                                    ->end()
+                                                ->end()
+                                                ->arrayNode('metadata')
+                                                    ->normalizeKeys(false)
+                                                    ->defaultValue([])
+                                                    ->example(['color' => 'blue', 'description' => 'Workflow to manage article.'])
+                                                    ->prototype('variable')
+                                                    ->end()
+                                                ->end()
+                                            ->end()
+                                        ->end()
+                                    ->end()
+                                    ->arrayNode('metadata')
+                                        ->normalizeKeys(false)
+                                        ->defaultValue([])
+                                        ->example(['color' => 'blue', 'description' => 'Workflow to manage article.'])
+                                        ->prototype('variable')
+                                        ->end()
+                                    ->end()
+                                ->end()
+                                ->validate()
+                                    ->ifTrue(function ($v) {
+                                        return $v['supports'] && isset($v['support_strategy']);
+                                    })
+                                    ->thenInvalid('"supports" and "support_strategy" cannot be used together.')
+                                ->end()
+                                ->validate()
+                                    ->ifTrue(function ($v) {
+                                        return !$v['supports'] && !isset($v['support_strategy']);
+                                    })
+                                    ->thenInvalid('"supports" or "support_strategy" should be configured.')
+                                ->end()
+                                ->validate()
+                                    ->ifTrue(function ($v) {
+                                        return 'workflow' === $v['type'] && 'single_state' === ($v['marking_store']['type'] ?? false);
+                                    })
+                                    ->then(function ($v) {
+                                        @trigger_error('Using a workflow with type=workflow and a marking_store=single_state is deprecated since Symfony 4.3. Use type=state_machine instead.', \E_USER_DEPRECATED);
+
+                                        return $v;
+                                    })
+                                ->end()
+                                ->validate()
+                                    ->ifTrue(function ($v) {
+                                        return isset($v['marking_store']['property'])
+                                            && (!isset($v['marking_store']['type']) || 'method' !== $v['marking_store']['type'])
+                                        ;
+                                    })
+                                    ->thenInvalid('"property" option is only supported by the "method" marking store.')
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addRouterSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('router')
+                    ->info('router configuration')
+                    ->canBeEnabled()
+                    ->children()
+                        ->scalarNode('resource')->isRequired()->end()
+                        ->scalarNode('type')->end()
+                        ->scalarNode('http_port')->defaultValue(80)->end()
+                        ->scalarNode('https_port')->defaultValue(443)->end()
+                        ->scalarNode('strict_requirements')
+                            ->info(
+                                "set to true to throw an exception when a parameter does not match the requirements\n".
+                                "set to false to disable exceptions when a parameter does not match the requirements (and return null instead)\n".
+                                "set to null to disable parameter checks against requirements\n".
+                                "'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production"
+                            )
+                            ->defaultTrue()
+                        ->end()
+                        ->booleanNode('utf8')->defaultFalse()->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addSessionSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('session')
+                    ->info('session configuration')
+                    ->canBeEnabled()
+                    ->children()
+                        ->scalarNode('storage_id')->defaultValue('session.storage.native')->end()
+                        ->scalarNode('handler_id')->defaultValue('session.handler.native_file')->end()
+                        ->scalarNode('name')
+                            ->validate()
+                                ->ifTrue(function ($v) {
+                                    parse_str($v, $parsed);
+
+                                    return implode('&', array_keys($parsed)) !== (string) $v;
+                                })
+                                ->thenInvalid('Session name %s contains illegal character(s)')
+                            ->end()
+                        ->end()
+                        ->scalarNode('cookie_lifetime')->end()
+                        ->scalarNode('cookie_path')->end()
+                        ->scalarNode('cookie_domain')->end()
+                        ->enumNode('cookie_secure')->values([true, false, 'auto'])->end()
+                        ->booleanNode('cookie_httponly')->defaultTrue()->end()
+                        ->enumNode('cookie_samesite')->values([null, Cookie::SAMESITE_LAX, Cookie::SAMESITE_STRICT, Cookie::SAMESITE_NONE])->defaultNull()->end()
+                        ->booleanNode('use_cookies')->end()
+                        ->scalarNode('gc_divisor')->end()
+                        ->scalarNode('gc_probability')->defaultValue(1)->end()
+                        ->scalarNode('gc_maxlifetime')->end()
+                        ->scalarNode('save_path')->defaultValue('%kernel.cache_dir%/sessions')->end()
+                        ->integerNode('metadata_update_threshold')
+                            ->defaultValue(0)
+                            ->info('seconds to wait between 2 session metadata updates')
+                        ->end()
+                        ->integerNode('sid_length')
+                            ->min(22)
+                            ->max(256)
+                        ->end()
+                        ->integerNode('sid_bits_per_character')
+                            ->min(4)
+                            ->max(6)
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addRequestSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('request')
+                    ->info('request configuration')
+                    ->canBeEnabled()
+                    ->fixXmlConfig('format')
+                    ->children()
+                        ->arrayNode('formats')
+                            ->useAttributeAsKey('name')
+                            ->prototype('array')
+                                ->beforeNormalization()
+                                    ->ifTrue(function ($v) { return \is_array($v) && isset($v['mime_type']); })
+                                    ->then(function ($v) { return $v['mime_type']; })
+                                ->end()
+                                ->beforeNormalization()->castToArray()->end()
+                                ->prototype('scalar')->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addTemplatingSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('templating')
+                    ->info('templating configuration')
+                    ->canBeEnabled()
+                    ->setDeprecated('The "%path%.%node%" configuration is deprecated since Symfony 4.3. Configure the "twig" section provided by the Twig Bundle instead.')
+                    ->beforeNormalization()
+                        ->ifTrue(function ($v) { return false === $v || \is_array($v) && false === $v['enabled']; })
+                        ->then(function () { return ['enabled' => false, 'engines' => false]; })
+                    ->end()
+                    ->children()
+                        ->scalarNode('hinclude_default_template')->setDeprecated('Setting "templating.hinclude_default_template" is deprecated since Symfony 4.3, use "fragments.hinclude_default_template" instead.')->defaultNull()->end()
+                        ->scalarNode('cache')->end()
+                        ->arrayNode('form')
+                            ->addDefaultsIfNotSet()
+                            ->fixXmlConfig('resource')
+                            ->children()
+                                ->arrayNode('resources')
+                                    ->addDefaultChildrenIfNoneSet()
+                                    ->prototype('scalar')->defaultValue('FrameworkBundle:Form')->end()
+                                    ->validate()
+                                        ->ifTrue(function ($v) {return !\in_array('FrameworkBundle:Form', $v); })
+                                        ->then(function ($v) {
+                                            return array_merge(['FrameworkBundle:Form'], $v);
+                                        })
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                    ->fixXmlConfig('engine')
+                    ->children()
+                        ->arrayNode('engines')
+                            ->example(['twig'])
+                            ->isRequired()
+                            ->requiresAtLeastOneElement()
+                            ->canBeUnset()
+                            ->beforeNormalization()
+                                ->ifTrue(function ($v) { return !\is_array($v) && false !== $v; })
+                                ->then(function ($v) { return [$v]; })
+                            ->end()
+                            ->prototype('scalar')->end()
+                        ->end()
+                    ->end()
+                    ->fixXmlConfig('loader')
+                    ->children()
+                        ->arrayNode('loaders')
+                            ->beforeNormalization()->castToArray()->end()
+                            ->prototype('scalar')->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addAssetsSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('assets')
+                    ->info('assets configuration')
+                    ->{!class_exists(FullStack::class) && class_exists(Package::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                    ->fixXmlConfig('base_url')
+                    ->children()
+                        ->scalarNode('version_strategy')->defaultNull()->end()
+                        ->scalarNode('version')->defaultNull()->end()
+                        ->scalarNode('version_format')->defaultValue('%%s?%%s')->end()
+                        ->scalarNode('json_manifest_path')->defaultNull()->end()
+                        ->scalarNode('base_path')->defaultValue('')->end()
+                        ->arrayNode('base_urls')
+                            ->requiresAtLeastOneElement()
+                            ->beforeNormalization()->castToArray()->end()
+                            ->prototype('scalar')->end()
+                        ->end()
+                    ->end()
+                    ->validate()
+                        ->ifTrue(function ($v) {
+                            return isset($v['version_strategy']) && isset($v['version']);
+                        })
+                        ->thenInvalid('You cannot use both "version_strategy" and "version" at the same time under "assets".')
+                    ->end()
+                    ->validate()
+                        ->ifTrue(function ($v) {
+                            return isset($v['version_strategy']) && isset($v['json_manifest_path']);
+                        })
+                        ->thenInvalid('You cannot use both "version_strategy" and "json_manifest_path" at the same time under "assets".')
+                    ->end()
+                    ->validate()
+                        ->ifTrue(function ($v) {
+                            return isset($v['version']) && isset($v['json_manifest_path']);
+                        })
+                        ->thenInvalid('You cannot use both "version" and "json_manifest_path" at the same time under "assets".')
+                    ->end()
+                    ->fixXmlConfig('package')
+                    ->children()
+                        ->arrayNode('packages')
+                            ->normalizeKeys(false)
+                            ->useAttributeAsKey('name')
+                            ->prototype('array')
+                                ->fixXmlConfig('base_url')
+                                ->children()
+                                    ->scalarNode('version_strategy')->defaultNull()->end()
+                                    ->scalarNode('version')
+                                        ->beforeNormalization()
+                                        ->ifTrue(function ($v) { return '' === $v; })
+                                        ->then(function ($v) { return; })
+                                        ->end()
+                                    ->end()
+                                    ->scalarNode('version_format')->defaultNull()->end()
+                                    ->scalarNode('json_manifest_path')->defaultNull()->end()
+                                    ->scalarNode('base_path')->defaultValue('')->end()
+                                    ->arrayNode('base_urls')
+                                        ->requiresAtLeastOneElement()
+                                        ->beforeNormalization()->castToArray()->end()
+                                        ->prototype('scalar')->end()
+                                    ->end()
+                                ->end()
+                                ->validate()
+                                    ->ifTrue(function ($v) {
+                                        return isset($v['version_strategy']) && isset($v['version']);
+                                    })
+                                    ->thenInvalid('You cannot use both "version_strategy" and "version" at the same time under "assets" packages.')
+                                ->end()
+                                ->validate()
+                                    ->ifTrue(function ($v) {
+                                        return isset($v['version_strategy']) && isset($v['json_manifest_path']);
+                                    })
+                                    ->thenInvalid('You cannot use both "version_strategy" and "json_manifest_path" at the same time under "assets" packages.')
+                                ->end()
+                                ->validate()
+                                    ->ifTrue(function ($v) {
+                                        return isset($v['version']) && isset($v['json_manifest_path']);
+                                    })
+                                    ->thenInvalid('You cannot use both "version" and "json_manifest_path" at the same time under "assets" packages.')
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addTranslatorSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('translator')
+                    ->info('translator configuration')
+                    ->{!class_exists(FullStack::class) && class_exists(Translator::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                    ->fixXmlConfig('fallback')
+                    ->fixXmlConfig('path')
+                    ->children()
+                        ->arrayNode('fallbacks')
+                            ->info('Defaults to the value of "default_locale".')
+                            ->beforeNormalization()->ifString()->then(function ($v) { return [$v]; })->end()
+                            ->prototype('scalar')->end()
+                            ->defaultValue([])
+                        ->end()
+                        ->booleanNode('logging')->defaultValue(false)->end()
+                        ->scalarNode('formatter')->defaultValue('translator.formatter.default')->end()
+                        ->scalarNode('cache_dir')->defaultValue('%kernel.cache_dir%/translations')->end()
+                        ->scalarNode('default_path')
+                            ->info('The default path used to load translations')
+                            ->defaultValue('%kernel.project_dir%/translations')
+                        ->end()
+                        ->arrayNode('paths')
+                            ->prototype('scalar')->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addValidationSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('validation')
+                    ->info('validation configuration')
+                    ->{!class_exists(FullStack::class) && class_exists(Validation::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                    ->validate()
+                        ->ifTrue(function ($v) { return isset($v['strict_email']) && isset($v['email_validation_mode']); })
+                        ->thenInvalid('"strict_email" and "email_validation_mode" cannot be used together.')
+                    ->end()
+                    ->beforeNormalization()
+                        ->ifTrue(function ($v) { return isset($v['strict_email']); })
+                        ->then(function ($v) {
+                            @trigger_error('The "framework.validation.strict_email" configuration key has been deprecated in Symfony 4.1. Use the "framework.validation.email_validation_mode" configuration key instead.', \E_USER_DEPRECATED);
+
+                            return $v;
+                        })
+                    ->end()
+                    ->beforeNormalization()
+                        ->ifTrue(function ($v) { return isset($v['strict_email']) && !isset($v['email_validation_mode']); })
+                        ->then(function ($v) {
+                            $v['email_validation_mode'] = $v['strict_email'] ? 'strict' : 'loose';
+                            unset($v['strict_email']);
+
+                            return $v;
+                        })
+                    ->end()
+                    ->children()
+                        ->scalarNode('cache')->end()
+                        ->booleanNode('enable_annotations')->{!class_exists(FullStack::class) && class_exists(Annotation::class) ? 'defaultTrue' : 'defaultFalse'}()->end()
+                        ->arrayNode('static_method')
+                            ->defaultValue(['loadValidatorMetadata'])
+                            ->prototype('scalar')->end()
+                            ->treatFalseLike([])
+                            ->validate()->castToArray()->end()
+                        ->end()
+                        ->scalarNode('translation_domain')->defaultValue('validators')->end()
+                        ->booleanNode('strict_email')->end()
+                        ->enumNode('email_validation_mode')->values(['html5', 'loose', 'strict'])->end()
+                        ->arrayNode('mapping')
+                            ->addDefaultsIfNotSet()
+                            ->fixXmlConfig('path')
+                            ->children()
+                                ->arrayNode('paths')
+                                    ->prototype('scalar')->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                        ->arrayNode('not_compromised_password')
+                            ->canBeDisabled()
+                            ->children()
+                                ->booleanNode('enabled')
+                                    ->defaultTrue()
+                                    ->info('When disabled, compromised passwords will be accepted as valid.')
+                                ->end()
+                                ->scalarNode('endpoint')
+                                    ->defaultNull()
+                                    ->info('API endpoint for the NotCompromisedPassword Validator.')
+                                ->end()
+                            ->end()
+                        ->end()
+                        ->arrayNode('auto_mapping')
+                            ->info('A collection of namespaces for which auto-mapping will be enabled by default, or null to opt-in with the EnableAutoMapping constraint.')
+                            ->example([
+                                'App\\Entity\\' => [],
+                                'App\\WithSpecificLoaders\\' => ['validator.property_info_loader'],
+                            ])
+                            ->useAttributeAsKey('namespace')
+                            ->normalizeKeys(false)
+                            ->beforeNormalization()
+                                ->ifArray()
+                                ->then(function (array $values): array {
+                                    foreach ($values as $k => $v) {
+                                        if (isset($v['service'])) {
+                                            continue;
+                                        }
+
+                                        if (isset($v['namespace'])) {
+                                            $values[$k]['services'] = [];
+                                            continue;
+                                        }
+
+                                        if (!\is_array($v)) {
+                                            $values[$v]['services'] = [];
+                                            unset($values[$k]);
+                                            continue;
+                                        }
+
+                                        $tmp = $v;
+                                        unset($values[$k]);
+                                        $values[$k]['services'] = $tmp;
+                                    }
+
+                                    return $values;
+                                })
+                            ->end()
+                            ->arrayPrototype()
+                                ->fixXmlConfig('service')
+                                ->children()
+                                    ->arrayNode('services')
+                                        ->prototype('scalar')->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addAnnotationsSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('annotations')
+                    ->info('annotation configuration')
+                    ->{class_exists(Annotation::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                    ->children()
+                        ->scalarNode('cache')->defaultValue(interface_exists(Cache::class) ? 'php_array' : 'none')->end()
+                        ->scalarNode('file_cache_dir')->defaultValue('%kernel.cache_dir%/annotations')->end()
+                        ->booleanNode('debug')->defaultValue($this->debug)->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addSerializerSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('serializer')
+                    ->info('serializer configuration')
+                    ->{!class_exists(FullStack::class) && class_exists(Serializer::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                    ->children()
+                        ->booleanNode('enable_annotations')->{!class_exists(FullStack::class) && class_exists(Annotation::class) ? 'defaultTrue' : 'defaultFalse'}()->end()
+                        ->scalarNode('name_converter')->end()
+                        ->scalarNode('circular_reference_handler')->end()
+                        ->scalarNode('max_depth_handler')->end()
+                        ->arrayNode('mapping')
+                            ->addDefaultsIfNotSet()
+                            ->fixXmlConfig('path')
+                            ->children()
+                                ->arrayNode('paths')
+                                    ->prototype('scalar')->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addPropertyAccessSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('property_access')
+                    ->addDefaultsIfNotSet()
+                    ->info('Property access configuration')
+                    ->children()
+                        ->booleanNode('magic_call')->defaultFalse()->end()
+                        ->booleanNode('throw_exception_on_invalid_index')->defaultFalse()->end()
+                        ->booleanNode('throw_exception_on_invalid_property_path')->defaultTrue()->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addPropertyInfoSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('property_info')
+                    ->info('Property info configuration')
+                    ->{!class_exists(FullStack::class) && interface_exists(PropertyInfoExtractorInterface::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addCacheSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('cache')
+                    ->info('Cache configuration')
+                    ->addDefaultsIfNotSet()
+                    ->fixXmlConfig('pool')
+                    ->children()
+                        ->scalarNode('prefix_seed')
+                            ->info('Used to namespace cache keys when using several apps with the same shared backend')
+                            ->example('my-application-name')
+                        ->end()
+                        ->scalarNode('app')
+                            ->info('App related cache pools configuration')
+                            ->defaultValue('cache.adapter.filesystem')
+                        ->end()
+                        ->scalarNode('system')
+                            ->info('System related cache pools configuration')
+                            ->defaultValue('cache.adapter.system')
+                        ->end()
+                        ->scalarNode('directory')->defaultValue('%kernel.cache_dir%/pools')->end()
+                        ->scalarNode('default_doctrine_provider')->end()
+                        ->scalarNode('default_psr6_provider')->end()
+                        ->scalarNode('default_redis_provider')->defaultValue('redis://localhost')->end()
+                        ->scalarNode('default_memcached_provider')->defaultValue('memcached://localhost')->end()
+                        ->scalarNode('default_pdo_provider')->defaultValue(class_exists(Connection::class) ? 'database_connection' : null)->end()
+                        ->arrayNode('pools')
+                            ->useAttributeAsKey('name')
+                            ->prototype('array')
+                                ->fixXmlConfig('adapter')
+                                ->beforeNormalization()
+                                    ->ifTrue(function ($v) { return isset($v['provider']) && \is_array($v['adapters'] ?? $v['adapter'] ?? null) && 1 < \count($v['adapters'] ?? $v['adapter']); })
+                                    ->thenInvalid('Pool cannot have a "provider" while more than one adapter is defined')
+                                ->end()
+                                ->children()
+                                    ->arrayNode('adapters')
+                                        ->performNoDeepMerging()
+                                        ->info('One or more adapters to chain for creating the pool, defaults to "cache.app".')
+                                        ->beforeNormalization()->castToArray()->end()
+                                        ->beforeNormalization()
+                                            ->always()->then(function ($values) {
+                                                if ([0] === array_keys($values) && \is_array($values[0])) {
+                                                    return $values[0];
+                                                }
+                                                $adapters = [];
+
+                                                foreach ($values as $k => $v) {
+                                                    if (\is_int($k) && \is_string($v)) {
+                                                        $adapters[] = $v;
+                                                    } elseif (!\is_array($v)) {
+                                                        $adapters[$k] = $v;
+                                                    } elseif (isset($v['provider'])) {
+                                                        $adapters[$v['provider']] = $v['name'] ?? $v;
+                                                    } else {
+                                                        $adapters[] = $v['name'] ?? $v;
+                                                    }
+                                                }
+
+                                                return $adapters;
+                                            })
+                                        ->end()
+                                        ->prototype('scalar')->end()
+                                    ->end()
+                                    ->scalarNode('tags')->defaultNull()->end()
+                                    ->booleanNode('public')->defaultFalse()->end()
+                                    ->integerNode('default_lifetime')->end()
+                                    ->scalarNode('provider')
+                                        ->info('Overwrite the setting from the default provider for this adapter.')
+                                    ->end()
+                                    ->scalarNode('clearer')->end()
+                                ->end()
+                            ->end()
+                            ->validate()
+                                ->ifTrue(function ($v) { return isset($v['cache.app']) || isset($v['cache.system']); })
+                                ->thenInvalid('"cache.app" and "cache.system" are reserved names')
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addPhpErrorsSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('php_errors')
+                    ->info('PHP errors handling configuration')
+                    ->addDefaultsIfNotSet()
+                    ->children()
+                        ->scalarNode('log')
+                            ->info('Use the application logger instead of the PHP logger for logging PHP errors.')
+                            ->example('"true" to use the default configuration: log all errors. "false" to disable. An integer bit field of E_* constants.')
+                            ->defaultValue($this->debug)
+                            ->treatNullLike($this->debug)
+                            ->validate()
+                                ->ifTrue(function ($v) { return !(\is_int($v) || \is_bool($v)); })
+                                ->thenInvalid('The "php_errors.log" parameter should be either an integer or a boolean.')
+                            ->end()
+                        ->end()
+                        ->booleanNode('throw')
+                            ->info('Throw PHP errors as \ErrorException instances.')
+                            ->defaultValue($this->debug)
+                            ->treatNullLike($this->debug)
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addLockSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('lock')
+                    ->info('Lock configuration')
+                    ->{!class_exists(FullStack::class) && class_exists(Lock::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                    ->beforeNormalization()
+                        ->ifString()->then(function ($v) { return ['enabled' => true, 'resources' => $v]; })
+                    ->end()
+                    ->beforeNormalization()
+                        ->ifTrue(function ($v) { return \is_array($v) && !isset($v['enabled']); })
+                        ->then(function ($v) { return $v + ['enabled' => true]; })
+                    ->end()
+                    ->beforeNormalization()
+                        ->ifTrue(function ($v) { return \is_array($v) && !isset($v['resources']) && !isset($v['resource']); })
+                        ->then(function ($v) {
+                            $e = $v['enabled'];
+                            unset($v['enabled']);
+
+                            return ['enabled' => $e, 'resources' => $v];
+                        })
+                    ->end()
+                    ->addDefaultsIfNotSet()
+                    ->fixXmlConfig('resource')
+                    ->children()
+                        ->arrayNode('resources')
+                            ->normalizeKeys(false)
+                            ->useAttributeAsKey('name')
+                            ->requiresAtLeastOneElement()
+                            ->defaultValue(['default' => [class_exists(SemaphoreStore::class) && SemaphoreStore::isSupported() ? 'semaphore' : 'flock']])
+                            ->beforeNormalization()
+                                ->ifString()->then(function ($v) { return ['default' => $v]; })
+                            ->end()
+                            ->beforeNormalization()
+                                ->ifTrue(function ($v) { return \is_array($v) && array_keys($v) === range(0, \count($v) - 1); })
+                                ->then(function ($v) {
+                                    $resources = [];
+                                    foreach ($v as $resource) {
+                                        $resources = array_merge_recursive(
+                                            $resources,
+                                            \is_array($resource) && isset($resource['name'])
+                                                ? [$resource['name'] => $resource['value']]
+                                                : ['default' => $resource]
+                                        );
+                                    }
+
+                                    return $resources;
+                                })
+                            ->end()
+                            ->prototype('array')
+                                ->performNoDeepMerging()
+                                ->beforeNormalization()->ifString()->then(function ($v) { return [$v]; })->end()
+                                ->prototype('scalar')->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addWebLinkSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('web_link')
+                    ->info('web links configuration')
+                    ->{!class_exists(FullStack::class) && class_exists(HttpHeaderSerializer::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addMessengerSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('messenger')
+                    ->info('Messenger configuration')
+                    ->{!class_exists(FullStack::class) && interface_exists(MessageBusInterface::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                    ->fixXmlConfig('transport')
+                    ->fixXmlConfig('bus', 'buses')
+                    ->validate()
+                        ->ifTrue(function ($v) { return isset($v['buses']) && \count($v['buses']) > 1 && null === $v['default_bus']; })
+                        ->thenInvalid('You must specify the "default_bus" if you define more than one bus.')
+                    ->end()
+                    ->validate()
+                        ->ifTrue(static function ($v): bool { return isset($v['buses']) && null !== $v['default_bus'] && !isset($v['buses'][$v['default_bus']]); })
+                        ->then(static function (array $v): void { throw new InvalidConfigurationException(sprintf('The specified default bus "%s" is not configured. Available buses are "%s".', $v['default_bus'], implode('", "', array_keys($v['buses'])))); })
+                    ->end()
+                    ->children()
+                        ->arrayNode('routing')
+                            ->normalizeKeys(false)
+                            ->useAttributeAsKey('message_class')
+                            ->beforeNormalization()
+                                ->always()
+                                ->then(function ($config) {
+                                    if (!\is_array($config)) {
+                                        return [];
+                                    }
+                                    // If XML config with only one routing attribute
+                                    if (2 === \count($config) && isset($config['message-class']) && isset($config['sender'])) {
+                                        $config = [0 => $config];
+                                    }
+
+                                    $newConfig = [];
+                                    foreach ($config as $k => $v) {
+                                        if (!\is_int($k)) {
+                                            $newConfig[$k] = [
+                                                'senders' => $v['senders'] ?? (\is_array($v) ? array_values($v) : [$v]),
+                                            ];
+                                        } else {
+                                            $newConfig[$v['message-class']]['senders'] = array_map(
+                                                function ($a) {
+                                                    return \is_string($a) ? $a : $a['service'];
+                                                },
+                                                array_values($v['sender'])
+                                            );
+                                        }
+                                    }
+
+                                    return $newConfig;
+                                })
+                            ->end()
+                            ->prototype('array')
+                                ->performNoDeepMerging()
+                                ->children()
+                                    ->arrayNode('senders')
+                                        ->requiresAtLeastOneElement()
+                                        ->prototype('scalar')->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                        ->arrayNode('serializer')
+                            ->addDefaultsIfNotSet()
+                            ->children()
+                                ->scalarNode('default_serializer')
+                                    ->defaultValue('messenger.transport.native_php_serializer')
+                                    ->info('Service id to use as the default serializer for the transports.')
+                                ->end()
+                                ->arrayNode('symfony_serializer')
+                                    ->addDefaultsIfNotSet()
+                                    ->children()
+                                        ->scalarNode('format')->defaultValue('json')->info('Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default).')->end()
+                                        ->arrayNode('context')
+                                            ->normalizeKeys(false)
+                                            ->useAttributeAsKey('name')
+                                            ->defaultValue([])
+                                            ->info('Context array for the messenger.transport.symfony_serializer service (which is not the serializer used by default).')
+                                            ->prototype('variable')->end()
+                                        ->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                        ->arrayNode('transports')
+                            ->normalizeKeys(false)
+                            ->useAttributeAsKey('name')
+                            ->arrayPrototype()
+                                ->beforeNormalization()
+                                    ->ifString()
+                                    ->then(function (string $dsn) {
+                                        return ['dsn' => $dsn];
+                                    })
+                                ->end()
+                                ->fixXmlConfig('option')
+                                ->children()
+                                    ->scalarNode('dsn')->end()
+                                    ->scalarNode('serializer')->defaultNull()->info('Service id of a custom serializer to use.')->end()
+                                    ->arrayNode('options')
+                                        ->normalizeKeys(false)
+                                        ->defaultValue([])
+                                        ->prototype('variable')
+                                        ->end()
+                                    ->end()
+                                    ->arrayNode('retry_strategy')
+                                        ->addDefaultsIfNotSet()
+                                        ->beforeNormalization()
+                                            ->always(function ($v) {
+                                                if (isset($v['service']) && (isset($v['max_retries']) || isset($v['delay']) || isset($v['multiplier']) || isset($v['max_delay']))) {
+                                                    throw new \InvalidArgumentException('The "service" cannot be used along with the other "retry_strategy" options.');
+                                                }
+
+                                                return $v;
+                                            })
+                                        ->end()
+                                        ->children()
+                                            ->scalarNode('service')->defaultNull()->info('Service id to override the retry strategy entirely')->end()
+                                            ->integerNode('max_retries')->defaultValue(3)->min(0)->end()
+                                            ->integerNode('delay')->defaultValue(1000)->min(0)->info('Time in ms to delay (or the initial value when multiplier is used)')->end()
+                                            ->floatNode('multiplier')->defaultValue(2)->min(1)->info('If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries))')->end()
+                                            ->integerNode('max_delay')->defaultValue(0)->min(0)->info('Max time in ms that a retry should ever be delayed (0 = infinite)')->end()
+                                        ->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                        ->scalarNode('failure_transport')
+                            ->defaultNull()
+                            ->info('Transport name to send failed messages to (after all retries have failed).')
+                        ->end()
+                        ->scalarNode('default_bus')->defaultNull()->end()
+                        ->arrayNode('buses')
+                            ->defaultValue(['messenger.bus.default' => ['default_middleware' => true, 'middleware' => []]])
+                            ->normalizeKeys(false)
+                            ->useAttributeAsKey('name')
+                            ->arrayPrototype()
+                                ->addDefaultsIfNotSet()
+                                ->children()
+                                    ->enumNode('default_middleware')
+                                        ->values([true, false, 'allow_no_handlers'])
+                                        ->defaultTrue()
+                                    ->end()
+                                    ->arrayNode('middleware')
+                                        ->performNoDeepMerging()
+                                        ->beforeNormalization()
+                                            ->ifTrue(function ($v) { return \is_string($v) || (\is_array($v) && !\is_int(key($v))); })
+                                            ->then(function ($v) { return [$v]; })
+                                        ->end()
+                                        ->defaultValue([])
+                                        ->arrayPrototype()
+                                            ->beforeNormalization()
+                                                ->always()
+                                                ->then(function ($middleware): array {
+                                                    if (!\is_array($middleware)) {
+                                                        return ['id' => $middleware];
+                                                    }
+                                                    if (isset($middleware['id'])) {
+                                                        return $middleware;
+                                                    }
+                                                    if (1 < \count($middleware)) {
+                                                        throw new \InvalidArgumentException('Invalid middleware at path "framework.messenger": a map with a single factory id as key and its arguments as value was expected, '.json_encode($middleware).' given.');
+                                                    }
+
+                                                    return [
+                                                        'id' => key($middleware),
+                                                        'arguments' => current($middleware),
+                                                    ];
+                                                })
+                                            ->end()
+                                            ->fixXmlConfig('argument')
+                                            ->children()
+                                                ->scalarNode('id')->isRequired()->cannotBeEmpty()->end()
+                                                ->arrayNode('arguments')
+                                                    ->normalizeKeys(false)
+                                                    ->defaultValue([])
+                                                    ->prototype('variable')
+                                                ->end()
+                                            ->end()
+                                        ->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addRobotsIndexSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->booleanNode('disallow_search_engine_index')
+                    ->info('Enabled by default when debug is enabled.')
+                    ->defaultValue($this->debug)
+                    ->treatNullLike($this->debug)
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addHttpClientSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('http_client')
+                    ->info('HTTP Client configuration')
+                    ->{!class_exists(FullStack::class) && class_exists(HttpClient::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                    ->fixXmlConfig('scoped_client')
+                    ->children()
+                        ->integerNode('max_host_connections')
+                            ->info('The maximum number of connections to a single host.')
+                        ->end()
+                        ->arrayNode('default_options')
+                            ->fixXmlConfig('header')
+                            ->children()
+                                ->arrayNode('headers')
+                                    ->info('Associative array: header => value(s).')
+                                    ->useAttributeAsKey('name')
+                                    ->normalizeKeys(false)
+                                    ->variablePrototype()->end()
+                                ->end()
+                                ->integerNode('max_redirects')
+                                    ->info('The maximum number of redirects to follow.')
+                                ->end()
+                                ->scalarNode('http_version')
+                                    ->info('The default HTTP version, typically 1.1 or 2.0, leave to null for the best version.')
+                                ->end()
+                                ->arrayNode('resolve')
+                                    ->info('Associative array: domain => IP.')
+                                    ->useAttributeAsKey('host')
+                                    ->beforeNormalization()
+                                        ->always(function ($config) {
+                                            if (!\is_array($config)) {
+                                                return [];
+                                            }
+                                            if (!isset($config['host'], $config['value']) || \count($config) > 2) {
+                                                return $config;
+                                            }
+
+                                            return [$config['host'] => $config['value']];
+                                        })
+                                    ->end()
+                                    ->normalizeKeys(false)
+                                    ->scalarPrototype()->end()
+                                ->end()
+                                ->scalarNode('proxy')
+                                    ->info('The URL of the proxy to pass requests through or null for automatic detection.')
+                                ->end()
+                                ->scalarNode('no_proxy')
+                                    ->info('A comma separated list of hosts that do not require a proxy to be reached.')
+                                ->end()
+                                ->floatNode('timeout')
+                                    ->info('The idle timeout, defaults to the "default_socket_timeout" ini parameter.')
+                                ->end()
+                                ->floatNode('max_duration')
+                                    ->info('The maximum execution time for the request+response as a whole.')
+                                ->end()
+                                ->scalarNode('bindto')
+                                    ->info('A network interface name, IP address, a host name or a UNIX socket to bind to.')
+                                ->end()
+                                ->booleanNode('verify_peer')
+                                    ->info('Indicates if the peer should be verified in an SSL/TLS context.')
+                                ->end()
+                                ->booleanNode('verify_host')
+                                    ->info('Indicates if the host should exist as a certificate common name.')
+                                ->end()
+                                ->scalarNode('cafile')
+                                    ->info('A certificate authority file.')
+                                ->end()
+                                ->scalarNode('capath')
+                                    ->info('A directory that contains multiple certificate authority files.')
+                                ->end()
+                                ->scalarNode('local_cert')
+                                    ->info('A PEM formatted certificate file.')
+                                ->end()
+                                ->scalarNode('local_pk')
+                                    ->info('A private key file.')
+                                ->end()
+                                ->scalarNode('passphrase')
+                                    ->info('The passphrase used to encrypt the "local_pk" file.')
+                                ->end()
+                                ->scalarNode('ciphers')
+                                    ->info('A list of SSL/TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...)')
+                                ->end()
+                                ->arrayNode('peer_fingerprint')
+                                    ->info('Associative array: hashing algorithm => hash(es).')
+                                    ->normalizeKeys(false)
+                                    ->children()
+                                        ->variableNode('sha1')->end()
+                                        ->variableNode('pin-sha256')->end()
+                                        ->variableNode('md5')->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                        ->arrayNode('scoped_clients')
+                            ->useAttributeAsKey('name')
+                            ->normalizeKeys(false)
+                            ->arrayPrototype()
+                                ->fixXmlConfig('header')
+                                ->beforeNormalization()
+                                    ->always()
+                                    ->then(function ($config) {
+                                        if (!class_exists(HttpClient::class)) {
+                                            throw new LogicException('HttpClient support cannot be enabled as the component is not installed. Try running "composer require symfony/http-client".');
+                                        }
+
+                                        return \is_array($config) ? $config : ['base_uri' => $config];
+                                    })
+                                ->end()
+                                ->validate()
+                                    ->ifTrue(function ($v) { return !isset($v['scope']) && !isset($v['base_uri']); })
+                                    ->thenInvalid('Either "scope" or "base_uri" should be defined.')
+                                ->end()
+                                ->validate()
+                                    ->ifTrue(function ($v) { return !empty($v['query']) && !isset($v['base_uri']); })
+                                    ->thenInvalid('"query" applies to "base_uri" but no base URI is defined.')
+                                ->end()
+                                ->children()
+                                    ->scalarNode('scope')
+                                        ->info('The regular expression that the request URL must match before adding the other options. When none is provided, the base URI is used instead.')
+                                        ->cannotBeEmpty()
+                                    ->end()
+                                    ->scalarNode('base_uri')
+                                        ->info('The URI to resolve relative URLs, following rules in RFC 3985, section 2.')
+                                        ->cannotBeEmpty()
+                                    ->end()
+                                    ->scalarNode('auth_basic')
+                                        ->info('An HTTP Basic authentication "username:password".')
+                                    ->end()
+                                    ->scalarNode('auth_bearer')
+                                        ->info('A token enabling HTTP Bearer authorization.')
+                                    ->end()
+                                    ->scalarNode('auth_ntlm')
+                                        ->info('A "username:password" pair to use Microsoft NTLM authentication (requires the cURL extension).')
+                                    ->end()
+                                    ->arrayNode('query')
+                                        ->info('Associative array of query string values merged with the base URI.')
+                                        ->useAttributeAsKey('key')
+                                        ->beforeNormalization()
+                                            ->always(function ($config) {
+                                                if (!\is_array($config)) {
+                                                    return [];
+                                                }
+                                                if (!isset($config['key'], $config['value']) || \count($config) > 2) {
+                                                    return $config;
+                                                }
+
+                                                return [$config['key'] => $config['value']];
+                                            })
+                                        ->end()
+                                        ->normalizeKeys(false)
+                                        ->scalarPrototype()->end()
+                                    ->end()
+                                    ->arrayNode('headers')
+                                        ->info('Associative array: header => value(s).')
+                                        ->useAttributeAsKey('name')
+                                        ->normalizeKeys(false)
+                                        ->variablePrototype()->end()
+                                    ->end()
+                                    ->integerNode('max_redirects')
+                                        ->info('The maximum number of redirects to follow.')
+                                    ->end()
+                                    ->scalarNode('http_version')
+                                        ->info('The default HTTP version, typically 1.1 or 2.0, leave to null for the best version.')
+                                    ->end()
+                                    ->arrayNode('resolve')
+                                        ->info('Associative array: domain => IP.')
+                                        ->useAttributeAsKey('host')
+                                        ->beforeNormalization()
+                                            ->always(function ($config) {
+                                                if (!\is_array($config)) {
+                                                    return [];
+                                                }
+                                                if (!isset($config['host'], $config['value']) || \count($config) > 2) {
+                                                    return $config;
+                                                }
+
+                                                return [$config['host'] => $config['value']];
+                                            })
+                                        ->end()
+                                        ->normalizeKeys(false)
+                                        ->scalarPrototype()->end()
+                                    ->end()
+                                    ->scalarNode('proxy')
+                                        ->info('The URL of the proxy to pass requests through or null for automatic detection.')
+                                    ->end()
+                                    ->scalarNode('no_proxy')
+                                        ->info('A comma separated list of hosts that do not require a proxy to be reached.')
+                                    ->end()
+                                    ->floatNode('timeout')
+                                        ->info('The idle timeout, defaults to the "default_socket_timeout" ini parameter.')
+                                    ->end()
+                                    ->floatNode('max_duration')
+                                        ->info('The maximum execution time for the request+response as a whole.')
+                                    ->end()
+                                    ->scalarNode('bindto')
+                                        ->info('A network interface name, IP address, a host name or a UNIX socket to bind to.')
+                                    ->end()
+                                    ->booleanNode('verify_peer')
+                                        ->info('Indicates if the peer should be verified in an SSL/TLS context.')
+                                    ->end()
+                                    ->booleanNode('verify_host')
+                                        ->info('Indicates if the host should exist as a certificate common name.')
+                                    ->end()
+                                    ->scalarNode('cafile')
+                                        ->info('A certificate authority file.')
+                                    ->end()
+                                    ->scalarNode('capath')
+                                        ->info('A directory that contains multiple certificate authority files.')
+                                    ->end()
+                                    ->scalarNode('local_cert')
+                                        ->info('A PEM formatted certificate file.')
+                                    ->end()
+                                    ->scalarNode('local_pk')
+                                        ->info('A private key file.')
+                                    ->end()
+                                    ->scalarNode('passphrase')
+                                        ->info('The passphrase used to encrypt the "local_pk" file.')
+                                    ->end()
+                                    ->scalarNode('ciphers')
+                                        ->info('A list of SSL/TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...)')
+                                    ->end()
+                                    ->arrayNode('peer_fingerprint')
+                                        ->info('Associative array: hashing algorithm => hash(es).')
+                                        ->normalizeKeys(false)
+                                        ->children()
+                                            ->variableNode('sha1')->end()
+                                            ->variableNode('pin-sha256')->end()
+                                            ->variableNode('md5')->end()
+                                        ->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+
+    private function addMailerSection(ArrayNodeDefinition $rootNode)
+    {
+        $rootNode
+            ->children()
+                ->arrayNode('mailer')
+                    ->info('Mailer configuration')
+                    ->{!class_exists(FullStack::class) && class_exists(Mailer::class) ? 'canBeDisabled' : 'canBeEnabled'}()
+                    ->validate()
+                        ->ifTrue(function ($v) { return isset($v['dsn']) && \count($v['transports']); })
+                        ->thenInvalid('"dsn" and "transports" cannot be used together.')
+                    ->end()
+                    ->fixXmlConfig('transport')
+                    ->children()
+                        ->scalarNode('dsn')->defaultNull()->end()
+                        ->arrayNode('transports')
+                            ->useAttributeAsKey('name')
+                            ->prototype('scalar')->end()
+                        ->end()
+                        ->arrayNode('envelope')
+                            ->info('Mailer Envelope configuration')
+                            ->children()
+                                ->scalarNode('sender')->end()
+                                ->arrayNode('recipients')
+                                    ->performNoDeepMerging()
+                                    ->beforeNormalization()
+                                    ->ifArray()
+                                        ->then(function ($v) {
+                                            return array_filter(array_values($v));
+                                        })
+                                    ->end()
+                                    ->prototype('scalar')->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php b/vendor/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php
new file mode 100644
index 0000000000000000000000000000000000000000..c19144ba5f204f9ba6744d8928cd32024acf319e
--- /dev/null
+++ b/vendor/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php
@@ -0,0 +1,2117 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\DependencyInjection;
+
+use Doctrine\Common\Annotations\AnnotationRegistry;
+use Doctrine\Common\Annotations\PsrCachedReader;
+use Doctrine\Common\Annotations\Reader;
+use Http\Client\HttpClient;
+use Psr\Cache\CacheItemPoolInterface;
+use Psr\Container\ContainerInterface as PsrContainerInterface;
+use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface;
+use Psr\Http\Client\ClientInterface;
+use Psr\Log\LoggerAwareInterface;
+use Symfony\Bridge\Monolog\Processor\DebugProcessor;
+use Symfony\Bridge\Twig\Extension\CsrfExtension;
+use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Bundle\FrameworkBundle\Routing\AnnotatedRouteControllerLoader;
+use Symfony\Bundle\FrameworkBundle\Routing\RedirectableUrlMatcher;
+use Symfony\Bundle\FrameworkBundle\Routing\RouteLoaderInterface;
+use Symfony\Bundle\FullStack;
+use Symfony\Component\Asset\PackageInterface;
+use Symfony\Component\BrowserKit\AbstractBrowser;
+use Symfony\Component\Cache\Adapter\AdapterInterface;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\Adapter\ChainAdapter;
+use Symfony\Component\Cache\Adapter\TagAwareAdapter;
+use Symfony\Component\Cache\DependencyInjection\CachePoolPass;
+use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
+use Symfony\Component\Cache\Marshaller\MarshallerInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\Config\Resource\DirectoryResource;
+use Symfony\Component\Config\ResourceCheckerInterface;
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\ChildDefinition;
+use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\EnvVarLoaderInterface;
+use Symfony\Component\DependencyInjection\EnvVarProcessorInterface;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
+use Symfony\Component\DependencyInjection\Parameter;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ServiceLocator;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\Form\ChoiceList\Factory\CachingFactoryDecorator;
+use Symfony\Component\Form\FormTypeExtensionInterface;
+use Symfony\Component\Form\FormTypeGuesserInterface;
+use Symfony\Component\Form\FormTypeInterface;
+use Symfony\Component\HttpClient\ScopingHttpClient;
+use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
+use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
+use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;
+use Symfony\Component\HttpKernel\DependencyInjection\Extension;
+use Symfony\Component\Lock\Factory;
+use Symfony\Component\Lock\Lock;
+use Symfony\Component\Lock\LockFactory;
+use Symfony\Component\Lock\LockInterface;
+use Symfony\Component\Lock\PersistingStoreInterface;
+use Symfony\Component\Lock\Store\StoreFactory;
+use Symfony\Component\Lock\StoreInterface;
+use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesTransportFactory;
+use Symfony\Component\Mailer\Bridge\Google\Transport\GmailTransportFactory;
+use Symfony\Component\Mailer\Bridge\Mailchimp\Transport\MandrillTransportFactory;
+use Symfony\Component\Mailer\Bridge\Mailgun\Transport\MailgunTransportFactory;
+use Symfony\Component\Mailer\Bridge\Postmark\Transport\PostmarkTransportFactory;
+use Symfony\Component\Mailer\Bridge\Sendgrid\Transport\SendgridTransportFactory;
+use Symfony\Component\Mailer\Mailer;
+use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
+use Symfony\Component\Messenger\MessageBus;
+use Symfony\Component\Messenger\MessageBusInterface;
+use Symfony\Component\Messenger\Transport\AmqpExt\AmqpTransportFactory;
+use Symfony\Component\Messenger\Transport\RedisExt\RedisTransportFactory;
+use Symfony\Component\Messenger\Transport\TransportFactoryInterface;
+use Symfony\Component\Messenger\Transport\TransportInterface;
+use Symfony\Component\Mime\MimeTypeGuesserInterface;
+use Symfony\Component\Mime\MimeTypes;
+use Symfony\Component\PropertyAccess\PropertyAccessor;
+use Symfony\Component\PropertyInfo\PropertyAccessExtractorInterface;
+use Symfony\Component\PropertyInfo\PropertyDescriptionExtractorInterface;
+use Symfony\Component\PropertyInfo\PropertyInfoExtractorInterface;
+use Symfony\Component\PropertyInfo\PropertyInitializableExtractorInterface;
+use Symfony\Component\PropertyInfo\PropertyListExtractorInterface;
+use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface;
+use Symfony\Component\Routing\Generator\Dumper\PhpGeneratorDumper;
+use Symfony\Component\Routing\Generator\UrlGenerator;
+use Symfony\Component\Routing\Loader\AnnotationDirectoryLoader;
+use Symfony\Component\Routing\Loader\AnnotationFileLoader;
+use Symfony\Component\Routing\Matcher\CompiledUrlMatcher;
+use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
+use Symfony\Component\Security\Core\Security;
+use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
+use Symfony\Component\Serializer\Encoder\DecoderInterface;
+use Symfony\Component\Serializer\Encoder\EncoderInterface;
+use Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata;
+use Symfony\Component\Serializer\Normalizer\ConstraintViolationListNormalizer;
+use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
+use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
+use Symfony\Component\Stopwatch\Stopwatch;
+use Symfony\Component\Translation\Command\XliffLintCommand as BaseXliffLintCommand;
+use Symfony\Component\Translation\Translator;
+use Symfony\Component\Translation\TranslatorInterface;
+use Symfony\Component\Validator\ConstraintValidatorInterface;
+use Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader;
+use Symfony\Component\Validator\ObjectInitializerInterface;
+use Symfony\Component\Validator\Util\LegacyTranslatorProxy;
+use Symfony\Component\WebLink\HttpHeaderSerializer;
+use Symfony\Component\Workflow;
+use Symfony\Component\Workflow\WorkflowInterface;
+use Symfony\Component\Yaml\Command\LintCommand as BaseYamlLintCommand;
+use Symfony\Component\Yaml\Yaml;
+use Symfony\Contracts\Cache\CacheInterface;
+use Symfony\Contracts\Cache\TagAwareCacheInterface;
+use Symfony\Contracts\HttpClient\HttpClientInterface;
+use Symfony\Contracts\Service\ResetInterface;
+use Symfony\Contracts\Service\ServiceSubscriberInterface;
+use Symfony\Contracts\Translation\LocaleAwareInterface;
+
+/**
+ * Process the configuration and prepare the dependency injection container with
+ * parameters and services.
+ */
+class FrameworkExtension extends Extension
+{
+    private $formConfigEnabled = false;
+    private $translationConfigEnabled = false;
+    private $sessionConfigEnabled = false;
+    private $annotationsConfigEnabled = false;
+    private $validatorConfigEnabled = false;
+    private $messengerConfigEnabled = false;
+    private $mailerConfigEnabled = false;
+    private $httpClientConfigEnabled = false;
+
+    /**
+     * Responds to the app.config configuration parameter.
+     *
+     * @throws LogicException
+     */
+    public function load(array $configs, ContainerBuilder $container)
+    {
+        $loader = new XmlFileLoader($container, new FileLocator(\dirname(__DIR__).'/Resources/config'));
+
+        $loader->load('web.xml');
+        $loader->load('services.xml');
+        $loader->load('fragment_renderer.xml');
+        $loader->load('error_renderer.xml');
+
+        if (interface_exists(PsrEventDispatcherInterface::class)) {
+            $container->setAlias(PsrEventDispatcherInterface::class, 'event_dispatcher');
+        }
+
+        $container->registerAliasForArgument('parameter_bag', PsrContainerInterface::class);
+
+        if (class_exists(Application::class)) {
+            $loader->load('console.xml');
+
+            if (!class_exists(BaseXliffLintCommand::class)) {
+                $container->removeDefinition('console.command.xliff_lint');
+            }
+            if (!class_exists(BaseYamlLintCommand::class)) {
+                $container->removeDefinition('console.command.yaml_lint');
+            }
+        }
+
+        // Load Cache configuration first as it is used by other components
+        $loader->load('cache.xml');
+
+        $configuration = $this->getConfiguration($configs, $container);
+        $config = $this->processConfiguration($configuration, $configs);
+
+        $this->annotationsConfigEnabled = $this->isConfigEnabled($container, $config['annotations']);
+        $this->translationConfigEnabled = $this->isConfigEnabled($container, $config['translator']);
+
+        // A translator must always be registered (as support is included by
+        // default in the Form and Validator component). If disabled, an identity
+        // translator will be used and everything will still work as expected.
+        if ($this->isConfigEnabled($container, $config['translator']) || $this->isConfigEnabled($container, $config['form']) || $this->isConfigEnabled($container, $config['validation'])) {
+            if (!class_exists(Translator::class) && $this->isConfigEnabled($container, $config['translator'])) {
+                throw new LogicException('Translation support cannot be enabled as the Translation component is not installed. Try running "composer require symfony/translation".');
+            }
+
+            if (class_exists(Translator::class)) {
+                $loader->load('identity_translator.xml');
+            }
+        }
+
+        if (isset($config['secret'])) {
+            $container->setParameter('kernel.secret', $config['secret']);
+        }
+
+        $container->setParameter('kernel.http_method_override', $config['http_method_override']);
+        $container->setParameter('kernel.trusted_hosts', $config['trusted_hosts']);
+        $container->setParameter('kernel.default_locale', $config['default_locale']);
+        $container->setParameter('kernel.error_controller', $config['error_controller']);
+
+        if (!$container->hasParameter('debug.file_link_format')) {
+            if (!$container->hasParameter('templating.helper.code.file_link_format')) {
+                $links = [
+                    'textmate' => 'txmt://open?url=file://%%f&line=%%l',
+                    'macvim' => 'mvim://open?url=file://%%f&line=%%l',
+                    'emacs' => 'emacs://open?url=file://%%f&line=%%l',
+                    'sublime' => 'subl://open?url=file://%%f&line=%%l',
+                    'phpstorm' => 'phpstorm://open?file=%%f&line=%%l',
+                    'atom' => 'atom://core/open/file?filename=%%f&line=%%l',
+                    'vscode' => 'vscode://file/%%f:%%l',
+                ];
+                $ide = $config['ide'];
+                // mark any env vars found in the ide setting as used
+                $container->resolveEnvPlaceholders($ide);
+
+                $container->setParameter('templating.helper.code.file_link_format', str_replace('%', '%%', \ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format')) ?: ($links[$ide] ?? $ide));
+            }
+            $container->setParameter('debug.file_link_format', '%templating.helper.code.file_link_format%');
+        }
+
+        if (!empty($config['test'])) {
+            $loader->load('test.xml');
+
+            if (!class_exists(AbstractBrowser::class)) {
+                $container->removeDefinition('test.client');
+            }
+        }
+
+        // register cache before session so both can share the connection services
+        $this->registerCacheConfiguration($config['cache'], $container);
+
+        if ($this->isConfigEnabled($container, $config['session'])) {
+            if (!\extension_loaded('session')) {
+                throw new LogicException('Session support cannot be enabled as the session extension is not installed. See https://php.net/session.installation for instructions.');
+            }
+
+            $this->sessionConfigEnabled = true;
+            $this->registerSessionConfiguration($config['session'], $container, $loader);
+            if (!empty($config['test'])) {
+                $container->getDefinition('test.session.listener')->setArgument(1, '%session.storage.options%');
+            }
+        }
+
+        if ($this->isConfigEnabled($container, $config['request'])) {
+            $this->registerRequestConfiguration($config['request'], $container, $loader);
+        }
+
+        if (null === $config['csrf_protection']['enabled']) {
+            $config['csrf_protection']['enabled'] = $this->sessionConfigEnabled && !class_exists(FullStack::class) && interface_exists(CsrfTokenManagerInterface::class);
+        }
+        $this->registerSecurityCsrfConfiguration($config['csrf_protection'], $container, $loader);
+
+        if ($this->isConfigEnabled($container, $config['form'])) {
+            if (!class_exists(\Symfony\Component\Form\Form::class)) {
+                throw new LogicException('Form support cannot be enabled as the Form component is not installed. Try running "composer require symfony/form".');
+            }
+
+            $this->formConfigEnabled = true;
+            $this->registerFormConfiguration($config, $container, $loader);
+
+            if (class_exists(\Symfony\Component\Validator\Validation::class)) {
+                $config['validation']['enabled'] = true;
+            } else {
+                $container->setParameter('validator.translation_domain', 'validators');
+
+                $container->removeDefinition('form.type_extension.form.validator');
+                $container->removeDefinition('form.type_guesser.validator');
+            }
+        } else {
+            $container->removeDefinition('console.command.form_debug');
+        }
+
+        if ($this->isConfigEnabled($container, $config['assets'])) {
+            if (!class_exists(\Symfony\Component\Asset\Package::class)) {
+                throw new LogicException('Asset support cannot be enabled as the Asset component is not installed. Try running "composer require symfony/asset".');
+            }
+
+            $this->registerAssetsConfiguration($config['assets'], $container, $loader);
+        }
+
+        if ($this->isConfigEnabled($container, $config['templating'])) {
+            @trigger_error('Enabling the Templating component is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+            if (!class_exists(\Symfony\Component\Templating\PhpEngine::class)) {
+                throw new LogicException('Templating support cannot be enabled as the Templating component is not installed. Try running "composer require symfony/templating".');
+            }
+
+            $this->registerTemplatingConfiguration($config['templating'], $container, $loader);
+        }
+
+        if ($this->messengerConfigEnabled = $this->isConfigEnabled($container, $config['messenger'])) {
+            $this->registerMessengerConfiguration($config['messenger'], $container, $loader, $config['validation']);
+        } else {
+            $container->removeDefinition('console.command.messenger_consume_messages');
+            $container->removeDefinition('console.command.messenger_debug');
+            $container->removeDefinition('console.command.messenger_stop_workers');
+            $container->removeDefinition('console.command.messenger_setup_transports');
+            $container->removeDefinition('console.command.messenger_failed_messages_retry');
+            $container->removeDefinition('console.command.messenger_failed_messages_show');
+            $container->removeDefinition('console.command.messenger_failed_messages_remove');
+            $container->removeDefinition('cache.messenger.restart_workers_signal');
+
+            if ($container->hasDefinition('messenger.transport.amqp.factory') && class_exists(AmqpTransportFactory::class)) {
+                $container->getDefinition('messenger.transport.amqp.factory')
+                    ->addTag('messenger.transport_factory');
+            }
+
+            if ($container->hasDefinition('messenger.transport.redis.factory') && class_exists(RedisTransportFactory::class)) {
+                $container->getDefinition('messenger.transport.redis.factory')
+                    ->addTag('messenger.transport_factory');
+            }
+        }
+
+        if ($this->httpClientConfigEnabled = $this->isConfigEnabled($container, $config['http_client'])) {
+            $this->registerHttpClientConfiguration($config['http_client'], $container, $loader, $config['profiler']);
+        }
+
+        if ($this->mailerConfigEnabled = $this->isConfigEnabled($container, $config['mailer'])) {
+            $this->registerMailerConfiguration($config['mailer'], $container, $loader);
+        }
+
+        $propertyInfoEnabled = $this->isConfigEnabled($container, $config['property_info']);
+        $this->registerValidationConfiguration($config['validation'], $container, $loader, $propertyInfoEnabled);
+        $this->registerEsiConfiguration($config['esi'], $container, $loader);
+        $this->registerSsiConfiguration($config['ssi'], $container, $loader);
+        $this->registerFragmentsConfiguration($config['fragments'], $container, $loader);
+        $this->registerTranslatorConfiguration($config['translator'], $container, $loader, $config['default_locale']);
+        $this->registerProfilerConfiguration($config['profiler'], $container, $loader);
+        $this->registerWorkflowConfiguration($config['workflows'], $container, $loader);
+        $this->registerDebugConfiguration($config['php_errors'], $container, $loader);
+        $this->registerRouterConfiguration($config['router'], $container, $loader);
+        $this->registerAnnotationsConfiguration($config['annotations'], $container, $loader);
+        $this->registerPropertyAccessConfiguration($config['property_access'], $container, $loader);
+        $this->registerSecretsConfiguration($config['secrets'], $container, $loader);
+
+        if ($this->isConfigEnabled($container, $config['serializer'])) {
+            if (!class_exists(\Symfony\Component\Serializer\Serializer::class)) {
+                throw new LogicException('Serializer support cannot be enabled as the Serializer component is not installed. Try running "composer require symfony/serializer-pack".');
+            }
+
+            $this->registerSerializerConfiguration($config['serializer'], $container, $loader);
+        }
+
+        if ($propertyInfoEnabled) {
+            $this->registerPropertyInfoConfiguration($container, $loader);
+        }
+
+        if ($this->isConfigEnabled($container, $config['lock'])) {
+            $this->registerLockConfiguration($config['lock'], $container, $loader);
+        }
+
+        if ($this->isConfigEnabled($container, $config['web_link'])) {
+            if (!class_exists(HttpHeaderSerializer::class)) {
+                throw new LogicException('WebLink support cannot be enabled as the WebLink component is not installed. Try running "composer require symfony/weblink".');
+            }
+
+            $loader->load('web_link.xml');
+        }
+
+        $this->addAnnotatedClassesToCompile([
+            '**\\Controller\\',
+            '**\\Entity\\',
+
+            // Added explicitly so that we don't rely on the class map being dumped to make it work
+            'Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController',
+        ]);
+
+        if (class_exists(MimeTypes::class)) {
+            $loader->load('mime_type.xml');
+        }
+
+        $container->registerForAutoconfiguration(Command::class)
+            ->addTag('console.command');
+        $container->registerForAutoconfiguration(ResourceCheckerInterface::class)
+            ->addTag('config_cache.resource_checker');
+        $container->registerForAutoconfiguration(EnvVarLoaderInterface::class)
+            ->addTag('container.env_var_loader');
+        $container->registerForAutoconfiguration(EnvVarProcessorInterface::class)
+            ->addTag('container.env_var_processor');
+        $container->registerForAutoconfiguration(ServiceLocator::class)
+            ->addTag('container.service_locator');
+        $container->registerForAutoconfiguration(ServiceSubscriberInterface::class)
+            ->addTag('container.service_subscriber');
+        $container->registerForAutoconfiguration(ArgumentValueResolverInterface::class)
+            ->addTag('controller.argument_value_resolver');
+        $container->registerForAutoconfiguration(AbstractController::class)
+            ->addTag('controller.service_arguments');
+        $container->registerForAutoconfiguration('Symfony\Bundle\FrameworkBundle\Controller\Controller')
+            ->addTag('controller.service_arguments');
+        $container->registerForAutoconfiguration(DataCollectorInterface::class)
+            ->addTag('data_collector');
+        $container->registerForAutoconfiguration(FormTypeInterface::class)
+            ->addTag('form.type');
+        $container->registerForAutoconfiguration(FormTypeGuesserInterface::class)
+            ->addTag('form.type_guesser');
+        $container->registerForAutoconfiguration(FormTypeExtensionInterface::class)
+            ->addTag('form.type_extension');
+        $container->registerForAutoconfiguration(CacheClearerInterface::class)
+            ->addTag('kernel.cache_clearer');
+        $container->registerForAutoconfiguration(CacheWarmerInterface::class)
+            ->addTag('kernel.cache_warmer');
+        $container->registerForAutoconfiguration(EventSubscriberInterface::class)
+            ->addTag('kernel.event_subscriber');
+        $container->registerForAutoconfiguration(LocaleAwareInterface::class)
+            ->addTag('kernel.locale_aware');
+        $container->registerForAutoconfiguration(ResetInterface::class)
+            ->addTag('kernel.reset', ['method' => 'reset']);
+
+        if (!interface_exists(MarshallerInterface::class)) {
+            $container->registerForAutoconfiguration(ResettableInterface::class)
+                ->addTag('kernel.reset', ['method' => 'reset']);
+        }
+
+        $container->registerForAutoconfiguration(PropertyListExtractorInterface::class)
+            ->addTag('property_info.list_extractor');
+        $container->registerForAutoconfiguration(PropertyTypeExtractorInterface::class)
+            ->addTag('property_info.type_extractor');
+        $container->registerForAutoconfiguration(PropertyDescriptionExtractorInterface::class)
+            ->addTag('property_info.description_extractor');
+        $container->registerForAutoconfiguration(PropertyAccessExtractorInterface::class)
+            ->addTag('property_info.access_extractor');
+        $container->registerForAutoconfiguration(PropertyInitializableExtractorInterface::class)
+            ->addTag('property_info.initializable_extractor');
+        $container->registerForAutoconfiguration(EncoderInterface::class)
+            ->addTag('serializer.encoder');
+        $container->registerForAutoconfiguration(DecoderInterface::class)
+            ->addTag('serializer.encoder');
+        $container->registerForAutoconfiguration(NormalizerInterface::class)
+            ->addTag('serializer.normalizer');
+        $container->registerForAutoconfiguration(DenormalizerInterface::class)
+            ->addTag('serializer.normalizer');
+        $container->registerForAutoconfiguration(ConstraintValidatorInterface::class)
+            ->addTag('validator.constraint_validator');
+        $container->registerForAutoconfiguration(ObjectInitializerInterface::class)
+            ->addTag('validator.initializer');
+        $container->registerForAutoconfiguration(MessageHandlerInterface::class)
+            ->addTag('messenger.message_handler');
+        $container->registerForAutoconfiguration(TransportFactoryInterface::class)
+            ->addTag('messenger.transport_factory');
+        $container->registerForAutoconfiguration(MimeTypeGuesserInterface::class)
+            ->addTag('mime.mime_type_guesser');
+        $container->registerForAutoconfiguration(LoggerAwareInterface::class)
+            ->addMethodCall('setLogger', [new Reference('logger')]);
+
+        if (!$container->getParameter('kernel.debug')) {
+            // remove tagged iterator argument for resource checkers
+            $container->getDefinition('config_cache_factory')->setArguments([]);
+        }
+
+        if (!$config['disallow_search_engine_index'] ?? false) {
+            $container->removeDefinition('disallow_search_engine_index_response_listener');
+        }
+
+        $container->registerForAutoconfiguration(RouteLoaderInterface::class)
+            ->addTag('routing.route_loader');
+
+        $container->setParameter('container.behavior_describing_tags', [
+            'annotations.cached_reader',
+            'container.do_not_inline',
+            'container.service_locator',
+            'container.service_subscriber',
+            'kernel.event_subscriber',
+            'kernel.locale_aware',
+            'kernel.reset',
+        ]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getConfiguration(array $config, ContainerBuilder $container)
+    {
+        return new Configuration($container->getParameter('kernel.debug'));
+    }
+
+    private function registerFormConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        $loader->load('form.xml');
+
+        if (null === $config['form']['csrf_protection']['enabled']) {
+            $config['form']['csrf_protection']['enabled'] = $config['csrf_protection']['enabled'];
+        }
+
+        if ($this->isConfigEnabled($container, $config['form']['csrf_protection'])) {
+            if (!$container->hasDefinition('security.csrf.token_generator')) {
+                throw new \LogicException('To use form CSRF protection, "framework.csrf_protection" must be enabled.');
+            }
+
+            $loader->load('form_csrf.xml');
+
+            $container->setParameter('form.type_extension.csrf.enabled', true);
+            $container->setParameter('form.type_extension.csrf.field_name', $config['form']['csrf_protection']['field_name']);
+        } else {
+            $container->setParameter('form.type_extension.csrf.enabled', false);
+        }
+
+        if (!class_exists(Translator::class)) {
+            $container->removeDefinition('form.type_extension.upload.validator');
+        }
+        if (!method_exists(CachingFactoryDecorator::class, 'reset')) {
+            $container->getDefinition('form.choice_list_factory.cached')
+                ->clearTag('kernel.reset')
+            ;
+        }
+    }
+
+    private function registerEsiConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!$this->isConfigEnabled($container, $config)) {
+            $container->removeDefinition('fragment.renderer.esi');
+
+            return;
+        }
+
+        $loader->load('esi.xml');
+    }
+
+    private function registerSsiConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!$this->isConfigEnabled($container, $config)) {
+            $container->removeDefinition('fragment.renderer.ssi');
+
+            return;
+        }
+
+        $loader->load('ssi.xml');
+    }
+
+    private function registerFragmentsConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!$this->isConfigEnabled($container, $config)) {
+            $container->removeDefinition('fragment.renderer.hinclude');
+
+            return;
+        }
+        if ($container->hasParameter('fragment.renderer.hinclude.global_template') && '' !== $container->getParameter('fragment.renderer.hinclude.global_template') && null !== $config['hinclude_default_template']) {
+            throw new \LogicException('You cannot set both "templating.hinclude_default_template" and "fragments.hinclude_default_template", please only use "fragments.hinclude_default_template".');
+        }
+
+        $container->setParameter('fragment.renderer.hinclude.global_template', $config['hinclude_default_template']);
+
+        $loader->load('fragment_listener.xml');
+        $container->setParameter('fragment.path', $config['path']);
+    }
+
+    private function registerProfilerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!$this->isConfigEnabled($container, $config)) {
+            // this is needed for the WebProfiler to work even if the profiler is disabled
+            $container->setParameter('data_collector.templates', []);
+
+            return;
+        }
+
+        $loader->load('profiling.xml');
+        $loader->load('collectors.xml');
+        $loader->load('cache_debug.xml');
+
+        if ($this->formConfigEnabled) {
+            $loader->load('form_debug.xml');
+        }
+
+        if ($this->validatorConfigEnabled) {
+            $loader->load('validator_debug.xml');
+        }
+
+        if ($this->translationConfigEnabled) {
+            $loader->load('translation_debug.xml');
+
+            $container->getDefinition('translator.data_collector')->setDecoratedService('translator');
+        }
+
+        if ($this->messengerConfigEnabled) {
+            $loader->load('messenger_debug.xml');
+        }
+
+        if ($this->mailerConfigEnabled) {
+            $loader->load('mailer_debug.xml');
+        }
+
+        if ($this->httpClientConfigEnabled) {
+            $loader->load('http_client_debug.xml');
+        }
+
+        $container->setParameter('profiler_listener.only_exceptions', $config['only_exceptions']);
+        $container->setParameter('profiler_listener.only_master_requests', $config['only_master_requests']);
+
+        // Choose storage class based on the DSN
+        [$class] = explode(':', $config['dsn'], 2);
+        if ('file' !== $class) {
+            throw new \LogicException(sprintf('Driver "%s" is not supported for the profiler.', $class));
+        }
+
+        $container->setParameter('profiler.storage.dsn', $config['dsn']);
+
+        $container->getDefinition('profiler')
+            ->addArgument($config['collect'])
+            ->addTag('kernel.reset', ['method' => 'reset']);
+    }
+
+    private function registerWorkflowConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!$config['enabled']) {
+            $container->removeDefinition('console.command.workflow_dump');
+
+            return;
+        }
+
+        if (!class_exists(Workflow\Workflow::class)) {
+            throw new LogicException('Workflow support cannot be enabled as the Workflow component is not installed. Try running "composer require symfony/workflow".');
+        }
+
+        $loader->load('workflow.xml');
+
+        $registryDefinition = $container->getDefinition('workflow.registry');
+
+        foreach ($config['workflows'] as $name => $workflow) {
+            $type = $workflow['type'];
+            $workflowId = sprintf('%s.%s', $type, $name);
+
+            // Process Metadata (workflow + places (transition is done in the "create transition" block))
+            $metadataStoreDefinition = new Definition(Workflow\Metadata\InMemoryMetadataStore::class, [[], [], null]);
+            if ($workflow['metadata']) {
+                $metadataStoreDefinition->replaceArgument(0, $workflow['metadata']);
+            }
+            $placesMetadata = [];
+            foreach ($workflow['places'] as $place) {
+                if ($place['metadata']) {
+                    $placesMetadata[$place['name']] = $place['metadata'];
+                }
+            }
+            if ($placesMetadata) {
+                $metadataStoreDefinition->replaceArgument(1, $placesMetadata);
+            }
+
+            // Create transitions
+            $transitions = [];
+            $guardsConfiguration = [];
+            $transitionsMetadataDefinition = new Definition(\SplObjectStorage::class);
+            // Global transition counter per workflow
+            $transitionCounter = 0;
+            foreach ($workflow['transitions'] as $transition) {
+                if ('workflow' === $type) {
+                    $transitionDefinition = new Definition(Workflow\Transition::class, [$transition['name'], $transition['from'], $transition['to']]);
+                    $transitionDefinition->setPublic(false);
+                    $transitionId = sprintf('%s.transition.%s', $workflowId, $transitionCounter++);
+                    $container->setDefinition($transitionId, $transitionDefinition);
+                    $transitions[] = new Reference($transitionId);
+                    if (isset($transition['guard'])) {
+                        $configuration = new Definition(Workflow\EventListener\GuardExpression::class);
+                        $configuration->addArgument(new Reference($transitionId));
+                        $configuration->addArgument($transition['guard']);
+                        $configuration->setPublic(false);
+                        $eventName = sprintf('workflow.%s.guard.%s', $name, $transition['name']);
+                        $guardsConfiguration[$eventName][] = $configuration;
+                    }
+                    if ($transition['metadata']) {
+                        $transitionsMetadataDefinition->addMethodCall('attach', [
+                            new Reference($transitionId),
+                            $transition['metadata'],
+                        ]);
+                    }
+                } elseif ('state_machine' === $type) {
+                    foreach ($transition['from'] as $from) {
+                        foreach ($transition['to'] as $to) {
+                            $transitionDefinition = new Definition(Workflow\Transition::class, [$transition['name'], $from, $to]);
+                            $transitionDefinition->setPublic(false);
+                            $transitionId = sprintf('%s.transition.%s', $workflowId, $transitionCounter++);
+                            $container->setDefinition($transitionId, $transitionDefinition);
+                            $transitions[] = new Reference($transitionId);
+                            if (isset($transition['guard'])) {
+                                $configuration = new Definition(Workflow\EventListener\GuardExpression::class);
+                                $configuration->addArgument(new Reference($transitionId));
+                                $configuration->addArgument($transition['guard']);
+                                $configuration->setPublic(false);
+                                $eventName = sprintf('workflow.%s.guard.%s', $name, $transition['name']);
+                                $guardsConfiguration[$eventName][] = $configuration;
+                            }
+                            if ($transition['metadata']) {
+                                $transitionsMetadataDefinition->addMethodCall('attach', [
+                                    new Reference($transitionId),
+                                    $transition['metadata'],
+                                ]);
+                            }
+                        }
+                    }
+                }
+            }
+            $metadataStoreDefinition->replaceArgument(2, $transitionsMetadataDefinition);
+
+            // Create places
+            $places = array_column($workflow['places'], 'name');
+            $initialMarking = $workflow['initial_marking'] ?? $workflow['initial_place'] ?? [];
+
+            // Create a Definition
+            $definitionDefinition = new Definition(Workflow\Definition::class);
+            $definitionDefinition->setPublic(false);
+            $definitionDefinition->addArgument($places);
+            $definitionDefinition->addArgument($transitions);
+            $definitionDefinition->addArgument($initialMarking);
+            $definitionDefinition->addArgument($metadataStoreDefinition);
+            $definitionDefinition->addTag('workflow.definition', [
+                'name' => $name,
+                'type' => $type,
+            ]);
+
+            // Create MarkingStore
+            if (isset($workflow['marking_store']['type'])) {
+                $markingStoreDefinition = new ChildDefinition('workflow.marking_store.'.$workflow['marking_store']['type']);
+                if ('method' === $workflow['marking_store']['type']) {
+                    $markingStoreDefinition->setArguments([
+                        'state_machine' === $type, // single state
+                        $workflow['marking_store']['property'] ?? 'marking',
+                    ]);
+                } else {
+                    foreach ($workflow['marking_store']['arguments'] as $argument) {
+                        $markingStoreDefinition->addArgument($argument);
+                    }
+                }
+            } elseif (isset($workflow['marking_store']['service'])) {
+                $markingStoreDefinition = new Reference($workflow['marking_store']['service']);
+            }
+
+            // Create Workflow
+            $workflowDefinition = new ChildDefinition(sprintf('%s.abstract', $type));
+            $workflowDefinition->replaceArgument(0, new Reference(sprintf('%s.definition', $workflowId)));
+            if (isset($markingStoreDefinition)) {
+                $workflowDefinition->replaceArgument(1, $markingStoreDefinition);
+            }
+            $workflowDefinition->replaceArgument(3, $name);
+
+            // Store to container
+            $container->setDefinition($workflowId, $workflowDefinition);
+            $container->setDefinition(sprintf('%s.definition', $workflowId), $definitionDefinition);
+            $container->registerAliasForArgument($workflowId, WorkflowInterface::class, $name.'.'.$type);
+
+            // Validate Workflow
+            $validator = null;
+            switch (true) {
+                case 'state_machine' === $workflow['type']:
+                    $validator = new Workflow\Validator\StateMachineValidator();
+                    break;
+                case 'single_state' === ($workflow['marking_store']['type'] ?? null):
+                    $validator = new Workflow\Validator\WorkflowValidator(true);
+                    break;
+                case 'multiple_state' === ($workflow['marking_store']['type'] ?? false):
+                    $validator = new Workflow\Validator\WorkflowValidator(false);
+                    break;
+            }
+
+            if ($validator) {
+                $trs = array_map(function (Reference $ref) use ($container): Workflow\Transition {
+                    return $container->get((string) $ref);
+                }, $transitions);
+                $realDefinition = new Workflow\Definition($places, $trs, $initialMarking);
+                $validator->validate($realDefinition, $name);
+            }
+
+            // Add workflow to Registry
+            if ($workflow['supports']) {
+                foreach ($workflow['supports'] as $supportedClassName) {
+                    $strategyDefinition = new Definition(Workflow\SupportStrategy\InstanceOfSupportStrategy::class, [$supportedClassName]);
+                    $strategyDefinition->setPublic(false);
+                    $registryDefinition->addMethodCall('addWorkflow', [new Reference($workflowId), $strategyDefinition]);
+                }
+            } elseif (isset($workflow['support_strategy'])) {
+                $registryDefinition->addMethodCall('addWorkflow', [new Reference($workflowId), new Reference($workflow['support_strategy'])]);
+            }
+
+            // Enable the AuditTrail
+            if ($workflow['audit_trail']['enabled']) {
+                $listener = new Definition(Workflow\EventListener\AuditTrailListener::class);
+                $listener->setPrivate(true);
+                $listener->addTag('monolog.logger', ['channel' => 'workflow']);
+                $listener->addTag('kernel.event_listener', ['event' => sprintf('workflow.%s.leave', $name), 'method' => 'onLeave']);
+                $listener->addTag('kernel.event_listener', ['event' => sprintf('workflow.%s.transition', $name), 'method' => 'onTransition']);
+                $listener->addTag('kernel.event_listener', ['event' => sprintf('workflow.%s.enter', $name), 'method' => 'onEnter']);
+                $listener->addArgument(new Reference('logger'));
+                $container->setDefinition(sprintf('%s.listener.audit_trail', $workflowId), $listener);
+            }
+
+            // Add Guard Listener
+            if ($guardsConfiguration) {
+                if (!class_exists(ExpressionLanguage::class)) {
+                    throw new LogicException('Cannot guard workflows as the ExpressionLanguage component is not installed. Try running "composer require symfony/expression-language".');
+                }
+
+                if (!class_exists(Security::class)) {
+                    throw new LogicException('Cannot guard workflows as the Security component is not installed. Try running "composer require symfony/security-core".');
+                }
+
+                $guard = new Definition(Workflow\EventListener\GuardListener::class);
+                $guard->setPrivate(true);
+
+                $guard->setArguments([
+                    $guardsConfiguration,
+                    new Reference('workflow.security.expression_language'),
+                    new Reference('security.token_storage'),
+                    new Reference('security.authorization_checker'),
+                    new Reference('security.authentication.trust_resolver'),
+                    new Reference('security.role_hierarchy'),
+                    new Reference('validator', ContainerInterface::NULL_ON_INVALID_REFERENCE),
+                ]);
+                foreach ($guardsConfiguration as $eventName => $config) {
+                    $guard->addTag('kernel.event_listener', ['event' => $eventName, 'method' => 'onTransition']);
+                }
+
+                $container->setDefinition(sprintf('%s.listener.guard', $workflowId), $guard);
+                $container->setParameter('workflow.has_guard_listeners', true);
+            }
+        }
+    }
+
+    private function registerDebugConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        $loader->load('debug_prod.xml');
+
+        if (class_exists(Stopwatch::class)) {
+            $container->register('debug.stopwatch', Stopwatch::class)
+                ->addArgument(true)
+                ->setPrivate(true)
+                ->addTag('kernel.reset', ['method' => 'reset']);
+            $container->setAlias(Stopwatch::class, new Alias('debug.stopwatch', false));
+        }
+
+        $debug = $container->getParameter('kernel.debug');
+
+        if ($debug) {
+            $container->setParameter('debug.container.dump', '%kernel.cache_dir%/%kernel.container_class%.xml');
+        }
+
+        if ($debug && class_exists(Stopwatch::class)) {
+            $loader->load('debug.xml');
+        }
+
+        $definition = $container->findDefinition('debug.debug_handlers_listener');
+
+        if (false === $config['log']) {
+            $definition->replaceArgument(1, null);
+        } elseif (true !== $config['log']) {
+            $definition->replaceArgument(2, $config['log']);
+        }
+
+        if (!$config['throw']) {
+            $container->setParameter('debug.error_handler.throw_at', 0);
+        }
+
+        if ($debug && class_exists(DebugProcessor::class)) {
+            $definition = new Definition(DebugProcessor::class);
+            $definition->setPublic(false);
+            $definition->addArgument(new Reference('request_stack'));
+            $container->setDefinition('debug.log_processor', $definition);
+        }
+    }
+
+    private function registerRouterConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!$this->isConfigEnabled($container, $config)) {
+            $container->removeDefinition('console.command.router_debug');
+            $container->removeDefinition('console.command.router_match');
+
+            return;
+        }
+
+        $loader->load('routing.xml');
+
+        if ($config['utf8']) {
+            $container->getDefinition('routing.loader')->replaceArgument(2, ['utf8' => true]);
+        }
+
+        $container->setParameter('router.resource', $config['resource']);
+        $container->setParameter('router.cache_class_prefix', $container->getParameter('kernel.container_class')); // deprecated
+        $router = $container->findDefinition('router.default');
+        $argument = $router->getArgument(2);
+        $argument['strict_requirements'] = $config['strict_requirements'];
+        if (isset($config['type'])) {
+            $argument['resource_type'] = $config['type'];
+        }
+        if (!class_exists(CompiledUrlMatcher::class)) {
+            $argument['matcher_class'] = $argument['matcher_base_class'] = $argument['matcher_base_class'] ?? RedirectableUrlMatcher::class;
+            $argument['matcher_dumper_class'] = PhpMatcherDumper::class;
+            $argument['generator_class'] = $argument['generator_base_class'] = $argument['generator_base_class'] ?? UrlGenerator::class;
+            $argument['generator_dumper_class'] = PhpGeneratorDumper::class;
+        }
+        $router->replaceArgument(2, $argument);
+
+        $container->setParameter('request_listener.http_port', $config['http_port']);
+        $container->setParameter('request_listener.https_port', $config['https_port']);
+
+        if (!$this->annotationsConfigEnabled) {
+            return;
+        }
+
+        $container->register('routing.loader.annotation', AnnotatedRouteControllerLoader::class)
+            ->setPublic(false)
+            ->addTag('routing.loader', ['priority' => -10])
+            ->addArgument(new Reference('annotation_reader'));
+
+        $container->register('routing.loader.annotation.directory', AnnotationDirectoryLoader::class)
+            ->setPublic(false)
+            ->addTag('routing.loader', ['priority' => -10])
+            ->setArguments([
+                new Reference('file_locator'),
+                new Reference('routing.loader.annotation'),
+            ]);
+
+        $container->register('routing.loader.annotation.file', AnnotationFileLoader::class)
+            ->setPublic(false)
+            ->addTag('routing.loader', ['priority' => -10])
+            ->setArguments([
+                new Reference('file_locator'),
+                new Reference('routing.loader.annotation'),
+            ]);
+    }
+
+    private function registerSessionConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        $loader->load('session.xml');
+
+        // session storage
+        $container->setAlias('session.storage', $config['storage_id'])->setPrivate(true);
+        $options = ['cache_limiter' => '0'];
+        foreach (['name', 'cookie_lifetime', 'cookie_path', 'cookie_domain', 'cookie_secure', 'cookie_httponly', 'cookie_samesite', 'use_cookies', 'gc_maxlifetime', 'gc_probability', 'gc_divisor', 'sid_length', 'sid_bits_per_character'] as $key) {
+            if (isset($config[$key])) {
+                $options[$key] = $config[$key];
+            }
+        }
+
+        if ('auto' === ($options['cookie_secure'] ?? null)) {
+            $locator = $container->getDefinition('session_listener')->getArgument(0);
+            $locator->setValues($locator->getValues() + [
+                'session_storage' => new Reference('session.storage', ContainerInterface::IGNORE_ON_INVALID_REFERENCE),
+                'request_stack' => new Reference('request_stack'),
+            ]);
+        }
+
+        $container->setParameter('session.storage.options', $options);
+
+        // session handler (the internal callback registered with PHP session management)
+        if (null === $config['handler_id']) {
+            // Set the handler class to be null
+            $container->getDefinition('session.storage.native')->replaceArgument(1, null);
+            $container->getDefinition('session.storage.php_bridge')->replaceArgument(0, null);
+            $container->setAlias('session.handler', 'session.handler.native_file')->setPrivate(true);
+        } else {
+            $container->resolveEnvPlaceholders($config['handler_id'], null, $usedEnvs);
+
+            if ($usedEnvs || preg_match('#^[a-z]++://#', $config['handler_id'])) {
+                $id = '.cache_connection.'.ContainerBuilder::hash($config['handler_id']);
+
+                $container->getDefinition('session.abstract_handler')
+                    ->replaceArgument(0, $container->hasDefinition($id) ? new Reference($id) : $config['handler_id']);
+
+                $container->setAlias('session.handler', 'session.abstract_handler')->setPrivate(true);
+            } else {
+                $container->setAlias('session.handler', $config['handler_id'])->setPrivate(true);
+            }
+        }
+
+        $container->setParameter('session.save_path', $config['save_path']);
+
+        $container->setParameter('session.metadata.update_threshold', $config['metadata_update_threshold']);
+    }
+
+    private function registerRequestConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if ($config['formats']) {
+            $loader->load('request.xml');
+
+            $listener = $container->getDefinition('request.add_request_formats_listener');
+            $listener->replaceArgument(0, $config['formats']);
+        }
+    }
+
+    private function registerTemplatingConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        $loader->load('templating.xml');
+
+        $container->setParameter('fragment.renderer.hinclude.global_template', $config['hinclude_default_template']);
+
+        if ($container->getParameter('kernel.debug')) {
+            $logger = new Reference('logger', ContainerInterface::IGNORE_ON_INVALID_REFERENCE);
+
+            $container->getDefinition('templating.loader.cache')
+                ->addTag('monolog.logger', ['channel' => 'templating'])
+                ->addMethodCall('setLogger', [$logger]);
+            $container->getDefinition('templating.loader.chain')
+                ->addTag('monolog.logger', ['channel' => 'templating'])
+                ->addMethodCall('setLogger', [$logger]);
+        }
+
+        if (!empty($config['loaders'])) {
+            $loaders = array_map(function ($loader) { return new Reference($loader); }, $config['loaders']);
+
+            // Use a delegation unless only a single loader was registered
+            if (1 === \count($loaders)) {
+                $container->setAlias('templating.loader', (string) reset($loaders))->setPrivate(true);
+            } else {
+                $container->getDefinition('templating.loader.chain')->addArgument($loaders);
+                $container->setAlias('templating.loader', 'templating.loader.chain')->setPrivate(true);
+            }
+        }
+
+        $container->setParameter('templating.loader.cache.path', null);
+        if (isset($config['cache'])) {
+            // Wrap the existing loader with cache (must happen after loaders are registered)
+            $container->setDefinition('templating.loader.wrapped', $container->findDefinition('templating.loader'));
+            $loaderCache = $container->getDefinition('templating.loader.cache');
+            $container->setParameter('templating.loader.cache.path', $config['cache']);
+
+            $container->setDefinition('templating.loader', $loaderCache);
+        }
+
+        $container->setParameter('templating.engines', $config['engines']);
+        $engines = array_map(function ($engine) { return new Reference('templating.engine.'.$engine); }, $config['engines']);
+
+        // Use a delegation unless only a single engine was registered
+        if (1 === \count($engines)) {
+            $container->setAlias('templating', (string) reset($engines))->setPublic(true);
+        } else {
+            $templateEngineDefinition = $container->getDefinition('templating.engine.delegating');
+            foreach ($engines as $engine) {
+                $templateEngineDefinition->addMethodCall('addEngine', [$engine]);
+            }
+            $container->setAlias('templating', 'templating.engine.delegating')->setPublic(true);
+        }
+
+        $container->getDefinition('fragment.renderer.hinclude')
+            ->addTag('kernel.fragment_renderer', ['alias' => 'hinclude'])
+            ->replaceArgument(0, new Reference('templating'))
+        ;
+
+        // configure the PHP engine if needed
+        if (\in_array('php', $config['engines'], true)) {
+            $loader->load('templating_php.xml');
+
+            $container->setParameter('templating.helper.form.resources', $config['form']['resources']);
+
+            if ($container->getParameter('kernel.debug') && class_exists(Stopwatch::class)) {
+                $loader->load('templating_debug.xml');
+
+                $container->setDefinition('templating.engine.php', $container->findDefinition('debug.templating.engine.php'));
+                $container->setAlias('debug.templating.engine.php', 'templating.engine.php')->setPrivate(true);
+            }
+
+            if ($container->has('assets.packages')) {
+                $container->getDefinition('templating.helper.assets')->replaceArgument(0, new Reference('assets.packages'));
+            } else {
+                $container->removeDefinition('templating.helper.assets');
+            }
+        }
+    }
+
+    private function registerAssetsConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        $loader->load('assets.xml');
+
+        if ($config['version_strategy']) {
+            $defaultVersion = new Reference($config['version_strategy']);
+        } else {
+            $defaultVersion = $this->createVersion($container, $config['version'], $config['version_format'], $config['json_manifest_path'], '_default');
+        }
+
+        $defaultPackage = $this->createPackageDefinition($config['base_path'], $config['base_urls'], $defaultVersion);
+        $container->setDefinition('assets._default_package', $defaultPackage);
+
+        $namedPackages = [];
+        foreach ($config['packages'] as $name => $package) {
+            if (null !== $package['version_strategy']) {
+                $version = new Reference($package['version_strategy']);
+            } elseif (!\array_key_exists('version', $package) && null === $package['json_manifest_path']) {
+                // if neither version nor json_manifest_path are specified, use the default
+                $version = $defaultVersion;
+            } else {
+                // let format fallback to main version_format
+                $format = $package['version_format'] ?: $config['version_format'];
+                $version = $package['version'] ?? null;
+                $version = $this->createVersion($container, $version, $format, $package['json_manifest_path'], $name);
+            }
+
+            $container->setDefinition('assets._package_'.$name, $this->createPackageDefinition($package['base_path'], $package['base_urls'], $version));
+            $container->registerAliasForArgument('assets._package_'.$name, PackageInterface::class, $name.'.package');
+            $namedPackages[$name] = new Reference('assets._package_'.$name);
+        }
+
+        $container->getDefinition('assets.packages')
+            ->replaceArgument(0, new Reference('assets._default_package'))
+            ->replaceArgument(1, $namedPackages)
+        ;
+    }
+
+    /**
+     * Returns a definition for an asset package.
+     */
+    private function createPackageDefinition(?string $basePath, array $baseUrls, Reference $version): Definition
+    {
+        if ($basePath && $baseUrls) {
+            throw new \LogicException('An asset package cannot have base URLs and base paths.');
+        }
+
+        $package = new ChildDefinition($baseUrls ? 'assets.url_package' : 'assets.path_package');
+        $package
+            ->setPublic(false)
+            ->replaceArgument(0, $baseUrls ?: $basePath)
+            ->replaceArgument(1, $version)
+        ;
+
+        return $package;
+    }
+
+    private function createVersion(ContainerBuilder $container, ?string $version, ?string $format, ?string $jsonManifestPath, string $name): Reference
+    {
+        // Configuration prevents $version and $jsonManifestPath from being set
+        if (null !== $version) {
+            $def = new ChildDefinition('assets.static_version_strategy');
+            $def
+                ->replaceArgument(0, $version)
+                ->replaceArgument(1, $format)
+            ;
+            $container->setDefinition('assets._version_'.$name, $def);
+
+            return new Reference('assets._version_'.$name);
+        }
+
+        if (null !== $jsonManifestPath) {
+            $def = new ChildDefinition('assets.json_manifest_version_strategy');
+            $def->replaceArgument(0, $jsonManifestPath);
+            $container->setDefinition('assets._version_'.$name, $def);
+
+            return new Reference('assets._version_'.$name);
+        }
+
+        return new Reference('assets.empty_version_strategy');
+    }
+
+    private function registerTranslatorConfiguration(array $config, ContainerBuilder $container, LoaderInterface $loader, string $defaultLocale)
+    {
+        if (!$this->isConfigEnabled($container, $config)) {
+            $container->removeDefinition('console.command.translation_debug');
+            $container->removeDefinition('console.command.translation_update');
+
+            return;
+        }
+
+        $loader->load('translation.xml');
+
+        // Use the "real" translator instead of the identity default
+        $container->setAlias('translator', 'translator.default')->setPublic(true);
+        $container->setAlias('translator.formatter', new Alias($config['formatter'], false));
+        $translator = $container->findDefinition('translator.default');
+        $translator->addMethodCall('setFallbackLocales', [$config['fallbacks'] ?: [$defaultLocale]]);
+
+        $defaultOptions = $translator->getArgument(4);
+        $defaultOptions['cache_dir'] = $config['cache_dir'];
+        $translator->setArgument(4, $defaultOptions);
+
+        $container->setParameter('translator.logging', $config['logging']);
+        $container->setParameter('translator.default_path', $config['default_path']);
+
+        // Discover translation directories
+        $dirs = [];
+        $transPaths = [];
+        $nonExistingDirs = [];
+        if (class_exists(\Symfony\Component\Validator\Validation::class)) {
+            $r = new \ReflectionClass(\Symfony\Component\Validator\Validation::class);
+
+            $dirs[] = $transPaths[] = \dirname($r->getFileName()).'/Resources/translations';
+        }
+        if (class_exists(\Symfony\Component\Form\Form::class)) {
+            $r = new \ReflectionClass(\Symfony\Component\Form\Form::class);
+
+            $dirs[] = $transPaths[] = \dirname($r->getFileName()).'/Resources/translations';
+        }
+        if (class_exists(\Symfony\Component\Security\Core\Exception\AuthenticationException::class)) {
+            $r = new \ReflectionClass(\Symfony\Component\Security\Core\Exception\AuthenticationException::class);
+
+            $dirs[] = $transPaths[] = \dirname($r->getFileName(), 2).'/Resources/translations';
+        }
+        $defaultDir = $container->getParameterBag()->resolveValue($config['default_path']);
+        $rootDir = $container->getParameter('kernel.root_dir');
+        foreach ($container->getParameter('kernel.bundles_metadata') as $name => $bundle) {
+            if ($container->fileExists($dir = $bundle['path'].'/Resources/translations') || $container->fileExists($dir = $bundle['path'].'/translations')) {
+                $dirs[] = $dir;
+            } else {
+                $nonExistingDirs[] = $dir;
+            }
+            if ($container->fileExists($dir = $rootDir.sprintf('/Resources/%s/translations', $name))) {
+                @trigger_error(sprintf('Translations directory "%s" is deprecated since Symfony 4.2, use "%s" instead.', $dir, $defaultDir), \E_USER_DEPRECATED);
+                $dirs[] = $dir;
+            } else {
+                $nonExistingDirs[] = $dir;
+            }
+        }
+
+        foreach ($config['paths'] as $dir) {
+            if ($container->fileExists($dir)) {
+                $dirs[] = $transPaths[] = $dir;
+            } else {
+                throw new \UnexpectedValueException(sprintf('"%s" defined in translator.paths does not exist or is not a directory.', $dir));
+            }
+        }
+
+        if ($container->hasDefinition('console.command.translation_debug')) {
+            $container->getDefinition('console.command.translation_debug')->replaceArgument(5, $transPaths);
+        }
+
+        if ($container->hasDefinition('console.command.translation_update')) {
+            $container->getDefinition('console.command.translation_update')->replaceArgument(6, $transPaths);
+        }
+
+        if (null === $defaultDir) {
+            // allow null
+        } elseif ($container->fileExists($defaultDir)) {
+            $dirs[] = $defaultDir;
+        } else {
+            $nonExistingDirs[] = $defaultDir;
+        }
+
+        if ($container->fileExists($dir = $rootDir.'/Resources/translations')) {
+            if ($dir !== $defaultDir) {
+                @trigger_error(sprintf('Translations directory "%s" is deprecated since Symfony 4.2, use "%s" instead.', $dir, $defaultDir), \E_USER_DEPRECATED);
+            }
+
+            $dirs[] = $dir;
+        } else {
+            $nonExistingDirs[] = $dir;
+        }
+
+        // Register translation resources
+        if ($dirs) {
+            $files = [];
+
+            foreach ($dirs as $dir) {
+                $finder = Finder::create()
+                    ->followLinks()
+                    ->files()
+                    ->filter(function (\SplFileInfo $file) {
+                        return 2 <= substr_count($file->getBasename(), '.') && preg_match('/\.\w+$/', $file->getBasename());
+                    })
+                    ->in($dir)
+                    ->sortByName()
+                ;
+                foreach ($finder as $file) {
+                    $fileNameParts = explode('.', basename($file));
+                    $locale = $fileNameParts[\count($fileNameParts) - 2];
+                    if (!isset($files[$locale])) {
+                        $files[$locale] = [];
+                    }
+
+                    $files[$locale][] = (string) $file;
+                }
+            }
+
+            $projectDir = $container->getParameter('kernel.project_dir');
+
+            $options = array_merge(
+                $translator->getArgument(4),
+                [
+                    'resource_files' => $files,
+                    'scanned_directories' => $scannedDirectories = array_merge($dirs, $nonExistingDirs),
+                    'cache_vary' => [
+                        'scanned_directories' => array_map(static function (string $dir) use ($projectDir): string {
+                            return str_starts_with($dir, $projectDir.'/') ? substr($dir, 1 + \strlen($projectDir)) : $dir;
+                        }, $scannedDirectories),
+                    ],
+                ]
+            );
+
+            $translator->replaceArgument(4, $options);
+        }
+    }
+
+    private function registerValidationConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader, bool $propertyInfoEnabled)
+    {
+        if (!$this->validatorConfigEnabled = $this->isConfigEnabled($container, $config)) {
+            return;
+        }
+
+        if (!class_exists(\Symfony\Component\Validator\Validation::class)) {
+            throw new LogicException('Validation support cannot be enabled as the Validator component is not installed. Try running "composer require symfony/validator".');
+        }
+
+        if (!isset($config['email_validation_mode'])) {
+            $config['email_validation_mode'] = 'loose';
+        }
+
+        $loader->load('validator.xml');
+
+        $validatorBuilder = $container->getDefinition('validator.builder');
+
+        if (interface_exists(TranslatorInterface::class) && class_exists(LegacyTranslatorProxy::class)) {
+            $calls = $validatorBuilder->getMethodCalls();
+            $calls[1] = ['setTranslator', [new Definition(LegacyTranslatorProxy::class, [new Reference('translator', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)])]];
+            $validatorBuilder->setMethodCalls($calls);
+        }
+
+        $container->setParameter('validator.translation_domain', $config['translation_domain']);
+
+        $files = ['xml' => [], 'yml' => []];
+        $this->registerValidatorMapping($container, $config, $files);
+
+        if (!empty($files['xml'])) {
+            $validatorBuilder->addMethodCall('addXmlMappings', [$files['xml']]);
+        }
+
+        if (!empty($files['yml'])) {
+            $validatorBuilder->addMethodCall('addYamlMappings', [$files['yml']]);
+        }
+
+        $definition = $container->findDefinition('validator.email');
+        $definition->replaceArgument(0, $config['email_validation_mode']);
+
+        if (\array_key_exists('enable_annotations', $config) && $config['enable_annotations']) {
+            if (!$this->annotationsConfigEnabled) {
+                throw new \LogicException('"enable_annotations" on the validator cannot be set as Annotations support is disabled.');
+            }
+
+            $validatorBuilder->addMethodCall('enableAnnotationMapping', [new Reference('annotation_reader')]);
+        }
+
+        if (\array_key_exists('static_method', $config) && $config['static_method']) {
+            foreach ($config['static_method'] as $methodName) {
+                $validatorBuilder->addMethodCall('addMethodMapping', [$methodName]);
+            }
+        }
+
+        if (!$container->getParameter('kernel.debug')) {
+            $validatorBuilder->addMethodCall('setMappingCache', [new Reference('validator.mapping.cache.adapter')]);
+        }
+
+        $container->setParameter('validator.auto_mapping', $config['auto_mapping']);
+        if (!$propertyInfoEnabled || !class_exists(PropertyInfoLoader::class)) {
+            $container->removeDefinition('validator.property_info_loader');
+        }
+
+        $container
+            ->getDefinition('validator.not_compromised_password')
+            ->setArgument(2, $config['not_compromised_password']['enabled'])
+            ->setArgument(3, $config['not_compromised_password']['endpoint'])
+        ;
+    }
+
+    private function registerValidatorMapping(ContainerBuilder $container, array $config, array &$files)
+    {
+        $fileRecorder = function ($extension, $path) use (&$files) {
+            $files['yaml' === $extension ? 'yml' : $extension][] = $path;
+        };
+
+        if (interface_exists(\Symfony\Component\Form\FormInterface::class)) {
+            $reflClass = new \ReflectionClass(\Symfony\Component\Form\FormInterface::class);
+            $fileRecorder('xml', \dirname($reflClass->getFileName()).'/Resources/config/validation.xml');
+        }
+
+        foreach ($container->getParameter('kernel.bundles_metadata') as $bundle) {
+            $configDir = is_dir($bundle['path'].'/Resources/config') ? $bundle['path'].'/Resources/config' : $bundle['path'].'/config';
+
+            if (
+                $container->fileExists($file = $configDir.'/validation.yaml', false) ||
+                $container->fileExists($file = $configDir.'/validation.yml', false)
+            ) {
+                $fileRecorder('yml', $file);
+            }
+
+            if ($container->fileExists($file = $configDir.'/validation.xml', false)) {
+                $fileRecorder('xml', $file);
+            }
+
+            if ($container->fileExists($dir = $configDir.'/validation', '/^$/')) {
+                $this->registerMappingFilesFromDir($dir, $fileRecorder);
+            }
+        }
+
+        $projectDir = $container->getParameter('kernel.project_dir');
+        if ($container->fileExists($dir = $projectDir.'/config/validator', '/^$/')) {
+            $this->registerMappingFilesFromDir($dir, $fileRecorder);
+        }
+
+        $this->registerMappingFilesFromConfig($container, $config, $fileRecorder);
+    }
+
+    private function registerMappingFilesFromDir(string $dir, callable $fileRecorder)
+    {
+        foreach (Finder::create()->followLinks()->files()->in($dir)->name('/\.(xml|ya?ml)$/')->sortByName() as $file) {
+            $fileRecorder($file->getExtension(), $file->getRealPath());
+        }
+    }
+
+    private function registerMappingFilesFromConfig(ContainerBuilder $container, array $config, callable $fileRecorder)
+    {
+        foreach ($config['mapping']['paths'] as $path) {
+            if (is_dir($path)) {
+                $this->registerMappingFilesFromDir($path, $fileRecorder);
+                $container->addResource(new DirectoryResource($path, '/^$/'));
+            } elseif ($container->fileExists($path, false)) {
+                if (!preg_match('/\.(xml|ya?ml)$/', $path, $matches)) {
+                    throw new \RuntimeException(sprintf('Unsupported mapping type in "%s", supported types are XML & Yaml.', $path));
+                }
+                $fileRecorder($matches[1], $path);
+            } else {
+                throw new \RuntimeException(sprintf('Could not open file or directory "%s".', $path));
+            }
+        }
+    }
+
+    private function registerAnnotationsConfiguration(array $config, ContainerBuilder $container, LoaderInterface $loader)
+    {
+        if (!$this->annotationsConfigEnabled) {
+            return;
+        }
+
+        if (!class_exists(\Doctrine\Common\Annotations\Annotation::class)) {
+            throw new LogicException('Annotations cannot be enabled as the Doctrine Annotation library is not installed.');
+        }
+
+        $loader->load('annotations.xml');
+
+        if (!method_exists(AnnotationRegistry::class, 'registerUniqueLoader')) {
+            $container->getDefinition('annotations.dummy_registry')
+                ->setMethodCalls([['registerLoader', ['class_exists']]]);
+        }
+
+        if ('none' !== $config['cache']) {
+            if (class_exists(PsrCachedReader::class)) {
+                $container
+                    ->getDefinition('annotations.cached_reader')
+                    ->setClass(PsrCachedReader::class)
+                    ->replaceArgument(1, new Definition(ArrayAdapter::class))
+                ;
+            } elseif (!class_exists(\Doctrine\Common\Cache\CacheProvider::class)) {
+                throw new LogicException('Annotations cannot be enabled as the Doctrine Cache library is not installed.');
+            }
+
+            $cacheService = $config['cache'];
+
+            if ('php_array' === $config['cache']) {
+                $cacheService = class_exists(PsrCachedReader::class) ? 'annotations.cache_adapter' : 'annotations.cache';
+
+                // Enable warmer only if PHP array is used for cache
+                $definition = $container->findDefinition('annotations.cache_warmer');
+                $definition->addTag('kernel.cache_warmer');
+            } elseif ('file' === $config['cache']) {
+                $cacheDir = $container->getParameterBag()->resolveValue($config['file_cache_dir']);
+
+                if (!is_dir($cacheDir) && false === @mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) {
+                    throw new \RuntimeException(sprintf('Could not create cache directory "%s".', $cacheDir));
+                }
+
+                $container
+                    ->getDefinition('annotations.filesystem_cache_adapter')
+                    ->replaceArgument(2, $cacheDir)
+                ;
+
+                $cacheService = class_exists(PsrCachedReader::class) ? 'annotations.filesystem_cache_adapter' : 'annotations.filesystem_cache';
+            }
+
+            $container
+                ->getDefinition('annotations.cached_reader')
+                ->replaceArgument(2, $config['debug'])
+                // reference the cache provider without using it until AddAnnotationsCachedReaderPass runs
+                ->addArgument(new ServiceClosureArgument(new Reference($cacheService)))
+            ;
+
+            $container->setAlias('annotation_reader', 'annotations.cached_reader')->setPrivate(true);
+            $container->setAlias(Reader::class, new Alias('annotations.cached_reader', false));
+        } else {
+            $container->removeDefinition('annotations.cached_reader');
+        }
+    }
+
+    private function registerPropertyAccessConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!class_exists(PropertyAccessor::class)) {
+            return;
+        }
+
+        $loader->load('property_access.xml');
+
+        $container
+            ->getDefinition('property_accessor')
+            ->replaceArgument(0, $config['magic_call'])
+            ->replaceArgument(1, $config['throw_exception_on_invalid_index'])
+            ->replaceArgument(3, $config['throw_exception_on_invalid_property_path'])
+        ;
+    }
+
+    private function registerSecretsConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!$this->isConfigEnabled($container, $config)) {
+            $container->removeDefinition('console.command.secrets_set');
+            $container->removeDefinition('console.command.secrets_list');
+            $container->removeDefinition('console.command.secrets_remove');
+            $container->removeDefinition('console.command.secrets_generate_key');
+            $container->removeDefinition('console.command.secrets_decrypt_to_local');
+            $container->removeDefinition('console.command.secrets_encrypt_from_local');
+
+            return;
+        }
+
+        $loader->load('secrets.xml');
+
+        $container->getDefinition('secrets.vault')->replaceArgument(0, $config['vault_directory']);
+
+        if ($config['local_dotenv_file']) {
+            $container->getDefinition('secrets.local_vault')->replaceArgument(0, $config['local_dotenv_file']);
+        } else {
+            $container->removeDefinition('secrets.local_vault');
+        }
+
+        if ($config['decryption_env_var']) {
+            if (!preg_match('/^(?:\w*+:)*+\w++$/', $config['decryption_env_var'])) {
+                throw new InvalidArgumentException(sprintf('Invalid value "%s" set as "decryption_env_var": only "word" characters are allowed.', $config['decryption_env_var']));
+            }
+
+            $container->getDefinition('secrets.vault')->replaceArgument(1, "%env({$config['decryption_env_var']})%");
+        } else {
+            $container->getDefinition('secrets.vault')->replaceArgument(1, null);
+        }
+    }
+
+    private function registerSecurityCsrfConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!$this->isConfigEnabled($container, $config)) {
+            return;
+        }
+
+        if (!class_exists(\Symfony\Component\Security\Csrf\CsrfToken::class)) {
+            throw new LogicException('CSRF support cannot be enabled as the Security CSRF component is not installed. Try running "composer require symfony/security-csrf".');
+        }
+
+        if (!$this->sessionConfigEnabled) {
+            throw new \LogicException('CSRF protection needs sessions to be enabled.');
+        }
+
+        // Enable services for CSRF protection (even without forms)
+        $loader->load('security_csrf.xml');
+
+        if (!class_exists(CsrfExtension::class)) {
+            $container->removeDefinition('twig.extension.security_csrf');
+        }
+    }
+
+    private function registerSerializerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        $loader->load('serializer.xml');
+
+        if (!class_exists(ConstraintViolationListNormalizer::class)) {
+            $container->removeDefinition('serializer.normalizer.constraint_violation_list');
+        }
+
+        if (!class_exists(ClassDiscriminatorFromClassMetadata::class)) {
+            $container->removeAlias('Symfony\Component\Serializer\Mapping\ClassDiscriminatorResolverInterface');
+            $container->removeDefinition('serializer.mapping.class_discriminator_resolver');
+        }
+
+        $chainLoader = $container->getDefinition('serializer.mapping.chain_loader');
+
+        if (!class_exists(PropertyAccessor::class)) {
+            $container->removeAlias('serializer.property_accessor');
+            $container->removeDefinition('serializer.normalizer.object');
+        }
+
+        if (!class_exists(Yaml::class)) {
+            $container->removeDefinition('serializer.encoder.yaml');
+        }
+
+        $serializerLoaders = [];
+        if (isset($config['enable_annotations']) && $config['enable_annotations']) {
+            if (!$this->annotationsConfigEnabled) {
+                throw new \LogicException('"enable_annotations" on the serializer cannot be set as Annotations support is disabled.');
+            }
+
+            $annotationLoader = new Definition(
+                'Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader',
+                [new Reference('annotation_reader')]
+            );
+            $annotationLoader->setPublic(false);
+
+            $serializerLoaders[] = $annotationLoader;
+        }
+
+        $fileRecorder = function ($extension, $path) use (&$serializerLoaders) {
+            $definition = new Definition(\in_array($extension, ['yaml', 'yml']) ? 'Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader' : 'Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', [$path]);
+            $definition->setPublic(false);
+            $serializerLoaders[] = $definition;
+        };
+
+        foreach ($container->getParameter('kernel.bundles_metadata') as $bundle) {
+            $configDir = is_dir($bundle['path'].'/Resources/config') ? $bundle['path'].'/Resources/config' : $bundle['path'].'/config';
+
+            if ($container->fileExists($file = $configDir.'/serialization.xml', false)) {
+                $fileRecorder('xml', $file);
+            }
+
+            if (
+                $container->fileExists($file = $configDir.'/serialization.yaml', false) ||
+                $container->fileExists($file = $configDir.'/serialization.yml', false)
+            ) {
+                $fileRecorder('yml', $file);
+            }
+
+            if ($container->fileExists($dir = $configDir.'/serialization', '/^$/')) {
+                $this->registerMappingFilesFromDir($dir, $fileRecorder);
+            }
+        }
+
+        $projectDir = $container->getParameter('kernel.project_dir');
+        if ($container->fileExists($dir = $projectDir.'/config/serializer', '/^$/')) {
+            $this->registerMappingFilesFromDir($dir, $fileRecorder);
+        }
+
+        $this->registerMappingFilesFromConfig($container, $config, $fileRecorder);
+
+        $chainLoader->replaceArgument(0, $serializerLoaders);
+        $container->getDefinition('serializer.mapping.cache_warmer')->replaceArgument(0, $serializerLoaders);
+
+        if ($container->getParameter('kernel.debug')) {
+            $container->removeDefinition('serializer.mapping.cache_class_metadata_factory');
+        }
+
+        if (isset($config['name_converter']) && $config['name_converter']) {
+            $container->getDefinition('serializer.name_converter.metadata_aware')->setArgument(1, new Reference($config['name_converter']));
+        }
+
+        if (isset($config['circular_reference_handler']) && $config['circular_reference_handler']) {
+            $arguments = $container->getDefinition('serializer.normalizer.object')->getArguments();
+            $context = ($arguments[6] ?? []) + ['circular_reference_handler' => new Reference($config['circular_reference_handler'])];
+            $container->getDefinition('serializer.normalizer.object')->setArgument(5, null);
+            $container->getDefinition('serializer.normalizer.object')->setArgument(6, $context);
+        }
+
+        if ($config['max_depth_handler'] ?? false) {
+            $defaultContext = $container->getDefinition('serializer.normalizer.object')->getArgument(6);
+            $defaultContext += ['max_depth_handler' => new Reference($config['max_depth_handler'])];
+            $container->getDefinition('serializer.normalizer.object')->replaceArgument(6, $defaultContext);
+        }
+    }
+
+    private function registerPropertyInfoConfiguration(ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!interface_exists(PropertyInfoExtractorInterface::class)) {
+            throw new LogicException('PropertyInfo support cannot be enabled as the PropertyInfo component is not installed. Try running "composer require symfony/property-info".');
+        }
+
+        $loader->load('property_info.xml');
+
+        if (interface_exists(\phpDocumentor\Reflection\DocBlockFactoryInterface::class)) {
+            $definition = $container->register('property_info.php_doc_extractor', 'Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor');
+            $definition->setPrivate(true);
+            $definition->addTag('property_info.description_extractor', ['priority' => -1000]);
+            $definition->addTag('property_info.type_extractor', ['priority' => -1001]);
+        }
+
+        if ($container->getParameter('kernel.debug')) {
+            $container->removeDefinition('property_info.cache');
+        }
+    }
+
+    private function registerLockConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        $loader->load('lock.xml');
+
+        foreach ($config['resources'] as $resourceName => $resourceStores) {
+            if (0 === \count($resourceStores)) {
+                continue;
+            }
+
+            // Generate stores
+            $storeDefinitions = [];
+            foreach ($resourceStores as $resourceStore) {
+                $storeDsn = $container->resolveEnvPlaceholders($resourceStore, null, $usedEnvs);
+                $storeDefinition = new Definition(interface_exists(StoreInterface::class) ? StoreInterface::class : PersistingStoreInterface::class);
+                $storeDefinition->setFactory([StoreFactory::class, 'createStore']);
+                $storeDefinition->setArguments([$resourceStore]);
+
+                $container->setDefinition($storeDefinitionId = '.lock.'.$resourceName.'.store.'.$container->hash($storeDsn), $storeDefinition);
+
+                $storeDefinition = new Reference($storeDefinitionId);
+
+                $storeDefinitions[] = $storeDefinition;
+            }
+
+            // Wrap array of stores with CombinedStore
+            if (\count($storeDefinitions) > 1) {
+                $combinedDefinition = new ChildDefinition('lock.store.combined.abstract');
+                $combinedDefinition->replaceArgument(0, $storeDefinitions);
+                $container->setDefinition('lock.'.$resourceName.'.store', $combinedDefinition);
+            } else {
+                $container->setAlias('lock.'.$resourceName.'.store', new Alias((string) $storeDefinitions[0], false));
+            }
+
+            // Generate factories for each resource
+            $factoryDefinition = new ChildDefinition('lock.factory.abstract');
+            $factoryDefinition->replaceArgument(0, new Reference('lock.'.$resourceName.'.store'));
+            $container->setDefinition('lock.'.$resourceName.'.factory', $factoryDefinition);
+
+            // Generate services for lock instances
+            $lockDefinition = new Definition(Lock::class);
+            $lockDefinition->setPublic(false);
+            $lockDefinition->setFactory([new Reference('lock.'.$resourceName.'.factory'), 'createLock']);
+            $lockDefinition->setArguments([$resourceName]);
+            $container->setDefinition('lock.'.$resourceName, $lockDefinition);
+
+            // provide alias for default resource
+            if ('default' === $resourceName) {
+                $container->setAlias('lock.store', new Alias('lock.'.$resourceName.'.store', false));
+                $container->setAlias('lock.factory', new Alias('lock.'.$resourceName.'.factory', false));
+                $container->setAlias('lock', new Alias('lock.'.$resourceName, false));
+                $container->setAlias(StoreInterface::class, new Alias('lock.store', false));
+                $container->setAlias(PersistingStoreInterface::class, new Alias('lock.store', false));
+                $container->setAlias(Factory::class, new Alias('lock.factory', false));
+                $container->setAlias(LockFactory::class, new Alias('lock.factory', false));
+                $container->setAlias(LockInterface::class, new Alias('lock', false));
+            } else {
+                $container->registerAliasForArgument('lock.'.$resourceName.'.store', StoreInterface::class, $resourceName.'.lock.store');
+                $container->registerAliasForArgument('lock.'.$resourceName.'.store', PersistingStoreInterface::class, $resourceName.'.lock.store');
+                $container->registerAliasForArgument('lock.'.$resourceName.'.factory', Factory::class, $resourceName.'.lock.factory');
+                $container->registerAliasForArgument('lock.'.$resourceName.'.factory', LockFactory::class, $resourceName.'.lock.factory');
+                $container->registerAliasForArgument('lock.'.$resourceName, LockInterface::class, $resourceName.'.lock');
+            }
+        }
+    }
+
+    private function registerMessengerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader, array $validationConfig)
+    {
+        if (!interface_exists(MessageBusInterface::class)) {
+            throw new LogicException('Messenger support cannot be enabled as the Messenger component is not installed. Try running "composer require symfony/messenger".');
+        }
+
+        $loader->load('messenger.xml');
+
+        if (class_exists(AmqpTransportFactory::class)) {
+            $container->getDefinition('messenger.transport.amqp.factory')->addTag('messenger.transport_factory');
+        }
+
+        if (class_exists(RedisTransportFactory::class)) {
+            $container->getDefinition('messenger.transport.redis.factory')->addTag('messenger.transport_factory');
+        }
+
+        if (null === $config['default_bus'] && 1 === \count($config['buses'])) {
+            $config['default_bus'] = key($config['buses']);
+        }
+
+        $defaultMiddleware = [
+            'before' => [
+                ['id' => 'add_bus_name_stamp_middleware'],
+                ['id' => 'reject_redelivered_message_middleware'],
+                ['id' => 'dispatch_after_current_bus'],
+                ['id' => 'failed_message_processing_middleware'],
+            ],
+            'after' => [
+                ['id' => 'send_message'],
+                ['id' => 'handle_message'],
+            ],
+        ];
+        foreach ($config['buses'] as $busId => $bus) {
+            $middleware = $bus['middleware'];
+
+            if ($bus['default_middleware']) {
+                if ('allow_no_handlers' === $bus['default_middleware']) {
+                    $defaultMiddleware['after'][1]['arguments'] = [true];
+                } else {
+                    unset($defaultMiddleware['after'][1]['arguments']);
+                }
+
+                // argument to add_bus_name_stamp_middleware
+                $defaultMiddleware['before'][0]['arguments'] = [$busId];
+
+                $middleware = array_merge($defaultMiddleware['before'], $middleware, $defaultMiddleware['after']);
+            }
+
+            foreach ($middleware as $middlewareItem) {
+                if (!$validationConfig['enabled'] && \in_array($middlewareItem['id'], ['validation', 'messenger.middleware.validation'], true)) {
+                    throw new LogicException('The Validation middleware is only available when the Validator component is installed and enabled. Try running "composer require symfony/validator".');
+                }
+            }
+
+            if ($container->getParameter('kernel.debug') && class_exists(Stopwatch::class)) {
+                array_unshift($middleware, ['id' => 'traceable', 'arguments' => [$busId]]);
+            }
+
+            $container->setParameter($busId.'.middleware', $middleware);
+            $container->register($busId, MessageBus::class)->addArgument([])->addTag('messenger.bus');
+
+            if ($busId === $config['default_bus']) {
+                $container->setAlias('message_bus', $busId)->setPublic(true)->setDeprecated(true, 'The "%alias_id%" service is deprecated, use the "messenger.default_bus" service instead.');
+                $container->setAlias('messenger.default_bus', $busId)->setPublic(true);
+                $container->setAlias(MessageBusInterface::class, $busId);
+            } else {
+                $container->registerAliasForArgument($busId, MessageBusInterface::class);
+            }
+        }
+
+        if (empty($config['transports'])) {
+            $container->removeDefinition('messenger.transport.symfony_serializer');
+            $container->removeDefinition('messenger.transport.amqp.factory');
+            $container->removeDefinition('messenger.transport.redis.factory');
+        } else {
+            $container->getDefinition('messenger.transport.symfony_serializer')
+                ->replaceArgument(1, $config['serializer']['symfony_serializer']['format'])
+                ->replaceArgument(2, $config['serializer']['symfony_serializer']['context']);
+            $container->setAlias('messenger.default_serializer', $config['serializer']['default_serializer']);
+        }
+
+        $senderAliases = [];
+        $transportRetryReferences = [];
+        foreach ($config['transports'] as $name => $transport) {
+            $serializerId = $transport['serializer'] ?? 'messenger.default_serializer';
+
+            $transportDefinition = (new Definition(TransportInterface::class))
+                ->setFactory([new Reference('messenger.transport_factory'), 'createTransport'])
+                ->setArguments([$transport['dsn'], $transport['options'] + ['transport_name' => $name], new Reference($serializerId)])
+                ->addTag('messenger.receiver', ['alias' => $name])
+            ;
+            $container->setDefinition($transportId = 'messenger.transport.'.$name, $transportDefinition);
+            $senderAliases[$name] = $transportId;
+
+            if (null !== $transport['retry_strategy']['service']) {
+                $transportRetryReferences[$name] = new Reference($transport['retry_strategy']['service']);
+            } else {
+                $retryServiceId = sprintf('messenger.retry.multiplier_retry_strategy.%s', $name);
+                $retryDefinition = new ChildDefinition('messenger.retry.abstract_multiplier_retry_strategy');
+                $retryDefinition
+                    ->replaceArgument(0, $transport['retry_strategy']['max_retries'])
+                    ->replaceArgument(1, $transport['retry_strategy']['delay'])
+                    ->replaceArgument(2, $transport['retry_strategy']['multiplier'])
+                    ->replaceArgument(3, $transport['retry_strategy']['max_delay']);
+                $container->setDefinition($retryServiceId, $retryDefinition);
+
+                $transportRetryReferences[$name] = new Reference($retryServiceId);
+            }
+        }
+
+        $senderReferences = [];
+        // alias => service_id
+        foreach ($senderAliases as $alias => $serviceId) {
+            $senderReferences[$alias] = new Reference($serviceId);
+        }
+        // service_id => service_id
+        foreach ($senderAliases as $serviceId) {
+            $senderReferences[$serviceId] = new Reference($serviceId);
+        }
+
+        $messageToSendersMapping = [];
+        foreach ($config['routing'] as $message => $messageConfiguration) {
+            if ('*' !== $message && !class_exists($message) && !interface_exists($message, false)) {
+                throw new LogicException(sprintf('Invalid Messenger routing configuration: class or interface "%s" not found.', $message));
+            }
+
+            // make sure senderAliases contains all senders
+            foreach ($messageConfiguration['senders'] as $sender) {
+                if (!isset($senderReferences[$sender])) {
+                    throw new LogicException(sprintf('Invalid Messenger routing configuration: the "%s" class is being routed to a sender called "%s". This is not a valid transport or service id.', $message, $sender));
+                }
+            }
+
+            $messageToSendersMapping[$message] = $messageConfiguration['senders'];
+        }
+
+        $sendersServiceLocator = ServiceLocatorTagPass::register($container, $senderReferences);
+
+        $container->getDefinition('messenger.senders_locator')
+            ->replaceArgument(0, $messageToSendersMapping)
+            ->replaceArgument(1, $sendersServiceLocator)
+        ;
+
+        $container->getDefinition('messenger.retry.send_failed_message_for_retry_listener')
+            ->replaceArgument(0, $sendersServiceLocator)
+        ;
+
+        $container->getDefinition('messenger.retry_strategy_locator')
+            ->replaceArgument(0, $transportRetryReferences);
+
+        if ($config['failure_transport']) {
+            if (!isset($senderReferences[$config['failure_transport']])) {
+                throw new LogicException(sprintf('Invalid Messenger configuration: the failure transport "%s" is not a valid transport or service id.', $config['failure_transport']));
+            }
+
+            $container->getDefinition('messenger.failure.send_failed_message_to_failure_transport_listener')
+                ->replaceArgument(0, $senderReferences[$config['failure_transport']]);
+            $container->getDefinition('console.command.messenger_failed_messages_retry')
+                ->replaceArgument(0, $config['failure_transport']);
+            $container->getDefinition('console.command.messenger_failed_messages_show')
+                ->replaceArgument(0, $config['failure_transport']);
+            $container->getDefinition('console.command.messenger_failed_messages_remove')
+                ->replaceArgument(0, $config['failure_transport']);
+        } else {
+            $container->removeDefinition('messenger.failure.send_failed_message_to_failure_transport_listener');
+            $container->removeDefinition('console.command.messenger_failed_messages_retry');
+            $container->removeDefinition('console.command.messenger_failed_messages_show');
+            $container->removeDefinition('console.command.messenger_failed_messages_remove');
+        }
+    }
+
+    private function registerCacheConfiguration(array $config, ContainerBuilder $container)
+    {
+        if (!class_exists(DefaultMarshaller::class)) {
+            $container->removeDefinition('cache.default_marshaller');
+        }
+
+        $version = new Parameter('container.build_id');
+        $container->getDefinition('cache.adapter.apcu')->replaceArgument(2, $version);
+        $container->getDefinition('cache.adapter.system')->replaceArgument(2, $version);
+        $container->getDefinition('cache.adapter.filesystem')->replaceArgument(2, $config['directory']);
+
+        if (isset($config['prefix_seed'])) {
+            $container->setParameter('cache.prefix.seed', $config['prefix_seed']);
+        }
+        if ($container->hasParameter('cache.prefix.seed')) {
+            // Inline any env vars referenced in the parameter
+            $container->setParameter('cache.prefix.seed', $container->resolveEnvPlaceholders($container->getParameter('cache.prefix.seed'), true));
+        }
+        foreach (['doctrine', 'psr6', 'redis', 'memcached', 'pdo'] as $name) {
+            if (isset($config[$name = 'default_'.$name.'_provider'])) {
+                $container->setAlias('cache.'.$name, new Alias(CachePoolPass::getServiceProvider($container, $config[$name]), false));
+            }
+        }
+        foreach (['app', 'system'] as $name) {
+            $config['pools']['cache.'.$name] = [
+                'adapters' => [$config[$name]],
+                'public' => true,
+                'tags' => false,
+            ];
+        }
+        foreach ($config['pools'] as $name => $pool) {
+            $pool['adapters'] = $pool['adapters'] ?: ['cache.app'];
+
+            foreach ($pool['adapters'] as $provider => $adapter) {
+                if ($config['pools'][$adapter]['tags'] ?? false) {
+                    $pool['adapters'][$provider] = $adapter = '.'.$adapter.'.inner';
+                }
+            }
+
+            if (1 === \count($pool['adapters'])) {
+                if (!isset($pool['provider']) && !\is_int($provider)) {
+                    $pool['provider'] = $provider;
+                }
+                $definition = new ChildDefinition($adapter);
+            } else {
+                $definition = new Definition(ChainAdapter::class, [$pool['adapters'], 0]);
+                $pool['reset'] = 'reset';
+            }
+
+            if ($pool['tags']) {
+                if (true !== $pool['tags'] && ($config['pools'][$pool['tags']]['tags'] ?? false)) {
+                    $pool['tags'] = '.'.$pool['tags'].'.inner';
+                }
+                $container->register($name, TagAwareAdapter::class)
+                    ->addArgument(new Reference('.'.$name.'.inner'))
+                    ->addArgument(true !== $pool['tags'] ? new Reference($pool['tags']) : null)
+                    ->setPublic($pool['public'])
+                ;
+
+                if (method_exists(TagAwareAdapter::class, 'setLogger')) {
+                    $container
+                        ->getDefinition($name)
+                        ->addMethodCall('setLogger', [new Reference('logger', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)])
+                        ->addTag('monolog.logger', ['channel' => 'cache']);
+                }
+
+                $pool['name'] = $name;
+                $pool['public'] = false;
+                $name = '.'.$name.'.inner';
+
+                if (!\in_array($pool['name'], ['cache.app', 'cache.system'], true)) {
+                    $container->registerAliasForArgument($pool['name'], TagAwareCacheInterface::class);
+                    $container->registerAliasForArgument($name, CacheInterface::class, $pool['name']);
+                    $container->registerAliasForArgument($name, CacheItemPoolInterface::class, $pool['name']);
+                }
+            } elseif (!\in_array($name, ['cache.app', 'cache.system'], true)) {
+                $container->register('.'.$name.'.taggable', TagAwareAdapter::class)
+                    ->addArgument(new Reference($name))
+                ;
+                $container->registerAliasForArgument('.'.$name.'.taggable', TagAwareCacheInterface::class, $name);
+                $container->registerAliasForArgument($name, CacheInterface::class);
+                $container->registerAliasForArgument($name, CacheItemPoolInterface::class);
+            }
+
+            $definition->setPublic($pool['public']);
+            unset($pool['adapters'], $pool['public'], $pool['tags']);
+
+            $definition->addTag('cache.pool', $pool);
+            $container->setDefinition($name, $definition);
+        }
+
+        if (method_exists(PropertyAccessor::class, 'createCache')) {
+            $propertyAccessDefinition = $container->register('cache.property_access', AdapterInterface::class);
+            $propertyAccessDefinition->setPublic(false);
+
+            if (!$container->getParameter('kernel.debug')) {
+                $propertyAccessDefinition->setFactory([PropertyAccessor::class, 'createCache']);
+                $propertyAccessDefinition->setArguments(['', 0, $version, new Reference('logger', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)]);
+                $propertyAccessDefinition->addTag('cache.pool', ['clearer' => 'cache.system_clearer']);
+                $propertyAccessDefinition->addTag('monolog.logger', ['channel' => 'cache']);
+            } else {
+                $propertyAccessDefinition->setClass(ArrayAdapter::class);
+                $propertyAccessDefinition->setArguments([0, false]);
+            }
+        }
+    }
+
+    private function registerHttpClientConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader, array $profilerConfig)
+    {
+        $loader->load('http_client.xml');
+
+        $container->getDefinition('http_client')->setArguments([$config['default_options'] ?? [], $config['max_host_connections'] ?? 6]);
+
+        if (!$hasPsr18 = interface_exists(ClientInterface::class)) {
+            $container->removeDefinition('psr18.http_client');
+            $container->removeAlias(ClientInterface::class);
+        }
+
+        if (!interface_exists(HttpClient::class)) {
+            $container->removeDefinition(HttpClient::class);
+        }
+
+        $httpClientId = $this->isConfigEnabled($container, $profilerConfig) ? '.debug.http_client.inner' : 'http_client';
+
+        foreach ($config['scoped_clients'] as $name => $scopeConfig) {
+            if ('http_client' === $name) {
+                throw new InvalidArgumentException(sprintf('Invalid scope name: "%s" is reserved.', $name));
+            }
+
+            $scope = $scopeConfig['scope'] ?? null;
+            unset($scopeConfig['scope']);
+
+            if (null === $scope) {
+                $baseUri = $scopeConfig['base_uri'];
+                unset($scopeConfig['base_uri']);
+
+                $container->register($name, ScopingHttpClient::class)
+                    ->setFactory([ScopingHttpClient::class, 'forBaseUri'])
+                    ->setArguments([new Reference($httpClientId), $baseUri, $scopeConfig])
+                    ->addTag('http_client.client')
+                ;
+            } else {
+                $container->register($name, ScopingHttpClient::class)
+                    ->setArguments([new Reference($httpClientId), [$scope => $scopeConfig], $scope])
+                    ->addTag('http_client.client')
+                ;
+            }
+
+            $container->registerAliasForArgument($name, HttpClientInterface::class);
+
+            if ($hasPsr18) {
+                $container->setDefinition('psr18.'.$name, new ChildDefinition('psr18.http_client'))
+                    ->replaceArgument(0, new Reference($name));
+
+                $container->registerAliasForArgument('psr18.'.$name, ClientInterface::class, $name);
+            }
+        }
+    }
+
+    private function registerMailerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
+    {
+        if (!class_exists(Mailer::class)) {
+            throw new LogicException('Mailer support cannot be enabled as the component is not installed. Try running "composer require symfony/mailer".');
+        }
+
+        $loader->load('mailer.xml');
+        $loader->load('mailer_transports.xml');
+        if (!\count($config['transports']) && null === $config['dsn']) {
+            $config['dsn'] = 'smtp://null';
+        }
+        $transports = $config['dsn'] ? ['main' => $config['dsn']] : $config['transports'];
+        $container->getDefinition('mailer.transports')->setArgument(0, $transports);
+        $container->getDefinition('mailer.default_transport')->setArgument(0, current($transports));
+
+        $classToServices = [
+            SesTransportFactory::class => 'mailer.transport_factory.amazon',
+            GmailTransportFactory::class => 'mailer.transport_factory.gmail',
+            MandrillTransportFactory::class => 'mailer.transport_factory.mailchimp',
+            MailgunTransportFactory::class => 'mailer.transport_factory.mailgun',
+            PostmarkTransportFactory::class => 'mailer.transport_factory.postmark',
+            SendgridTransportFactory::class => 'mailer.transport_factory.sendgrid',
+        ];
+
+        foreach ($classToServices as $class => $service) {
+            if (!class_exists($class)) {
+                $container->removeDefinition($service);
+            }
+        }
+
+        $recipients = $config['envelope']['recipients'] ?? null;
+        $sender = $config['envelope']['sender'] ?? null;
+
+        $envelopeListener = $container->getDefinition('mailer.envelope_listener');
+        $envelopeListener->setArgument(0, $sender);
+        $envelopeListener->setArgument(1, $recipients);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getXsdValidationBasePath()
+    {
+        return \dirname(__DIR__).'/Resources/config/schema';
+    }
+
+    public function getNamespace()
+    {
+        return 'http://symfony.com/schema/dic/symfony';
+    }
+}
diff --git a/vendor/symfony/framework-bundle/EventListener/ResolveControllerNameSubscriber.php b/vendor/symfony/framework-bundle/EventListener/ResolveControllerNameSubscriber.php
new file mode 100644
index 0000000000000000000000000000000000000000..ef146419013bc15165f9bf7e4edf4fdfcf6c4067
--- /dev/null
+++ b/vendor/symfony/framework-bundle/EventListener/ResolveControllerNameSubscriber.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\EventListener;
+
+use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\RequestEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Guarantees that the _controller key is parsed into its final format.
+ *
+ * @author Ryan Weaver <ryan@knpuniversity.com>
+ *
+ * @method onKernelRequest(RequestEvent $event)
+ *
+ * @deprecated since Symfony 4.1
+ */
+class ResolveControllerNameSubscriber implements EventSubscriberInterface
+{
+    private $parser;
+
+    public function __construct(ControllerNameParser $parser, bool $triggerDeprecation = true)
+    {
+        if ($triggerDeprecation) {
+            @trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.1.', __CLASS__), \E_USER_DEPRECATED);
+        }
+
+        $this->parser = $parser;
+    }
+
+    /**
+     * @internal
+     */
+    public function resolveControllerName(...$args)
+    {
+        $this->onKernelRequest(...$args);
+    }
+
+    public function __call(string $method, array $args)
+    {
+        if ('onKernelRequest' !== $method && 'onkernelrequest' !== strtolower($method)) {
+            throw new \Error(sprintf('Error: Call to undefined method "%s::%s()".', static::class, $method));
+        }
+
+        $event = $args[0];
+
+        $controller = $event->getRequest()->attributes->get('_controller');
+        if (\is_string($controller) && !str_contains($controller, '::') && 2 === substr_count($controller, ':')) {
+            // controller in the a:b:c notation then
+            $event->getRequest()->attributes->set('_controller', $parsedNotation = $this->parser->parse($controller, false));
+
+            @trigger_error(sprintf('Referencing controllers with %s is deprecated since Symfony 4.1, use "%s" instead.', $controller, $parsedNotation), \E_USER_DEPRECATED);
+        }
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return [
+            KernelEvents::REQUEST => ['resolveControllerName', 24],
+        ];
+    }
+}
diff --git a/vendor/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.php b/vendor/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.php
new file mode 100644
index 0000000000000000000000000000000000000000..231329c0bf07c6438d7369ff3a8b475932323e35
--- /dev/null
+++ b/vendor/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\EventListener;
+
+use Symfony\Component\Console\ConsoleEvents;
+use Symfony\Component\Console\Event\ConsoleErrorEvent;
+use Symfony\Component\Console\Exception\CommandNotFoundException;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Suggests a package, that should be installed (via composer),
+ * if the package is missing, and the input command namespace can be mapped to a Symfony bundle.
+ *
+ * @author Przemysław Bogusz <przemyslaw.bogusz@tubotax.pl>
+ *
+ * @internal
+ */
+final class SuggestMissingPackageSubscriber implements EventSubscriberInterface
+{
+    private const PACKAGES = [
+        'doctrine' => [
+            'fixtures' => ['DoctrineFixturesBundle', 'doctrine/doctrine-fixtures-bundle --dev'],
+            'mongodb' => ['DoctrineMongoDBBundle', 'doctrine/mongodb-odm-bundle'],
+            '_default' => ['Doctrine ORM', 'symfony/orm-pack'],
+        ],
+        'generate' => [
+            '_default' => ['SensioGeneratorBundle', 'sensio/generator-bundle'],
+        ],
+        'make' => [
+            '_default' => ['MakerBundle', 'symfony/maker-bundle --dev'],
+        ],
+        'server' => [
+            'dump' => ['Debug Bundle', 'symfony/debug-bundle --dev'],
+            '_default' => ['WebServerBundle', 'symfony/web-server-bundle --dev'],
+        ],
+    ];
+
+    public function onConsoleError(ConsoleErrorEvent $event): void
+    {
+        if (!$event->getError() instanceof CommandNotFoundException) {
+            return;
+        }
+
+        [$namespace, $command] = explode(':', $event->getInput()->getFirstArgument()) + [1 => ''];
+
+        if (!isset(self::PACKAGES[$namespace])) {
+            return;
+        }
+
+        if (isset(self::PACKAGES[$namespace][$command])) {
+            $suggestion = self::PACKAGES[$namespace][$command];
+            $exact = true;
+        } else {
+            $suggestion = self::PACKAGES[$namespace]['_default'];
+            $exact = false;
+        }
+
+        $error = $event->getError();
+
+        if ($error->getAlternatives() && !$exact) {
+            return;
+        }
+
+        $message = sprintf("%s\n\nYou may be looking for a command provided by the \"%s\" which is currently not installed. Try running \"composer require %s\".", $error->getMessage(), $suggestion[0], $suggestion[1]);
+        $event->setError(new CommandNotFoundException($message));
+    }
+
+    public static function getSubscribedEvents(): array
+    {
+        return [
+            ConsoleEvents::ERROR => ['onConsoleError', 0],
+        ];
+    }
+}
diff --git a/vendor/symfony/framework-bundle/FrameworkBundle.php b/vendor/symfony/framework-bundle/FrameworkBundle.php
new file mode 100644
index 0000000000000000000000000000000000000000..f5c52cf19749d7c40614e7e19b4b46b9e8a96108
--- /dev/null
+++ b/vendor/symfony/framework-bundle/FrameworkBundle.php
@@ -0,0 +1,177 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle;
+
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddAnnotationsCachedReaderPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddDebugLogProcessorPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddExpressionLanguageProvidersPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ContainerBuilderDebugDumpPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\DataCollectorTranslatorPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\LoggingTranslatorPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ProfilerPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\SessionPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TemplatingPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TestServiceContainerRealRefPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TestServiceContainerWeakRefPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\UnusedTagsPass;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\WorkflowGuardListenerPass;
+use Symfony\Component\Cache\Adapter\ApcuAdapter;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\Adapter\ChainAdapter;
+use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
+use Symfony\Component\Cache\Adapter\PhpFilesAdapter;
+use Symfony\Component\Cache\DependencyInjection\CacheCollectorPass;
+use Symfony\Component\Cache\DependencyInjection\CachePoolClearerPass;
+use Symfony\Component\Cache\DependencyInjection\CachePoolPass;
+use Symfony\Component\Cache\DependencyInjection\CachePoolPrunerPass;
+use Symfony\Component\Config\Resource\ClassExistenceResource;
+use Symfony\Component\Console\DependencyInjection\AddConsoleCommandPass;
+use Symfony\Component\Debug\ErrorHandler as LegacyErrorHandler;
+use Symfony\Component\DependencyInjection\Compiler\PassConfig;
+use Symfony\Component\DependencyInjection\Compiler\RegisterReverseContainerPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Dotenv\Dotenv;
+use Symfony\Component\ErrorHandler\ErrorHandler;
+use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
+use Symfony\Component\Form\DependencyInjection\FormPass;
+use Symfony\Component\HttpClient\DependencyInjection\HttpClientPass;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+use Symfony\Component\HttpKernel\DependencyInjection\ControllerArgumentValueResolverPass;
+use Symfony\Component\HttpKernel\DependencyInjection\FragmentRendererPass;
+use Symfony\Component\HttpKernel\DependencyInjection\LoggerPass;
+use Symfony\Component\HttpKernel\DependencyInjection\RegisterControllerArgumentLocatorsPass;
+use Symfony\Component\HttpKernel\DependencyInjection\RegisterLocaleAwareServicesPass;
+use Symfony\Component\HttpKernel\DependencyInjection\RemoveEmptyControllerArgumentLocatorsPass;
+use Symfony\Component\HttpKernel\DependencyInjection\ResettableServicePass;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\Messenger\DependencyInjection\MessengerPass;
+use Symfony\Component\Mime\DependencyInjection\AddMimeTypeGuesserPass;
+use Symfony\Component\PropertyInfo\DependencyInjection\PropertyInfoPass;
+use Symfony\Component\Routing\DependencyInjection\RoutingResolverPass;
+use Symfony\Component\Serializer\DependencyInjection\SerializerPass;
+use Symfony\Component\Translation\DependencyInjection\TranslationDumperPass;
+use Symfony\Component\Translation\DependencyInjection\TranslationExtractorPass;
+use Symfony\Component\Translation\DependencyInjection\TranslatorPass;
+use Symfony\Component\Translation\DependencyInjection\TranslatorPathsPass;
+use Symfony\Component\Validator\DependencyInjection\AddAutoMappingConfigurationPass;
+use Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass;
+use Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass;
+use Symfony\Component\VarExporter\Internal\Hydrator;
+use Symfony\Component\VarExporter\Internal\Registry;
+
+// Help opcache.preload discover always-needed symbols
+class_exists(ApcuAdapter::class);
+class_exists(ArrayAdapter::class);
+class_exists(ChainAdapter::class);
+class_exists(PhpArrayAdapter::class);
+class_exists(PhpFilesAdapter::class);
+class_exists(Dotenv::class);
+class_exists(ErrorHandler::class);
+class_exists(Hydrator::class);
+class_exists(Registry::class);
+
+/**
+ * Bundle.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FrameworkBundle extends Bundle
+{
+    public function boot()
+    {
+        ErrorHandler::register(null, false)->throwAt($this->container->getParameter('debug.error_handler.throw_at'), true);
+        if (class_exists(LegacyErrorHandler::class, false)) {
+            LegacyErrorHandler::register(null, false)->throwAt($this->container->getParameter('debug.error_handler.throw_at'), true);
+        }
+
+        if ($this->container->getParameter('kernel.http_method_override')) {
+            Request::enableHttpMethodParameterOverride();
+        }
+
+        if ($trustedHosts = $this->container->getParameter('kernel.trusted_hosts')) {
+            Request::setTrustedHosts($trustedHosts);
+        }
+    }
+
+    public function build(ContainerBuilder $container)
+    {
+        parent::build($container);
+
+        $hotPathEvents = [
+            KernelEvents::REQUEST,
+            KernelEvents::CONTROLLER,
+            KernelEvents::CONTROLLER_ARGUMENTS,
+            KernelEvents::RESPONSE,
+            KernelEvents::FINISH_REQUEST,
+        ];
+
+        $container->addCompilerPass(new LoggerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -32);
+        $container->addCompilerPass(new RegisterControllerArgumentLocatorsPass());
+        $container->addCompilerPass(new RemoveEmptyControllerArgumentLocatorsPass(), PassConfig::TYPE_BEFORE_REMOVING);
+        $container->addCompilerPass(new RoutingResolverPass());
+        $container->addCompilerPass(new DataCollectorTranslatorPass());
+        $container->addCompilerPass(new ProfilerPass());
+        // must be registered before removing private services as some might be listeners/subscribers
+        // but as late as possible to get resolved parameters
+        $container->addCompilerPass((new RegisterListenersPass())->setHotPathEvents($hotPathEvents), PassConfig::TYPE_BEFORE_REMOVING);
+        $container->addCompilerPass(new TemplatingPass());
+        $this->addCompilerPassIfExists($container, AddConstraintValidatorsPass::class);
+        $container->addCompilerPass(new AddAnnotationsCachedReaderPass(), PassConfig::TYPE_AFTER_REMOVING, -255);
+        $this->addCompilerPassIfExists($container, AddValidatorInitializersPass::class);
+        $this->addCompilerPassIfExists($container, AddConsoleCommandPass::class, PassConfig::TYPE_BEFORE_REMOVING);
+        // must be registered as late as possible to get access to all Twig paths registered in
+        // twig.template_iterator definition
+        $this->addCompilerPassIfExists($container, TranslatorPass::class, PassConfig::TYPE_BEFORE_OPTIMIZATION, -32);
+        $this->addCompilerPassIfExists($container, TranslatorPathsPass::class, PassConfig::TYPE_AFTER_REMOVING);
+        $container->addCompilerPass(new LoggingTranslatorPass());
+        $container->addCompilerPass(new AddExpressionLanguageProvidersPass(false));
+        $this->addCompilerPassIfExists($container, TranslationExtractorPass::class);
+        $this->addCompilerPassIfExists($container, TranslationDumperPass::class);
+        $container->addCompilerPass(new FragmentRendererPass());
+        $this->addCompilerPassIfExists($container, SerializerPass::class);
+        $this->addCompilerPassIfExists($container, PropertyInfoPass::class);
+        $container->addCompilerPass(new ControllerArgumentValueResolverPass());
+        $container->addCompilerPass(new CachePoolPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 32);
+        $container->addCompilerPass(new CachePoolClearerPass(), PassConfig::TYPE_AFTER_REMOVING);
+        $container->addCompilerPass(new CachePoolPrunerPass(), PassConfig::TYPE_AFTER_REMOVING);
+        $this->addCompilerPassIfExists($container, FormPass::class);
+        $container->addCompilerPass(new WorkflowGuardListenerPass());
+        $container->addCompilerPass(new ResettableServicePass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -32);
+        $container->addCompilerPass(new RegisterLocaleAwareServicesPass());
+        $container->addCompilerPass(new TestServiceContainerWeakRefPass(), PassConfig::TYPE_BEFORE_REMOVING, -32);
+        $container->addCompilerPass(new TestServiceContainerRealRefPass(), PassConfig::TYPE_AFTER_REMOVING);
+        $this->addCompilerPassIfExists($container, AddMimeTypeGuesserPass::class);
+        $this->addCompilerPassIfExists($container, MessengerPass::class);
+        $this->addCompilerPassIfExists($container, HttpClientPass::class);
+        $this->addCompilerPassIfExists($container, AddAutoMappingConfigurationPass::class);
+        $container->addCompilerPass(new RegisterReverseContainerPass(true));
+        $container->addCompilerPass(new RegisterReverseContainerPass(false), PassConfig::TYPE_AFTER_REMOVING);
+        $container->addCompilerPass(new SessionPass());
+
+        if ($container->getParameter('kernel.debug')) {
+            $container->addCompilerPass(new AddDebugLogProcessorPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 2);
+            $container->addCompilerPass(new UnusedTagsPass(), PassConfig::TYPE_AFTER_REMOVING);
+            $container->addCompilerPass(new ContainerBuilderDebugDumpPass(), PassConfig::TYPE_BEFORE_REMOVING, -255);
+            $container->addCompilerPass(new CacheCollectorPass(), PassConfig::TYPE_BEFORE_REMOVING);
+        }
+    }
+
+    private function addCompilerPassIfExists(ContainerBuilder $container, string $class, string $type = PassConfig::TYPE_BEFORE_OPTIMIZATION, int $priority = 0)
+    {
+        $container->addResource(new ClassExistenceResource($class));
+
+        if (class_exists($class)) {
+            $container->addCompilerPass(new $class(), $type, $priority);
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/HttpCache/HttpCache.php b/vendor/symfony/framework-bundle/HttpCache/HttpCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..03cd73b4f8994d8b54f29bda5746c4293552beab
--- /dev/null
+++ b/vendor/symfony/framework-bundle/HttpCache/HttpCache.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\HttpCache;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpCache\Esi;
+use Symfony\Component\HttpKernel\HttpCache\HttpCache as BaseHttpCache;
+use Symfony\Component\HttpKernel\HttpCache\Store;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * Manages HTTP cache objects in a Container.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class HttpCache extends BaseHttpCache
+{
+    protected $cacheDir;
+    protected $kernel;
+
+    /**
+     * @param string $cacheDir The cache directory (default used if null)
+     */
+    public function __construct(KernelInterface $kernel, string $cacheDir = null)
+    {
+        $this->kernel = $kernel;
+        $this->cacheDir = $cacheDir;
+
+        $isDebug = $kernel->isDebug();
+        $options = ['debug' => $isDebug];
+
+        if ($isDebug) {
+            $options['stale_if_error'] = 0;
+        }
+
+        parent::__construct($kernel, $this->createStore(), $this->createSurrogate(), array_merge($options, $this->getOptions()));
+    }
+
+    /**
+     * Forwards the Request to the backend and returns the Response.
+     *
+     * @param bool     $raw   Whether to catch exceptions or not
+     * @param Response $entry A Response instance (the stale entry if present, null otherwise)
+     *
+     * @return Response A Response instance
+     */
+    protected function forward(Request $request, $raw = false, Response $entry = null)
+    {
+        $this->getKernel()->boot();
+        $this->getKernel()->getContainer()->set('cache', $this);
+
+        return parent::forward($request, $raw, $entry);
+    }
+
+    /**
+     * Returns an array of options to customize the Cache configuration.
+     *
+     * @return array An array of options
+     */
+    protected function getOptions()
+    {
+        return [];
+    }
+
+    protected function createSurrogate()
+    {
+        return new Esi();
+    }
+
+    protected function createStore()
+    {
+        return new Store($this->cacheDir ?: $this->kernel->getCacheDir().'/http_cache');
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Kernel/MicroKernelTrait.php b/vendor/symfony/framework-bundle/Kernel/MicroKernelTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f4f3a7dec17b2eda9f47cf2a363f0154fcd2c2a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Kernel/MicroKernelTrait.php
@@ -0,0 +1,97 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Kernel;
+
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\Routing\RouteCollectionBuilder;
+
+/**
+ * A Kernel that provides configuration hooks.
+ *
+ * @author Ryan Weaver <ryan@knpuniversity.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+trait MicroKernelTrait
+{
+    /**
+     * Add or import routes into your application.
+     *
+     *     $routes->import('config/routing.yml');
+     *     $routes->add('/admin', 'App\Controller\AdminController::dashboard', 'admin_dashboard');
+     */
+    abstract protected function configureRoutes(RouteCollectionBuilder $routes);
+
+    /**
+     * Configures the container.
+     *
+     * You can register extensions:
+     *
+     *     $container->loadFromExtension('framework', [
+     *         'secret' => '%secret%'
+     *     ]);
+     *
+     * Or services:
+     *
+     *     $container->register('halloween', 'FooBundle\HalloweenProvider');
+     *
+     * Or parameters:
+     *
+     *     $container->setParameter('halloween', 'lot of fun');
+     */
+    abstract protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader);
+
+    /**
+     * {@inheritdoc}
+     */
+    public function registerContainerConfiguration(LoaderInterface $loader)
+    {
+        $loader->load(function (ContainerBuilder $container) use ($loader) {
+            $container->loadFromExtension('framework', [
+                'router' => [
+                    'resource' => 'kernel::loadRoutes',
+                    'type' => 'service',
+                ],
+            ]);
+
+            if (!$container->hasDefinition('kernel')) {
+                $container->register('kernel', static::class)
+                    ->setSynthetic(true)
+                    ->setPublic(true)
+                ;
+            }
+
+            $kernelDefinition = $container->getDefinition('kernel');
+            $kernelDefinition->addTag('routing.route_loader');
+
+            if ($this instanceof EventSubscriberInterface) {
+                $kernelDefinition->addTag('kernel.event_subscriber');
+            }
+
+            $this->configureContainer($container, $loader);
+
+            $container->addObjectResource($this);
+        });
+    }
+
+    /**
+     * @internal
+     */
+    public function loadRoutes(LoaderInterface $loader)
+    {
+        $routes = new RouteCollectionBuilder($loader);
+        $this->configureRoutes($routes);
+
+        return $routes->build();
+    }
+}
diff --git a/vendor/symfony/framework-bundle/KernelBrowser.php b/vendor/symfony/framework-bundle/KernelBrowser.php
new file mode 100644
index 0000000000000000000000000000000000000000..b05b60def12d1f75625dc8b0eed496bb32130c98
--- /dev/null
+++ b/vendor/symfony/framework-bundle/KernelBrowser.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle;
+
+/**
+ * Client simulates a browser and makes requests to a Kernel object.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class KernelBrowser extends Client
+{
+}
diff --git a/vendor/symfony/framework-bundle/LICENSE b/vendor/symfony/framework-bundle/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..88bf75bb4d6a2898be0558b61cfe48996d33ffbf
--- /dev/null
+++ b/vendor/symfony/framework-bundle/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2022 Fabien Potencier
+
+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/vendor/symfony/framework-bundle/README.md b/vendor/symfony/framework-bundle/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..76c7700fa03af957b42f82f02fed066f593fc851
--- /dev/null
+++ b/vendor/symfony/framework-bundle/README.md
@@ -0,0 +1,13 @@
+FrameworkBundle
+===============
+
+FrameworkBundle provides a tight integration between Symfony components and the
+Symfony full-stack framework.
+
+Resources
+---------
+
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+   [send Pull Requests](https://github.com/symfony/symfony/pulls)
+   in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/vendor/symfony/framework-bundle/Resources/bin/check-unused-known-tags.php b/vendor/symfony/framework-bundle/Resources/bin/check-unused-known-tags.php
new file mode 100644
index 0000000000000000000000000000000000000000..ec9ae1f97c0ff987e9ed9ecb05577876e70798ab
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/bin/check-unused-known-tags.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+require dirname(__DIR__, 6).'/vendor/autoload.php';
+
+use Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Compiler\UnusedTagsPassUtils;
+
+$target = dirname(__DIR__, 2).'/DependencyInjection/Compiler/UnusedTagsPass.php';
+$contents = file_get_contents($target);
+$contents = preg_replace('{private \$knownTags = \[(.+?)\];}sm', "private \$knownTags = [\n        '".implode("',\n        '", UnusedTagsPassUtils::getDefinedTags())."',\n    ];", $contents);
+file_put_contents($target, $contents);
diff --git a/vendor/symfony/framework-bundle/Resources/config/annotations.xml b/vendor/symfony/framework-bundle/Resources/config/annotations.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1fb375ea3c472fb5e097c5a5148bd875066a93c9
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/annotations.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="annotations.reader" class="Doctrine\Common\Annotations\AnnotationReader">
+            <call method="addGlobalIgnoredName">
+                <argument>required</argument>
+                <!-- dummy arg to register class_exists as annotation loader only when required -->
+                <argument type="service" id="annotations.dummy_registry" />
+            </call>
+        </service>
+
+        <service id="annotations.dummy_registry" class="Doctrine\Common\Annotations\AnnotationRegistry">
+            <call method="registerUniqueLoader">
+                <argument>class_exists</argument>
+            </call>
+        </service>
+
+        <service id="annotations.cached_reader" class="Doctrine\Common\Annotations\CachedReader">
+            <argument type="service" id="annotations.reader" />
+            <argument type="service">
+                <service class="Symfony\Component\Cache\DoctrineProvider">
+                    <argument type="service">
+                        <service class="Symfony\Component\Cache\Adapter\ArrayAdapter" />
+                    </argument>
+                </service>
+            </argument>
+            <argument /><!-- Debug-Flag -->
+            <tag name="annotations.cached_reader" />
+            <tag name="container.do_not_inline" />
+        </service>
+
+        <service id="annotations.filesystem_cache_adapter" class="Symfony\Component\Cache\Adapter\FilesystemAdapter">
+            <argument />
+            <argument>0</argument>
+            <argument /><!-- Cache-Directory -->
+        </service>
+
+        <service id="annotations.filesystem_cache" class="Symfony\Component\Cache\DoctrineProvider">
+            <argument type="service" id="annotations.filesystem_cache_adapter" />
+        </service>
+
+        <service id="annotations.cache_warmer" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\AnnotationsCacheWarmer">
+            <argument type="service" id="annotations.reader" />
+            <argument>%kernel.cache_dir%/annotations.php</argument>
+            <argument>#^Symfony\\(?:Component\\HttpKernel\\|Bundle\\FrameworkBundle\\Controller\\(?!.*Controller$))#</argument>
+            <argument>%kernel.debug%</argument>
+        </service>
+
+        <service id="annotations.cache_adapter" class="Symfony\Component\Cache\Adapter\PhpArrayAdapter">
+            <factory class="Symfony\Component\Cache\Adapter\PhpArrayAdapter" method="create" />
+            <argument>%kernel.cache_dir%/annotations.php</argument>
+            <argument type="service" id="cache.annotations" />
+            <tag name="container.hot_path" />
+        </service>
+
+        <service id="annotations.cache" class="Symfony\Component\Cache\DoctrineProvider">
+            <argument type="service" id="annotations.cache_adapter" />
+            <tag name="container.hot_path" />
+        </service>
+
+        <service id="annotation_reader" alias="annotations.reader" />
+        <service id="Doctrine\Common\Annotations\Reader" alias="annotation_reader" />
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/assets.xml b/vendor/symfony/framework-bundle/Resources/config/assets.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4aaa702df5dc9c2aec8e61e0607d11cc604c267a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/assets.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <parameter key="asset.request_context.base_path"></parameter>
+        <parameter key="asset.request_context.secure">false</parameter>
+    </parameters>
+
+    <services>
+        <defaults public="false" />
+
+        <service id="assets.packages" class="Symfony\Component\Asset\Packages">
+            <argument type="service" id="assets.empty_package" /> <!-- default package -->
+            <argument type="collection" /> <!-- named packages -->
+        </service>
+        <service id="Symfony\Component\Asset\Packages" alias="assets.packages" />
+
+        <service id="assets.empty_package" class="Symfony\Component\Asset\Package">
+            <argument type="service" id="assets.empty_version_strategy" />
+        </service>
+
+        <service id="assets.context" class="Symfony\Component\Asset\Context\RequestStackContext">
+            <argument type="service" id="request_stack" />
+            <argument>%asset.request_context.base_path%</argument>
+            <argument>%asset.request_context.secure%</argument>
+        </service>
+
+        <service id="assets.path_package" class="Symfony\Component\Asset\PathPackage" abstract="true">
+            <argument /> <!-- base path -->
+            <argument /> <!-- version strategy -->
+            <argument type="service" id="assets.context" />
+        </service>
+
+        <service id="assets.url_package" class="Symfony\Component\Asset\UrlPackage" abstract="true">
+            <argument /> <!-- base URLs -->
+            <argument /> <!-- version strategy -->
+            <argument type="service" id="assets.context" />
+        </service>
+
+        <service id="assets.static_version_strategy" class="Symfony\Component\Asset\VersionStrategy\StaticVersionStrategy" abstract="true">
+            <argument /> <!-- version -->
+            <argument /> <!-- format -->
+        </service>
+
+        <service id="assets.empty_version_strategy" class="Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy" />
+
+        <service id="assets.json_manifest_version_strategy" class="Symfony\Component\Asset\VersionStrategy\JsonManifestVersionStrategy" abstract="true">
+            <argument /> <!-- manifest path -->
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/cache.xml b/vendor/symfony/framework-bundle/Resources/config/cache.xml
new file mode 100644
index 0000000000000000000000000000000000000000..41264e9d1acabf3c8b6177751faca5d575c0971f
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/cache.xml
@@ -0,0 +1,163 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="cache.app" parent="cache.adapter.filesystem" public="true">
+            <tag name="cache.pool" clearer="cache.app_clearer" />
+        </service>
+
+        <service id="cache.app.simple" class="Symfony\Component\Cache\Psr16Cache">
+            <deprecated>The "Psr\SimpleCache\CacheInterface" / "%service_id%" service is deprecated since Symfony 4.3. Use "Symfony\Contracts\Cache\CacheInterface" / "cache.app" instead.</deprecated>
+            <argument type="service" id="cache.app" />
+        </service>
+
+        <service id="cache.app.taggable" class="Symfony\Component\Cache\Adapter\TagAwareAdapter">
+            <argument type="service" id="cache.app" />
+        </service>
+
+        <service id="cache.system" parent="cache.adapter.system" public="true">
+            <tag name="cache.pool" />
+        </service>
+
+        <service id="cache.validator" parent="cache.system" public="false">
+            <tag name="cache.pool" />
+        </service>
+
+        <service id="cache.serializer" parent="cache.system" public="false">
+            <tag name="cache.pool" />
+        </service>
+
+        <service id="cache.annotations" parent="cache.system" public="false">
+            <tag name="cache.pool" />
+        </service>
+
+        <service id="cache.property_info" parent="cache.system" public="false">
+            <tag name="cache.pool" />
+        </service>
+
+        <service id="cache.messenger.restart_workers_signal" parent="cache.app" public="false">
+            <tag name="cache.pool" />
+        </service>
+
+        <service id="cache.adapter.system" class="Symfony\Component\Cache\Adapter\AdapterInterface" abstract="true">
+            <factory class="Symfony\Component\Cache\Adapter\AbstractAdapter" method="createSystemCache" />
+            <tag name="cache.pool" clearer="cache.system_clearer" reset="reset" />
+            <tag name="monolog.logger" channel="cache" />
+            <argument /> <!-- namespace -->
+            <argument>0</argument> <!-- default lifetime -->
+            <argument /> <!-- version -->
+            <argument>%kernel.cache_dir%/pools</argument>
+            <argument type="service" id="logger" on-invalid="ignore" />
+        </service>
+
+        <service id="cache.adapter.apcu" class="Symfony\Component\Cache\Adapter\ApcuAdapter" abstract="true">
+            <tag name="cache.pool" clearer="cache.default_clearer" reset="reset" />
+            <tag name="monolog.logger" channel="cache" />
+            <argument /> <!-- namespace -->
+            <argument>0</argument> <!-- default lifetime -->
+            <argument /> <!-- version -->
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+
+        <service id="cache.adapter.doctrine" class="Symfony\Component\Cache\Adapter\DoctrineAdapter" abstract="true">
+            <tag name="cache.pool" provider="cache.default_doctrine_provider" clearer="cache.default_clearer" reset="reset" />
+            <tag name="monolog.logger" channel="cache" />
+            <argument /> <!-- Doctrine provider service -->
+            <argument /> <!-- namespace -->
+            <argument>0</argument> <!-- default lifetime -->
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+
+        <service id="cache.adapter.filesystem" class="Symfony\Component\Cache\Adapter\FilesystemAdapter" abstract="true">
+            <tag name="cache.pool" clearer="cache.default_clearer" reset="reset" />
+            <tag name="monolog.logger" channel="cache" />
+            <argument /> <!-- namespace -->
+            <argument>0</argument> <!-- default lifetime -->
+            <argument>%kernel.cache_dir%/pools</argument>
+            <argument type="service" id="cache.default_marshaller" on-invalid="ignore" />
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+
+        <service id="cache.adapter.psr6" class="Symfony\Component\Cache\Adapter\ProxyAdapter" abstract="true">
+            <tag name="cache.pool" provider="cache.default_psr6_provider" clearer="cache.default_clearer" reset="reset" />
+            <argument /> <!-- PSR-6 provider service -->
+            <argument /> <!-- namespace -->
+            <argument>0</argument> <!-- default lifetime -->
+        </service>
+
+        <service id="cache.adapter.redis" class="Symfony\Component\Cache\Adapter\RedisAdapter" abstract="true">
+            <tag name="cache.pool" provider="cache.default_redis_provider" clearer="cache.default_clearer" reset="reset" />
+            <tag name="monolog.logger" channel="cache" />
+            <argument /> <!-- Redis connection service -->
+            <argument /> <!-- namespace -->
+            <argument>0</argument> <!-- default lifetime -->
+            <argument type="service" id="cache.default_marshaller" on-invalid="ignore" />
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+
+        <service id="cache.adapter.memcached" class="Symfony\Component\Cache\Adapter\MemcachedAdapter" abstract="true">
+            <tag name="cache.pool" provider="cache.default_memcached_provider" clearer="cache.default_clearer" reset="reset" />
+            <tag name="monolog.logger" channel="cache" />
+            <argument /> <!-- Memcached connection service -->
+            <argument /> <!-- namespace -->
+            <argument>0</argument> <!-- default lifetime -->
+            <argument type="service" id="cache.default_marshaller" on-invalid="ignore" />
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+
+        <service id="cache.adapter.pdo" class="Symfony\Component\Cache\Adapter\PdoAdapter" abstract="true">
+            <tag name="cache.pool" provider="cache.default_pdo_provider" clearer="cache.default_clearer" reset="reset" />
+            <tag name="monolog.logger" channel="cache" />
+            <argument /> <!-- PDO connection service -->
+            <argument /> <!-- namespace -->
+            <argument>0</argument> <!-- default lifetime -->
+            <argument type="collection" /> <!-- table options -->
+            <argument type="service" id="cache.default_marshaller" on-invalid="ignore" />
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+
+        <service id="cache.adapter.array" class="Symfony\Component\Cache\Adapter\ArrayAdapter" abstract="true">
+            <tag name="cache.pool" clearer="cache.default_clearer" reset="reset" />
+            <tag name="monolog.logger" channel="cache" />
+            <argument>0</argument> <!-- default lifetime -->
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+
+        <service id="cache.default_marshaller" class="Symfony\Component\Cache\Marshaller\DefaultMarshaller">
+            <argument>null</argument> <!-- use igbinary_serialize() when available -->
+        </service>
+
+        <service id="cache.default_clearer" class="Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer">
+            <argument type="collection" />
+        </service>
+
+        <service id="cache.system_clearer" parent="cache.default_clearer" public="true" />
+
+        <service id="cache.global_clearer" parent="cache.default_clearer" public="true" />
+        <service id="cache.app_clearer" alias="cache.default_clearer" public="true" />
+        <service id="Psr\Cache\CacheItemPoolInterface" alias="cache.app" />
+        <service id="Psr\SimpleCache\CacheInterface" alias="cache.app.simple" />
+        <service id="Symfony\Component\Cache\Adapter\AdapterInterface" alias="cache.app" />
+        <service id="Symfony\Contracts\Cache\CacheInterface" alias="cache.app" />
+        <service id="Symfony\Contracts\Cache\TagAwareCacheInterface" alias="cache.app.taggable" />
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/cache_debug.xml b/vendor/symfony/framework-bundle/Resources/config/cache_debug.xml
new file mode 100644
index 0000000000000000000000000000000000000000..20e22761a308d5382aa0f54cb60b93be6e727729
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/cache_debug.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <!-- DataCollector (public to prevent inlining, made private in CacheCollectorPass) -->
+        <service id="data_collector.cache" class="Symfony\Component\Cache\DataCollector\CacheDataCollector" public="true">
+            <tag name="data_collector" template="@WebProfiler/Collector/cache.html.twig" id="cache" priority="275" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/collectors.xml b/vendor/symfony/framework-bundle/Resources/config/collectors.xml
new file mode 100644
index 0000000000000000000000000000000000000000..17df61db1c13ab060e4eaf28c355b7964bd81d9f
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/collectors.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="data_collector.config" class="Symfony\Component\HttpKernel\DataCollector\ConfigDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/config.html.twig" id="config" priority="-255" />
+            <call method="setKernel"><argument type="service" id="kernel" on-invalid="ignore" /></call>
+        </service>
+
+        <service id="data_collector.request" class="Symfony\Component\HttpKernel\DataCollector\RequestDataCollector">
+            <tag name="kernel.event_subscriber" />
+            <tag name="data_collector" template="@WebProfiler/Collector/request.html.twig" id="request" priority="335" />
+        </service>
+
+        <service id="data_collector.ajax" class="Symfony\Component\HttpKernel\DataCollector\AjaxDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/ajax.html.twig" id="ajax" priority="315" />
+        </service>
+
+        <service id="data_collector.exception" class="Symfony\Component\HttpKernel\DataCollector\ExceptionDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/exception.html.twig" id="exception" priority="305" />
+        </service>
+
+        <service id="data_collector.events" class="Symfony\Component\HttpKernel\DataCollector\EventDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/events.html.twig" id="events" priority="290" />
+            <argument type="service" id="debug.event_dispatcher" on-invalid="ignore" />
+            <argument type="service" id="request_stack" on-invalid="ignore" />
+        </service>
+
+        <service id="data_collector.logger" class="Symfony\Component\HttpKernel\DataCollector\LoggerDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/logger.html.twig" id="logger" priority="300" />
+            <tag name="monolog.logger" channel="profiler" />
+            <argument type="service" id="logger" on-invalid="ignore" />
+            <argument>%kernel.cache_dir%/%kernel.container_class%</argument>
+            <argument type="service" id="request_stack" on-invalid="ignore" />
+        </service>
+
+        <service id="data_collector.time" class="Symfony\Component\HttpKernel\DataCollector\TimeDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/time.html.twig" id="time" priority="330" />
+            <argument type="service" id="kernel" on-invalid="ignore" />
+            <argument type="service" id="debug.stopwatch" on-invalid="ignore" />
+        </service>
+
+        <service id="data_collector.memory" class="Symfony\Component\HttpKernel\DataCollector\MemoryDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/memory.html.twig" id="memory" priority="325" />
+        </service>
+
+        <service id="data_collector.router" class="Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector">
+            <tag name="kernel.event_listener" event="kernel.controller" method="onKernelController"/>
+            <tag name="data_collector" template="@WebProfiler/Collector/router.html.twig" id="router" priority="285" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/console.xml b/vendor/symfony/framework-bundle/Resources/config/console.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7276892940acb94d50f423d81fecd607f2eeaf84
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/console.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="console.error_listener" class="Symfony\Component\Console\EventListener\ErrorListener">
+            <argument type="service" id="logger" on-invalid="null" />
+            <tag name="kernel.event_subscriber" />
+            <tag name="monolog.logger" channel="console" />
+        </service>
+
+        <service id="console.suggest_missing_package_subscriber" class="Symfony\Bundle\FrameworkBundle\EventListener\SuggestMissingPackageSubscriber">
+            <tag name="kernel.event_subscriber" />
+        </service>
+
+        <service id="console.command.about" class="Symfony\Bundle\FrameworkBundle\Command\AboutCommand">
+            <tag name="console.command" command="about" />
+        </service>
+
+        <service id="console.command.assets_install" class="Symfony\Bundle\FrameworkBundle\Command\AssetsInstallCommand">
+            <argument type="service" id="filesystem" />
+            <argument>%kernel.project_dir%</argument>
+            <tag name="console.command" command="assets:install" />
+        </service>
+
+        <service id="console.command.cache_clear" class="Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand">
+            <argument type="service" id="cache_clearer" />
+            <argument type="service" id="filesystem" />
+            <tag name="console.command" command="cache:clear" />
+        </service>
+
+        <service id="console.command.cache_pool_clear" class="Symfony\Bundle\FrameworkBundle\Command\CachePoolClearCommand">
+            <argument type="service" id="cache.global_clearer" />
+            <tag name="console.command" command="cache:pool:clear" />
+        </service>
+
+        <service id="console.command.cache_pool_prune" class="Symfony\Bundle\FrameworkBundle\Command\CachePoolPruneCommand">
+            <argument type="iterator" />
+            <tag name="console.command" command="cache:pool:prune" />
+        </service>
+
+        <service id="console.command.cache_pool_delete" class="Symfony\Bundle\FrameworkBundle\Command\CachePoolDeleteCommand">
+            <argument type="service" id="cache.global_clearer" />
+            <tag name="console.command" command="cache:pool:delete" />
+        </service>
+
+        <service id="console.command.cache_pool_list" class="Symfony\Bundle\FrameworkBundle\Command\CachePoolListCommand">
+            <argument /> <!-- Pool names -->
+            <tag name="console.command" command="cache:pool:list" />
+        </service>
+
+        <service id="console.command.cache_warmup" class="Symfony\Bundle\FrameworkBundle\Command\CacheWarmupCommand">
+            <argument type="service" id="cache_warmer" />
+            <tag name="console.command" command="cache:warmup" />
+        </service>
+
+        <service id="console.command.config_debug" class="Symfony\Bundle\FrameworkBundle\Command\ConfigDebugCommand">
+            <tag name="console.command" command="debug:config" />
+        </service>
+
+        <service id="console.command.config_dump_reference" class="Symfony\Bundle\FrameworkBundle\Command\ConfigDumpReferenceCommand">
+            <tag name="console.command" command="config:dump-reference" />
+        </service>
+
+        <service id="console.command.container_debug" class="Symfony\Bundle\FrameworkBundle\Command\ContainerDebugCommand">
+            <tag name="console.command" command="debug:container" />
+        </service>
+
+        <service id="console.command.container_lint" class="Symfony\Bundle\FrameworkBundle\Command\ContainerLintCommand">
+            <tag name="console.command" command="lint:container" />
+        </service>
+
+        <service id="console.command.debug_autowiring" class="Symfony\Bundle\FrameworkBundle\Command\DebugAutowiringCommand">
+            <argument>null</argument>
+            <argument type="service" id="debug.file_link_formatter" on-invalid="null"/>
+            <tag name="console.command" command="debug:autowiring" />
+        </service>
+
+        <service id="console.command.event_dispatcher_debug" class="Symfony\Bundle\FrameworkBundle\Command\EventDispatcherDebugCommand">
+            <argument type="service" id="event_dispatcher" />
+            <tag name="console.command" command="debug:event-dispatcher" />
+        </service>
+
+        <service id="console.command.messenger_consume_messages" class="Symfony\Component\Messenger\Command\ConsumeMessagesCommand">
+            <argument /> <!-- Routable message bus -->
+            <argument type="service" id="messenger.receiver_locator" />
+            <argument type="service" id="event_dispatcher" />
+            <argument type="service" id="logger" on-invalid="null" />
+            <argument type="collection" /> <!-- Receiver names -->
+
+            <tag name="console.command" command="messenger:consume" />
+            <tag name="console.command" command="messenger:consume-messages" />
+            <tag name="monolog.logger" channel="messenger" />
+        </service>
+
+        <service id="console.command.messenger_setup_transports" class="Symfony\Component\Messenger\Command\SetupTransportsCommand">
+            <argument type="service" id="messenger.receiver_locator" />
+            <argument type="collection" /> <!-- Receiver names -->
+
+            <tag name="console.command" command="messenger:setup-transports" />
+        </service>
+
+        <service id="console.command.messenger_debug" class="Symfony\Component\Messenger\Command\DebugCommand">
+            <argument type="collection" /> <!-- Message to handlers mapping -->
+            <tag name="console.command" command="debug:messenger" />
+        </service>
+
+        <service id="console.command.messenger_stop_workers" class="Symfony\Component\Messenger\Command\StopWorkersCommand">
+            <argument type="service" id="cache.messenger.restart_workers_signal" />
+            <tag name="console.command" command="messenger:stop-workers" />
+        </service>
+
+        <service id="console.command.messenger_failed_messages_retry" class="Symfony\Component\Messenger\Command\FailedMessagesRetryCommand">
+            <argument /> <!-- Receiver name -->
+            <argument /> <!-- Receiver -->
+            <argument type="service" id="messenger.routable_message_bus" />
+            <argument type="service" id="event_dispatcher" />
+            <argument type="service" id="logger" />
+
+            <tag name="console.command" command="messenger:failed:retry" />
+        </service>
+
+        <service id="console.command.messenger_failed_messages_show" class="Symfony\Component\Messenger\Command\FailedMessagesShowCommand">
+            <argument /> <!-- Receiver name -->
+            <argument /> <!-- Receiver -->
+
+            <tag name="console.command" command="messenger:failed:show" />
+        </service>
+
+        <service id="console.command.messenger_failed_messages_remove" class="Symfony\Component\Messenger\Command\FailedMessagesRemoveCommand">
+            <argument /> <!-- Receiver name -->
+            <argument /> <!-- Receiver -->
+
+            <tag name="console.command" command="messenger:failed:remove" />
+        </service>
+
+        <service id="console.command.router_debug" class="Symfony\Bundle\FrameworkBundle\Command\RouterDebugCommand">
+            <argument type="service" id="router" />
+            <argument type="service" id="debug.file_link_formatter" on-invalid="null" />
+            <tag name="console.command" command="debug:router" />
+        </service>
+
+        <service id="console.command.router_match" class="Symfony\Bundle\FrameworkBundle\Command\RouterMatchCommand">
+            <argument type="service" id="router" />
+            <tag name="console.command" command="router:match" />
+        </service>
+
+        <service id="console.command.translation_debug" class="Symfony\Bundle\FrameworkBundle\Command\TranslationDebugCommand">
+            <argument type="service" id="translator" />
+            <argument type="service" id="translation.reader" />
+            <argument type="service" id="translation.extractor" />
+            <argument>%translator.default_path%</argument>
+            <argument /> <!-- %twig.default_path% -->
+            <argument type="collection" /> <!-- Translator paths -->
+            <argument type="collection" /> <!-- Twig paths -->
+            <tag name="console.command" command="debug:translation" />
+        </service>
+
+        <service id="console.command.translation_update" class="Symfony\Bundle\FrameworkBundle\Command\TranslationUpdateCommand">
+            <argument type="service" id="translation.writer" />
+            <argument type="service" id="translation.reader" />
+            <argument type="service" id="translation.extractor" />
+            <argument>%kernel.default_locale%</argument>
+            <argument>%translator.default_path%</argument>
+            <argument /> <!-- %twig.default_path% -->
+            <argument type="collection" /> <!-- Translator paths -->
+            <argument type="collection" /> <!-- Twig paths -->
+            <tag name="console.command" command="translation:update" />
+        </service>
+
+        <service id="console.command.workflow_dump" class="Symfony\Bundle\FrameworkBundle\Command\WorkflowDumpCommand">
+            <tag name="console.command" command="workflow:dump" />
+        </service>
+
+        <service id="console.command.xliff_lint" class="Symfony\Bundle\FrameworkBundle\Command\XliffLintCommand">
+            <tag name="console.command" command="lint:xliff" />
+        </service>
+
+        <service id="console.command.yaml_lint" class="Symfony\Bundle\FrameworkBundle\Command\YamlLintCommand">
+            <tag name="console.command" command="lint:yaml" />
+        </service>
+
+        <service id="console.command.form_debug" class="Symfony\Component\Form\Command\DebugCommand">
+            <argument type="service" id="form.registry" />
+            <argument type="collection" /> <!-- All form types namespaces are stored here by FormPass -->
+            <argument type="collection" /> <!-- All services form types are stored here by FormPass -->
+            <argument type="collection" /> <!-- All type extensions are stored here by FormPass -->
+            <argument type="collection" /> <!-- All type guessers are stored here by FormPass -->
+            <argument type="service" id="debug.file_link_formatter" on-invalid="null" />
+            <tag name="console.command" command="debug:form" />
+        </service>
+
+        <service id="console.command.secrets_set" class="Symfony\Bundle\FrameworkBundle\Command\SecretsSetCommand">
+            <argument type="service" id="secrets.vault" />
+            <argument type="service" id="secrets.local_vault" on-invalid="ignore" />
+            <tag name="console.command" command="secrets:set" />
+        </service>
+
+        <service id="console.command.secrets_remove" class="Symfony\Bundle\FrameworkBundle\Command\SecretsRemoveCommand">
+            <argument type="service" id="secrets.vault" />
+            <argument type="service" id="secrets.local_vault" on-invalid="ignore" />
+            <tag name="console.command" command="secrets:remove" />
+        </service>
+
+        <service id="console.command.secrets_generate_key" class="Symfony\Bundle\FrameworkBundle\Command\SecretsGenerateKeysCommand">
+            <argument type="service" id="secrets.vault" />
+            <argument type="service" id="secrets.local_vault" on-invalid="ignore" />
+            <tag name="console.command" command="secrets:generate-keys" />
+        </service>
+
+        <service id="console.command.secrets_list" class="Symfony\Bundle\FrameworkBundle\Command\SecretsListCommand">
+            <argument type="service" id="secrets.vault" />
+            <argument type="service" id="secrets.local_vault" on-invalid="ignore" />
+            <tag name="console.command" command="secrets:list" />
+        </service>
+
+        <service id="console.command.secrets_decrypt_to_local" class="Symfony\Bundle\FrameworkBundle\Command\SecretsDecryptToLocalCommand">
+            <argument type="service" id="secrets.vault" />
+            <argument type="service" id="secrets.local_vault" on-invalid="ignore" />
+            <tag name="console.command" command="secrets:decrypt-to-local" />
+        </service>
+
+        <service id="console.command.secrets_encrypt_from_local" class="Symfony\Bundle\FrameworkBundle\Command\SecretsEncryptFromLocalCommand">
+            <argument type="service" id="secrets.vault" />
+            <argument type="service" id="secrets.local_vault" on-invalid="ignore" />
+            <tag name="console.command" command="secrets:encrypt-from-local" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/debug.xml b/vendor/symfony/framework-bundle/Resources/config/debug.xml
new file mode 100644
index 0000000000000000000000000000000000000000..63a61efe4bb516054f672f5f16fbe59ba9138f1b
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/debug.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="debug.event_dispatcher" class="Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher" decorates="event_dispatcher">
+            <tag name="monolog.logger" channel="event" />
+            <tag name="kernel.reset" method="reset" />
+            <argument type="service" id="debug.event_dispatcher.inner" />
+            <argument type="service" id="debug.stopwatch" />
+            <argument type="service" id="logger" on-invalid="null" />
+            <argument type="service" id="request_stack" on-invalid="null" />
+        </service>
+
+        <service id="debug.controller_resolver" decorates="controller_resolver" class="Symfony\Component\HttpKernel\Controller\TraceableControllerResolver">
+            <argument type="service" id="debug.controller_resolver.inner" />
+            <argument type="service" id="debug.stopwatch" />
+        </service>
+
+        <service id="debug.argument_resolver" decorates="argument_resolver" class="Symfony\Component\HttpKernel\Controller\TraceableArgumentResolver">
+            <argument type="service" id="debug.argument_resolver.inner" />
+            <argument type="service" id="debug.stopwatch" />
+        </service>
+
+        <service id="argument_resolver.not_tagged_controller" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\NotTaggedControllerValueResolver">
+            <tag name="controller.argument_value_resolver" priority="-200" />
+            <argument />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/debug_prod.xml b/vendor/symfony/framework-bundle/Resources/config/debug_prod.xml
new file mode 100644
index 0000000000000000000000000000000000000000..786158dd899e1869f2738cc70cf7a899bb61a175
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/debug_prod.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <parameter key="debug.error_handler.throw_at">-1</parameter>
+    </parameters>
+
+    <services>
+        <defaults public="false" />
+
+        <service id="debug.debug_handlers_listener" class="Symfony\Component\HttpKernel\EventListener\DebugHandlersListener">
+            <tag name="kernel.event_subscriber" />
+            <tag name="monolog.logger" channel="php" />
+            <argument>null</argument><!-- Exception handler -->
+            <argument type="service" id="logger" on-invalid="null" />
+            <argument>null</argument><!-- Log levels map for enabled error levels -->
+            <argument>%debug.error_handler.throw_at%</argument>
+            <argument>%kernel.debug%</argument>
+            <argument type="service" id="debug.file_link_formatter" />
+            <argument>%kernel.debug%</argument>
+        </service>
+
+        <service id="debug.file_link_formatter" class="Symfony\Component\HttpKernel\Debug\FileLinkFormatter">
+            <argument>%debug.file_link_format%</argument>
+        </service>
+        <service id="Symfony\Component\HttpKernel\Debug\FileLinkFormatter" alias="debug.file_link_formatter" />
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/error_renderer.xml b/vendor/symfony/framework-bundle/Resources/config/error_renderer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4d2423feeeedeef74a39aa5e83cd2b65219e4c50
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/error_renderer.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <service id="error_handler.error_renderer.html" class="Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer">
+            <argument type="service">
+                <service>
+                    <factory class="Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer" method="isDebug" />
+                    <argument type="service" id="request_stack" />
+                    <argument>%kernel.debug%</argument>
+                </service>
+            </argument>
+            <argument>%kernel.charset%</argument>
+            <argument type="service" id="debug.file_link_formatter" on-invalid="null" />
+            <argument>%kernel.project_dir%</argument>
+            <argument type="service">
+                <service>
+                    <factory class="Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer" method="getAndCleanOutputBuffer" />
+                    <argument type="service" id="request_stack" />
+                </service>
+            </argument>
+            <argument type="service" id="logger" on-invalid="null" />
+        </service>
+
+        <service id="error_renderer.html" alias="error_handler.error_renderer.html" />
+        <service id="error_renderer" alias="error_renderer.html" />
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/esi.xml b/vendor/symfony/framework-bundle/Resources/config/esi.xml
new file mode 100644
index 0000000000000000000000000000000000000000..65e26d81e25c3fa6e3529e3afa4c6a9e4b974ae4
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/esi.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="esi" class="Symfony\Component\HttpKernel\HttpCache\Esi" />
+
+        <service id="esi_listener" class="Symfony\Component\HttpKernel\EventListener\SurrogateListener">
+            <tag name="kernel.event_subscriber" />
+            <argument type="service" id="esi" on-invalid="ignore" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/form.xml b/vendor/symfony/framework-bundle/Resources/config/form.xml
new file mode 100644
index 0000000000000000000000000000000000000000..05a58c4c4cd2c38d014aaaec8eb7b6761b696b07
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/form.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <!-- ResolvedFormTypeFactory -->
+        <service id="form.resolved_type_factory" class="Symfony\Component\Form\ResolvedFormTypeFactory" />
+        <service id="Symfony\Component\Form\ResolvedFormTypeFactoryInterface" alias="form.resolved_type_factory" />
+
+        <!-- FormRegistry -->
+        <service id="form.registry" class="Symfony\Component\Form\FormRegistry">
+            <argument type="collection">
+                <!--
+                We don't need to be able to add more extensions.
+                 * more types can be registered with the form.type tag
+                 * more type extensions can be registered with the form.type_extension tag
+                 * more type_guessers can be registered with the form.type_guesser tag
+                -->
+                <argument type="service" id="form.extension" />
+            </argument>
+            <argument type="service" id="form.resolved_type_factory" />
+        </service>
+        <service id="Symfony\Component\Form\FormRegistryInterface" alias="form.registry" />
+
+        <!-- FormFactory -->
+        <service id="form.factory" class="Symfony\Component\Form\FormFactory" public="true">
+            <argument type="service" id="form.registry" />
+        </service>
+        <service id="Symfony\Component\Form\FormFactoryInterface" alias="form.factory" />
+
+        <!-- DependencyInjectionExtension -->
+        <service id="form.extension" class="Symfony\Component\Form\Extension\DependencyInjection\DependencyInjectionExtension">
+            <argument /><!-- All services with tag "form.type" are stored in a service locator by FormPass -->
+            <argument type="collection" /><!-- All services with tag "form.type_extension" are stored here by FormPass -->
+            <argument type="iterator" /><!-- All services with tag "form.type_guesser" are stored here by FormPass -->
+        </service>
+
+        <!-- ValidatorTypeGuesser -->
+        <service id="form.type_guesser.validator" class="Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser">
+            <tag name="form.type_guesser" />
+            <argument type="service" id="validator.mapping.class_metadata_factory" />
+        </service>
+
+        <!-- CoreExtension -->
+        <service id="form.property_accessor" alias="property_accessor" />
+
+        <service id="form.choice_list_factory.default" class="Symfony\Component\Form\ChoiceList\Factory\DefaultChoiceListFactory" />
+
+        <service id="form.choice_list_factory.property_access" class="Symfony\Component\Form\ChoiceList\Factory\PropertyAccessDecorator">
+            <argument type="service" id="form.choice_list_factory.default"/>
+            <argument type="service" id="form.property_accessor"/>
+        </service>
+
+        <service id="form.choice_list_factory.cached" class="Symfony\Component\Form\ChoiceList\Factory\CachingFactoryDecorator">
+            <argument type="service" id="form.choice_list_factory.property_access"/>
+            <tag name="kernel.reset" method="reset" />
+        </service>
+
+        <service id="form.choice_list_factory" alias="form.choice_list_factory.cached" />
+
+        <service id="form.type.form" class="Symfony\Component\Form\Extension\Core\Type\FormType">
+            <argument type="service" id="form.property_accessor" />
+            <tag name="form.type" />
+        </service>
+        <service id="form.type.choice" class="Symfony\Component\Form\Extension\Core\Type\ChoiceType">
+            <tag name="form.type" />
+            <argument type="service" id="form.choice_list_factory"/>
+            <argument type="service" id="translator" on-invalid="ignore" />
+        </service>
+        <service id="form.type.file" class="Symfony\Component\Form\Extension\Core\Type\FileType" public="true">
+            <tag name="form.type" />
+            <argument type="service" id="translator" on-invalid="ignore" />
+        </service>
+
+        <service id="form.type_extension.form.transformation_failure_handling" class="Symfony\Component\Form\Extension\Core\Type\TransformationFailureExtension">
+            <tag name="form.type_extension" extended-type="Symfony\Component\Form\Extension\Core\Type\FormType" />
+            <argument type="service" id="translator" on-invalid="ignore" />
+        </service>
+
+        <!-- FormTypeHttpFoundationExtension -->
+        <service id="form.type_extension.form.http_foundation" class="Symfony\Component\Form\Extension\HttpFoundation\Type\FormTypeHttpFoundationExtension">
+            <argument type="service" id="form.type_extension.form.request_handler" />
+            <tag name="form.type_extension" />
+        </service>
+
+        <!-- HttpFoundationRequestHandler -->
+        <service id="form.type_extension.form.request_handler" class="Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationRequestHandler">
+            <argument type="service" id="form.server_params" />
+        </service>
+
+        <service id="form.server_params" class="Symfony\Component\Form\Util\ServerParams">
+            <argument type="service" id="request_stack" />
+        </service>
+
+        <!-- FormTypeValidatorExtension -->
+        <service id="form.type_extension.form.validator" class="Symfony\Component\Form\Extension\Validator\Type\FormTypeValidatorExtension">
+            <tag name="form.type_extension" extended-type="Symfony\Component\Form\Extension\Core\Type\FormType" />
+            <argument type="service" id="validator" />
+        </service>
+        <service id="form.type_extension.repeated.validator" class="Symfony\Component\Form\Extension\Validator\Type\RepeatedTypeValidatorExtension">
+            <tag name="form.type_extension" />
+        </service>
+        <service id="form.type_extension.submit.validator" class="Symfony\Component\Form\Extension\Validator\Type\SubmitTypeValidatorExtension">
+            <tag name="form.type_extension" extended-type="Symfony\Component\Form\Extension\Core\Type\SubmitType" />
+        </service>
+        <service id="form.type_extension.upload.validator" class="Symfony\Component\Form\Extension\Validator\Type\UploadValidatorExtension">
+            <tag name="form.type_extension" />
+            <argument type="service" id="translator"/>
+            <argument type="string">%validator.translation_domain%</argument>
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/form_csrf.xml b/vendor/symfony/framework-bundle/Resources/config/form_csrf.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5e897bea8a30b3499cdb4a799204f9aa91cb51e8
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/form_csrf.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="form.type_extension.csrf" class="Symfony\Component\Form\Extension\Csrf\Type\FormTypeCsrfExtension">
+            <tag name="form.type_extension" />
+            <argument type="service" id="security.csrf.token_manager" />
+            <argument>%form.type_extension.csrf.enabled%</argument>
+            <argument>%form.type_extension.csrf.field_name%</argument>
+            <argument type="service" id="translator" on-invalid="null" />
+            <argument>%validator.translation_domain%</argument>
+            <argument type="service" id="form.server_params" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/form_debug.xml b/vendor/symfony/framework-bundle/Resources/config/form_debug.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5e3e97aad524230a724e5a617277e9a78302c564
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/form_debug.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="form.resolved_type_factory" class="Symfony\Component\Form\Extension\DataCollector\Proxy\ResolvedTypeFactoryDataCollectorProxy">
+            <argument type="service">
+                <service class="Symfony\Component\Form\ResolvedFormTypeFactory" />
+            </argument>
+            <argument type="service" id="data_collector.form" />
+        </service>
+
+        <!-- DataCollectorTypeExtension -->
+        <service id="form.type_extension.form.data_collector" class="Symfony\Component\Form\Extension\DataCollector\Type\DataCollectorTypeExtension">
+            <tag name="form.type_extension" />
+            <argument type="service" id="data_collector.form" />
+        </service>
+
+        <!-- DataCollector -->
+        <service id="data_collector.form.extractor" class="Symfony\Component\Form\Extension\DataCollector\FormDataExtractor" />
+
+        <service id="data_collector.form" class="Symfony\Component\Form\Extension\DataCollector\FormDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/form.html.twig" id="form" priority="310" />
+            <argument type="service" id="data_collector.form.extractor" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/fragment_listener.xml b/vendor/symfony/framework-bundle/Resources/config/fragment_listener.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b7c64119f88e634b9c6b08db98c189cd16463920
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/fragment_listener.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="fragment.listener" class="Symfony\Component\HttpKernel\EventListener\FragmentListener">
+            <tag name="kernel.event_subscriber" />
+            <argument type="service" id="uri_signer" />
+            <argument>%fragment.path%</argument>
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/fragment_renderer.xml b/vendor/symfony/framework-bundle/Resources/config/fragment_renderer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..394033734d2d471c024f8ed45523719ce6a80b6a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/fragment_renderer.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <parameter key="fragment.renderer.hinclude.global_template"></parameter>
+        <parameter key="fragment.path">/_fragment</parameter>
+    </parameters>
+
+    <services>
+        <defaults public="false" />
+
+        <service id="fragment.handler" class="Symfony\Component\HttpKernel\DependencyInjection\LazyLoadingFragmentHandler">
+            <argument /> <!-- fragment renderer locator -->
+            <argument type="service" id="request_stack" />
+            <argument>%kernel.debug%</argument>
+        </service>
+
+        <service id="fragment.renderer.inline" class="Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer">
+            <tag name="kernel.fragment_renderer" alias="inline" />
+            <argument type="service" id="http_kernel" />
+            <argument type="service" id="event_dispatcher" />
+            <call method="setFragmentPath"><argument>%fragment.path%</argument></call>
+        </service>
+
+        <service id="fragment.renderer.hinclude" class="Symfony\Component\HttpKernel\Fragment\HIncludeFragmentRenderer">
+            <argument /> <!-- templating or Twig service -->
+            <argument type="service" id="uri_signer" />
+            <argument>%fragment.renderer.hinclude.global_template%</argument>
+            <call method="setFragmentPath"><argument>%fragment.path%</argument></call>
+        </service>
+
+        <service id="fragment.renderer.esi" class="Symfony\Component\HttpKernel\Fragment\EsiFragmentRenderer">
+            <tag name="kernel.fragment_renderer" alias="esi" />
+            <argument type="service" id="esi" on-invalid="null" />
+            <argument type="service" id="fragment.renderer.inline" />
+            <argument type="service" id="uri_signer" />
+            <call method="setFragmentPath"><argument>%fragment.path%</argument></call>
+        </service>
+
+        <service id="fragment.renderer.ssi" class="Symfony\Component\HttpKernel\Fragment\SsiFragmentRenderer">
+            <tag name="kernel.fragment_renderer" alias="ssi" />
+            <argument type="service" id="ssi" on-invalid="null" />
+            <argument type="service" id="fragment.renderer.inline" />
+            <argument type="service" id="uri_signer" />
+            <call method="setFragmentPath"><argument>%fragment.path%</argument></call>
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/http_client.xml b/vendor/symfony/framework-bundle/Resources/config/http_client.xml
new file mode 100644
index 0000000000000000000000000000000000000000..10256b69d5e96c334e3301a45b1ab2c18a216340
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/http_client.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <service id="http_client" class="Symfony\Contracts\HttpClient\HttpClientInterface">
+            <tag name="monolog.logger" channel="http_client" />
+            <tag name="http_client.client" />
+            <factory class="Symfony\Component\HttpClient\HttpClient" method="create" />
+            <argument type="collection" /> <!-- default options -->
+            <argument /> <!-- max host connections -->
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+        <service id="Symfony\Contracts\HttpClient\HttpClientInterface" alias="http_client" />
+
+        <service id="psr18.http_client" class="Symfony\Component\HttpClient\Psr18Client">
+            <argument type="service" id="http_client" />
+            <argument type="service" id="Psr\Http\Message\ResponseFactoryInterface" on-invalid="ignore" />
+            <argument type="service" id="Psr\Http\Message\StreamFactoryInterface" on-invalid="ignore" />
+        </service>
+        <service id="Psr\Http\Client\ClientInterface" alias="psr18.http_client" />
+
+        <service id="Http\Client\HttpClient" class="Symfony\Component\HttpClient\HttplugClient">
+            <argument type="service" id="http_client" />
+            <argument type="service" id="Psr\Http\Message\ResponseFactoryInterface" on-invalid="ignore" />
+            <argument type="service" id="Psr\Http\Message\StreamFactoryInterface" on-invalid="ignore" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/http_client_debug.xml b/vendor/symfony/framework-bundle/Resources/config/http_client_debug.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6d6ae4b7290937486487fb8edb7006581cdee37c
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/http_client_debug.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <service id="data_collector.http_client" class="Symfony\Component\HttpClient\DataCollector\HttpClientDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/http_client.html.twig" id="http_client" priority="250" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/identity_translator.xml b/vendor/symfony/framework-bundle/Resources/config/identity_translator.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4d2d488edb3541ffa2efff5772d02e10f1ec9ebf
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/identity_translator.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="translator" class="Symfony\Component\Translation\IdentityTranslator" public="true" />
+        <service id="Symfony\Component\Translation\TranslatorInterface" alias="translator" />
+        <service id="Symfony\Contracts\Translation\TranslatorInterface" alias="translator" />
+
+        <service id="identity_translator" class="Symfony\Component\Translation\IdentityTranslator" />
+        <service id="translator.selector" class="Symfony\Component\Translation\MessageSelector">
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.2, use "identity_translator" instead.</deprecated>
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/lock.xml b/vendor/symfony/framework-bundle/Resources/config/lock.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a82003c004a154d0dd5f0e26333a9955400bc42d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/lock.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="lock.store.flock" class="Symfony\Component\Lock\Store\FlockStore">
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.4 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="lock.store.semaphore" class="Symfony\Component\Lock\Store\SemaphoreStore">
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.4 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="lock.store.memcached.abstract" class="Symfony\Component\Lock\Store\MemcachedStore" abstract="true">
+            <argument /> <!-- Memcached connection service -->
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.4 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="lock.store.redis.abstract" class="Symfony\Component\Lock\Store\RedisStore" abstract="true">
+            <argument /> <!-- Redis connection service -->
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.4 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="lock.store.combined.abstract" class="Symfony\Component\Lock\Store\CombinedStore" abstract="true">
+            <argument /> <!-- List of stores -->
+            <argument type="service" id="lock.strategy.majority" /> <!-- Strategy -->
+        </service>
+
+        <service id="lock.strategy.majority" class="Symfony\Component\Lock\Strategy\ConsensusStrategy" />
+
+        <service id="lock.factory.abstract" class="Symfony\Component\Lock\LockFactory" abstract="true">
+            <tag name="monolog.logger" channel="lock" />
+            <argument /> <!-- Store -->
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/mailer.xml b/vendor/symfony/framework-bundle/Resources/config/mailer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..12d40229932cd97a61d5aa1a33cfd6b7b7fa6249
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/mailer.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <service id="mailer.mailer" class="Symfony\Component\Mailer\Mailer">
+            <argument type="service" id="mailer.transports" />
+            <argument type="service" id="messenger.default_bus" on-invalid="ignore" />
+            <argument type="service" id="event_dispatcher" on-invalid="ignore" />
+        </service>
+        <service id="mailer" alias="mailer.mailer" />
+        <service id="Symfony\Component\Mailer\MailerInterface" alias="mailer.mailer" />
+
+        <service id="mailer.transports" class="Symfony\Component\Mailer\Transport\Transports">
+            <factory service="mailer.transport_factory" method="fromStrings" />
+            <argument type="collection" /> <!-- transports -->
+        </service>
+
+        <service id="mailer.transport_factory" class="Symfony\Component\Mailer\Transport">
+            <argument type="tagged_iterator" tag="mailer.transport_factory" />
+        </service>
+
+        <service id="mailer.default_transport" class="Symfony\Component\Mailer\Transport\TransportInterface">
+            <factory service="mailer.transport_factory" method="fromString" />
+            <argument /> <!-- env(MAILER_DSN) -->
+        </service>
+        <service id="Symfony\Component\Mailer\Transport\TransportInterface" alias="mailer.default_transport" />
+
+        <service id="mailer.messenger.message_handler" class="Symfony\Component\Mailer\Messenger\MessageHandler">
+            <argument type="service" id="mailer.transports" />
+            <tag name="messenger.message_handler" />
+        </service>
+
+        <service id="mailer.envelope_listener" class="Symfony\Component\Mailer\EventListener\EnvelopeListener">
+            <argument /> <!-- sender -->
+            <argument /> <!-- recipients -->
+            <tag name="kernel.event_subscriber"/>
+        </service>
+
+        <service id="mailer.logger_message_listener" class="Symfony\Component\Mailer\EventListener\MessageLoggerListener">
+            <tag name="kernel.event_subscriber"/>
+            <tag name="kernel.reset" method="reset" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/mailer_debug.xml b/vendor/symfony/framework-bundle/Resources/config/mailer_debug.xml
new file mode 100644
index 0000000000000000000000000000000000000000..17e1a6ed54ad9f3a855c90ed0e365473ecfeee62
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/mailer_debug.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+       <service id="mailer.data_collector" class="Symfony\Component\Mailer\DataCollector\MessageDataCollector">
+            <argument type="service" id="mailer.logger_message_listener" />
+            <tag name="data_collector" template="@WebProfiler/Collector/mailer.html.twig" id="mailer" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/mailer_transports.xml b/vendor/symfony/framework-bundle/Resources/config/mailer_transports.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d478942a0c3f0531225f604873445b14045e9537
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/mailer_transports.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <service id="mailer.transport_factory.abstract" class="Symfony\Component\Mailer\Transport\AbstractTransportFactory" abstract="true">
+            <argument type="service" id="event_dispatcher" />
+            <argument type="service" id="http_client" on-invalid="ignore" />
+            <argument type="service" id="logger" on-invalid="ignore" />
+        </service>
+
+        <service id="mailer.transport_factory.amazon" class="Symfony\Component\Mailer\Bridge\Amazon\Transport\SesTransportFactory" parent="mailer.transport_factory.abstract">
+            <tag name="mailer.transport_factory" />
+        </service>
+
+        <service id="mailer.transport_factory.gmail" class="Symfony\Component\Mailer\Bridge\Google\Transport\GmailTransportFactory" parent="mailer.transport_factory.abstract">
+            <tag name="mailer.transport_factory" />
+        </service>
+
+        <service id="mailer.transport_factory.mailchimp" class="Symfony\Component\Mailer\Bridge\Mailchimp\Transport\MandrillTransportFactory" parent="mailer.transport_factory.abstract">
+            <tag name="mailer.transport_factory" />
+        </service>
+
+        <service id="mailer.transport_factory.mailgun" class="Symfony\Component\Mailer\Bridge\Mailgun\Transport\MailgunTransportFactory" parent="mailer.transport_factory.abstract">
+            <tag name="mailer.transport_factory" />
+        </service>
+
+        <service id="mailer.transport_factory.postmark" class="Symfony\Component\Mailer\Bridge\Postmark\Transport\PostmarkTransportFactory" parent="mailer.transport_factory.abstract">
+            <tag name="mailer.transport_factory" />
+        </service>
+
+        <service id="mailer.transport_factory.sendgrid" class="Symfony\Component\Mailer\Bridge\Sendgrid\Transport\SendgridTransportFactory" parent="mailer.transport_factory.abstract">
+            <tag name="mailer.transport_factory" />
+        </service>
+
+        <service id="mailer.transport_factory.null" class="Symfony\Component\Mailer\Transport\NullTransportFactory" parent="mailer.transport_factory.abstract">
+            <tag name="mailer.transport_factory" />
+        </service>
+
+        <service id="mailer.transport_factory.sendmail" class="Symfony\Component\Mailer\Transport\SendmailTransportFactory" parent="mailer.transport_factory.abstract">
+            <tag name="mailer.transport_factory" />
+        </service>
+
+        <service id="mailer.transport_factory.smtp" class="Symfony\Component\Mailer\Transport\Smtp\EsmtpTransportFactory" parent="mailer.transport_factory.abstract">
+            <tag name="mailer.transport_factory" priority="-100" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/messenger.xml b/vendor/symfony/framework-bundle/Resources/config/messenger.xml
new file mode 100644
index 0000000000000000000000000000000000000000..839aba901b915db2e9ed567da3cc99902fa57472
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/messenger.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <!-- Asynchronous -->
+        <service id="messenger.senders_locator" class="Symfony\Component\Messenger\Transport\Sender\SendersLocator">
+            <argument type="collection" /> <!-- Per message senders map -->
+            <argument /> <!-- senders service locator -->
+        </service>
+        <service id="messenger.middleware.send_message" class="Symfony\Component\Messenger\Middleware\SendMessageMiddleware">
+            <tag name="monolog.logger" channel="messenger" />
+            <argument type="service" id="messenger.senders_locator" />
+            <argument type="service" id="event_dispatcher" />
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+
+        <!-- Message encoding/decoding -->
+        <service id="messenger.transport.symfony_serializer" class="Symfony\Component\Messenger\Transport\Serialization\Serializer">
+            <argument type="service" id="serializer" />
+            <argument /> <!-- Format -->
+            <argument type="collection" /> <!-- Context -->
+        </service>
+        <service id="Symfony\Component\Messenger\Transport\Serialization\SerializerInterface" alias="messenger.default_serializer" />
+
+        <service id="messenger.transport.native_php_serializer" class="Symfony\Component\Messenger\Transport\Serialization\PhpSerializer" />
+
+        <!-- Middleware -->
+        <service id="messenger.middleware.handle_message" class="Symfony\Component\Messenger\Middleware\HandleMessageMiddleware" abstract="true">
+            <tag name="monolog.logger" channel="messenger" />
+            <argument /> <!-- Bus handler resolver -->
+            <call method="setLogger">
+                <argument type="service" id="logger" on-invalid="ignore" />
+            </call>
+        </service>
+
+        <service id="messenger.middleware.add_bus_name_stamp_middleware" class="Symfony\Component\Messenger\Middleware\AddBusNameStampMiddleware" abstract="true" />
+
+        <service id="messenger.middleware.dispatch_after_current_bus" class="Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware" />
+
+        <service id="messenger.middleware.validation" class="Symfony\Component\Messenger\Middleware\ValidationMiddleware">
+            <argument type="service" id="validator" />
+        </service>
+
+        <service id="messenger.middleware.reject_redelivered_message_middleware" class="Symfony\Component\Messenger\Middleware\RejectRedeliveredMessageMiddleware" />
+
+        <service id="messenger.middleware.failed_message_processing_middleware" class="Symfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware" />
+
+        <service id="messenger.middleware.traceable" class="Symfony\Component\Messenger\Middleware\TraceableMiddleware" abstract="true">
+            <argument type="service" id="debug.stopwatch" />
+        </service>
+
+        <!-- Discovery -->
+        <service id="messenger.receiver_locator" class="Symfony\Component\DependencyInjection\ServiceLocator">
+            <tag name="container.service_locator" />
+            <argument type="collection" />
+        </service>
+
+        <!-- transports -->
+        <service id="messenger.transport_factory" class="Symfony\Component\Messenger\Transport\TransportFactory">
+            <argument type="tagged_iterator" tag="messenger.transport_factory" />
+        </service>
+
+        <service id="messenger.transport.amqp.factory" class="Symfony\Component\Messenger\Transport\AmqpExt\AmqpTransportFactory"/>
+
+        <service id="messenger.transport.redis.factory" class="Symfony\Component\Messenger\Transport\RedisExt\RedisTransportFactory"/>
+
+        <service id="messenger.transport.sync.factory" class="Symfony\Component\Messenger\Transport\Sync\SyncTransportFactory">
+            <tag name="messenger.transport_factory" />
+            <argument type="service" id="messenger.routable_message_bus" />
+        </service>
+
+        <service id="messenger.transport.in_memory.factory" class="Symfony\Component\Messenger\Transport\InMemoryTransportFactory">
+            <tag name="messenger.transport_factory" />
+            <tag name="kernel.reset" method="reset" />
+        </service>
+
+        <!-- retry -->
+        <service id="messenger.retry_strategy_locator" class="Symfony\Component\DependencyInjection\ServiceLocator">
+            <tag name="container.service_locator" />
+            <argument type="collection" />
+        </service>
+
+        <service id="messenger.retry.abstract_multiplier_retry_strategy" class="Symfony\Component\Messenger\Retry\MultiplierRetryStrategy" abstract="true">
+            <argument /> <!-- max retries -->
+            <argument /> <!-- delay ms -->
+            <argument /> <!-- multiplier -->
+            <argument /> <!-- max delay ms -->
+        </service>
+
+        <!-- worker event listeners -->
+        <service id="messenger.retry.send_failed_message_for_retry_listener" class="Symfony\Component\Messenger\EventListener\SendFailedMessageForRetryListener">
+            <tag name="kernel.event_subscriber" />
+            <tag name="monolog.logger" channel="messenger" />
+            <argument /> <!-- senders service locator -->
+            <argument type="service" id="messenger.retry_strategy_locator" />
+            <argument type="service" id="logger" on-invalid="ignore" />
+        </service>
+
+        <service id="messenger.failure.send_failed_message_to_failure_transport_listener" class="Symfony\Component\Messenger\EventListener\SendFailedMessageToFailureTransportListener">
+            <tag name="kernel.event_subscriber" />
+            <tag name="monolog.logger" channel="messenger" />
+            <argument /> <!-- Failure transport -->
+            <argument type="service" id="logger" on-invalid="ignore" />
+        </service>
+
+        <service id="messenger.listener.dispatch_pcntl_signal_listener" class="Symfony\Component\Messenger\EventListener\DispatchPcntlSignalListener">
+            <tag name="kernel.event_subscriber" />
+        </service>
+
+        <service id="messenger.listener.stop_worker_on_restart_signal_listener" class="Symfony\Component\Messenger\EventListener\StopWorkerOnRestartSignalListener">
+            <tag name="kernel.event_subscriber" />
+            <tag name="monolog.logger" channel="messenger" />
+            <argument type="service" id="cache.messenger.restart_workers_signal" />
+            <argument type="service" id="logger" on-invalid="ignore" />
+        </service>
+
+        <service id="messenger.listener.stop_worker_on_sigterm_signal_listener" class="Symfony\Component\Messenger\EventListener\StopWorkerOnSigtermSignalListener">
+            <tag name="kernel.event_subscriber" />
+        </service>
+
+        <!-- routable message bus -->
+        <service id="messenger.routable_message_bus" class="Symfony\Component\Messenger\RoutableMessageBus">
+            <argument /> <!-- Message bus locator -->
+            <argument type="service" id="messenger.default_bus" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/messenger_debug.xml b/vendor/symfony/framework-bundle/Resources/config/messenger_debug.xml
new file mode 100644
index 0000000000000000000000000000000000000000..96f43b3b33d790cd2143d3172a274cfe88db0b88
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/messenger_debug.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="data_collector.messenger" class="Symfony\Component\Messenger\DataCollector\MessengerDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/messenger.html.twig" id="messenger" priority="100" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/mime_type.xml b/vendor/symfony/framework-bundle/Resources/config/mime_type.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e91705d1c19ed42418ee72033bc0fd469fec623f
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/mime_type.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="mime_types" class="Symfony\Component\Mime\MimeTypes">
+            <call method="setDefault">
+                <argument type="service" id="mime_types" />
+            </call>
+        </service>
+        <service id="Symfony\Component\Mime\MimeTypesInterface" alias="mime_types" />
+        <service id="Symfony\Component\Mime\MimeTypeGuesserInterface" alias="mime_types" />
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/profiling.xml b/vendor/symfony/framework-bundle/Resources/config/profiling.xml
new file mode 100644
index 0000000000000000000000000000000000000000..166be86b2e20351b1aae4331e536ca556ff1db44
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/profiling.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="profiler" class="Symfony\Component\HttpKernel\Profiler\Profiler" public="true">
+            <tag name="monolog.logger" channel="profiler" />
+            <argument type="service" id="profiler.storage" />
+            <argument type="service" id="logger" on-invalid="null" />
+        </service>
+
+        <service id="profiler.storage" class="Symfony\Component\HttpKernel\Profiler\FileProfilerStorage">
+            <argument>%profiler.storage.dsn%</argument>
+        </service>
+
+        <service id="profiler_listener" class="Symfony\Component\HttpKernel\EventListener\ProfilerListener">
+            <tag name="kernel.event_subscriber" />
+            <argument type="service" id="profiler" />
+            <argument type="service" id="request_stack" />
+            <argument>null</argument>
+            <argument>%profiler_listener.only_exceptions%</argument>
+            <argument>%profiler_listener.only_master_requests%</argument>
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/property_access.xml b/vendor/symfony/framework-bundle/Resources/config/property_access.xml
new file mode 100644
index 0000000000000000000000000000000000000000..424f9f682d7960a5d10640f61ef0fb326e255259
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/property_access.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="property_accessor" class="Symfony\Component\PropertyAccess\PropertyAccessor">
+            <argument /> <!-- magicCall, set by the extension -->
+            <argument /> <!-- throwExceptionOnInvalidIndex, set by the extension -->
+            <argument type="service" id="cache.property_access" on-invalid="ignore" />
+            <argument /> <!-- throwExceptionOnInvalidPropertyPath, set by the extension -->
+        </service>
+        <service id="Symfony\Component\PropertyAccess\PropertyAccessorInterface" alias="property_accessor" />
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/property_info.xml b/vendor/symfony/framework-bundle/Resources/config/property_info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cd78d7f95ea563956f4fbc4663cd574b7f75e365
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/property_info.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="property_info" class="Symfony\Component\PropertyInfo\PropertyInfoExtractor">
+            <argument type="collection" />
+            <argument type="collection" />
+            <argument type="collection" />
+            <argument type="collection" />
+            <argument type="collection" />
+        </service>
+        <service id="Symfony\Component\PropertyInfo\PropertyAccessExtractorInterface" alias="property_info" />
+        <service id="Symfony\Component\PropertyInfo\PropertyDescriptionExtractorInterface" alias="property_info" />
+        <service id="Symfony\Component\PropertyInfo\PropertyInfoExtractorInterface" alias="property_info" />
+        <service id="Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface" alias="property_info" />
+        <service id="Symfony\Component\PropertyInfo\PropertyListExtractorInterface" alias="property_info" />
+        <service id="Symfony\Component\PropertyInfo\PropertyInitializableExtractorInterface" alias="property_info" />
+
+        <service id="property_info.cache" decorates="property_info" class="Symfony\Component\PropertyInfo\PropertyInfoCacheExtractor">
+            <argument type="service" id="property_info.cache.inner" />
+            <argument type="service" id="cache.property_info" />
+        </service>
+
+        <!-- Extractor -->
+        <service id="property_info.reflection_extractor" class="Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor">
+            <tag name="property_info.list_extractor" priority="-1000" />
+            <tag name="property_info.type_extractor" priority="-1002" />
+            <tag name="property_info.access_extractor" priority="-1000" />
+            <tag name="property_info.initializable_extractor" priority="-1000" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/request.xml b/vendor/symfony/framework-bundle/Resources/config/request.xml
new file mode 100644
index 0000000000000000000000000000000000000000..048b61ec466f07223856bdb6492d78e08dda8b01
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/request.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="request.add_request_formats_listener" class="Symfony\Component\HttpKernel\EventListener\AddRequestFormatsListener">
+            <tag name="kernel.event_subscriber" />
+            <argument/>
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/routing.xml b/vendor/symfony/framework-bundle/Resources/config/routing.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b85e9fa71d1ccffdca6965256ed4f6b6e3263bef
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/routing.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <parameter key="router.request_context.host">localhost</parameter>
+        <parameter key="router.request_context.scheme">http</parameter>
+        <parameter key="router.request_context.base_url"></parameter>
+    </parameters>
+
+    <services>
+        <defaults public="false" />
+
+        <service id="routing.resolver" class="Symfony\Component\Config\Loader\LoaderResolver" />
+
+        <service id="routing.loader.xml" class="Symfony\Component\Routing\Loader\XmlFileLoader">
+            <tag name="routing.loader" />
+            <argument type="service" id="file_locator" />
+        </service>
+
+        <service id="routing.loader.yml" class="Symfony\Component\Routing\Loader\YamlFileLoader">
+            <tag name="routing.loader" />
+            <argument type="service" id="file_locator" />
+        </service>
+
+        <service id="routing.loader.php" class="Symfony\Component\Routing\Loader\PhpFileLoader">
+            <tag name="routing.loader" />
+            <argument type="service" id="file_locator" />
+        </service>
+
+        <service id="routing.loader.glob" class="Symfony\Component\Routing\Loader\GlobFileLoader">
+            <tag name="routing.loader" />
+            <argument type="service" id="file_locator" />
+        </service>
+
+        <service id="routing.loader.directory" class="Symfony\Component\Routing\Loader\DirectoryLoader">
+            <tag name="routing.loader" />
+            <argument type="service" id="file_locator" />
+        </service>
+
+        <service id="routing.loader.service" class="Symfony\Component\Routing\Loader\DependencyInjection\ServiceRouterLoader">
+            <argument type="service" id="service_container" />
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.4, use "routing.loader.container" instead.</deprecated>
+        </service>
+
+        <service id="routing.loader.container" class="Symfony\Component\Routing\Loader\ContainerLoader">
+            <tag name="routing.loader" />
+            <argument type="service">
+                <service class="Symfony\Bundle\FrameworkBundle\Routing\LegacyRouteLoaderContainer">
+                    <argument type="service" id="service_container" />
+                    <argument type="tagged_locator" tag="routing.route_loader" />
+                </service>
+            </argument>
+        </service>
+
+        <service id="routing.loader" class="Symfony\Bundle\FrameworkBundle\Routing\DelegatingLoader" public="true">
+            <argument type="service" id="routing.resolver" />
+            <argument type="collection" />
+            <argument type="service" id=".legacy_controller_name_converter" /> <!-- deprecated since Symfony 4.4 -->
+        </service>
+
+        <service id="router.default" class="Symfony\Bundle\FrameworkBundle\Routing\Router">
+            <tag name="monolog.logger" channel="router" />
+            <tag name="container.service_subscriber" id="routing.loader" />
+            <argument type="service" id="Psr\Container\ContainerInterface" />
+            <argument>%router.resource%</argument>
+            <argument type="collection">
+                <argument key="cache_dir">%kernel.cache_dir%</argument>
+                <argument key="debug">%kernel.debug%</argument>
+                <argument key="generator_class">Symfony\Component\Routing\Generator\CompiledUrlGenerator</argument>
+                <argument key="generator_dumper_class">Symfony\Component\Routing\Generator\Dumper\CompiledUrlGeneratorDumper</argument>
+                <argument key="matcher_class">Symfony\Bundle\FrameworkBundle\Routing\RedirectableCompiledUrlMatcher</argument>
+                <argument key="matcher_dumper_class">Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper</argument>
+            </argument>
+            <argument type="service" id="router.request_context" on-invalid="ignore" />
+            <argument type="service" id="parameter_bag" on-invalid="ignore" />
+            <argument type="service" id="logger" on-invalid="ignore" />
+            <argument>%kernel.default_locale%</argument>
+            <call method="setConfigCacheFactory">
+                <argument type="service" id="config_cache_factory" />
+            </call>
+        </service>
+
+        <service id="router" alias="router.default" public="true" />
+        <service id="Symfony\Component\Routing\RouterInterface" alias="router" />
+        <service id="Symfony\Component\Routing\Generator\UrlGeneratorInterface" alias="router" />
+        <service id="Symfony\Component\Routing\Matcher\UrlMatcherInterface" alias="router" />
+        <service id="Symfony\Component\Routing\RequestContextAwareInterface" alias="router" />
+
+        <service id="router.request_context" class="Symfony\Component\Routing\RequestContext">
+            <argument>%router.request_context.base_url%</argument>
+            <argument>GET</argument>
+            <argument>%router.request_context.host%</argument>
+            <argument>%router.request_context.scheme%</argument>
+            <argument>%request_listener.http_port%</argument>
+            <argument>%request_listener.https_port%</argument>
+        </service>
+        <service id="Symfony\Component\Routing\RequestContext" alias="router.request_context" />
+
+        <service id="router.cache_warmer" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\RouterCacheWarmer">
+            <tag name="container.service_subscriber" id="router" />
+            <tag name="kernel.cache_warmer" />
+            <argument type="service" id="Psr\Container\ContainerInterface" />
+        </service>
+
+        <service id="router_listener" class="Symfony\Component\HttpKernel\EventListener\RouterListener">
+            <tag name="kernel.event_subscriber" />
+            <tag name="monolog.logger" channel="request" />
+            <argument type="service" id="router" />
+            <argument type="service" id="request_stack" />
+            <argument type="service" id="router.request_context" on-invalid="ignore" />
+            <argument type="service" id="logger" on-invalid="ignore" />
+            <argument>%kernel.project_dir%</argument>
+            <argument>%kernel.debug%</argument>
+        </service>
+
+        <service id="Symfony\Bundle\FrameworkBundle\Controller\RedirectController" public="true">
+            <argument type="service" id="router" />
+            <argument>%request_listener.http_port%</argument>
+            <argument>%request_listener.https_port%</argument>
+        </service>
+
+        <service id="Symfony\Bundle\FrameworkBundle\Controller\TemplateController" public="true">
+            <argument type="service" id="twig" on-invalid="ignore" />
+            <argument type="service" id="templating" on-invalid="ignore" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/routing/errors.xml b/vendor/symfony/framework-bundle/Resources/config/routing/errors.xml
new file mode 100644
index 0000000000000000000000000000000000000000..13a9cc4076c79b249272b9d2542d699b2dcc256a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/routing/errors.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/routing https://symfony.com/schema/routing/routing-1.0.xsd">
+
+    <route id="_preview_error" path="/{code}.{_format}">
+        <default key="_controller">error_controller::preview</default>
+        <default key="_format">html</default>
+        <requirement key="code">\d+</requirement>
+    </route>
+</routes>
diff --git a/vendor/symfony/framework-bundle/Resources/config/schema/symfony-1.0.xsd b/vendor/symfony/framework-bundle/Resources/config/schema/symfony-1.0.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..0d5e45f9c2b7e0c2b19cf056806d89283f618d18
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/schema/symfony-1.0.xsd
@@ -0,0 +1,597 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<xsd:schema xmlns="http://symfony.com/schema/dic/symfony"
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://symfony.com/schema/dic/symfony"
+    elementFormDefault="qualified">
+
+    <xsd:element name="config" type="config" />
+
+    <xsd:complexType name="config">
+        <xsd:choice maxOccurs="unbounded">
+            <xsd:element name="assets" type="assets" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="form" type="form" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="csrf-protection" type="csrf_protection" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="esi" type="esi" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="ssi" type="ssi" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="fragments" type="fragments" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="web-link" type="web_link" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="profiler" type="profiler" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="router" type="router" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="session" type="session" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="request" type="request" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="templating" type="templating" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="translator" type="translator" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="validation" type="validation" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="annotations" type="annotations" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="property-access" type="property_access" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="serializer" type="serializer" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="property-info" type="property_info" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="cache" type="cache" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="workflow" type="workflow" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="php-errors" type="php-errors" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="lock" type="lock" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="messenger" type="messenger" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="http-client" type="http_client" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="mailer" type="mailer" minOccurs="0" maxOccurs="1" />
+        </xsd:choice>
+
+        <xsd:attribute name="http-method-override" type="xsd:boolean" />
+        <xsd:attribute name="ide" type="xsd:string" />
+        <xsd:attribute name="secret" type="xsd:string" />
+        <xsd:attribute name="default-locale" type="xsd:string" />
+        <xsd:attribute name="test" type="xsd:boolean" />
+        <xsd:attribute name="error-controller" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="form">
+        <xsd:all>
+            <xsd:element name="csrf-protection" type="form_csrf_protection" minOccurs="0" maxOccurs="1" />
+        </xsd:all>
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="form_csrf_protection">
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+        <xsd:attribute name="field-name" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="csrf_protection">
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="esi">
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="ssi">
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="fragments">
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+        <xsd:attribute name="path" type="xsd:string" />
+        <xsd:attribute name="hinclude-default-template" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="web_link">
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="profiler">
+        <xsd:attribute name="collect" type="xsd:string" />
+        <xsd:attribute name="only-exceptions" type="xsd:string" />
+        <xsd:attribute name="only-master-requests" type="xsd:string" />
+        <xsd:attribute name="enabled" type="xsd:string" />
+        <xsd:attribute name="dsn" type="xsd:string" />
+        <xsd:attribute name="username" type="xsd:string" />
+        <xsd:attribute name="password" type="xsd:string" />
+        <xsd:attribute name="lifetime" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="router">
+        <xsd:attribute name="resource" type="xsd:string" />
+        <xsd:attribute name="type" type="xsd:string" />
+        <xsd:attribute name="http-port" type="xsd:string" />
+        <xsd:attribute name="https-port" type="xsd:string" />
+        <xsd:attribute name="strict-requirements" type="xsd:string" />
+        <xsd:attribute name="utf8" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="session">
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+        <xsd:attribute name="storage-id" type="xsd:string" />
+        <xsd:attribute name="handler-id" type="xsd:string" />
+        <xsd:attribute name="name" type="xsd:string" />
+        <xsd:attribute name="cookie-lifetime" type="xsd:string" />
+        <xsd:attribute name="cookie-path" type="xsd:string" />
+        <xsd:attribute name="cookie-domain" type="xsd:string" />
+        <xsd:attribute name="cookie-secure" type="cookie_secure" />
+        <xsd:attribute name="cookie-httponly" type="xsd:boolean" />
+        <xsd:attribute name="cookie-samesite" type="cookie_samesite" />
+        <xsd:attribute name="use-cookies" type="xsd:boolean" />
+        <xsd:attribute name="cache-limiter" type="xsd:string" />
+        <xsd:attribute name="gc-maxlifetime" type="xsd:string" />
+        <xsd:attribute name="gc-divisor" type="xsd:string" />
+        <xsd:attribute name="gc-probability" type="xsd:string" />
+        <xsd:attribute name="save-path" type="xsd:string" />
+        <xsd:attribute name="metadata-update-threshold" type="xsd:nonNegativeInteger" />
+        <xsd:attribute name="sid-length" type="sid_length" />
+        <xsd:attribute name="sid-bits-per-character" type="sid_bits_per_character" />
+    </xsd:complexType>
+
+    <xsd:complexType name="request">
+        <xsd:sequence>
+            <xsd:element name="format" type="format" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="format">
+        <xsd:choice minOccurs="1" maxOccurs="unbounded">
+            <xsd:element name="mime-type" type="xsd:string" />
+        </xsd:choice>
+        <xsd:attribute name="name" type="xsd:string" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="assets">
+        <xsd:sequence>
+            <xsd:element name="base-url" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="package" type="package" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+        <xsd:attribute name="base-path" type="xsd:string" />
+        <xsd:attribute name="version-strategy" type="xsd:string" />
+        <xsd:attribute name="version" type="xsd:string" />
+        <xsd:attribute name="version-format" type="xsd:string" />
+        <xsd:attribute name="json-manifest-path" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="package">
+        <xsd:sequence>
+            <xsd:element name="base-url" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+
+        <xsd:attribute name="name" type="xsd:string" use="required" />
+        <xsd:attribute name="base-path" type="xsd:string" />
+        <xsd:attribute name="version-strategy" type="xsd:string" />
+        <xsd:attribute name="version" type="xsd:string" />
+        <xsd:attribute name="version-format" type="xsd:string" />
+        <xsd:attribute name="json-manifest-path" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="templating">
+        <xsd:sequence>
+            <xsd:element name="loader" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="engine" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="form" type="form-resources" minOccurs="0" maxOccurs="1" />
+        </xsd:sequence>
+
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+        <xsd:attribute name="cache" type="xsd:string" />
+        <xsd:attribute name="hinclude-default-template" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="form-resources">
+        <xsd:choice minOccurs="1" maxOccurs="unbounded">
+            <xsd:element name="resource" type="xsd:string" />
+        </xsd:choice>
+    </xsd:complexType>
+
+    <xsd:complexType name="translator">
+        <xsd:sequence>
+            <xsd:element name="fallback" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="path" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+        <xsd:attribute name="fallback" type="xsd:string" />
+        <xsd:attribute name="logging" type="xsd:boolean" />
+        <xsd:attribute name="formatter" type="xsd:string" />
+        <xsd:attribute name="cache-dir" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="validation">
+        <xsd:choice minOccurs="0" maxOccurs="unbounded">
+            <xsd:element name="static-method" type="xsd:string" />
+            <xsd:element name="mapping" type="file_mapping" />
+            <xsd:element name="auto-mapping" type="auto_mapping" />
+        </xsd:choice>
+
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+        <xsd:attribute name="cache" type="xsd:string" />
+        <xsd:attribute name="enable-annotations" type="xsd:boolean" />
+        <xsd:attribute name="static-method" type="xsd:boolean" />
+        <xsd:attribute name="translation-domain" type="xsd:string" />
+        <xsd:attribute name="strict-email" type="xsd:boolean" />
+        <xsd:attribute name="email-validation-mode" type="email-validation-mode" />
+    </xsd:complexType>
+
+    <xsd:complexType name="file_mapping">
+        <xsd:sequence>
+            <xsd:element name="path" type="xsd:string" minOccurs="1" maxOccurs="unbounded" />
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="auto_mapping">
+        <xsd:sequence>
+            <xsd:element name="service" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="namespace" type="xsd:string" use="required" />
+    </xsd:complexType>
+
+    <xsd:simpleType name="email-validation-mode">
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="html5" />
+            <xsd:enumeration value="loose" />
+            <xsd:enumeration value="strict" />
+        </xsd:restriction>
+    </xsd:simpleType>
+
+    <xsd:complexType name="annotations">
+        <xsd:attribute name="cache" type="xsd:string" />
+        <xsd:attribute name="debug" type="xsd:string" />
+        <xsd:attribute name="file-cache-dir" type="xsd:string" />
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="property_access">
+        <xsd:attribute name="magic-call" type="xsd:boolean" />
+        <xsd:attribute name="throw-exception-on-invalid-index" type="xsd:boolean" />
+        <xsd:attribute name="throw-exception-on-invalid-property-path" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="serializer">
+        <xsd:choice minOccurs="0" maxOccurs="unbounded">
+            <xsd:element name="mapping" type="file_mapping" />
+        </xsd:choice>
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+        <xsd:attribute name="enable-annotations" type="xsd:boolean" />
+        <xsd:attribute name="name-converter" type="xsd:string" />
+        <xsd:attribute name="circular-reference-handler" type="xsd:string" />
+        <xsd:attribute name="max-depth-handler" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="property_info">
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="cache">
+        <xsd:sequence>
+            <xsd:element name="app" type="xsd:string" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="system" type="xsd:string" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="directory" type="xsd:string" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="default-doctrine-provider" type="xsd:string" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="default-psr6-provider" type="xsd:string" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="default-redis-provider" type="xsd:string" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="default-memcached-provider" type="xsd:string" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="default-pdo-provider" type="xsd:string" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="pool" type="cache_pool" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="app" type="xsd:string" />
+        <xsd:attribute name="system" type="xsd:string" />
+        <xsd:attribute name="directory" type="xsd:string" />
+        <xsd:attribute name="default-doctrine-provider" type="xsd:string" />
+        <xsd:attribute name="default-psr6-provider" type="xsd:string" />
+        <xsd:attribute name="default-redis-provider" type="xsd:string" />
+        <xsd:attribute name="default-memcached-provider" type="xsd:string" />
+        <xsd:attribute name="default-pdo-provider" type="xsd:string" />
+        <xsd:attribute name="prefix-seed" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="cache_pool">
+        <xsd:sequence>
+            <xsd:element name="adapter" type="cache_pool_adapter" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+
+        <xsd:attribute name="name" type="xsd:string" use="required" />
+        <xsd:attribute name="adapter" type="xsd:string" />
+        <xsd:attribute name="tags" type="xsd:string" />
+        <xsd:attribute name="public" type="xsd:boolean" />
+        <xsd:attribute name="default-lifetime" type="xsd:integer" />
+        <xsd:attribute name="provider" type="xsd:string" />
+        <xsd:attribute name="clearer" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="cache_pool_adapter">
+        <xsd:attribute name="name" type="xsd:string" use="required" />
+        <xsd:attribute name="provider" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="workflow">
+        <xsd:sequence>
+            <xsd:element name="initial-marking" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="marking-store" type="marking_store" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="support" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="place" type="place" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="transition" type="transition" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="name" type="xsd:string" />
+        <xsd:attribute name="type" type="workflow_type" />
+        <xsd:attribute name="initial-place" type="xsd:string" />
+        <xsd:attribute name="initial-marking" type="xsd:string" />
+        <xsd:attribute name="support-strategy" type="xsd:string" />
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="php-errors">
+        <xsd:attribute name="log" type="xsd:string" />
+        <xsd:attribute name="throw" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="marking_store">
+        <xsd:sequence>
+            <xsd:element name="argument" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="type" type="marking_store_type" />
+        <xsd:attribute name="service" type="xsd:string" />
+        <xsd:attribute name="property" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:simpleType name="marking_store_type">
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="multiple_state" />
+            <xsd:enumeration value="single_state" />
+            <xsd:enumeration value="method" />
+        </xsd:restriction>
+    </xsd:simpleType>
+
+    <xsd:complexType name="transition">
+        <xsd:sequence>
+            <xsd:element name="from" type="xsd:string" minOccurs="1" maxOccurs="unbounded" />
+            <xsd:element name="to" type="xsd:string" minOccurs="1" maxOccurs="unbounded" />
+            <xsd:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="guard" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="name" type="xsd:string" use="required" />
+    </xsd:complexType>
+
+    <xsd:complexType name="place" mixed="true">
+        <xsd:sequence>
+            <xsd:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="name" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="metadata">
+        <xsd:sequence>
+            <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:simpleType name="default_middleware">
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="true" />
+            <xsd:enumeration value="false" />
+            <xsd:enumeration value="1" />
+            <xsd:enumeration value="0" />
+            <xsd:enumeration value="allow_no_handlers" />
+        </xsd:restriction>
+    </xsd:simpleType>
+
+    <xsd:simpleType name="cookie_secure">
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="true" />
+            <xsd:enumeration value="false" />
+            <xsd:enumeration value="1" />
+            <xsd:enumeration value="0" />
+            <xsd:enumeration value="auto" />
+        </xsd:restriction>
+    </xsd:simpleType>
+
+    <xsd:simpleType name="cookie_samesite">
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="" />
+            <xsd:enumeration value="none" />
+            <xsd:enumeration value="lax" />
+            <xsd:enumeration value="strict" />
+        </xsd:restriction>
+    </xsd:simpleType>
+
+    <xsd:simpleType name="sid_bits_per_character">
+        <xsd:restriction base="xsd:positiveInteger">
+            <xsd:enumeration value="4" />
+            <xsd:enumeration value="5" />
+            <xsd:enumeration value="6" />
+        </xsd:restriction>
+    </xsd:simpleType>
+
+    <xsd:simpleType name="sid_length">
+        <xsd:restriction base="xsd:positiveInteger">
+            <xsd:minInclusive value="22" />
+            <xsd:maxInclusive value="256" />
+        </xsd:restriction>
+    </xsd:simpleType>
+
+    <xsd:simpleType name="workflow_type">
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="state_machine" />
+            <xsd:enumeration value="workflow" />
+        </xsd:restriction>
+    </xsd:simpleType>
+
+    <xsd:complexType name="lock">
+        <xsd:sequence>
+            <xsd:element name="resource" type="lock_resource" minOccurs="1" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+    </xsd:complexType>
+
+    <xsd:complexType name="lock_resource">
+        <xsd:simpleContent>
+            <xsd:extension base="xsd:string">
+                <xsd:attribute name="name" type="xsd:string" />
+            </xsd:extension>
+        </xsd:simpleContent>
+    </xsd:complexType>
+
+    <xsd:complexType name="messenger">
+        <xsd:sequence>
+            <xsd:element name="serializer" type="messenger_serializer" minOccurs="0" />
+            <xsd:element name="routing" type="messenger_routing" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="transport" type="messenger_transport" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="bus" type="messenger_bus" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="default-bus" type="xsd:string" />
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+        <xsd:attribute name="failure-transport" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="messenger_serializer">
+        <xsd:sequence>
+            <xsd:element name="symfony-serializer" type="messenger_symfony_serializer" minOccurs="0" />
+        </xsd:sequence>
+        <xsd:attribute name="default-serializer" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="messenger_symfony_serializer">
+        <xsd:sequence>
+            <xsd:element name="context" type="metadata" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="format" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="messenger_routing">
+        <xsd:choice minOccurs="0" maxOccurs="unbounded">
+            <xsd:element name="sender" type="messenger_routing_sender" />
+        </xsd:choice>
+        <xsd:attribute name="message-class" type="xsd:string" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="messenger_routing_sender">
+        <xsd:attribute name="service" type="xsd:string" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="messenger_transport">
+        <xsd:sequence>
+            <xsd:element name="options" type="metadata" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="retry-strategy" type="messenger_retry_strategy" minOccurs="0" maxOccurs="1" />
+        </xsd:sequence>
+        <xsd:attribute name="name" type="xsd:string" />
+        <xsd:attribute name="serializer" type="xsd:string" />
+        <xsd:attribute name="dsn" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="messenger_retry_strategy">
+        <xsd:attribute name="service" type="xsd:string" />
+        <xsd:attribute name="max-retries" type="xsd:integer" />
+        <xsd:attribute name="delay" type="xsd:integer" />
+        <xsd:attribute name="multiplier" type="xsd:float" />
+        <xsd:attribute name="max-delay" type="xsd:float" />
+    </xsd:complexType>
+
+    <xsd:complexType name="messenger_bus">
+        <xsd:sequence>
+            <xsd:element name="middleware" type="messenger_middleware" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="name" type="xsd:string" use="required"/>
+        <xsd:attribute name="default-middleware" type="default_middleware"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="messenger_middleware">
+        <xsd:sequence>
+            <xsd:element name="argument" type="xsd:anyType" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="id" type="xsd:string" use="required"/>
+    </xsd:complexType>
+
+    <xsd:complexType name="http_client">
+        <xsd:sequence>
+            <xsd:element name="default-options" type="http_client_default_options" minOccurs="0" />
+            <xsd:element name="scoped-client" type="http_client_scope_options" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="enabled" type="xsd:boolean" />
+        <xsd:attribute name="max-host-connections" type="xsd:integer" />
+    </xsd:complexType>
+
+    <xsd:complexType name="http_client_default_options" mixed="true">
+        <xsd:choice maxOccurs="unbounded">
+            <xsd:element name="resolve" type="http_resolve" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="header" type="http_header" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="peer-fingerprint" type="fingerprint" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:choice>
+        <xsd:attribute name="max-redirects" type="xsd:integer" />
+        <xsd:attribute name="http-version" type="xsd:string" />
+        <xsd:attribute name="proxy" type="xsd:string" />
+        <xsd:attribute name="no-proxy" type="xsd:string" />
+        <xsd:attribute name="timeout" type="xsd:float" />
+        <xsd:attribute name="max-duration" type="xsd:float" />
+        <xsd:attribute name="bindto" type="xsd:string" />
+        <xsd:attribute name="verify-peer" type="xsd:boolean" />
+        <xsd:attribute name="verify-host" type="xsd:boolean" />
+        <xsd:attribute name="cafile" type="xsd:string" />
+        <xsd:attribute name="capath" type="xsd:string" />
+        <xsd:attribute name="local-cert" type="xsd:string" />
+        <xsd:attribute name="local-pk" type="xsd:string" />
+        <xsd:attribute name="passphrase" type="xsd:string" />
+        <xsd:attribute name="ciphers" type="xsd:string" />
+
+    </xsd:complexType>
+
+    <xsd:complexType name="http_client_scope_options" mixed="true">
+        <xsd:choice maxOccurs="unbounded">
+            <xsd:element name="query" type="http_query" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="resolve" type="http_resolve" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="header" type="http_header" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="peer-fingerprint" type="fingerprint" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:choice>
+        <xsd:attribute name="name" type="xsd:string" />
+        <xsd:attribute name="scope" type="xsd:string" />
+        <xsd:attribute name="base-uri" type="xsd:string" />
+        <xsd:attribute name="auth-basic" type="xsd:string" />
+        <xsd:attribute name="auth-bearer" type="xsd:string" />
+        <xsd:attribute name="max-redirects" type="xsd:integer" />
+        <xsd:attribute name="http-version" type="xsd:string" />
+        <xsd:attribute name="proxy" type="xsd:string" />
+        <xsd:attribute name="no-proxy" type="xsd:string" />
+        <xsd:attribute name="timeout" type="xsd:float" />
+        <xsd:attribute name="bindto" type="xsd:string" />
+        <xsd:attribute name="verify-peer" type="xsd:boolean" />
+        <xsd:attribute name="verify-host" type="xsd:boolean" />
+        <xsd:attribute name="cafile" type="xsd:string" />
+        <xsd:attribute name="capath" type="xsd:string" />
+        <xsd:attribute name="local-cert" type="xsd:string" />
+        <xsd:attribute name="local-pk" type="xsd:string" />
+        <xsd:attribute name="passphrase" type="xsd:string" />
+        <xsd:attribute name="ciphers" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="fingerprint">
+        <xsd:choice maxOccurs="unbounded">
+            <xsd:element name="pin-sha256" type="xsd:string" minOccurs="0" />
+            <xsd:element name="sha1" type="xsd:string" minOccurs="0" />
+            <xsd:element name="md5" type="xsd:string" minOccurs="0" />
+        </xsd:choice>
+    </xsd:complexType>
+
+    <xsd:complexType name="http_query" mixed="true">
+        <xsd:attribute name="key" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="http_resolve" mixed="true">
+        <xsd:attribute name="host" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="http_header" mixed="true">
+        <xsd:attribute name="name" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="mailer">
+        <xsd:sequence>
+            <xsd:element name="transport" type="mailer_transport" minOccurs="0" maxOccurs="unbounded" />
+            <xsd:element name="envelope" type="mailer_envelope" minOccurs="0" maxOccurs="1" />
+        </xsd:sequence>
+        <xsd:attribute name="dsn" type="xsd:string" />
+    </xsd:complexType>
+
+    <xsd:complexType name="mailer_transport" mixed="true">
+        <xsd:attribute name="name" type="xsd:string" use="required" />
+    </xsd:complexType>
+
+    <xsd:complexType name="mailer_envelope">
+        <xsd:sequence>
+            <xsd:element name="sender" type="xsd:string" minOccurs="0" maxOccurs="1" />
+            <xsd:element name="recipients" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+    </xsd:complexType>
+</xsd:schema>
diff --git a/vendor/symfony/framework-bundle/Resources/config/secrets.xml b/vendor/symfony/framework-bundle/Resources/config/secrets.xml
new file mode 100644
index 0000000000000000000000000000000000000000..65fd1073fd46fe27827ab3cdb282ca5876b9926c
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/secrets.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <service id="secrets.vault" class="Symfony\Bundle\FrameworkBundle\Secrets\SodiumVault">
+            <tag name="container.env_var_loader" />
+            <argument />
+            <argument />
+        </service>
+
+        <service id="secrets.local_vault" class="Symfony\Bundle\FrameworkBundle\Secrets\DotenvVault">
+            <argument />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/security_csrf.xml b/vendor/symfony/framework-bundle/Resources/config/security_csrf.xml
new file mode 100644
index 0000000000000000000000000000000000000000..eefe6ad73601f71eb05b1b380a90f35d9d2a8d25
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/security_csrf.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="security.csrf.token_generator" class="Symfony\Component\Security\Csrf\TokenGenerator\UriSafeTokenGenerator" />
+        <service id="Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface" alias="security.csrf.token_generator" />
+
+        <service id="security.csrf.token_storage" class="Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage">
+            <argument type="service" id="session" />
+        </service>
+        <service id="Symfony\Component\Security\Csrf\TokenStorage\TokenStorageInterface" alias="security.csrf.token_storage" />
+
+        <service id="security.csrf.token_manager" class="Symfony\Component\Security\Csrf\CsrfTokenManager" public="true">
+            <argument type="service" id="security.csrf.token_generator" />
+            <argument type="service" id="security.csrf.token_storage" />
+            <argument type="service" id="request_stack" on-invalid="ignore" />
+        </service>
+        <service id="Symfony\Component\Security\Csrf\CsrfTokenManagerInterface" alias="security.csrf.token_manager" />
+
+        <service id="twig.runtime.security_csrf" class="Symfony\Bridge\Twig\Extension\CsrfRuntime">
+            <tag name="twig.runtime" />
+            <argument type="service" id="security.csrf.token_manager" />
+        </service>
+
+        <service id="twig.extension.security_csrf" class="Symfony\Bridge\Twig\Extension\CsrfExtension">
+            <tag name="twig.extension" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/serializer.xml b/vendor/symfony/framework-bundle/Resources/config/serializer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..19defd885259c1a8641e7ad7b912e7ef607e9ffe
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/serializer.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <parameter key="serializer.mapping.cache.file">%kernel.cache_dir%/serialization.php</parameter>
+    </parameters>
+
+    <services>
+        <defaults public="false" />
+
+        <service id="serializer" class="Symfony\Component\Serializer\Serializer" public="true">
+            <argument type="collection" />
+            <argument type="collection" />
+        </service>
+        <service id="Symfony\Component\Serializer\SerializerInterface" alias="serializer" />
+        <service id="Symfony\Component\Serializer\Normalizer\NormalizerInterface" alias="serializer" />
+        <service id="Symfony\Component\Serializer\Normalizer\DenormalizerInterface" alias="serializer" />
+        <service id="Symfony\Component\Serializer\Encoder\EncoderInterface" alias="serializer" />
+        <service id="Symfony\Component\Serializer\Encoder\DecoderInterface" alias="serializer" />
+
+        <service id="serializer.property_accessor" alias="property_accessor" />
+
+        <!-- Discriminator Map -->
+        <service id="serializer.mapping.class_discriminator_resolver" class="Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata">
+            <argument type="service" id="serializer.mapping.class_metadata_factory" />
+        </service>
+        <service id="Symfony\Component\Serializer\Mapping\ClassDiscriminatorResolverInterface" alias="serializer.mapping.class_discriminator_resolver" />
+
+        <!-- Normalizer -->
+        <service id="serializer.normalizer.constraint_violation_list" class="Symfony\Component\Serializer\Normalizer\ConstraintViolationListNormalizer">
+            <argument type="collection" />
+            <argument type="service" id="serializer.name_converter.metadata_aware" />
+            <!-- Run before serializer.normalizer.object -->
+            <tag name="serializer.normalizer" priority="-915" />
+        </service>
+
+        <service id="serializer.normalizer.datetimezone" class="Symfony\Component\Serializer\Normalizer\DateTimeZoneNormalizer">
+            <!-- Run before serializer.normalizer.object -->
+            <tag name="serializer.normalizer" priority="-915" />
+        </service>
+
+        <service id="serializer.normalizer.dateinterval" class="Symfony\Component\Serializer\Normalizer\DateIntervalNormalizer">
+            <!-- Run before serializer.normalizer.object -->
+            <tag name="serializer.normalizer" priority="-915" />
+        </service>
+
+        <service id="serializer.normalizer.data_uri" class="Symfony\Component\Serializer\Normalizer\DataUriNormalizer">
+            <argument type="service" id="mime_types" on-invalid="null" />
+            <!-- Run before serializer.normalizer.object -->
+            <tag name="serializer.normalizer" priority="-920" />
+        </service>
+
+        <service id="serializer.normalizer.datetime" class="Symfony\Component\Serializer\Normalizer\DateTimeNormalizer">
+            <!-- Run before serializer.normalizer.object -->
+            <tag name="serializer.normalizer" priority="-910" />
+        </service>
+
+        <service id="serializer.normalizer.json_serializable" class="Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer">
+            <!-- Run before serializer.normalizer.object -->
+            <tag name="serializer.normalizer" priority="-950" />
+        </service>
+
+        <service id="serializer.normalizer.problem" class="Symfony\Component\Serializer\Normalizer\ProblemNormalizer">
+            <argument>%kernel.debug%</argument>
+            <!-- Run before serializer.normalizer.object -->
+            <tag name="serializer.normalizer" priority="-890" />
+        </service>
+
+        <service id="serializer.normalizer.object" class="Symfony\Component\Serializer\Normalizer\ObjectNormalizer">
+            <argument type="service" id="serializer.mapping.class_metadata_factory" />
+            <argument type="service" id="serializer.name_converter.metadata_aware" />
+            <argument type="service" id="serializer.property_accessor" />
+            <argument type="service" id="property_info" on-invalid="ignore" />
+            <argument type="service" id="serializer.mapping.class_discriminator_resolver" on-invalid="ignore" />
+            <argument>null</argument>
+            <argument type="collection" />
+
+            <!-- Run after all custom normalizers -->
+            <tag name="serializer.normalizer" priority="-1000" />
+        </service>
+        <service id="Symfony\Component\Serializer\Normalizer\ObjectNormalizer" alias="serializer.normalizer.object" />
+
+        <service id="serializer.denormalizer.array" class="Symfony\Component\Serializer\Normalizer\ArrayDenormalizer">
+            <!-- Run before the object normalizer -->
+            <tag name="serializer.normalizer" priority="-990" />
+        </service>
+
+        <!-- Loader -->
+        <service id="serializer.mapping.chain_loader" class="Symfony\Component\Serializer\Mapping\Loader\LoaderChain">
+            <argument type="collection" />
+        </service>
+
+        <!-- Class Metadata Factory -->
+        <service id="serializer.mapping.class_metadata_factory" class="Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory">
+            <argument type="service" id="serializer.mapping.chain_loader" />
+        </service>
+
+        <service id="Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface" alias="serializer.mapping.class_metadata_factory" />
+
+        <!-- Cache -->
+        <service id="serializer.mapping.cache_warmer" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\SerializerCacheWarmer">
+            <argument type="collection" /><!-- Loaders injected by the extension -->
+            <argument>%serializer.mapping.cache.file%</argument>
+            <tag name="kernel.cache_warmer" />
+        </service>
+
+        <service id="serializer.mapping.cache.symfony" class="Psr\Cache\CacheItemPoolInterface">
+            <factory class="Symfony\Component\Cache\Adapter\PhpArrayAdapter" method="create" />
+            <argument>%serializer.mapping.cache.file%</argument>
+            <argument type="service" id="cache.serializer" />
+        </service>
+
+        <service id="serializer.mapping.cache_class_metadata_factory" decorates="serializer.mapping.class_metadata_factory" class="Symfony\Component\Serializer\Mapping\Factory\CacheClassMetadataFactory">
+            <argument type="service" id="serializer.mapping.cache_class_metadata_factory.inner" />
+            <argument type="service" id="serializer.mapping.cache.symfony" />
+        </service>
+
+        <!-- Encoders -->
+        <service id="serializer.encoder.xml" class="Symfony\Component\Serializer\Encoder\XmlEncoder">
+            <tag name="serializer.encoder" />
+        </service>
+
+        <service id="serializer.encoder.json" class="Symfony\Component\Serializer\Encoder\JsonEncoder">
+            <tag name="serializer.encoder" />
+        </service>
+
+        <service id="serializer.encoder.yaml" class="Symfony\Component\Serializer\Encoder\YamlEncoder">
+            <tag name="serializer.encoder" />
+        </service>
+
+        <service id="serializer.encoder.csv" class="Symfony\Component\Serializer\Encoder\CsvEncoder">
+            <tag name="serializer.encoder" />
+        </service>
+
+        <!-- Name converter -->
+        <service id="serializer.name_converter.camel_case_to_snake_case" class="Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter" />
+
+        <service id="serializer.name_converter.metadata_aware" class="Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter" >
+            <argument type="service" id="serializer.mapping.class_metadata_factory"/>
+        </service>
+
+        <!-- PropertyInfo extractor -->
+        <service id="property_info.serializer_extractor" class="Symfony\Component\PropertyInfo\Extractor\SerializerExtractor">
+            <argument type="service" id="serializer.mapping.class_metadata_factory" />
+
+            <tag name="property_info.list_extractor" priority="-999" />
+        </service>
+
+        <!-- ErrorRenderer integration -->
+        <service id="error_renderer" alias="error_renderer.serializer" />
+        <service id="error_renderer.serializer" alias="error_handler.error_renderer.serializer" />
+        <service id="error_handler.error_renderer.serializer" class="Symfony\Component\ErrorHandler\ErrorRenderer\SerializerErrorRenderer">
+            <argument type="service" id="serializer" />
+            <argument type="service">
+                <service>
+                    <factory class="Symfony\Component\ErrorHandler\ErrorRenderer\SerializerErrorRenderer" method="getPreferredFormat" />
+                    <argument type="service" id="request_stack" />
+                </service>
+            </argument>
+            <argument type="service" id="error_renderer.html" />
+            <argument type="service">
+                <service>
+                    <factory class="Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer" method="isDebug" />
+                    <argument type="service" id="request_stack" />
+                    <argument>%kernel.debug%</argument>
+                </service>
+            </argument>
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/services.xml b/vendor/symfony/framework-bundle/Resources/config/services.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5d8508f97dbe9e071ae057fa440358f0f985ab50
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/services.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <!-- this parameter is used at compile time in RegisterListenersPass -->
+        <parameter key="event_dispatcher.event_aliases" type="collection">
+            <parameter key="Symfony\Component\Console\Event\ConsoleCommandEvent">console.command</parameter>
+            <parameter key="Symfony\Component\Console\Event\ConsoleErrorEvent">console.error</parameter>
+            <parameter key="Symfony\Component\Console\Event\ConsoleTerminateEvent">console.terminate</parameter>
+            <parameter key="Symfony\Component\Form\Event\PreSubmitEvent">form.pre_submit</parameter>
+            <parameter key="Symfony\Component\Form\Event\SubmitEvent">form.submit</parameter>
+            <parameter key="Symfony\Component\Form\Event\PostSubmitEvent">form.post_submit</parameter>
+            <parameter key="Symfony\Component\Form\Event\PreSetDataEvent">form.pre_set_data</parameter>
+            <parameter key="Symfony\Component\Form\Event\PostSetDataEvent">form.post_set_data</parameter>
+            <parameter key="Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent">kernel.controller_arguments</parameter>
+            <parameter key="Symfony\Component\HttpKernel\Event\ControllerEvent">kernel.controller</parameter>
+            <parameter key="Symfony\Component\HttpKernel\Event\ResponseEvent">kernel.response</parameter>
+            <parameter key="Symfony\Component\HttpKernel\Event\FinishRequestEvent">kernel.finish_request</parameter>
+            <parameter key="Symfony\Component\HttpKernel\Event\RequestEvent">kernel.request</parameter>
+            <parameter key="Symfony\Component\HttpKernel\Event\ViewEvent">kernel.view</parameter>
+            <parameter key="Symfony\Component\HttpKernel\Event\ExceptionEvent">kernel.exception</parameter>
+            <parameter key="Symfony\Component\HttpKernel\Event\TerminateEvent">kernel.terminate</parameter>
+            <parameter key="Symfony\Component\Workflow\Event\GuardEvent">workflow.guard</parameter>
+            <parameter key="Symfony\Component\Workflow\Event\LeaveEvent">workflow.leave</parameter>
+            <parameter key="Symfony\Component\Workflow\Event\TransitionEvent">workflow.transition</parameter>
+            <parameter key="Symfony\Component\Workflow\Event\EnterEvent">workflow.enter</parameter>
+            <parameter key="Symfony\Component\Workflow\Event\EnteredEvent">workflow.entered</parameter>
+            <parameter key="Symfony\Component\Workflow\Event\CompletedEvent">workflow.completed</parameter>
+            <parameter key="Symfony\Component\Workflow\Event\AnnounceEvent">workflow.announce</parameter>
+        </parameter>
+    </parameters>
+    <services>
+        <defaults public="false" />
+
+        <service id="parameter_bag" class="Symfony\Component\DependencyInjection\ParameterBag\ContainerBag">
+            <argument type="service" id="service_container" />
+        </service>
+        <service id="Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface" alias="parameter_bag" />
+        <service id="Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface" alias="parameter_bag" />
+
+        <service id="event_dispatcher" class="Symfony\Component\EventDispatcher\EventDispatcher" public="true">
+            <tag name="container.hot_path" />
+        </service>
+        <service id="Symfony\Component\EventDispatcher\EventDispatcherInterface" alias="event_dispatcher" />
+        <service id="Symfony\Contracts\EventDispatcher\EventDispatcherInterface" alias="event_dispatcher" />
+
+        <service id="http_kernel" class="Symfony\Component\HttpKernel\HttpKernel" public="true">
+            <argument type="service" id="event_dispatcher" />
+            <argument type="service" id="controller_resolver" />
+            <argument type="service" id="request_stack" />
+            <argument type="service" id="argument_resolver" />
+            <tag name="container.hot_path" />
+        </service>
+        <service id="Symfony\Component\HttpKernel\HttpKernelInterface" alias="http_kernel" />
+
+        <service id="request_stack" class="Symfony\Component\HttpFoundation\RequestStack" public="true" />
+        <service id="Symfony\Component\HttpFoundation\RequestStack" alias="request_stack" />
+
+        <service id="url_helper" class="Symfony\Component\HttpFoundation\UrlHelper">
+            <argument type="service" id="request_stack" />
+            <argument type="service" id="router.request_context" on-invalid="ignore" />
+        </service>
+        <service id="Symfony\Component\HttpFoundation\UrlHelper" alias="url_helper" />
+
+        <service id="cache_warmer" class="Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate" public="true">
+            <argument type="tagged_iterator" tag="kernel.cache_warmer" />
+            <argument>%kernel.debug%</argument>
+            <argument>%kernel.cache_dir%/%kernel.container_class%Deprecations.log</argument>
+        </service>
+
+        <service id="cache_clearer" class="Symfony\Component\HttpKernel\CacheClearer\ChainCacheClearer" public="true">
+            <argument type="tagged_iterator" tag="kernel.cache_clearer" />
+        </service>
+
+        <service id="kernel" synthetic="true" public="true" />
+        <service id="Symfony\Component\HttpKernel\KernelInterface" alias="kernel" />
+
+        <service id="filesystem" class="Symfony\Component\Filesystem\Filesystem" public="true" />
+        <service id="Symfony\Component\Filesystem\Filesystem" alias="filesystem" />
+
+        <service id="file_locator" class="Symfony\Component\HttpKernel\Config\FileLocator">
+            <argument type="service" id="kernel" />
+            <argument>%kernel.root_dir%/Resources</argument>
+            <argument type="collection">
+                <argument>%kernel.root_dir%</argument>
+            </argument>
+            <argument>false</argument>
+        </service>
+        <service id="Symfony\Component\HttpKernel\Config\FileLocator" alias="file_locator" />
+
+        <service id="uri_signer" class="Symfony\Component\HttpKernel\UriSigner">
+            <argument>%kernel.secret%</argument>
+        </service>
+
+        <service id="config_cache_factory" class="Symfony\Component\Config\ResourceCheckerConfigCacheFactory">
+            <argument type="tagged_iterator" tag="config_cache.resource_checker" />
+        </service>
+
+        <service id="dependency_injection.config.container_parameters_resource_checker" class="Symfony\Component\DependencyInjection\Config\ContainerParametersResourceChecker">
+            <argument type="service" id="service_container" />
+            <tag name="config_cache.resource_checker" priority="-980" />
+        </service>
+
+        <service id="config.resource.self_checking_resource_checker" class="Symfony\Component\Config\Resource\SelfCheckingResourceChecker">
+            <tag name="config_cache.resource_checker" priority="-990" />
+        </service>
+
+        <service id="services_resetter" class="Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter" public="true" />
+
+        <service id="reverse_container" class="Symfony\Component\DependencyInjection\ReverseContainer">
+            <argument type="service" id="service_container" />
+            <argument type="service_locator" />
+        </service>
+        <service id="Symfony\Component\DependencyInjection\ReverseContainer" alias="reverse_container" />
+
+        <service id="locale_aware_listener" class="Symfony\Component\HttpKernel\EventListener\LocaleAwareListener">
+            <argument type="collection" /> <!-- locale aware services -->
+            <argument type="service" id="request_stack" />
+            <tag name="kernel.event_subscriber" />
+        </service>
+
+        <service id="container.env_var_processor" class="Symfony\Component\DependencyInjection\EnvVarProcessor">
+            <tag name="container.env_var_processor" />
+            <argument type="service" id="service_container" />
+            <argument type="tagged_iterator" tag="container.env_var_loader" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/session.xml b/vendor/symfony/framework-bundle/Resources/config/session.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c9b17f311f5761863a7c7bc3b3c97a07fb6c7129
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/session.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <parameter key="session.metadata.storage_key">_sf2_meta</parameter>
+    </parameters>
+
+    <services>
+        <defaults public="false" />
+
+        <service id="session" class="Symfony\Component\HttpFoundation\Session\Session" public="true">
+            <argument type="service" id="session.storage" />
+        </service>
+
+        <service id="Symfony\Component\HttpFoundation\Session\SessionInterface" alias="session" />
+        <service id="Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface" alias="session.storage" />
+        <service id="SessionHandlerInterface" alias="session.handler" />
+
+        <service id="session.storage.metadata_bag" class="Symfony\Component\HttpFoundation\Session\Storage\MetadataBag">
+            <argument>%session.metadata.storage_key%</argument>
+            <argument>%session.metadata.update_threshold%</argument>
+        </service>
+
+        <service id="session.storage.native" class="Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage">
+            <argument>%session.storage.options%</argument>
+            <argument type="service" id="session.handler" />
+            <argument type="service" id="session.storage.metadata_bag" />
+        </service>
+
+        <service id="session.storage.php_bridge" class="Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage">
+            <argument type="service" id="session.handler" />
+            <argument type="service" id="session.storage.metadata_bag" />
+        </service>
+
+        <service id="session.flash_bag" class="Symfony\Component\HttpFoundation\Session\Flash\FlashBag">
+            <factory service="session" method="getFlashBag"/>
+        </service>
+        <service id="Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface" alias="session.flash_bag" />
+
+        <service id="session.attribute_bag" class="Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag">
+            <factory service="session" method="getBag"/>
+            <argument>attributes</argument>
+        </service>
+
+        <service id="session.storage.mock_file" class="Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage">
+            <argument>%kernel.cache_dir%/sessions</argument>
+            <argument>MOCKSESSID</argument>
+            <argument type="service" id="session.storage.metadata_bag" />
+        </service>
+
+        <service id="session.handler.native_file" class="Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler">
+            <argument type="service">
+                <service class="Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeFileSessionHandler">
+                    <argument>%session.save_path%</argument>
+                </service>
+            </argument>
+        </service>
+
+        <service id="session.abstract_handler" class="Symfony\Component\HttpFoundation\Session\Storage\Handler\AbstractSessionHandler">
+            <factory class="Symfony\Component\HttpFoundation\Session\Storage\Handler\SessionHandlerFactory" method="createHandler" />
+            <argument />
+        </service>
+
+        <service id="session_listener" class="Symfony\Component\HttpKernel\EventListener\SessionListener">
+            <tag name="kernel.event_subscriber" />
+            <argument type="service_locator">
+                <argument key="session" type="service" id="session" on-invalid="ignore" />
+                <argument key="initialized_session" type="service" id="session" on-invalid="ignore_uninitialized" />
+            </argument>
+        </service>
+
+        <service id="session.save_listener" class="Symfony\Component\HttpKernel\EventListener\SaveSessionListener">
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.1. Use the "session_listener" service instead.</deprecated>
+        </service>
+
+        <!-- for BC -->
+        <service id="session.storage.filesystem" alias="session.storage.mock_file" />
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/ssi.xml b/vendor/symfony/framework-bundle/Resources/config/ssi.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b4e5b3d3df899cab7f0db5ad4c8eccc70f64336a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/ssi.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="ssi" class="Symfony\Component\HttpKernel\HttpCache\Ssi" />
+
+        <service id="ssi_listener" class="Symfony\Component\HttpKernel\EventListener\SurrogateListener">
+            <tag name="kernel.event_subscriber" />
+            <argument type="service" id="ssi" on-invalid="ignore" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/templating.xml b/vendor/symfony/framework-bundle/Resources/config/templating.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b6b70be999de89f09a89bbe718b133e473ae69dd
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/templating.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="templating.engine.delegating" class="Symfony\Bundle\FrameworkBundle\Templating\DelegatingEngine">
+            <argument type="service" id="service_container" />
+            <argument type="collection" /> <!-- engines -->
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.name_parser" class="Symfony\Bundle\FrameworkBundle\Templating\TemplateNameParser">
+            <argument type="service" id="kernel" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.filename_parser" class="Symfony\Bundle\FrameworkBundle\Templating\TemplateFilenameParser" />
+
+        <service id="templating.locator" class="Symfony\Bundle\FrameworkBundle\Templating\Loader\TemplateLocator">
+            <argument type="service" id="file_locator" />
+            <argument>%kernel.cache_dir%</argument>
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.finder" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\TemplateFinder">
+            <argument type="service" id="kernel" />
+            <argument type="service" id="templating.filename_parser" />
+            <argument>%kernel.root_dir%/Resources</argument>
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.cache_warmer.template_paths" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\TemplatePathsCacheWarmer">
+            <tag name="kernel.cache_warmer" priority="20" />
+            <argument type="service" id="templating.finder" />
+            <argument type="service" id="templating.locator" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.loader.filesystem" class="Symfony\Bundle\FrameworkBundle\Templating\Loader\FilesystemLoader">
+            <argument type="service" id="templating.locator" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.loader.cache" class="Symfony\Component\Templating\Loader\CacheLoader">
+            <argument type="service" id="templating.loader.wrapped" />
+            <argument>%templating.loader.cache.path%</argument>
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.loader.chain" class="Symfony\Component\Templating\Loader\ChainLoader">
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.loader" alias="templating.loader.filesystem" public="true" />
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/templating_debug.xml b/vendor/symfony/framework-bundle/Resources/config/templating_debug.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3dd7b84c123baa18f6f3a584b3c4900411ede4c0
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/templating_debug.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="debug.templating.engine.php" class="Symfony\Bundle\FrameworkBundle\Templating\TimedPhpEngine">
+            <argument type="service" id="templating.name_parser" />
+            <argument type="service" id="templating.engine.php.helpers_locator" />
+            <argument type="service" id="templating.loader" />
+            <argument type="service" id="debug.stopwatch" />
+            <argument type="service" id="templating.globals" />
+            <call method="setCharset"><argument>%kernel.charset%</argument></call>
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/templating_php.xml b/vendor/symfony/framework-bundle/Resources/config/templating_php.xml
new file mode 100644
index 0000000000000000000000000000000000000000..440b9a5d232983a405dc9700baaf5d7e7e338455
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/templating_php.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="templating.engine.php" class="Symfony\Bundle\FrameworkBundle\Templating\PhpEngine">
+            <argument type="service" id="templating.name_parser" />
+            <argument type="service" id="templating.engine.php.helpers_locator" />
+            <argument type="service" id="templating.loader" />
+            <argument type="service" id="templating.globals" />
+            <call method="setCharset"><argument>%kernel.charset%</argument></call>
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.engine.php.helpers_locator">
+            <tag name="container.service_locator" />
+            <argument type="collection" />
+        </service>
+
+        <service id="templating.helper.slots" class="Symfony\Component\Templating\Helper\SlotsHelper">
+            <tag name="templating.helper" alias="slots" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.helper.request" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\RequestHelper">
+            <tag name="templating.helper" alias="request" />
+            <argument type="service" id="request_stack" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.helper.session" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\SessionHelper">
+            <tag name="templating.helper" alias="session" />
+            <argument type="service" id="request_stack" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.helper.router" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\RouterHelper">
+            <tag name="templating.helper" alias="router" />
+            <argument type="service" id="router" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.helper.assets" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\AssetsHelper">
+            <tag name="templating.helper" alias="assets" />
+            <argument /> <!-- packages -->
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.helper.actions" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\ActionsHelper">
+            <tag name="templating.helper" alias="actions" />
+            <argument type="service" id="fragment.handler" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.helper.code" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\CodeHelper">
+            <tag name="templating.helper" alias="code" />
+            <argument type="service" id="debug.file_link_formatter"></argument>
+            <argument>%kernel.project_dir%</argument>
+            <argument>%kernel.charset%</argument>
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.helper.translator" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper">
+            <tag name="templating.helper" alias="translator" />
+            <argument type="service" id="translator" on-invalid="null" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.helper.form" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\FormHelper">
+            <tag name="templating.helper" alias="form" />
+            <argument type="service" id="templating.form.renderer" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.helper.stopwatch" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\StopwatchHelper">
+            <tag name="templating.helper" alias="stopwatch" />
+            <argument type="service" id="debug.stopwatch" on-invalid="ignore" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.form.engine" class="Symfony\Component\Form\Extension\Templating\TemplatingRendererEngine">
+            <argument type="service" id="templating.engine.php" />
+            <argument>%templating.helper.form.resources%</argument>
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.form.renderer" class="Symfony\Component\Form\FormRenderer">
+            <argument type="service" id="templating.form.engine" />
+            <argument type="service" id="security.csrf.token_manager" on-invalid="null" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+
+        <service id="templating.globals" class="Symfony\Bundle\FrameworkBundle\Templating\GlobalVariables">
+            <argument type="service" id="service_container" />
+
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.3 and will be removed in 5.0.</deprecated>
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/test.xml b/vendor/symfony/framework-bundle/Resources/config/test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ef571fdbc67488ddba8ed58bf62013a2a2df1019
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/test.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <parameter key="test.client.parameters" type="collection"></parameter>
+    </parameters>
+
+    <services>
+        <defaults public="false" />
+
+        <service id="test.client" class="Symfony\Bundle\FrameworkBundle\KernelBrowser" shared="false" public="true">
+            <argument type="service" id="kernel" />
+            <argument>%test.client.parameters%</argument>
+            <argument type="service" id="test.client.history" />
+            <argument type="service" id="test.client.cookiejar" />
+        </service>
+
+        <service id="test.client.history" class="Symfony\Component\BrowserKit\History" shared="false" />
+
+        <service id="test.client.cookiejar" class="Symfony\Component\BrowserKit\CookieJar" shared="false" />
+
+        <service id="test.session.listener" class="Symfony\Component\HttpKernel\EventListener\TestSessionListener">
+            <tag name="kernel.event_subscriber" />
+            <argument type="service_locator">
+                <argument key="session" type="service" id="session" on-invalid="ignore" />
+            </argument>
+        </service>
+
+        <service id="test.service_container" class="Symfony\Bundle\FrameworkBundle\Test\TestContainer" public="true">
+            <argument type="service" id="kernel" />
+            <argument>test.private_services_locator</argument>
+        </service>
+
+        <service id="test.private_services_locator" class="Symfony\Component\DependencyInjection\ServiceLocator" public="true">
+            <argument type="collection" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/translation.xml b/vendor/symfony/framework-bundle/Resources/config/translation.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a9d5a85d202e823814266c39f6a9481b0e9bd38a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/translation.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="translator.default" class="Symfony\Bundle\FrameworkBundle\Translation\Translator">
+            <argument /> <!-- translation loaders locator -->
+            <argument type="service" id="translator.formatter" />
+            <argument>%kernel.default_locale%</argument>
+            <argument type="collection" /> <!-- translation loaders ids -->
+            <argument type="collection">
+                <argument key="cache_dir">%kernel.cache_dir%/translations</argument>
+                <argument key="debug">%kernel.debug%</argument>
+            </argument>
+            <call method="setConfigCacheFactory">
+                <argument type="service" id="config_cache_factory" />
+            </call>
+            <tag name="kernel.locale_aware" />
+        </service>
+        <service id="Symfony\Component\Translation\TranslatorInterface" alias="translator" />
+        <service id="Symfony\Contracts\Translation\TranslatorInterface" alias="translator" />
+
+        <service id="translator.logging" class="Symfony\Component\Translation\LoggingTranslator">
+            <argument type="service" id="translator.logging.inner" />
+            <argument type="service" id="logger" />
+            <tag name="monolog.logger" channel="translation" />
+        </service>
+
+        <service id="translator.formatter.default" class="Symfony\Component\Translation\Formatter\MessageFormatter">
+            <argument type="service" id="identity_translator" />
+        </service>
+
+        <service id="translation.loader.php" class="Symfony\Component\Translation\Loader\PhpFileLoader">
+            <tag name="translation.loader" alias="php" />
+        </service>
+
+        <service id="translation.loader.yml" class="Symfony\Component\Translation\Loader\YamlFileLoader">
+            <tag name="translation.loader" alias="yaml" legacy-alias="yml" />
+        </service>
+
+        <service id="translation.loader.xliff" class="Symfony\Component\Translation\Loader\XliffFileLoader">
+            <tag name="translation.loader" alias="xlf" legacy-alias="xliff" />
+        </service>
+
+        <service id="translation.loader.po" class="Symfony\Component\Translation\Loader\PoFileLoader">
+            <tag name="translation.loader" alias="po" />
+        </service>
+
+        <service id="translation.loader.mo" class="Symfony\Component\Translation\Loader\MoFileLoader">
+            <tag name="translation.loader" alias="mo" />
+        </service>
+
+        <service id="translation.loader.qt" class="Symfony\Component\Translation\Loader\QtFileLoader">
+            <tag name="translation.loader" alias="ts" />
+        </service>
+
+        <service id="translation.loader.csv" class="Symfony\Component\Translation\Loader\CsvFileLoader">
+            <tag name="translation.loader" alias="csv" />
+        </service>
+
+        <service id="translation.loader.res" class="Symfony\Component\Translation\Loader\IcuResFileLoader">
+            <tag name="translation.loader" alias="res" />
+        </service>
+
+        <service id="translation.loader.dat" class="Symfony\Component\Translation\Loader\IcuDatFileLoader">
+            <tag name="translation.loader" alias="dat" />
+        </service>
+
+        <service id="translation.loader.ini" class="Symfony\Component\Translation\Loader\IniFileLoader">
+            <tag name="translation.loader" alias="ini" />
+        </service>
+
+        <service id="translation.loader.json" class="Symfony\Component\Translation\Loader\JsonFileLoader">
+            <tag name="translation.loader" alias="json" />
+        </service>
+
+        <service id="translation.dumper.php" class="Symfony\Component\Translation\Dumper\PhpFileDumper">
+            <tag name="translation.dumper" alias="php" />
+        </service>
+
+        <service id="translation.dumper.xliff" class="Symfony\Component\Translation\Dumper\XliffFileDumper">
+            <tag name="translation.dumper" alias="xlf" />
+        </service>
+
+        <service id="translation.dumper.po" class="Symfony\Component\Translation\Dumper\PoFileDumper">
+            <tag name="translation.dumper" alias="po" />
+        </service>
+
+        <service id="translation.dumper.mo" class="Symfony\Component\Translation\Dumper\MoFileDumper">
+            <tag name="translation.dumper" alias="mo" />
+        </service>
+
+        <service id="translation.dumper.yml" class="Symfony\Component\Translation\Dumper\YamlFileDumper">
+            <tag name="translation.dumper" alias="yml" />
+        </service>
+
+        <service id="translation.dumper.yaml" class="Symfony\Component\Translation\Dumper\YamlFileDumper">
+            <argument>yaml</argument>
+            <tag name="translation.dumper" alias="yaml" />
+        </service>
+
+        <service id="translation.dumper.qt" class="Symfony\Component\Translation\Dumper\QtFileDumper">
+            <tag name="translation.dumper" alias="ts" />
+        </service>
+
+        <service id="translation.dumper.csv" class="Symfony\Component\Translation\Dumper\CsvFileDumper">
+            <tag name="translation.dumper" alias="csv" />
+        </service>
+
+        <service id="translation.dumper.ini" class="Symfony\Component\Translation\Dumper\IniFileDumper">
+            <tag name="translation.dumper" alias="ini" />
+        </service>
+
+        <service id="translation.dumper.json" class="Symfony\Component\Translation\Dumper\JsonFileDumper">
+            <tag name="translation.dumper" alias="json" />
+        </service>
+
+        <service id="translation.dumper.res" class="Symfony\Component\Translation\Dumper\IcuResFileDumper">
+            <tag name="translation.dumper" alias="res" />
+        </service>
+
+        <service id="translation.extractor.php" class="Symfony\Component\Translation\Extractor\PhpExtractor">
+            <tag name="translation.extractor" alias="php" />
+        </service>
+
+        <service id="translation.reader" class="Symfony\Component\Translation\Reader\TranslationReader" />
+        <service id="Symfony\Component\Translation\Reader\TranslationReaderInterface" alias="translation.reader" />
+
+        <service id="translation.extractor" class="Symfony\Component\Translation\Extractor\ChainExtractor" />
+        <service id="Symfony\Component\Translation\Extractor\ExtractorInterface" alias="translation.extractor" />
+
+        <service id="translation.writer" class="Symfony\Component\Translation\Writer\TranslationWriter" />
+        <service id="Symfony\Component\Translation\Writer\TranslationWriterInterface" alias="translation.writer" />
+
+        <service id="translation.warmer" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\TranslationsCacheWarmer">
+            <tag name="container.service_subscriber" id="translator" />
+            <tag name="kernel.cache_warmer" />
+            <argument type="service" id="Psr\Container\ContainerInterface" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/translation_debug.xml b/vendor/symfony/framework-bundle/Resources/config/translation_debug.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c9c5385fbfb768d3029085f961e6df56bdbac2ac
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/translation_debug.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <!-- DataCollectorTranslator -->
+        <service id="translator.data_collector" class="Symfony\Component\Translation\DataCollectorTranslator">
+            <argument type="service" id="translator.data_collector.inner" />
+        </service>
+
+        <!-- DataCollector -->
+        <service id="data_collector.translation" class="Symfony\Component\Translation\DataCollector\TranslationDataCollector">
+            <tag name="data_collector" template="@WebProfiler/Collector/translation.html.twig" id="translation" priority="275" />
+            <argument type="service" id="translator.data_collector" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/validator.xml b/vendor/symfony/framework-bundle/Resources/config/validator.xml
new file mode 100644
index 0000000000000000000000000000000000000000..886132ff4b1c86d88fef14e18a05e595bdfb9e16
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/validator.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <parameter key="validator.mapping.cache.file">%kernel.cache_dir%/validation.php</parameter>
+    </parameters>
+
+    <services>
+        <defaults public="false" />
+
+        <service id="validator" class="Symfony\Component\Validator\Validator\ValidatorInterface" public="true">
+            <factory service="validator.builder" method="getValidator" />
+        </service>
+        <service id="Symfony\Component\Validator\Validator\ValidatorInterface" alias="validator" />
+
+        <service id="validator.builder" class="Symfony\Component\Validator\ValidatorBuilder">
+            <factory class="Symfony\Component\Validator\Validation" method="createValidatorBuilder" />
+            <call method="setConstraintValidatorFactory">
+                <argument type="service" id="validator.validator_factory" />
+            </call>
+            <call method="setTranslator">
+                <argument type="service" id="translator" on-invalid="ignore" />
+            </call>
+            <call method="setTranslationDomain">
+                <argument>%validator.translation_domain%</argument>
+            </call>
+        </service>
+
+        <service id="validator.mapping.class_metadata_factory" alias="validator" />
+
+        <service id="validator.mapping.cache_warmer" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\ValidatorCacheWarmer">
+            <argument type="service" id="validator.builder" />
+            <argument>%validator.mapping.cache.file%</argument>
+            <tag name="kernel.cache_warmer" />
+        </service>
+
+        <service id="validator.mapping.cache.symfony" class="Symfony\Component\Validator\Mapping\Cache\Psr6Cache">
+            <argument type="service" id="validator.mapping.cache.adapter" />
+            <deprecated>The "%service_id%" service is deprecated since Symfony 4.4. Use validator.mapping.cache.adapter instead.</deprecated>
+        </service>
+
+        <service id="validator.mapping.cache.adapter" class="Symfony\Component\Cache\Adapter\PhpArrayAdapter">
+            <factory class="Symfony\Component\Cache\Adapter\PhpArrayAdapter" method="create" />
+            <argument>%validator.mapping.cache.file%</argument>
+            <argument type="service" id="cache.validator" />
+        </service>
+
+        <service id="validator.validator_factory" class="Symfony\Component\Validator\ContainerConstraintValidatorFactory">
+            <argument /> <!-- Constraint validators locator -->
+        </service>
+
+        <service id="validator.expression" class="Symfony\Component\Validator\Constraints\ExpressionValidator">
+            <tag name="validator.constraint_validator" alias="validator.expression" />
+        </service>
+
+        <service id="validator.email" class="Symfony\Component\Validator\Constraints\EmailValidator">
+            <argument></argument>
+            <tag name="validator.constraint_validator" alias="Symfony\Component\Validator\Constraints\EmailValidator" />
+        </service>
+
+        <service id="validator.not_compromised_password" class="Symfony\Component\Validator\Constraints\NotCompromisedPasswordValidator">
+            <argument type="service" id="http_client" on-invalid="null" />
+            <argument>%kernel.charset%</argument>
+            <argument>false</argument>
+            <tag name="validator.constraint_validator" alias="Symfony\Component\Validator\Constraints\NotCompromisedPasswordValidator" />
+        </service>
+
+        <service id="validator.property_info_loader" class="Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader">
+            <argument type="service" id="property_info" />
+            <argument type="service" id="property_info" />
+            <argument type="service" id="property_info" />
+
+            <tag name="validator.auto_mapper" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/validator_debug.xml b/vendor/symfony/framework-bundle/Resources/config/validator_debug.xml
new file mode 100644
index 0000000000000000000000000000000000000000..939c55553ca383f2758b38d8d55b2457fed7ffbc
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/validator_debug.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="debug.validator" decorates="validator" decoration-priority="255" class="Symfony\Component\Validator\Validator\TraceableValidator">
+            <argument type="service" id="debug.validator.inner" />
+            <tag name="kernel.reset" method="reset" />
+        </service>
+
+        <!-- DataCollector -->
+        <service id="data_collector.validator" class="Symfony\Component\Validator\DataCollector\ValidatorDataCollector">
+            <argument type="service" id="debug.validator"/>
+            <tag name="data_collector" template="@WebProfiler/Collector/validator.html.twig" id="validator" priority="320" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/web.xml b/vendor/symfony/framework-bundle/Resources/config/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aff90a584b87d5dbd0f1599e297ca9416138bff9
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/web.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id=".legacy_controller_name_converter" class="Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser">
+            <tag name="monolog.logger" channel="request" />
+            <argument type="service" id="kernel" />
+            <argument>false</argument>
+        </service>
+
+        <service id="controller_name_converter" alias=".legacy_controller_name_converter">
+            <deprecated>The "%alias_id%" service is deprecated since Symfony 4.3.</deprecated>
+        </service>
+
+        <service id="controller_resolver" class="Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver">
+            <tag name="monolog.logger" channel="request" />
+            <argument type="service" id="service_container" />
+            <argument type="service" id="logger" on-invalid="ignore" />
+            <argument type="service" id=".legacy_controller_name_converter" />
+        </service>
+
+        <service id="argument_metadata_factory" class="Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory" />
+
+        <service id="argument_resolver" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver">
+            <argument type="service" id="argument_metadata_factory" />
+            <argument /> <!-- argument value resolvers -->
+        </service>
+
+        <service id="argument_resolver.request_attribute" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver">
+            <tag name="controller.argument_value_resolver" priority="100" />
+        </service>
+
+        <service id="argument_resolver.request" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver">
+            <tag name="controller.argument_value_resolver" priority="50" />
+        </service>
+
+        <service id="argument_resolver.session" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\SessionValueResolver">
+            <tag name="controller.argument_value_resolver" priority="50" />
+        </service>
+
+        <service id="argument_resolver.service" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\ServiceValueResolver">
+            <tag name="controller.argument_value_resolver" priority="-50" />
+            <argument />
+        </service>
+
+        <service id="argument_resolver.default" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver">
+            <tag name="controller.argument_value_resolver" priority="-100" />
+        </service>
+
+        <service id="argument_resolver.variadic" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver">
+            <tag name="controller.argument_value_resolver" priority="-150" />
+        </service>
+
+        <service id="response_listener" class="Symfony\Component\HttpKernel\EventListener\ResponseListener">
+            <tag name="kernel.event_subscriber" />
+            <argument>%kernel.charset%</argument>
+        </service>
+
+        <service id="streamed_response_listener" class="Symfony\Component\HttpKernel\EventListener\StreamedResponseListener">
+            <tag name="kernel.event_subscriber" />
+        </service>
+
+        <service id="locale_listener" class="Symfony\Component\HttpKernel\EventListener\LocaleListener">
+            <tag name="kernel.event_subscriber" />
+            <argument type="service" id="request_stack" />
+            <argument>%kernel.default_locale%</argument>
+            <argument type="service" id="router" on-invalid="ignore" />
+        </service>
+
+        <service id="validate_request_listener" class="Symfony\Component\HttpKernel\EventListener\ValidateRequestListener">
+            <tag name="kernel.event_subscriber" />
+        </service>
+
+        <service id=".legacy_resolve_controller_name_subscriber" class="Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber">
+            <argument type="service" id=".legacy_controller_name_converter" />
+            <argument>false</argument>
+            <tag name="kernel.event_subscriber" />
+        </service>
+        <service id="resolve_controller_name_subscriber" alias=".legacy_resolve_controller_name_subscriber">
+            <deprecated>The "%alias_id%" service is deprecated since Symfony 4.3.</deprecated>
+        </service>
+
+        <service id="disallow_search_engine_index_response_listener" class="Symfony\Component\HttpKernel\EventListener\DisallowRobotsIndexingListener">
+            <tag name="kernel.event_subscriber" />
+        </service>
+
+        <service id="error_controller" class="Symfony\Component\HttpKernel\Controller\ErrorController" public="true">
+            <argument type="service" id="http_kernel" />
+            <argument>%kernel.error_controller%</argument>
+            <argument type="service" id="error_renderer" />
+        </service>
+
+        <service id="exception_listener" class="Symfony\Component\HttpKernel\EventListener\ErrorListener">
+            <tag name="kernel.event_subscriber" />
+            <tag name="monolog.logger" channel="request" />
+            <argument>%kernel.error_controller%</argument>
+            <argument type="service" id="logger" on-invalid="null" />
+            <argument>%kernel.debug%</argument>
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/web_link.xml b/vendor/symfony/framework-bundle/Resources/config/web_link.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bf3e8d7211e00690fdafd77be85492182fbdd376
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/web_link.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="web_link.add_link_header_listener" class="Symfony\Component\WebLink\EventListener\AddLinkHeaderListener">
+            <tag name="kernel.event_subscriber" />
+        </service>
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/config/workflow.xml b/vendor/symfony/framework-bundle/Resources/config/workflow.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0bba153b10317c08e9547c3501caf5564fa91df5
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/config/workflow.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://symfony.com/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
+
+    <services>
+        <defaults public="false" />
+
+        <service id="workflow.abstract" class="Symfony\Component\Workflow\Workflow" abstract="true" public="true">
+            <argument /> <!-- workflow definition -->
+            <argument type="constant">null</argument> <!-- marking store -->
+            <argument type="service" id="event_dispatcher" on-invalid="ignore" />
+            <argument /> <!-- name -->
+        </service>
+        <service id="state_machine.abstract" class="Symfony\Component\Workflow\StateMachine" abstract="true" public="true">
+            <argument /> <!-- workflow definition -->
+            <argument type="constant">null</argument> <!-- marking store -->
+            <argument type="service" id="event_dispatcher" on-invalid="ignore" />
+            <argument /> <!-- name -->
+        </service>
+
+        <service id="workflow.marking_store.multiple_state" class="Symfony\Component\Workflow\MarkingStore\MultipleStateMarkingStore" abstract="true" />
+        <service id="workflow.marking_store.single_state" class="Symfony\Component\Workflow\MarkingStore\SingleStateMarkingStore" abstract="true" />
+        <service id="workflow.marking_store.method" class="Symfony\Component\Workflow\MarkingStore\MethodMarkingStore" abstract="true" />
+
+        <service id="workflow.registry" class="Symfony\Component\Workflow\Registry" />
+        <service id="Symfony\Component\Workflow\Registry" alias="workflow.registry" />
+
+        <service id="workflow.security.expression_language" class="Symfony\Component\Workflow\EventListener\ExpressionLanguage" />
+    </services>
+</container>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/attributes.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/attributes.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..047d342a8d5c3ad58ca5d1cb653cd7fd81a5ff69
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/attributes.html.php
@@ -0,0 +1,9 @@
+<?php foreach ($attr as $k => $v): ?>
+<?php if ('placeholder' === $k || 'title' === $k): ?>
+<?php printf('%s="%s" ', $view->escape($k), $view->escape(false !== $translation_domain ? $view['translator']->trans($v, $attr_translation_parameters, $translation_domain) : $v)) ?>
+<?php elseif (true === $v): ?>
+<?php printf('%s="%s" ', $view->escape($k), $view->escape($k)) ?>
+<?php elseif (false !== $v): ?>
+<?php printf('%s="%s" ', $view->escape($k), $view->escape($v)) ?>
+<?php endif ?>
+<?php endforeach ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/button_attributes.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/button_attributes.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..279233baa3fc068bb74fdd9f6095ade924d5791a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/button_attributes.html.php
@@ -0,0 +1,2 @@
+id="<?php echo $view->escape($id) ?>" name="<?php echo $view->escape($full_name) ?>"<?php if ($disabled): ?> disabled="disabled"<?php endif ?>
+<?php echo $attr ? ' '.$view['form']->block($form, 'attributes') : '' ?>
diff --git a/vendor/simplesamlphp/simplesamlphp/modules/memcookie/default-enable b/vendor/symfony/framework-bundle/Resources/views/Form/button_label.html.php
similarity index 100%
rename from vendor/simplesamlphp/simplesamlphp/modules/memcookie/default-enable
rename to vendor/symfony/framework-bundle/Resources/views/Form/button_label.html.php
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/button_row.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/button_row.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..b52e92984533d406a5985929c3663c78f51382d5
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/button_row.html.php
@@ -0,0 +1,3 @@
+<div>
+    <?php echo $view['form']->widget($form) ?>
+</div>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/button_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/button_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..42a7c5db02d8fcce985aa3dfbc1fe47504ae4787
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/button_widget.html.php
@@ -0,0 +1,4 @@
+<?php if (!$label) { $label = isset($label_format)
+    ? strtr($label_format, ['%name%' => $name, '%id%' => $id])
+    : $view['form']->humanize($name); } ?>
+<button type="<?php echo isset($type) ? $view->escape($type) : 'button' ?>" <?php echo $view['form']->block($form, 'button_attributes') ?>><?php echo $view->escape(false !== $translation_domain ? $view['translator']->trans($label, $label_translation_parameters, $translation_domain) : $label) ?></button>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/checkbox_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/checkbox_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..143557dea8a647dc40a1ccec8e223d4bf89e6b4f
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/checkbox_widget.html.php
@@ -0,0 +1,5 @@
+<input type="checkbox"
+    <?php echo $view['form']->block($form, 'widget_attributes') ?>
+    <?php if (strlen($value) > 0): ?> value="<?php echo $view->escape($value) ?>"<?php endif ?>
+    <?php if ($checked): ?> checked="checked"<?php endif ?>
+/>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/choice_attributes.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/choice_attributes.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..18f8368dc8065185b60f53ae4f3b03bb1ccb1ebf
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/choice_attributes.html.php
@@ -0,0 +1,8 @@
+<?php if ($disabled): ?>disabled="disabled" <?php endif ?>
+<?php foreach ($choice_attr as $k => $v): ?>
+<?php if ($v === true): ?>
+<?php printf('%s="%s" ', $view->escape($k), $view->escape($k)) ?>
+<?php elseif ($v !== false): ?>
+<?php printf('%s="%s" ', $view->escape($k), $view->escape($v)) ?>
+<?php endif ?>
+<?php endforeach ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/choice_options.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/choice_options.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..211ae73f1c3d1b18b6b4331b7bd6c7d7e8f5e76d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/choice_options.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'choice_widget_options') ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..13593a96f11ef38af000c2af3de0e1d01b867764
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget.html.php
@@ -0,0 +1,5 @@
+<?php if ($expanded): ?>
+<?php echo $view['form']->block($form, 'choice_widget_expanded') ?>
+<?php else: ?>
+<?php echo $view['form']->block($form, 'choice_widget_collapsed') ?>
+<?php endif ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget_collapsed.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget_collapsed.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a57d585c7b5746461636e3b46f31023c4b3cfd2
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget_collapsed.html.php
@@ -0,0 +1,18 @@
+<select
+    <?php if ($required && null === $placeholder && $placeholder_in_choices === false && $multiple === false && (!isset($attr['size']) || $attr['size'] <= 1)):
+        $required = false;
+    endif; ?>
+    <?php echo $view['form']->block($form, 'widget_attributes', [
+        'required' => $required,
+    ]) ?>
+    <?php if ($multiple): ?> multiple="multiple"<?php endif ?>
+>
+    <?php if (null !== $placeholder): ?><option value=""<?php if ($required && empty($value) && '0' !== $value): ?> selected="selected"<?php endif?>><?php echo '' != $placeholder ? $view->escape(false !== $translation_domain ? $view['translator']->trans($placeholder, [], $translation_domain) : $placeholder) : '' ?></option><?php endif; ?>
+    <?php if (count($preferred_choices) > 0): ?>
+        <?php echo $view['form']->block($form, 'choice_widget_options', ['choices' => $preferred_choices]) ?>
+        <?php if (count($choices) > 0 && null !== $separator): ?>
+            <option disabled="disabled"><?php echo $view->escape($separator) ?></option>
+        <?php endif ?>
+    <?php endif ?>
+    <?php echo $view['form']->block($form, 'choice_widget_options', ['choices' => $choices]) ?>
+</select>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget_expanded.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget_expanded.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..9691759a907f5cab7cf11ddb7fccfae7e180c392
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget_expanded.html.php
@@ -0,0 +1,6 @@
+<div <?php echo $view['form']->block($form, 'widget_container_attributes') ?>>
+<?php foreach ($form as $child): ?>
+    <?php echo $view['form']->widget($child) ?>
+    <?php echo $view['form']->label($child, null, ['translation_domain' => $choice_translation_domain]) ?>
+<?php endforeach ?>
+</div>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget_options.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget_options.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..a19b5a5e6e0b88d822cfa79daf37ba8ecbdc45f1
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/choice_widget_options.html.php
@@ -0,0 +1,13 @@
+<?php use Symfony\Component\Form\ChoiceList\View\ChoiceGroupView;
+
+$translatorHelper = $view['translator']; // outside of the loop for performance reasons! ?>
+<?php $formHelper = $view['form']; ?>
+<?php foreach ($choices as $group_label => $choice): ?>
+    <?php if (is_array($choice) || $choice instanceof ChoiceGroupView): ?>
+        <optgroup label="<?php echo $view->escape(false !== $choice_translation_domain ? $translatorHelper->trans($group_label, [], $choice_translation_domain) : $group_label) ?>">
+            <?php echo $formHelper->block($form, 'choice_widget_options', ['choices' => $choice]) ?>
+        </optgroup>
+    <?php else: ?>
+        <option value="<?php echo $view->escape($choice->value) ?>" <?php echo $formHelper->block($form, 'choice_attributes', ['choice_attr' => $choice->attr]) ?><?php if ($is_selected($choice->value, $value)): ?> selected="selected"<?php endif?>><?php echo $view->escape(false !== $choice_translation_domain ? $translatorHelper->trans($choice->label, [], $choice_translation_domain) : $choice->label) ?></option>
+    <?php endif ?>
+<?php endforeach ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/collection_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/collection_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..40dfdaf1f031f9dc5ce6ba633046f6d73cb5cbc0
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/collection_widget.html.php
@@ -0,0 +1,4 @@
+<?php if (isset($prototype)): ?>
+    <?php $attr['data-prototype'] = $view->escape($view['form']->row($prototype)) ?>
+<?php endif ?>
+<?php echo $view['form']->widget($form, ['attr' => $attr]) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/color_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/color_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..74b5e6f72c23e9f85d6f7192fc041d429a214352
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/color_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'color']);
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/container_attributes.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/container_attributes.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..302bbfcd479d97a9c4e81ec63d24389d42164b2a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/container_attributes.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'widget_container_attributes') ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/date_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/date_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..fbd844f28693bcb307138bd0f5abe68ffa3582c3
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/date_widget.html.php
@@ -0,0 +1,11 @@
+<?php if ($widget == 'single_text'): ?>
+    <?php echo $view['form']->block($form, 'form_widget_simple'); ?>
+<?php else: ?>
+    <div <?php echo $view['form']->block($form, 'widget_container_attributes') ?>>
+        <?php echo str_replace(['{{ year }}', '{{ month }}', '{{ day }}'], [
+            $view['form']->widget($form['year']),
+            $view['form']->widget($form['month']),
+            $view['form']->widget($form['day']),
+        ], $date_pattern) ?>
+    </div>
+<?php endif ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/datetime_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/datetime_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..aef2a32512f729b6e1f6e172c8dc72edbadf5dae
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/datetime_widget.html.php
@@ -0,0 +1,7 @@
+<?php if ($widget == 'single_text'): ?>
+    <?php echo $view['form']->block($form, 'form_widget_simple'); ?>
+<?php else: ?>
+    <div <?php echo $view['form']->block($form, 'widget_container_attributes') ?>>
+        <?php echo $view['form']->widget($form['date']).' '.$view['form']->widget($form['time']) ?>
+    </div>
+<?php endif ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/email_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/email_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..96bfbcacc2006eabbad20ed8eba7fab76ddac36d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/email_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'email']) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb789faff723aa115cff4ce4513d2acd0368d646
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form.html.php
@@ -0,0 +1,3 @@
+<?php echo $view['form']->start($form) ?>
+    <?php echo $view['form']->widget($form) ?>
+<?php echo $view['form']->end($form) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_enctype.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_enctype.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..36eba3c9e8e7a8c4ce57ad9aa5eee8e133202d5b
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_enctype.html.php
@@ -0,0 +1 @@
+<?php if ($form->vars['multipart']): ?>enctype="multipart/form-data"<?php endif ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_end.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_end.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe6843905cee5e30d4765043077bad26200c4367
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_end.html.php
@@ -0,0 +1,4 @@
+<?php if (!isset($render_rest) || $render_rest): ?>
+<?php echo $view['form']->rest($form) ?>
+<?php endif ?>
+</form>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_errors.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_errors.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..d97179e9a680c94dac029d132d5f4db942449502
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_errors.html.php
@@ -0,0 +1,7 @@
+<?php if (count($errors) > 0): ?>
+    <ul>
+        <?php foreach ($errors as $error): ?>
+            <li><?php echo $view->escape($error->getMessage()) ?></li>
+        <?php endforeach; ?>
+    </ul>
+<?php endif ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_help.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_help.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e3ed9b6c6e44d6804a96d93bd9ef44244650101
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_help.html.php
@@ -0,0 +1,6 @@
+<?php if (!empty($help)): ?>
+    <?php $help_attr['class'] = isset($help_attr['class']) ? trim($help_attr['class'].' help-text') : 'help-text'; ?>
+    <?php $help = false !== $translation_domain ? $view['translator']->trans($help, $help_translation_parameters, $translation_domain) : $help; ?>
+    <?php $help = false === $help_html ? $view->escape($help) : $help ?>
+    <p id="<?php echo $view->escape($id); ?>_help" <?php echo ' '.$view['form']->block($form, 'attributes', ['attr' => $help_attr]); ?>><?php echo $help; ?></p>
+<?php endif; ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_label.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_label.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..a17a5ca2ab26f6bf9126f0d73746dffbd49e2976
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_label.html.php
@@ -0,0 +1,8 @@
+<?php if (false !== $label): ?>
+<?php if ($required) { $label_attr['class'] = trim(($label_attr['class'] ?? '').' required'); } ?>
+<?php if (!$compound) { $label_attr['for'] = $id; } ?>
+<?php if (!$label) { $label = isset($label_format)
+    ? strtr($label_format, ['%name%' => $name, '%id%' => $id])
+    : $view['form']->humanize($name); } ?>
+<label<?php if ($label_attr) { echo ' '.$view['form']->block($form, 'attributes', ['attr' => $label_attr]); } ?>><?php echo $view->escape(false !== $translation_domain ? $view['translator']->trans($label, $label_translation_parameters, $translation_domain) : $label) ?></label>
+<?php endif ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_rest.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_rest.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..89041c6ec637497966de2df9039370dadd6625e8
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_rest.html.php
@@ -0,0 +1,5 @@
+<?php foreach ($form as $child): ?>
+    <?php if (!$child->isRendered()): ?>
+        <?php echo $view['form']->row($child) ?>
+    <?php endif; ?>
+<?php endforeach; ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_row.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_row.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6e750aa79f4b0fc1e0633c602339ba3f0e646b3
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_row.html.php
@@ -0,0 +1,7 @@
+<div>
+    <?php $widgetAttr = empty($help) ? [] : ['attr' => ['aria-describedby' => $id.'_help']]; ?>
+    <?php echo $view['form']->label($form); ?>
+    <?php echo $view['form']->errors($form); ?>
+    <?php echo $view['form']->widget($form, $widgetAttr); ?>
+    <?php echo $view['form']->help($form); ?>
+</div>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_rows.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_rows.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..4de226f2b8b2aeed7cdf1fdbdf2459efddd29853
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_rows.html.php
@@ -0,0 +1,5 @@
+<?php foreach ($form as $child) : ?>
+    <?php if (!$child->isRendered()): ?>
+        <?php echo $view['form']->row($child) ?>
+    <?php endif; ?>
+<?php endforeach; ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_start.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_start.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..7e244258053ffc09807b74fd611d79508674b64b
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_start.html.php
@@ -0,0 +1,6 @@
+<?php $method = strtoupper($method) ?>
+<?php $form_method = $method === 'GET' || $method === 'POST' ? $method : 'POST' ?>
+<form name="<?php echo $name ?>" method="<?php echo strtolower($form_method) ?>"<?php if ($action !== ''): ?> action="<?php echo $view->escape($action) ?>"<?php endif ?><?php foreach ($attr as $k => $v) { printf(' %s="%s"', $view->escape($k), $view->escape($v)); } ?><?php if ($multipart): ?> enctype="multipart/form-data"<?php endif ?>>
+<?php if ($form_method !== $method): ?>
+    <input type="hidden" name="_method" value="<?php echo $view->escape($method) ?>" />
+<?php endif ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5af39a5b6b06fbcfc6bb8ee392ea13972abfb8e
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_widget.html.php
@@ -0,0 +1,5 @@
+<?php if ($compound): ?>
+<?php echo $view['form']->block($form, 'form_widget_compound')?>
+<?php else: ?>
+<?php echo $view['form']->block($form, 'form_widget_simple')?>
+<?php endif ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_widget_compound.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_widget_compound.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..7a4f7cd51fb3a861e860f448396a2a9688ba574c
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_widget_compound.html.php
@@ -0,0 +1,7 @@
+<div <?php echo $view['form']->block($form, 'widget_container_attributes') ?>>
+    <?php if (!$form->parent && $errors): ?>
+    <?php echo $view['form']->errors($form) ?>
+    <?php endif ?>
+    <?php echo $view['form']->block($form, 'form_rows') ?>
+    <?php echo $view['form']->rest($form) ?>
+</div>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/form_widget_simple.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/form_widget_simple.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d7654f54cdc667d1318d525b69c82de07a3ea06
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/form_widget_simple.html.php
@@ -0,0 +1 @@
+<input type="<?php echo isset($type) ? $view->escape($type) : 'text' ?>" <?php echo $view['form']->block($form, 'widget_attributes') ?><?php if (!empty($value) || is_numeric($value)): ?> value="<?php echo $view->escape($value) ?>"<?php endif ?> />
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/hidden_row.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/hidden_row.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..3239d8f415b123cf120dea00d171ded75d3ecceb
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/hidden_row.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->widget($form) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/hidden_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/hidden_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..15df70208e530916166b4ba580fadb93dbf0504c
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/hidden_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'hidden']) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/integer_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/integer_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..64ae6b76ec10dba56101ef571763de12a0b2b2d5
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/integer_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'number']) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/money_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/money_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..25fe13f7e057c47d404025ba1e7829944d8cee79
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/money_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->formEncodeCurrency($money_pattern, $view['form']->block($form, 'form_widget_simple')) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/number_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/number_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..225aa31573664cecb46415927cc491dca44fa142
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/number_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'text']) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/password_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/password_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..ea6c6ab479c604eefc6a735dae022ac809a6be48
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/password_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'password']) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/percent_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/percent_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..47ae89f50a26101aa7f4e9c9fc847ed9a62d9c63
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/percent_widget.html.php
@@ -0,0 +1,2 @@
+<?php $symbol = false !== $symbol ? ($symbol ? ' '.$symbol : ' %') : '' ?>
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'text']).$view->escape($symbol) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/radio_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/radio_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..ddc8c529dff676c1b68c9a8befd9fc1061581a88
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/radio_widget.html.php
@@ -0,0 +1,5 @@
+<input type="radio"
+    <?php echo $view['form']->block($form, 'widget_attributes') ?>
+    value="<?php echo $view->escape($value) ?>"
+    <?php if ($checked): ?> checked="checked"<?php endif ?>
+/>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/range_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/range_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..97f4a497f5d68989f6ef14d91ab145fe3f27bc97
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/range_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'range']);
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/repeated_row.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/repeated_row.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4af23d712320864f2f1ef52527b5cad7bacc135
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/repeated_row.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_rows') ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/reset_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/reset_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..117327b16ea98e1c1281b3fc303f4023d343ed0f
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/reset_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'button_widget', ['type' => $type ?? 'reset']) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/search_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/search_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b6efa7b75ed520c803a8405240f6250aeb45360
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/search_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'search']) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/submit_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/submit_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..db643c24235e8256e422168b899ec393bb581d01
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/submit_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'button_widget', ['type' => $type ?? 'submit']) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/tel_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/tel_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb62226c1d7e2fdc62ceb26a4b58bcea8c0430da
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/tel_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'tel']);
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/textarea_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/textarea_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..c989ce575d579d7f40dbea711bbf39a8645df3a4
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/textarea_widget.html.php
@@ -0,0 +1 @@
+<textarea <?php echo $view['form']->block($form, 'widget_attributes') ?>><?php echo $view->escape($value) ?></textarea>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/time_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/time_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..cd2f5596011c162597212904e834806843960920
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/time_widget.html.php
@@ -0,0 +1,22 @@
+<?php if ($widget == 'single_text'): ?>
+    <?php echo $view['form']->block($form, 'form_widget_simple'); ?>
+<?php else: ?>
+    <?php $vars = $widget == 'text' ? ['attr' => ['size' => 1]] : [] ?>
+    <div <?php echo $view['form']->block($form, 'widget_container_attributes') ?>>
+        <?php
+            // There should be no spaces between the colons and the widgets, that's why
+            // this block is written in a single PHP tag
+            echo $view['form']->widget($form['hour'], $vars);
+
+            if ($with_minutes) {
+                echo ':';
+                echo $view['form']->widget($form['minute'], $vars);
+            }
+
+            if ($with_seconds) {
+                echo ':';
+                echo $view['form']->widget($form['second'], $vars);
+            }
+        ?>
+    </div>
+<?php endif ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/url_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/url_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..fee20f07c979cb7da8e637b3f4b68712baf66464
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/url_widget.html.php
@@ -0,0 +1 @@
+<?php echo $view['form']->block($form, 'form_widget_simple', ['type' => $type ?? 'url']) ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/week_widget.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/week_widget.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..610b6e0c19eac13bd7cdc9a94ef1a1216035a5fb
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/week_widget.html.php
@@ -0,0 +1,14 @@
+<?php if ($widget == 'single_text'): ?>
+    <?php echo $view['form']->block($form, 'form_widget_simple'); ?>
+<?php else: ?>
+    <?php $vars = $widget == 'text' ? ['attr' => ['size' => 1]] : [] ?>
+    <div <?php echo $view['form']->block($form, 'widget_container_attributes') ?>>
+        <?php
+            // There should be no spaces between the colons and the widgets, that's why
+            // this block is written in a single PHP tag
+            echo $view['form']->widget($form['year'], $vars);
+            echo '-';
+            echo $view['form']->widget($form['week'], $vars);
+        ?>
+    </div>
+<?php endif ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/widget_attributes.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/widget_attributes.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..1626a9cc63ff5e2ce7edbbd98026356ecb9e16e0
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/widget_attributes.html.php
@@ -0,0 +1,3 @@
+id="<?php echo $view->escape($id) ?>" name="<?php echo $view->escape($full_name) ?>"<?php if ($disabled): ?> disabled="disabled"<?php endif ?>
+<?php if ($required): ?> required="required"<?php endif ?>
+<?php echo $attr ? ' '.$view['form']->block($form, 'attributes') : '' ?>
\ No newline at end of file
diff --git a/vendor/symfony/framework-bundle/Resources/views/Form/widget_container_attributes.html.php b/vendor/symfony/framework-bundle/Resources/views/Form/widget_container_attributes.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..fdd176d12c79f9d527ed4a7afdc982072aa01bbd
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/Form/widget_container_attributes.html.php
@@ -0,0 +1,2 @@
+<?php if (!empty($id)): ?>id="<?php echo $view->escape($id) ?>"<?php endif ?>
+<?php echo $attr ? ' '.$view['form']->block($form, 'attributes') : '' ?>
diff --git a/vendor/symfony/framework-bundle/Resources/views/FormTable/button_row.html.php b/vendor/symfony/framework-bundle/Resources/views/FormTable/button_row.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..67d0137e20b97c0a45bab7ae07d5c69235443f0a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/FormTable/button_row.html.php
@@ -0,0 +1,6 @@
+<tr>
+    <td></td>
+    <td>
+        <?php echo $view['form']->widget($form); ?>
+    </td>
+</tr>
diff --git a/vendor/symfony/framework-bundle/Resources/views/FormTable/form_row.html.php b/vendor/symfony/framework-bundle/Resources/views/FormTable/form_row.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..92b87e1b679bdc6c8fecd38bc985426b74a3c702
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/FormTable/form_row.html.php
@@ -0,0 +1,11 @@
+<tr>
+    <?php $widgetAttr = empty($help) ? [] : ['attr' => ['aria-describedby' => $id.'_help']]; ?>
+    <td>
+        <?php echo $view['form']->label($form); ?>
+    </td>
+    <td>
+        <?php echo $view['form']->errors($form); ?>
+        <?php echo $view['form']->widget($form, $widgetAttr); ?>
+        <?php echo $view['form']->help($form); ?>
+    </td>
+</tr>
diff --git a/vendor/symfony/framework-bundle/Resources/views/FormTable/form_widget_compound.html.php b/vendor/symfony/framework-bundle/Resources/views/FormTable/form_widget_compound.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..adc897338861b45f09fd213e2ea635a26ad0c310
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/FormTable/form_widget_compound.html.php
@@ -0,0 +1,11 @@
+<table <?php echo $view['form']->block($form, 'widget_container_attributes'); ?>>
+    <?php if (!$form->parent && $errors): ?>
+    <tr>
+        <td colspan="2">
+            <?php echo $view['form']->errors($form); ?>
+        </td>
+    </tr>
+    <?php endif; ?>
+    <?php echo $view['form']->block($form, 'form_rows'); ?>
+    <?php echo $view['form']->rest($form); ?>
+</table>
diff --git a/vendor/symfony/framework-bundle/Resources/views/FormTable/hidden_row.html.php b/vendor/symfony/framework-bundle/Resources/views/FormTable/hidden_row.html.php
new file mode 100644
index 0000000000000000000000000000000000000000..116b300bd5619bc8341b7b3a3bce5aa1678f0a31
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Resources/views/FormTable/hidden_row.html.php
@@ -0,0 +1,5 @@
+<tr style="display: none">
+    <td colspan="2">
+        <?php echo $view['form']->widget($form); ?>
+    </td>
+</tr>
diff --git a/vendor/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php b/vendor/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e5a71b8fadfd13bf5822c50a4aa9212aba1dac7
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Routing;
+
+use Symfony\Component\Routing\Loader\AnnotationClassLoader;
+use Symfony\Component\Routing\Route;
+
+/**
+ * AnnotatedRouteControllerLoader is an implementation of AnnotationClassLoader
+ * that sets the '_controller' default based on the class and method names.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class AnnotatedRouteControllerLoader extends AnnotationClassLoader
+{
+    /**
+     * Configures the _controller default parameter of a given Route instance.
+     *
+     * @param object $annot The annotation class instance
+     */
+    protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot)
+    {
+        if ('__invoke' === $method->getName()) {
+            $route->setDefault('_controller', $class->getName());
+        } else {
+            $route->setDefault('_controller', $class->getName().'::'.$method->getName());
+        }
+    }
+
+    /**
+     * Makes the default route name more sane by removing common keywords.
+     *
+     * @return string
+     */
+    protected function getDefaultRouteName(\ReflectionClass $class, \ReflectionMethod $method)
+    {
+        return preg_replace([
+            '/(bundle|controller)_/',
+            '/action(_\d+)?$/',
+            '/__/',
+        ], [
+            '_',
+            '\\1',
+            '_',
+        ], parent::getDefaultRouteName($class, $method));
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Routing/DelegatingLoader.php b/vendor/symfony/framework-bundle/Routing/DelegatingLoader.php
new file mode 100644
index 0000000000000000000000000000000000000000..7276a387d4e0191485522acaec0adafa18298fbc
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Routing/DelegatingLoader.php
@@ -0,0 +1,119 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Routing;
+
+use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser;
+use Symfony\Component\Config\Exception\LoaderLoadException;
+use Symfony\Component\Config\Loader\DelegatingLoader as BaseDelegatingLoader;
+use Symfony\Component\Config\Loader\LoaderResolverInterface;
+
+/**
+ * DelegatingLoader delegates route loading to other loaders using a loader resolver.
+ *
+ * This implementation resolves the _controller attribute from the short notation
+ * to the fully-qualified form (from a:b:c to class::method).
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @final since Symfony 4.4
+ */
+class DelegatingLoader extends BaseDelegatingLoader
+{
+    /**
+     * @deprecated since Symfony 4.4
+     */
+    protected $parser;
+    private $loading = false;
+    private $defaultOptions;
+
+    /**
+     * @param LoaderResolverInterface $resolver
+     * @param array                   $defaultOptions
+     */
+    public function __construct($resolver, $defaultOptions = [])
+    {
+        if ($resolver instanceof ControllerNameParser) {
+            @trigger_error(sprintf('Passing a "%s" instance as first argument to "%s()" is deprecated since Symfony 4.4, pass a "%s" instance instead.', ControllerNameParser::class, __METHOD__, LoaderResolverInterface::class), \E_USER_DEPRECATED);
+            $this->parser = $resolver;
+            $resolver = $defaultOptions;
+            $defaultOptions = 2 < \func_num_args() ? func_get_arg(2) : [];
+        } elseif (2 < \func_num_args() && func_get_arg(2) instanceof ControllerNameParser) {
+            $this->parser = func_get_arg(2);
+        }
+
+        $this->defaultOptions = $defaultOptions;
+
+        parent::__construct($resolver);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load($resource, $type = null)
+    {
+        if ($this->loading) {
+            // This can happen if a fatal error occurs in parent::load().
+            // Here is the scenario:
+            // - while routes are being loaded by parent::load() below, a fatal error
+            //   occurs (e.g. parse error in a controller while loading annotations);
+            // - PHP abruptly empties the stack trace, bypassing all catch/finally blocks;
+            //   it then calls the registered shutdown functions;
+            // - the ErrorHandler catches the fatal error and re-injects it for rendering
+            //   thanks to HttpKernel->terminateWithException() (that calls handleException());
+            // - at this stage, if we try to load the routes again, we must prevent
+            //   the fatal error from occurring a second time,
+            //   otherwise the PHP process would be killed immediately;
+            // - while rendering the exception page, the router can be required
+            //   (by e.g. the web profiler that needs to generate an URL);
+            // - this handles the case and prevents the second fatal error
+            //   by triggering an exception beforehand.
+
+            throw new LoaderLoadException($resource, null, 0, null, $type);
+        }
+        $this->loading = true;
+
+        try {
+            $collection = parent::load($resource, $type);
+        } finally {
+            $this->loading = false;
+        }
+
+        foreach ($collection->all() as $route) {
+            if ($this->defaultOptions) {
+                $route->setOptions($route->getOptions() + $this->defaultOptions);
+            }
+            if (!\is_string($controller = $route->getDefault('_controller'))) {
+                continue;
+            }
+
+            if (str_contains($controller, '::')) {
+                continue;
+            }
+
+            if ($this->parser && 2 === substr_count($controller, ':')) {
+                $deprecatedNotation = $controller;
+
+                try {
+                    $controller = $this->parser->parse($controller, false);
+
+                    @trigger_error(sprintf('Referencing controllers with %s is deprecated since Symfony 4.1, use "%s" instead.', $deprecatedNotation, $controller), \E_USER_DEPRECATED);
+                } catch (\InvalidArgumentException $e) {
+                    // unable to optimize unknown notation
+                }
+            }
+
+            $route->setDefault('_controller', $controller);
+        }
+
+        return $collection;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Routing/LegacyRouteLoaderContainer.php b/vendor/symfony/framework-bundle/Routing/LegacyRouteLoaderContainer.php
new file mode 100644
index 0000000000000000000000000000000000000000..10529b459a40d98c26aa55534babceaa50943803
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Routing/LegacyRouteLoaderContainer.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Routing;
+
+use Psr\Container\ContainerInterface;
+
+/**
+ * @internal to be removed in Symfony 5.0
+ */
+class LegacyRouteLoaderContainer implements ContainerInterface
+{
+    private $container;
+    private $serviceLocator;
+
+    public function __construct(ContainerInterface $container, ContainerInterface $serviceLocator)
+    {
+        $this->container = $container;
+        $this->serviceLocator = $serviceLocator;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return mixed
+     */
+    public function get($id)
+    {
+        if ($this->serviceLocator->has($id)) {
+            return $this->serviceLocator->get($id);
+        }
+
+        @trigger_error(sprintf('Registering the service route loader "%s" without tagging it with the "routing.route_loader" tag is deprecated since Symfony 4.4 and will be required in Symfony 5.0.', $id), \E_USER_DEPRECATED);
+
+        return $this->container->get($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return bool
+     */
+    public function has($id)
+    {
+        return $this->serviceLocator->has($id) || $this->container->has($id);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php b/vendor/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php
new file mode 100644
index 0000000000000000000000000000000000000000..cb2c831d969fd69f095a26910de26d9bc80a87a4
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Routing;
+
+use Symfony\Component\Routing\Matcher\CompiledUrlMatcher;
+use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ */
+class RedirectableCompiledUrlMatcher extends CompiledUrlMatcher implements RedirectableUrlMatcherInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function redirect($path, $route, $scheme = null): array
+    {
+        return [
+            '_controller' => 'Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController::urlRedirectAction',
+            'path' => $path,
+            'permanent' => true,
+            'scheme' => $scheme,
+            'httpPort' => $this->context->getHttpPort(),
+            'httpsPort' => $this->context->getHttpsPort(),
+            '_route' => $route,
+        ];
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Routing/RedirectableUrlMatcher.php b/vendor/symfony/framework-bundle/Routing/RedirectableUrlMatcher.php
new file mode 100644
index 0000000000000000000000000000000000000000..c9ca4831845c900a05c70afc777033bd1b12723d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Routing/RedirectableUrlMatcher.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Routing;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3.', RedirectableUrlMatcher::class), \E_USER_DEPRECATED);
+
+use Symfony\Component\Routing\Matcher\RedirectableUrlMatcher as BaseMatcher;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since Symfony 4.3
+ */
+class RedirectableUrlMatcher extends BaseMatcher
+{
+    /**
+     * Redirects the user to another URL.
+     *
+     * @param string $path   The path info to redirect to
+     * @param string $route  The route that matched
+     * @param string $scheme The URL scheme (null to keep the current one)
+     *
+     * @return array An array of parameters
+     */
+    public function redirect($path, $route, $scheme = null)
+    {
+        return [
+            '_controller' => 'Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController::urlRedirectAction',
+            'path' => $path,
+            'permanent' => true,
+            'scheme' => $scheme,
+            'httpPort' => $this->context->getHttpPort(),
+            'httpsPort' => $this->context->getHttpsPort(),
+            '_route' => $route,
+        ];
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Routing/RouteLoaderInterface.php b/vendor/symfony/framework-bundle/Routing/RouteLoaderInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..d1cb55a7af895835e18667cec9facb88ed00b242
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Routing/RouteLoaderInterface.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Routing;
+
+/**
+ * Marker interface for service route loaders.
+ */
+interface RouteLoaderInterface
+{
+}
diff --git a/vendor/symfony/framework-bundle/Routing/Router.php b/vendor/symfony/framework-bundle/Routing/Router.php
new file mode 100644
index 0000000000000000000000000000000000000000..50b820871427db5a1232869cc1cba14382717460
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Routing/Router.php
@@ -0,0 +1,208 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Routing;
+
+use Psr\Container\ContainerInterface;
+use Psr\Log\LoggerInterface;
+use Symfony\Bundle\FrameworkBundle\DependencyInjection\CompatibilityServiceSubscriberInterface as ServiceSubscriberInterface;
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\Config\Resource\FileExistenceResource;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\DependencyInjection\Config\ContainerParametersResource;
+use Symfony\Component\DependencyInjection\ContainerInterface as SymfonyContainerInterface;
+use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
+use Symfony\Component\Routing\Annotation\Route;
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Router as BaseRouter;
+
+// Help opcache.preload discover always-needed symbols
+class_exists(RedirectableCompiledUrlMatcher::class);
+class_exists(Route::class);
+
+/**
+ * This Router creates the Loader only when the cache is empty.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Router extends BaseRouter implements WarmableInterface, ServiceSubscriberInterface
+{
+    private $container;
+    private $collectedParameters = [];
+    private $paramFetcher;
+
+    /**
+     * @param mixed $resource The main resource to load
+     */
+    public function __construct(ContainerInterface $container, $resource, array $options = [], RequestContext $context = null, ContainerInterface $parameters = null, LoggerInterface $logger = null, string $defaultLocale = null)
+    {
+        $this->container = $container;
+        $this->resource = $resource;
+        $this->context = $context ?? new RequestContext();
+        $this->logger = $logger;
+        $this->setOptions($options);
+
+        if ($parameters) {
+            $this->paramFetcher = [$parameters, 'get'];
+        } elseif ($container instanceof SymfonyContainerInterface) {
+            $this->paramFetcher = [$container, 'getParameter'];
+        } else {
+            throw new \LogicException(sprintf('You should either pass a "%s" instance or provide the $parameters argument of the "%s" method.', SymfonyContainerInterface::class, __METHOD__));
+        }
+
+        $this->defaultLocale = $defaultLocale;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRouteCollection()
+    {
+        if (null === $this->collection) {
+            $this->collection = $this->container->get('routing.loader')->load($this->resource, $this->options['resource_type']);
+            $this->resolveParameters($this->collection);
+            $this->collection->addResource(new ContainerParametersResource($this->collectedParameters));
+
+            try {
+                $containerFile = ($this->paramFetcher)('kernel.cache_dir').'/'.($this->paramFetcher)('kernel.container_class').'.php';
+                if (file_exists($containerFile)) {
+                    $this->collection->addResource(new FileResource($containerFile));
+                } else {
+                    $this->collection->addResource(new FileExistenceResource($containerFile));
+                }
+            } catch (ParameterNotFoundException $exception) {
+            }
+        }
+
+        return $this->collection;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function warmUp($cacheDir)
+    {
+        $currentDir = $this->getOption('cache_dir');
+
+        // force cache generation
+        $this->setOption('cache_dir', $cacheDir);
+        $this->getMatcher();
+        $this->getGenerator();
+
+        $this->setOption('cache_dir', $currentDir);
+    }
+
+    /**
+     * Replaces placeholders with service container parameter values in:
+     * - the route defaults,
+     * - the route requirements,
+     * - the route path,
+     * - the route host,
+     * - the route schemes,
+     * - the route methods.
+     */
+    private function resolveParameters(RouteCollection $collection)
+    {
+        foreach ($collection as $route) {
+            foreach ($route->getDefaults() as $name => $value) {
+                $route->setDefault($name, $this->resolve($value));
+            }
+
+            foreach ($route->getRequirements() as $name => $value) {
+                $route->setRequirement($name, $this->resolve($value));
+            }
+
+            $route->setPath($this->resolve($route->getPath()));
+            $route->setHost($this->resolve($route->getHost()));
+
+            $schemes = [];
+            foreach ($route->getSchemes() as $scheme) {
+                $schemes = array_merge($schemes, explode('|', $this->resolve($scheme)));
+            }
+            $route->setSchemes($schemes);
+
+            $methods = [];
+            foreach ($route->getMethods() as $method) {
+                $methods = array_merge($methods, explode('|', $this->resolve($method)));
+            }
+            $route->setMethods($methods);
+            $route->setCondition($this->resolve($route->getCondition()));
+        }
+    }
+
+    /**
+     * Recursively replaces placeholders with the service container parameters.
+     *
+     * @param mixed $value The source which might contain "%placeholders%"
+     *
+     * @return mixed The source with the placeholders replaced by the container
+     *               parameters. Arrays are resolved recursively.
+     *
+     * @throws ParameterNotFoundException When a placeholder does not exist as a container parameter
+     * @throws RuntimeException           When a container value is not a string or a numeric value
+     */
+    private function resolve($value)
+    {
+        if (\is_array($value)) {
+            foreach ($value as $key => $val) {
+                $value[$key] = $this->resolve($val);
+            }
+
+            return $value;
+        }
+
+        if (!\is_string($value)) {
+            return $value;
+        }
+
+        $escapedValue = preg_replace_callback('/%%|%([^%\s]++)%/', function ($match) use ($value) {
+            // skip %%
+            if (!isset($match[1])) {
+                return '%%';
+            }
+
+            if (preg_match('/^env\((?:\w++:)*+\w++\)$/', $match[1])) {
+                throw new RuntimeException(sprintf('Using "%%%s%%" is not allowed in routing configuration.', $match[1]));
+            }
+
+            $resolved = ($this->paramFetcher)($match[1]);
+
+            if (\is_scalar($resolved)) {
+                $this->collectedParameters[$match[1]] = $resolved;
+
+                if (\is_string($resolved)) {
+                    $resolved = $this->resolve($resolved);
+                }
+
+                if (\is_scalar($resolved)) {
+                    return false === $resolved ? '0' : (string) $resolved;
+                }
+            }
+
+            throw new RuntimeException(sprintf('The container parameter "%s", used in the route configuration value "%s", must be a string or numeric, but it is of type "%s".', $match[1], $value, \gettype($resolved)));
+        }, $value);
+
+        return str_replace('%%', '%', $escapedValue);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedServices()
+    {
+        return [
+            'routing.loader' => LoaderInterface::class,
+        ];
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Secrets/AbstractVault.php b/vendor/symfony/framework-bundle/Secrets/AbstractVault.php
new file mode 100644
index 0000000000000000000000000000000000000000..eeecbbb68b683949ef2345f2e4479853cb02db4a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Secrets/AbstractVault.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Secrets;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+abstract class AbstractVault
+{
+    protected $lastMessage;
+
+    public function getLastMessage(): ?string
+    {
+        return $this->lastMessage;
+    }
+
+    abstract public function generateKeys(bool $override = false): bool;
+
+    abstract public function seal(string $name, string $value): void;
+
+    abstract public function reveal(string $name): ?string;
+
+    abstract public function remove(string $name): bool;
+
+    abstract public function list(bool $reveal = false): array;
+
+    protected function validateName(string $name): void
+    {
+        if (!preg_match('/^\w++$/D', $name)) {
+            throw new \LogicException(sprintf('Invalid secret name "%s": only "word" characters are allowed.', $name));
+        }
+    }
+
+    protected function getPrettyPath(string $path)
+    {
+        return str_replace(getcwd().\DIRECTORY_SEPARATOR, '', $path);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Secrets/DotenvVault.php b/vendor/symfony/framework-bundle/Secrets/DotenvVault.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c1670feae02d7e03af5e27705f47ae04c6d84dd
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Secrets/DotenvVault.php
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Secrets;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class DotenvVault extends AbstractVault
+{
+    private $dotenvFile;
+
+    public function __construct(string $dotenvFile)
+    {
+        $this->dotenvFile = strtr($dotenvFile, '/', \DIRECTORY_SEPARATOR);
+    }
+
+    public function generateKeys(bool $override = false): bool
+    {
+        $this->lastMessage = 'The dotenv vault doesn\'t encrypt secrets thus doesn\'t need keys.';
+
+        return false;
+    }
+
+    public function seal(string $name, string $value): void
+    {
+        $this->lastMessage = null;
+        $this->validateName($name);
+        $v = str_replace("'", "'\\''", $value);
+
+        $content = file_exists($this->dotenvFile) ? file_get_contents($this->dotenvFile) : '';
+        $content = preg_replace("/^$name=((\\\\'|'[^']++')++|.*)/m", "$name='$v'", $content, -1, $count);
+
+        if (!$count) {
+            $content .= "$name='$v'\n";
+        }
+
+        file_put_contents($this->dotenvFile, $content);
+
+        $this->lastMessage = sprintf('Secret "%s" %s in "%s".', $name, $count ? 'added' : 'updated', $this->getPrettyPath($this->dotenvFile));
+    }
+
+    public function reveal(string $name): ?string
+    {
+        $this->lastMessage = null;
+        $this->validateName($name);
+        $v = \is_string($_SERVER[$name] ?? null) && !str_starts_with($name, 'HTTP_') ? $_SERVER[$name] : ($_ENV[$name] ?? null);
+
+        if (null === $v) {
+            $this->lastMessage = sprintf('Secret "%s" not found in "%s".', $name, $this->getPrettyPath($this->dotenvFile));
+
+            return null;
+        }
+
+        return $v;
+    }
+
+    public function remove(string $name): bool
+    {
+        $this->lastMessage = null;
+        $this->validateName($name);
+
+        $content = file_exists($this->dotenvFile) ? file_get_contents($this->dotenvFile) : '';
+        $content = preg_replace("/^$name=((\\\\'|'[^']++')++|.*)\n?/m", '', $content, -1, $count);
+
+        if ($count) {
+            file_put_contents($this->dotenvFile, $content);
+            $this->lastMessage = sprintf('Secret "%s" removed from file "%s".', $name, $this->getPrettyPath($this->dotenvFile));
+
+            return true;
+        }
+
+        $this->lastMessage = sprintf('Secret "%s" not found in "%s".', $name, $this->getPrettyPath($this->dotenvFile));
+
+        return false;
+    }
+
+    public function list(bool $reveal = false): array
+    {
+        $this->lastMessage = null;
+        $secrets = [];
+
+        foreach ($_ENV as $k => $v) {
+            if (preg_match('/^\w+$/D', $k)) {
+                $secrets[$k] = $reveal ? $v : null;
+            }
+        }
+
+        foreach ($_SERVER as $k => $v) {
+            if (\is_string($v) && preg_match('/^\w+$/D', $k)) {
+                $secrets[$k] = $reveal ? $v : null;
+            }
+        }
+
+        return $secrets;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Secrets/SodiumVault.php b/vendor/symfony/framework-bundle/Secrets/SodiumVault.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d8f1529b44190324983a9addcf6b46328f8dd3e
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Secrets/SodiumVault.php
@@ -0,0 +1,223 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Secrets;
+
+use Symfony\Component\DependencyInjection\EnvVarLoaderInterface;
+use Symfony\Component\VarExporter\VarExporter;
+
+/**
+ * @author Tobias Schultze <http://tobion.de>
+ * @author Jérémy Derussé <jeremy@derusse.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class SodiumVault extends AbstractVault implements EnvVarLoaderInterface
+{
+    private $encryptionKey;
+    private $decryptionKey;
+    private $pathPrefix;
+    private $secretsDir;
+
+    /**
+     * @param string|\Stringable|null $decryptionKey A string or a stringable object that defines the private key to use to decrypt the vault
+     *                                               or null to store generated keys in the provided $secretsDir
+     */
+    public function __construct(string $secretsDir, $decryptionKey = null)
+    {
+        if (null !== $decryptionKey && !\is_string($decryptionKey) && !(\is_object($decryptionKey) && method_exists($decryptionKey, '__toString'))) {
+            throw new \TypeError(sprintf('Decryption key should be a string or an object that implements the __toString() method, "%s" given.', \gettype($decryptionKey)));
+        }
+
+        $this->pathPrefix = rtrim(strtr($secretsDir, '/', \DIRECTORY_SEPARATOR), \DIRECTORY_SEPARATOR).\DIRECTORY_SEPARATOR.basename($secretsDir).'.';
+        $this->decryptionKey = $decryptionKey;
+        $this->secretsDir = $secretsDir;
+    }
+
+    public function generateKeys(bool $override = false): bool
+    {
+        $this->lastMessage = null;
+
+        if (null === $this->encryptionKey && '' !== $this->decryptionKey = (string) $this->decryptionKey) {
+            $this->lastMessage = 'Cannot generate keys when a decryption key has been provided while instantiating the vault.';
+
+            return false;
+        }
+
+        try {
+            $this->loadKeys();
+        } catch (\RuntimeException $e) {
+            // ignore failures to load keys
+        }
+
+        if ('' !== $this->decryptionKey && !file_exists($this->pathPrefix.'encrypt.public.php')) {
+            $this->export('encrypt.public', $this->encryptionKey);
+        }
+
+        if (!$override && null !== $this->encryptionKey) {
+            $this->lastMessage = sprintf('Sodium keys already exist at "%s*.{public,private}" and won\'t be overridden.', $this->getPrettyPath($this->pathPrefix));
+
+            return false;
+        }
+
+        $this->decryptionKey = sodium_crypto_box_keypair();
+        $this->encryptionKey = sodium_crypto_box_publickey($this->decryptionKey);
+
+        $this->export('encrypt.public', $this->encryptionKey);
+        $this->export('decrypt.private', $this->decryptionKey);
+
+        $this->lastMessage = sprintf('Sodium keys have been generated at "%s*.public/private.php".', $this->getPrettyPath($this->pathPrefix));
+
+        return true;
+    }
+
+    public function seal(string $name, string $value): void
+    {
+        $this->lastMessage = null;
+        $this->validateName($name);
+        $this->loadKeys();
+        $this->export($name.'.'.substr(md5($name), 0, 6), sodium_crypto_box_seal($value, $this->encryptionKey ?? sodium_crypto_box_publickey($this->decryptionKey)));
+
+        $list = $this->list();
+        $list[$name] = null;
+        uksort($list, 'strnatcmp');
+        file_put_contents($this->pathPrefix.'list.php', sprintf("<?php\n\nreturn %s;\n", VarExporter::export($list)), \LOCK_EX);
+
+        $this->lastMessage = sprintf('Secret "%s" encrypted in "%s"; you can commit it.', $name, $this->getPrettyPath(\dirname($this->pathPrefix).\DIRECTORY_SEPARATOR));
+    }
+
+    public function reveal(string $name): ?string
+    {
+        $this->lastMessage = null;
+        $this->validateName($name);
+
+        if (!file_exists($file = $this->pathPrefix.$name.'.'.substr_replace(md5($name), '.php', -26))) {
+            $this->lastMessage = sprintf('Secret "%s" not found in "%s".', $name, $this->getPrettyPath(\dirname($this->pathPrefix).\DIRECTORY_SEPARATOR));
+
+            return null;
+        }
+
+        if (!\function_exists('sodium_crypto_box_seal')) {
+            $this->lastMessage = sprintf('Secret "%s" cannot be revealed as the "sodium" PHP extension missing. Try running "composer require paragonie/sodium_compat" if you cannot enable the extension."', $name);
+
+            return null;
+        }
+
+        $this->loadKeys();
+
+        if ('' === $this->decryptionKey) {
+            $this->lastMessage = sprintf('Secret "%s" cannot be revealed as no decryption key was found in "%s".', $name, $this->getPrettyPath(\dirname($this->pathPrefix).\DIRECTORY_SEPARATOR));
+
+            return null;
+        }
+
+        if (false === $value = sodium_crypto_box_seal_open(include $file, $this->decryptionKey)) {
+            $this->lastMessage = sprintf('Secret "%s" cannot be revealed as the wrong decryption key was provided for "%s".', $name, $this->getPrettyPath(\dirname($this->pathPrefix).\DIRECTORY_SEPARATOR));
+
+            return null;
+        }
+
+        return $value;
+    }
+
+    public function remove(string $name): bool
+    {
+        $this->lastMessage = null;
+        $this->validateName($name);
+
+        if (!file_exists($file = $this->pathPrefix.$name.'.'.substr_replace(md5($name), '.php', -26))) {
+            $this->lastMessage = sprintf('Secret "%s" not found in "%s".', $name, $this->getPrettyPath(\dirname($this->pathPrefix).\DIRECTORY_SEPARATOR));
+
+            return false;
+        }
+
+        $list = $this->list();
+        unset($list[$name]);
+        file_put_contents($this->pathPrefix.'list.php', sprintf("<?php\n\nreturn %s;\n", VarExporter::export($list)), \LOCK_EX);
+
+        $this->lastMessage = sprintf('Secret "%s" removed from "%s".', $name, $this->getPrettyPath(\dirname($this->pathPrefix).\DIRECTORY_SEPARATOR));
+
+        return @unlink($file) || !file_exists($file);
+    }
+
+    public function list(bool $reveal = false): array
+    {
+        $this->lastMessage = null;
+
+        if (!file_exists($file = $this->pathPrefix.'list.php')) {
+            return [];
+        }
+
+        $secrets = include $file;
+
+        if (!$reveal) {
+            return $secrets;
+        }
+
+        foreach ($secrets as $name => $value) {
+            $secrets[$name] = $this->reveal($name);
+        }
+
+        return $secrets;
+    }
+
+    public function loadEnvVars(): array
+    {
+        return $this->list(true);
+    }
+
+    private function loadKeys(): void
+    {
+        if (!\function_exists('sodium_crypto_box_seal')) {
+            throw new \LogicException('The "sodium" PHP extension is required to deal with secrets. Alternatively, try running "composer require paragonie/sodium_compat" if you cannot enable the extension.".');
+        }
+
+        if (null !== $this->encryptionKey || '' !== $this->decryptionKey = (string) $this->decryptionKey) {
+            return;
+        }
+
+        if (file_exists($this->pathPrefix.'decrypt.private.php')) {
+            $this->decryptionKey = (string) include $this->pathPrefix.'decrypt.private.php';
+        }
+
+        if (file_exists($this->pathPrefix.'encrypt.public.php')) {
+            $this->encryptionKey = (string) include $this->pathPrefix.'encrypt.public.php';
+        } elseif ('' !== $this->decryptionKey) {
+            $this->encryptionKey = sodium_crypto_box_publickey($this->decryptionKey);
+        } else {
+            throw new \RuntimeException(sprintf('Encryption key not found in "%s".', \dirname($this->pathPrefix)));
+        }
+    }
+
+    private function export(string $file, string $data): void
+    {
+        $name = basename($this->pathPrefix.$file);
+        $data = str_replace('%', '\x', rawurlencode($data));
+        $data = sprintf("<?php // %s on %s\n\nreturn \"%s\";\n", $name, date('r'), $data);
+
+        $this->createSecretsDir();
+
+        if (false === file_put_contents($this->pathPrefix.$file.'.php', $data, \LOCK_EX)) {
+            $e = error_get_last();
+            throw new \ErrorException($e['message'] ?? 'Failed to write secrets data.', 0, $e['type'] ?? \E_USER_WARNING);
+        }
+    }
+
+    private function createSecretsDir(): void
+    {
+        if ($this->secretsDir && !is_dir($this->secretsDir) && !@mkdir($this->secretsDir, 0777, true) && !is_dir($this->secretsDir)) {
+            throw new \RuntimeException(sprintf('Unable to create the secrets directory (%s).', $this->secretsDir));
+        }
+
+        $this->secretsDir = null;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/DelegatingEngine.php b/vendor/symfony/framework-bundle/Templating/DelegatingEngine.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1d4d8a93c7c8a9466b943a765252c2ef42fce1d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/DelegatingEngine.php
@@ -0,0 +1,78 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating;
+
+@trigger_error('The '.DelegatingEngine::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Psr\Container\ContainerInterface;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Templating\DelegatingEngine as BaseDelegatingEngine;
+
+/**
+ * DelegatingEngine selects an engine for a given template.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class DelegatingEngine extends BaseDelegatingEngine implements EngineInterface
+{
+    protected $container;
+
+    public function __construct(ContainerInterface $container, array $engineIds)
+    {
+        $this->container = $container;
+        $this->engines = $engineIds;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getEngine($name)
+    {
+        $this->resolveEngines();
+
+        return parent::getEngine($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function renderResponse($view, array $parameters = [], Response $response = null)
+    {
+        $engine = $this->getEngine($view);
+
+        if ($engine instanceof EngineInterface) {
+            return $engine->renderResponse($view, $parameters, $response);
+        }
+
+        if (null === $response) {
+            $response = new Response();
+        }
+
+        $response->setContent($engine->render($view, $parameters));
+
+        return $response;
+    }
+
+    /**
+     * Resolved engine ids to their real engine instances from the container.
+     */
+    private function resolveEngines()
+    {
+        foreach ($this->engines as $i => $engine) {
+            if (\is_string($engine)) {
+                $this->engines[$i] = $this->container->get($engine);
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/EngineInterface.php b/vendor/symfony/framework-bundle/Templating/EngineInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..28b023bb0348aa520ecfcf31b1e6f16c3e613aa5
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/EngineInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating;
+
+@trigger_error('The '.EngineInterface::class.' interface is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Templating\EngineInterface as BaseEngineInterface;
+
+/**
+ * EngineInterface is the interface each engine must implement.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+interface EngineInterface extends BaseEngineInterface
+{
+    /**
+     * Renders a view and returns a Response.
+     *
+     * @param string $view       The view name
+     * @param array  $parameters An array of parameters to pass to the view
+     *
+     * @return Response A Response instance
+     *
+     * @throws \RuntimeException if the template cannot be rendered
+     */
+    public function renderResponse($view, array $parameters = [], Response $response = null);
+}
diff --git a/vendor/symfony/framework-bundle/Templating/GlobalVariables.php b/vendor/symfony/framework-bundle/Templating/GlobalVariables.php
new file mode 100644
index 0000000000000000000000000000000000000000..29e45ac7f15f9e40871d4b5163595cda6d7f8d47
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/GlobalVariables.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating;
+
+@trigger_error('The '.GlobalVariables::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
+
+/**
+ * GlobalVariables is the entry point for Symfony global variables in PHP templates.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class GlobalVariables
+{
+    protected $container;
+
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * @return TokenInterface|null
+     */
+    public function getToken()
+    {
+        if (!$this->container->has('security.token_storage')) {
+            return null;
+        }
+
+        return $this->container->get('security.token_storage')->getToken();
+    }
+
+    public function getUser()
+    {
+        if (!$token = $this->getToken()) {
+            return null;
+        }
+
+        $user = $token->getUser();
+
+        return \is_object($user) ? $user : null;
+    }
+
+    /**
+     * @return Request|null The HTTP request object
+     */
+    public function getRequest()
+    {
+        return $this->container->has('request_stack') ? $this->container->get('request_stack')->getCurrentRequest() : null;
+    }
+
+    /**
+     * @return Session|null The session
+     */
+    public function getSession()
+    {
+        $request = $this->getRequest();
+
+        return $request && $request->hasSession() ? $request->getSession() : null;
+    }
+
+    /**
+     * @return string The current environment string (e.g 'dev')
+     */
+    public function getEnvironment()
+    {
+        return $this->container->getParameter('kernel.environment');
+    }
+
+    /**
+     * @return bool The current debug mode
+     */
+    public function getDebug()
+    {
+        return (bool) $this->container->getParameter('kernel.debug');
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Helper/ActionsHelper.php b/vendor/symfony/framework-bundle/Templating/Helper/ActionsHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..3e689f5934ead56b0ad8a1e5b21f42a61361dc38
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Helper/ActionsHelper.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
+
+@trigger_error('The '.ActionsHelper::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+use Symfony\Component\HttpKernel\Fragment\FragmentHandler;
+use Symfony\Component\Templating\Helper\Helper;
+
+/**
+ * ActionsHelper manages action inclusions.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class ActionsHelper extends Helper
+{
+    private $handler;
+
+    public function __construct(FragmentHandler $handler)
+    {
+        $this->handler = $handler;
+    }
+
+    /**
+     * Returns the fragment content for a given URI.
+     *
+     * @param string $uri
+     *
+     * @return string The fragment content
+     *
+     * @see FragmentHandler::render()
+     */
+    public function render($uri, array $options = [])
+    {
+        $strategy = $options['strategy'] ?? 'inline';
+        unset($options['strategy']);
+
+        return $this->handler->render($uri, $strategy, $options);
+    }
+
+    public function controller($controller, $attributes = [], $query = [])
+    {
+        return new ControllerReference($controller, $attributes, $query);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'actions';
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Helper/AssetsHelper.php b/vendor/symfony/framework-bundle/Templating/Helper/AssetsHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..0e326b628d4f9798bce422b4e555c724ac20fdf0
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Helper/AssetsHelper.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
+
+@trigger_error('The '.AssetsHelper::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\Asset\Packages;
+use Symfony\Component\Templating\Helper\Helper;
+
+/**
+ * AssetsHelper helps manage asset URLs.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class AssetsHelper extends Helper
+{
+    private $packages;
+
+    public function __construct(Packages $packages)
+    {
+        $this->packages = $packages;
+    }
+
+    /**
+     * Returns the public url/path of an asset.
+     *
+     * If the package used to generate the path is an instance of
+     * UrlPackage, you will always get a URL and not a path.
+     *
+     * @param string $path        A public path
+     * @param string $packageName The name of the asset package to use
+     *
+     * @return string The public path of the asset
+     */
+    public function getUrl($path, $packageName = null)
+    {
+        return $this->packages->getUrl($path, $packageName);
+    }
+
+    /**
+     * Returns the version of an asset.
+     *
+     * @param string $path        A public path
+     * @param string $packageName The name of the asset package to use
+     *
+     * @return string The asset version
+     */
+    public function getVersion($path, $packageName = null)
+    {
+        return $this->packages->getVersion($path, $packageName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'assets';
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Helper/CodeHelper.php b/vendor/symfony/framework-bundle/Templating/Helper/CodeHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..b0a7291d93ab46bf7d7c165897398108a5617eb2
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Helper/CodeHelper.php
@@ -0,0 +1,233 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
+
+@trigger_error('The '.CodeHelper::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
+use Symfony\Component\Templating\Helper\Helper;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal since Symfony 4.2
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class CodeHelper extends Helper
+{
+    protected $fileLinkFormat;
+    protected $rootDir; // to be renamed $projectDir in 5.0
+    protected $charset;
+
+    /**
+     * @param string|FileLinkFormatter $fileLinkFormat The format for links to source files
+     * @param string                   $projectDir     The project root directory
+     * @param string                   $charset        The charset
+     */
+    public function __construct($fileLinkFormat, string $projectDir, string $charset)
+    {
+        $this->fileLinkFormat = $fileLinkFormat ?: \ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
+        $this->rootDir = str_replace('\\', '/', $projectDir).'/';
+        $this->charset = $charset;
+    }
+
+    /**
+     * Formats an array as a string.
+     *
+     * @param array $args The argument array
+     *
+     * @return string
+     */
+    public function formatArgsAsText(array $args)
+    {
+        return strip_tags($this->formatArgs($args));
+    }
+
+    public function abbrClass($class)
+    {
+        $parts = explode('\\', $class);
+        $short = array_pop($parts);
+
+        return sprintf('<abbr title="%s">%s</abbr>', $class, $short);
+    }
+
+    public function abbrMethod($method)
+    {
+        if (str_contains($method, '::')) {
+            [$class, $method] = explode('::', $method, 2);
+            $result = sprintf('%s::%s()', $this->abbrClass($class), $method);
+        } elseif ('Closure' === $method) {
+            $result = sprintf('<abbr title="%s">%1$s</abbr>', $method);
+        } else {
+            $result = sprintf('<abbr title="%s">%1$s</abbr>()', $method);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Formats an array as a string.
+     *
+     * @param array $args The argument array
+     *
+     * @return string
+     */
+    public function formatArgs(array $args)
+    {
+        $result = [];
+        foreach ($args as $key => $item) {
+            if ('object' === $item[0]) {
+                $parts = explode('\\', $item[1]);
+                $short = array_pop($parts);
+                $formattedValue = sprintf('<em>object</em>(<abbr title="%s">%s</abbr>)', $item[1], $short);
+            } elseif ('array' === $item[0]) {
+                $formattedValue = sprintf('<em>array</em>(%s)', \is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
+            } elseif ('string' === $item[0]) {
+                $formattedValue = sprintf("'%s'", htmlspecialchars($item[1], \ENT_QUOTES, $this->getCharset()));
+            } elseif ('null' === $item[0]) {
+                $formattedValue = '<em>null</em>';
+            } elseif ('boolean' === $item[0]) {
+                $formattedValue = '<em>'.strtolower(var_export($item[1], true)).'</em>';
+            } elseif ('resource' === $item[0]) {
+                $formattedValue = '<em>resource</em>';
+            } else {
+                $formattedValue = str_replace("\n", '', var_export(htmlspecialchars((string) $item[1], \ENT_QUOTES, $this->getCharset()), true));
+            }
+
+            $result[] = \is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue);
+        }
+
+        return implode(', ', $result);
+    }
+
+    /**
+     * Returns an excerpt of a code file around the given line number.
+     *
+     * @param string $file A file path
+     * @param int    $line The selected line number
+     *
+     * @return string|null An HTML string
+     */
+    public function fileExcerpt($file, $line)
+    {
+        if (is_readable($file)) {
+            if (\extension_loaded('fileinfo')) {
+                $finfo = new \finfo();
+
+                // Check if the file is an application/octet-stream (eg. Phar file) because highlight_file cannot parse these files
+                if ('application/octet-stream' === $finfo->file($file, \FILEINFO_MIME_TYPE)) {
+                    return '';
+                }
+            }
+
+            // highlight_file could throw warnings
+            // see https://bugs.php.net/25725
+            $code = @highlight_file($file, true);
+            // remove main code/span tags
+            $code = preg_replace('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s', '\\1', $code);
+            $content = explode('<br />', $code);
+
+            $lines = [];
+            for ($i = max($line - 3, 1), $max = min($line + 3, \count($content)); $i <= $max; ++$i) {
+                $lines[] = '<li'.($i == $line ? ' class="selected"' : '').'><code>'.self::fixCodeMarkup($content[$i - 1]).'</code></li>';
+            }
+
+            return '<ol start="'.max($line - 3, 1).'">'.implode("\n", $lines).'</ol>';
+        }
+
+        return null;
+    }
+
+    /**
+     * Formats a file path.
+     *
+     * @param string $file An absolute file path
+     * @param int    $line The line number
+     * @param string $text Use this text for the link rather than the file path
+     *
+     * @return string
+     */
+    public function formatFile($file, $line, $text = null)
+    {
+        $flags = \ENT_QUOTES | \ENT_SUBSTITUTE;
+
+        if (null === $text) {
+            $file = trim($file);
+            $fileStr = $file;
+            if (str_starts_with($fileStr, $this->rootDir)) {
+                $fileStr = str_replace(['\\', $this->rootDir], ['/', ''], $fileStr);
+                $fileStr = htmlspecialchars($fileStr, $flags, $this->charset);
+                $fileStr = sprintf('<abbr title="%s">kernel.project_dir</abbr>/%s', htmlspecialchars($this->rootDir, $flags, $this->charset), $fileStr);
+            }
+
+            $text = sprintf('%s at line %d', $fileStr, $line);
+        }
+
+        if (false !== $link = $this->getFileLink($file, $line)) {
+            return sprintf('<a href="%s" title="Click to open this file" class="file_link">%s</a>', htmlspecialchars($link, $flags, $this->charset), $text);
+        }
+
+        return $text;
+    }
+
+    /**
+     * Returns the link for a given file/line pair.
+     *
+     * @param string $file An absolute file path
+     * @param int    $line The line number
+     *
+     * @return string A link of false
+     */
+    public function getFileLink($file, $line)
+    {
+        if ($fmt = $this->fileLinkFormat) {
+            return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line);
+        }
+
+        return false;
+    }
+
+    public function formatFileFromText($text)
+    {
+        return preg_replace_callback('/in ("|&quot;)?(.+?)\1(?: +(?:on|at))? +line (\d+)/s', function ($match) {
+            return 'in '.$this->formatFile($match[2], $match[3]);
+        }, $text);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'code';
+    }
+
+    protected static function fixCodeMarkup($line)
+    {
+        // </span> ending tag from previous line
+        $opening = strpos($line, '<span');
+        $closing = strpos($line, '</span>');
+        if (false !== $closing && (false === $opening || $closing < $opening)) {
+            $line = substr_replace($line, '', $closing, 7);
+        }
+
+        // missing </span> tag at the end of line
+        $opening = strpos($line, '<span');
+        $closing = strpos($line, '</span>');
+        if (false !== $opening && (false === $closing || $closing > $opening)) {
+            $line .= '</span>';
+        }
+
+        return $line;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Helper/FormHelper.php b/vendor/symfony/framework-bundle/Templating/Helper/FormHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..cb18d3eb34406c622cf10ff5f625f7e9961a4d0a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Helper/FormHelper.php
@@ -0,0 +1,260 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
+
+@trigger_error('The '.FormHelper::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\Form\FormRendererInterface;
+use Symfony\Component\Form\FormView;
+use Symfony\Component\Templating\Helper\Helper;
+
+/**
+ * FormHelper provides helpers to help display forms.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class FormHelper extends Helper
+{
+    private $renderer;
+
+    public function __construct(FormRendererInterface $renderer)
+    {
+        $this->renderer = $renderer;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'form';
+    }
+
+    /**
+     * Sets a theme for a given view.
+     *
+     * The theme format is "<Bundle>:<Controller>".
+     *
+     * @param string|array $themes           A theme or an array of theme
+     * @param bool         $useDefaultThemes If true, will use default themes defined in the renderer
+     */
+    public function setTheme(FormView $view, $themes, $useDefaultThemes = true)
+    {
+        $this->renderer->setTheme($view, $themes, $useDefaultThemes);
+    }
+
+    /**
+     * Renders the HTML for a form.
+     *
+     * Example usage:
+     *
+     *     <?php echo view['form']->form($form) ?>
+     *
+     * You can pass options during the call:
+     *
+     *     <?php echo view['form']->form($form, ['attr' => ['class' => 'foo']]) ?>
+     *
+     *     <?php echo view['form']->form($form, ['separator' => '+++++']) ?>
+     *
+     * This method is mainly intended for prototyping purposes. If you want to
+     * control the layout of a form in a more fine-grained manner, you are
+     * advised to use the other helper methods for rendering the parts of the
+     * form individually. You can also create a custom form theme to adapt
+     * the look of the form.
+     *
+     * @param array $variables Additional variables passed to the template
+     *
+     * @return string The HTML markup
+     */
+    public function form(FormView $view, array $variables = [])
+    {
+        return $this->renderer->renderBlock($view, 'form', $variables);
+    }
+
+    /**
+     * Renders the form start tag.
+     *
+     * Example usage templates:
+     *
+     *     <?php echo $view['form']->start($form) ?>>
+     *
+     * @param array $variables Additional variables passed to the template
+     *
+     * @return string The HTML markup
+     */
+    public function start(FormView $view, array $variables = [])
+    {
+        return $this->renderer->renderBlock($view, 'form_start', $variables);
+    }
+
+    /**
+     * Renders the form end tag.
+     *
+     * Example usage templates:
+     *
+     *     <?php echo $view['form']->end($form) ?>>
+     *
+     * @param array $variables Additional variables passed to the template
+     *
+     * @return string The HTML markup
+     */
+    public function end(FormView $view, array $variables = [])
+    {
+        return $this->renderer->renderBlock($view, 'form_end', $variables);
+    }
+
+    /**
+     * Renders the HTML for a given view.
+     *
+     * Example usage:
+     *
+     *     <?php echo $view['form']->widget($form) ?>
+     *
+     * You can pass options during the call:
+     *
+     *     <?php echo $view['form']->widget($form, ['attr' => ['class' => 'foo']]) ?>
+     *
+     *     <?php echo $view['form']->widget($form, ['separator' => '+++++']) ?>
+     *
+     * @param array $variables Additional variables passed to the template
+     *
+     * @return string The HTML markup
+     */
+    public function widget(FormView $view, array $variables = [])
+    {
+        return $this->renderer->searchAndRenderBlock($view, 'widget', $variables);
+    }
+
+    /**
+     * Renders the entire form field "row".
+     *
+     * @param array $variables Additional variables passed to the template
+     *
+     * @return string The HTML markup
+     */
+    public function row(FormView $view, array $variables = [])
+    {
+        return $this->renderer->searchAndRenderBlock($view, 'row', $variables);
+    }
+
+    /**
+     * Renders the label of the given view.
+     *
+     * @param string $label     The label
+     * @param array  $variables Additional variables passed to the template
+     *
+     * @return string The HTML markup
+     */
+    public function label(FormView $view, $label = null, array $variables = [])
+    {
+        if (null !== $label) {
+            $variables += ['label' => $label];
+        }
+
+        return $this->renderer->searchAndRenderBlock($view, 'label', $variables);
+    }
+
+    /**
+     * Renders the help of the given view.
+     *
+     * @return string The HTML markup
+     */
+    public function help(FormView $view): string
+    {
+        return $this->renderer->searchAndRenderBlock($view, 'help');
+    }
+
+    /**
+     * Renders the errors of the given view.
+     *
+     * @return string The HTML markup
+     */
+    public function errors(FormView $view)
+    {
+        return $this->renderer->searchAndRenderBlock($view, 'errors');
+    }
+
+    /**
+     * Renders views which have not already been rendered.
+     *
+     * @param array $variables An array of variables
+     *
+     * @return string The HTML markup
+     */
+    public function rest(FormView $view, array $variables = [])
+    {
+        return $this->renderer->searchAndRenderBlock($view, 'rest', $variables);
+    }
+
+    /**
+     * Renders a block of the template.
+     *
+     * @param string $blockName The name of the block to render
+     * @param array  $variables The variable to pass to the template
+     *
+     * @return string The HTML markup
+     */
+    public function block(FormView $view, $blockName, array $variables = [])
+    {
+        return $this->renderer->renderBlock($view, $blockName, $variables);
+    }
+
+    /**
+     * Returns a CSRF token.
+     *
+     * Use this helper for CSRF protection without the overhead of creating a
+     * form.
+     *
+     *     echo $view['form']->csrfToken('rm_user_'.$user->getId());
+     *
+     * Check the token in your action using the same CSRF token id.
+     *
+     *     // $csrfProvider being an instance of Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface
+     *     if (!$csrfProvider->isCsrfTokenValid('rm_user_'.$user->getId(), $token)) {
+     *         throw new \RuntimeException('CSRF attack detected.');
+     *     }
+     *
+     * @param string $tokenId The CSRF token id of the protected action
+     *
+     * @return string A CSRF token
+     *
+     * @throws \BadMethodCallException when no CSRF provider was injected in the constructor
+     */
+    public function csrfToken($tokenId)
+    {
+        return $this->renderer->renderCsrfToken($tokenId);
+    }
+
+    public function humanize($text)
+    {
+        return $this->renderer->humanize($text);
+    }
+
+    /**
+     * @internal
+     */
+    public function formEncodeCurrency($text, $widget = '')
+    {
+        if ('UTF-8' === $charset = $this->getCharset()) {
+            $text = htmlspecialchars($text, \ENT_QUOTES | \ENT_SUBSTITUTE, 'UTF-8');
+        } else {
+            $text = htmlentities($text, \ENT_QUOTES | \ENT_SUBSTITUTE, 'UTF-8');
+            $text = iconv('UTF-8', $charset, $text);
+            $widget = iconv('UTF-8', $charset, $widget);
+        }
+
+        return str_replace('{{ widget }}', $widget, $text);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Helper/RequestHelper.php b/vendor/symfony/framework-bundle/Templating/Helper/RequestHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..0df1f6761d0f19440db6df63d88758b676b9a50b
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Helper/RequestHelper.php
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
+
+@trigger_error('The '.RequestHelper::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\Templating\Helper\Helper;
+
+/**
+ * RequestHelper provides access to the current request parameters.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class RequestHelper extends Helper
+{
+    protected $requestStack;
+
+    public function __construct(RequestStack $requestStack)
+    {
+        $this->requestStack = $requestStack;
+    }
+
+    /**
+     * Returns a parameter from the current request object.
+     *
+     * @param string $key     The name of the parameter
+     * @param string $default A default value
+     *
+     * @return mixed
+     *
+     * @see Request::get()
+     */
+    public function getParameter($key, $default = null)
+    {
+        return $this->getRequest()->get($key, $default);
+    }
+
+    /**
+     * Returns the locale.
+     *
+     * @return string
+     */
+    public function getLocale()
+    {
+        return $this->getRequest()->getLocale();
+    }
+
+    private function getRequest(): Request
+    {
+        if (!$this->requestStack->getCurrentRequest()) {
+            throw new \LogicException('A Request must be available.');
+        }
+
+        return $this->requestStack->getCurrentRequest();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'request';
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Helper/RouterHelper.php b/vendor/symfony/framework-bundle/Templating/Helper/RouterHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad02bca83929cd863970cee1688ba034d8606712
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Helper/RouterHelper.php
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
+
+@trigger_error('The '.RouterHelper::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Templating\Helper\Helper;
+
+/**
+ * RouterHelper manages links between pages in a template context.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class RouterHelper extends Helper
+{
+    protected $generator;
+
+    public function __construct(UrlGeneratorInterface $router)
+    {
+        $this->generator = $router;
+    }
+
+    /**
+     * Generates a URL reference (as an absolute or relative path) to the route with the given parameters.
+     *
+     * @param string $name       The name of the route
+     * @param mixed  $parameters An array of parameters
+     * @param bool   $relative   Whether to generate a relative or absolute path
+     *
+     * @return string The generated URL reference
+     *
+     * @see UrlGeneratorInterface
+     */
+    public function path($name, $parameters = [], $relative = false)
+    {
+        return $this->generator->generate($name, $parameters, $relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH);
+    }
+
+    /**
+     * Generates a URL reference (as an absolute URL or network path) to the route with the given parameters.
+     *
+     * @param string $name           The name of the route
+     * @param mixed  $parameters     An array of parameters
+     * @param bool   $schemeRelative Whether to omit the scheme in the generated URL reference
+     *
+     * @return string The generated URL reference
+     *
+     * @see UrlGeneratorInterface
+     */
+    public function url($name, $parameters = [], $schemeRelative = false)
+    {
+        return $this->generator->generate($name, $parameters, $schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'router';
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Helper/SessionHelper.php b/vendor/symfony/framework-bundle/Templating/Helper/SessionHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..33c0e6cea729a2eb9fae3464a11eb54cc101a9a4
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Helper/SessionHelper.php
@@ -0,0 +1,85 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
+
+@trigger_error('The '.SessionHelper::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Session\SessionInterface;
+use Symfony\Component\Templating\Helper\Helper;
+
+/**
+ * SessionHelper provides read-only access to the session attributes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class SessionHelper extends Helper
+{
+    protected $session;
+    protected $requestStack;
+
+    public function __construct(RequestStack $requestStack)
+    {
+        $this->requestStack = $requestStack;
+    }
+
+    /**
+     * Returns an attribute.
+     *
+     * @param string $name    The attribute name
+     * @param mixed  $default The default value
+     *
+     * @return mixed
+     */
+    public function get($name, $default = null)
+    {
+        return $this->getSession()->get($name, $default);
+    }
+
+    public function getFlash($name, array $default = [])
+    {
+        return $this->getSession()->getFlashBag()->get($name, $default);
+    }
+
+    public function getFlashes()
+    {
+        return $this->getSession()->getFlashBag()->all();
+    }
+
+    public function hasFlash($name)
+    {
+        return $this->getSession()->getFlashBag()->has($name);
+    }
+
+    private function getSession(): SessionInterface
+    {
+        if (null === $this->session) {
+            if (!$this->requestStack->getMasterRequest()) {
+                throw new \LogicException('A Request must be available.');
+            }
+
+            $this->session = $this->requestStack->getMasterRequest()->getSession();
+        }
+
+        return $this->session;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'session';
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Helper/StopwatchHelper.php b/vendor/symfony/framework-bundle/Templating/Helper/StopwatchHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..57d4f1900d59e68a61c854ddda88ef807fc96f6c
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Helper/StopwatchHelper.php
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
+
+@trigger_error('The '.StopwatchHelper::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\Stopwatch\Stopwatch;
+use Symfony\Component\Templating\Helper\Helper;
+
+/**
+ * StopwatchHelper provides methods time your PHP templates.
+ *
+ * @author Wouter J <wouter@wouterj.nl>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class StopwatchHelper extends Helper
+{
+    private $stopwatch;
+
+    public function __construct(Stopwatch $stopwatch = null)
+    {
+        $this->stopwatch = $stopwatch;
+    }
+
+    public function getName()
+    {
+        return 'stopwatch';
+    }
+
+    public function __call($method, $arguments = [])
+    {
+        if (null === $this->stopwatch) {
+            return null;
+        }
+
+        if (method_exists($this->stopwatch, $method)) {
+            return $this->stopwatch->{$method}(...$arguments);
+        }
+
+        throw new \BadMethodCallException(sprintf('Method "%s" of Stopwatch does not exist.', $method));
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Helper/TranslatorHelper.php b/vendor/symfony/framework-bundle/Templating/Helper/TranslatorHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..e33197b832e8dabfd79b5b3224d05d15fb83a038
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Helper/TranslatorHelper.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
+
+@trigger_error('The '.TranslatorHelper::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\Templating\Helper\Helper;
+use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
+use Symfony\Contracts\Translation\TranslatorTrait;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class TranslatorHelper extends Helper
+{
+    use TranslatorTrait {
+        getLocale as private;
+        setLocale as private;
+        trans as private doTrans;
+    }
+
+    protected $translator;
+
+    /**
+     * @param TranslatorInterface|null $translator
+     */
+    public function __construct($translator = null)
+    {
+        if (null !== $translator && !$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) {
+            throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be an instance of "%s", "%s" given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
+        }
+        $this->translator = $translator;
+    }
+
+    /**
+     * @see TranslatorInterface::trans()
+     */
+    public function trans($id, array $parameters = [], $domain = 'messages', $locale = null)
+    {
+        if (null === $this->translator) {
+            return $this->doTrans($id, $parameters, $domain, $locale);
+        }
+
+        return $this->translator->trans($id, $parameters, $domain, $locale);
+    }
+
+    /**
+     * @see TranslatorInterface::transChoice()
+     * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter
+     */
+    public function transChoice($id, $number, array $parameters = [], $domain = 'messages', $locale = null)
+    {
+        @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%%count%%" parameter.', __METHOD__), \E_USER_DEPRECATED);
+
+        if (null === $this->translator) {
+            return $this->doTrans($id, ['%count%' => $number] + $parameters, $domain, $locale);
+        }
+        if ($this->translator instanceof TranslatorInterface) {
+            return $this->translator->trans($id, ['%count%' => $number] + $parameters, $domain, $locale);
+        }
+
+        return $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'translator';
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Loader/FilesystemLoader.php b/vendor/symfony/framework-bundle/Templating/Loader/FilesystemLoader.php
new file mode 100644
index 0000000000000000000000000000000000000000..e060a6d7d2238a9230f2179392c8cc9d1f8ccd89
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Loader/FilesystemLoader.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Loader;
+
+@trigger_error('The '.FilesystemLoader::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\Config\FileLocatorInterface;
+use Symfony\Component\Templating\Loader\LoaderInterface;
+use Symfony\Component\Templating\Storage\FileStorage;
+use Symfony\Component\Templating\TemplateReferenceInterface;
+
+/**
+ * FilesystemLoader is a loader that read templates from the filesystem.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class FilesystemLoader implements LoaderInterface
+{
+    protected $locator;
+
+    public function __construct(FileLocatorInterface $locator)
+    {
+        $this->locator = $locator;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load(TemplateReferenceInterface $template)
+    {
+        try {
+            $file = $this->locator->locate($template);
+        } catch (\InvalidArgumentException $e) {
+            return false;
+        }
+
+        return new FileStorage($file);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isFresh(TemplateReferenceInterface $template, $time)
+    {
+        if (false === $storage = $this->load($template)) {
+            return false;
+        }
+
+        if (!is_readable((string) $storage)) {
+            return false;
+        }
+
+        return filemtime((string) $storage) < $time;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/Loader/TemplateLocator.php b/vendor/symfony/framework-bundle/Templating/Loader/TemplateLocator.php
new file mode 100644
index 0000000000000000000000000000000000000000..d1c6648268181ee015af5ca21ec1075f5acb930d
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/Loader/TemplateLocator.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating\Loader;
+
+@trigger_error('The '.TemplateLocator::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\Config\FileLocatorInterface;
+use Symfony\Component\Templating\TemplateReferenceInterface;
+
+/**
+ * TemplateLocator locates templates in bundles.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class TemplateLocator implements FileLocatorInterface
+{
+    protected $locator;
+    protected $cache;
+
+    private $cacheHits = [];
+
+    /**
+     * @param string $cacheDir The cache path
+     */
+    public function __construct(FileLocatorInterface $locator, string $cacheDir = null)
+    {
+        if (null !== $cacheDir && file_exists($cache = $cacheDir.'/templates.php')) {
+            $this->cache = require $cache;
+        }
+
+        $this->locator = $locator;
+    }
+
+    /**
+     * Returns a full path for a given file.
+     *
+     * @return string The full path for the file
+     */
+    protected function getCacheKey($template)
+    {
+        return $template->getLogicalName();
+    }
+
+    /**
+     * Returns a full path for a given file.
+     *
+     * @param TemplateReferenceInterface $template    A template
+     * @param string                     $currentPath Unused
+     * @param bool                       $first       Unused
+     *
+     * @return string The full path for the file
+     *
+     * @throws \InvalidArgumentException When the template is not an instance of TemplateReferenceInterface
+     * @throws \InvalidArgumentException When the template file can not be found
+     */
+    public function locate($template, $currentPath = null, $first = true)
+    {
+        if (!$template instanceof TemplateReferenceInterface) {
+            throw new \InvalidArgumentException('The template must be an instance of TemplateReferenceInterface.');
+        }
+
+        $key = $this->getCacheKey($template);
+
+        if (isset($this->cacheHits[$key])) {
+            return $this->cacheHits[$key];
+        }
+        if (isset($this->cache[$key])) {
+            return $this->cacheHits[$key] = realpath($this->cache[$key]) ?: $this->cache[$key];
+        }
+
+        try {
+            return $this->cacheHits[$key] = $this->locator->locate($template->getPath(), $currentPath);
+        } catch (\InvalidArgumentException $e) {
+            throw new \InvalidArgumentException(sprintf('Unable to find template "%s": ', $template).$e->getMessage(), 0, $e);
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/PhpEngine.php b/vendor/symfony/framework-bundle/Templating/PhpEngine.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1f9347b7b807301c4e4e7eb6fa4d1eb336ab288
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/PhpEngine.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating;
+
+@trigger_error('The '.PhpEngine::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Psr\Container\ContainerInterface;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Templating\Loader\LoaderInterface;
+use Symfony\Component\Templating\PhpEngine as BasePhpEngine;
+use Symfony\Component\Templating\TemplateNameParserInterface;
+
+/**
+ * This engine knows how to render Symfony templates.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class PhpEngine extends BasePhpEngine implements EngineInterface
+{
+    protected $container;
+
+    public function __construct(TemplateNameParserInterface $parser, ContainerInterface $container, LoaderInterface $loader, GlobalVariables $globals = null)
+    {
+        $this->container = $container;
+
+        parent::__construct($parser, $loader);
+
+        if (null !== $globals) {
+            $this->addGlobal('app', $globals);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($name)
+    {
+        if (!isset($this->helpers[$name])) {
+            throw new \InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name));
+        }
+
+        if (\is_string($this->helpers[$name])) {
+            $this->helpers[$name] = $this->container->get($this->helpers[$name]);
+            $this->helpers[$name]->setCharset($this->charset);
+        }
+
+        return $this->helpers[$name];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setHelpers(array $helpers)
+    {
+        $this->helpers = $helpers;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function renderResponse($view, array $parameters = [], Response $response = null)
+    {
+        if (null === $response) {
+            $response = new Response();
+        }
+
+        $response->setContent($this->render($view, $parameters));
+
+        return $response;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/TemplateFilenameParser.php b/vendor/symfony/framework-bundle/Templating/TemplateFilenameParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7c56cefb175447a23d09f329c68705a2a50e9da
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/TemplateFilenameParser.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating;
+
+@trigger_error('The '.TemplateFilenameParser::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\Templating\TemplateNameParserInterface;
+use Symfony\Component\Templating\TemplateReferenceInterface;
+
+/**
+ * TemplateFilenameParser converts template filenames to
+ * TemplateReferenceInterface instances.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class TemplateFilenameParser implements TemplateNameParserInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function parse($name)
+    {
+        if ($name instanceof TemplateReferenceInterface) {
+            return $name;
+        }
+
+        $parts = explode('/', str_replace('\\', '/', $name));
+
+        $elements = explode('.', array_pop($parts));
+        if (3 > \count($elements)) {
+            return false;
+        }
+        $engine = array_pop($elements);
+        $format = array_pop($elements);
+
+        return new TemplateReference('', implode('/', $parts), implode('.', $elements), $format, $engine);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/TemplateNameParser.php b/vendor/symfony/framework-bundle/Templating/TemplateNameParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..e553b85f03ffaf8dd307381f90a3f3d0d3b13889
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/TemplateNameParser.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating;
+
+@trigger_error('The '.TemplateNameParser::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\HttpKernel\KernelInterface;
+use Symfony\Component\Templating\TemplateNameParser as BaseTemplateNameParser;
+use Symfony\Component\Templating\TemplateReferenceInterface;
+
+/**
+ * TemplateNameParser converts template names from the short notation
+ * "bundle:section:template.format.engine" to TemplateReferenceInterface
+ * instances.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class TemplateNameParser extends BaseTemplateNameParser
+{
+    protected $kernel;
+    protected $cache = [];
+
+    public function __construct(KernelInterface $kernel)
+    {
+        $this->kernel = $kernel;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function parse($name)
+    {
+        if ($name instanceof TemplateReferenceInterface) {
+            return $name;
+        } elseif (isset($this->cache[$name])) {
+            return $this->cache[$name];
+        }
+
+        // normalize name
+        $name = preg_replace('#/{2,}#', '/', str_replace('\\', '/', $name));
+
+        if (str_contains($name, '..')) {
+            throw new \RuntimeException(sprintf('Template name "%s" contains invalid characters.', $name));
+        }
+
+        if (!preg_match('/^(?:([^:]*):([^:]*):)?(.+)\.([^\.]+)\.([^\.]+)$/', $name, $matches) || str_starts_with($name, '@')) {
+            return parent::parse($name);
+        }
+
+        $template = new TemplateReference($matches[1], $matches[2], $matches[3], $matches[4], $matches[5]);
+
+        if ($template->get('bundle')) {
+            try {
+                $this->kernel->getBundle($template->get('bundle'));
+            } catch (\Exception $e) {
+                throw new \InvalidArgumentException(sprintf('Template name "%s" is not valid.', $name), 0, $e);
+            }
+        }
+
+        return $this->cache[$name] = $template;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/TemplateReference.php b/vendor/symfony/framework-bundle/Templating/TemplateReference.php
new file mode 100644
index 0000000000000000000000000000000000000000..4bf4778a801b744a2a00d78adc7e77c67a4e12b7
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/TemplateReference.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating;
+
+@trigger_error('The '.TemplateReference::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Symfony\Component\Templating\TemplateReference as BaseTemplateReference;
+
+/**
+ * Internal representation of a template.
+ *
+ * @author Victor Berchet <victor@suumit.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class TemplateReference extends BaseTemplateReference
+{
+    public function __construct(string $bundle = null, string $controller = null, string $name = null, string $format = null, string $engine = null)
+    {
+        $this->parameters = [
+            'bundle' => $bundle,
+            'controller' => $controller,
+            'name' => $name,
+            'format' => $format,
+            'engine' => $engine,
+        ];
+    }
+
+    /**
+     * Returns the path to the template
+     *  - as a path when the template is not part of a bundle
+     *  - as a resource when the template is part of a bundle.
+     *
+     * @return string A path to the template or a resource
+     */
+    public function getPath()
+    {
+        $controller = str_replace('\\', '/', $this->get('controller'));
+
+        $path = (empty($controller) ? '' : $controller.'/').$this->get('name').'.'.$this->get('format').'.'.$this->get('engine');
+
+        return empty($this->parameters['bundle']) ? 'views/'.$path : '@'.$this->get('bundle').'/Resources/views/'.$path;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getLogicalName()
+    {
+        return sprintf('%s:%s:%s.%s.%s', $this->parameters['bundle'], $this->parameters['controller'], $this->parameters['name'], $this->parameters['format'], $this->parameters['engine']);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Templating/TimedPhpEngine.php b/vendor/symfony/framework-bundle/Templating/TimedPhpEngine.php
new file mode 100644
index 0000000000000000000000000000000000000000..76509a8f16a7a97c78f2d36aafc862bb9d5a49b5
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Templating/TimedPhpEngine.php
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Templating;
+
+@trigger_error('The '.TimedPhpEngine::class.' class is deprecated since version 4.3 and will be removed in 5.0; use Twig instead.', \E_USER_DEPRECATED);
+
+use Psr\Container\ContainerInterface;
+use Symfony\Component\Stopwatch\Stopwatch;
+use Symfony\Component\Templating\Loader\LoaderInterface;
+use Symfony\Component\Templating\TemplateNameParserInterface;
+
+/**
+ * Times the time spent to render a template.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 4.3, to be removed in 5.0; use Twig instead.
+ */
+class TimedPhpEngine extends PhpEngine
+{
+    protected $stopwatch;
+
+    public function __construct(TemplateNameParserInterface $parser, ContainerInterface $container, LoaderInterface $loader, Stopwatch $stopwatch, GlobalVariables $globals = null)
+    {
+        parent::__construct($parser, $container, $loader, $globals);
+
+        $this->stopwatch = $stopwatch;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function render($name, array $parameters = [])
+    {
+        $e = $this->stopwatch->start(sprintf('template.php (%s)', $name), 'template');
+
+        $ret = parent::render($name, $parameters);
+
+        $e->stop();
+
+        return $ret;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php b/vendor/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..086d83e8adf0c1d76b4964d0c8fc4eecf98cfd3e
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php
@@ -0,0 +1,159 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Test;
+
+use PHPUnit\Framework\Constraint\LogicalAnd;
+use PHPUnit\Framework\Constraint\LogicalNot;
+use Symfony\Component\BrowserKit\AbstractBrowser;
+use Symfony\Component\BrowserKit\Test\Constraint as BrowserKitConstraint;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Test\Constraint as ResponseConstraint;
+
+/**
+ * Ideas borrowed from Laravel Dusk's assertions.
+ *
+ * @see https://laravel.com/docs/5.7/dusk#available-assertions
+ */
+trait BrowserKitAssertionsTrait
+{
+    public static function assertResponseIsSuccessful(string $message = ''): void
+    {
+        self::assertThat(self::getResponse(), new ResponseConstraint\ResponseIsSuccessful(), $message);
+    }
+
+    public static function assertResponseStatusCodeSame(int $expectedCode, string $message = ''): void
+    {
+        self::assertThat(self::getResponse(), new ResponseConstraint\ResponseStatusCodeSame($expectedCode), $message);
+    }
+
+    public static function assertResponseRedirects(string $expectedLocation = null, int $expectedCode = null, string $message = ''): void
+    {
+        $constraint = new ResponseConstraint\ResponseIsRedirected();
+        if ($expectedLocation) {
+            $constraint = LogicalAnd::fromConstraints($constraint, new ResponseConstraint\ResponseHeaderSame('Location', $expectedLocation));
+        }
+        if ($expectedCode) {
+            $constraint = LogicalAnd::fromConstraints($constraint, new ResponseConstraint\ResponseStatusCodeSame($expectedCode));
+        }
+
+        self::assertThat(self::getResponse(), $constraint, $message);
+    }
+
+    public static function assertResponseHasHeader(string $headerName, string $message = ''): void
+    {
+        self::assertThat(self::getResponse(), new ResponseConstraint\ResponseHasHeader($headerName), $message);
+    }
+
+    public static function assertResponseNotHasHeader(string $headerName, string $message = ''): void
+    {
+        self::assertThat(self::getResponse(), new LogicalNot(new ResponseConstraint\ResponseHasHeader($headerName)), $message);
+    }
+
+    public static function assertResponseHeaderSame(string $headerName, string $expectedValue, string $message = ''): void
+    {
+        self::assertThat(self::getResponse(), new ResponseConstraint\ResponseHeaderSame($headerName, $expectedValue), $message);
+    }
+
+    public static function assertResponseHeaderNotSame(string $headerName, string $expectedValue, string $message = ''): void
+    {
+        self::assertThat(self::getResponse(), new LogicalNot(new ResponseConstraint\ResponseHeaderSame($headerName, $expectedValue)), $message);
+    }
+
+    public static function assertResponseHasCookie(string $name, string $path = '/', string $domain = null, string $message = ''): void
+    {
+        self::assertThat(self::getResponse(), new ResponseConstraint\ResponseHasCookie($name, $path, $domain), $message);
+    }
+
+    public static function assertResponseNotHasCookie(string $name, string $path = '/', string $domain = null, string $message = ''): void
+    {
+        self::assertThat(self::getResponse(), new LogicalNot(new ResponseConstraint\ResponseHasCookie($name, $path, $domain)), $message);
+    }
+
+    public static function assertResponseCookieValueSame(string $name, string $expectedValue, string $path = '/', string $domain = null, string $message = ''): void
+    {
+        self::assertThat(self::getResponse(), LogicalAnd::fromConstraints(
+            new ResponseConstraint\ResponseHasCookie($name, $path, $domain),
+            new ResponseConstraint\ResponseCookieValueSame($name, $expectedValue, $path, $domain)
+        ), $message);
+    }
+
+    public static function assertBrowserHasCookie(string $name, string $path = '/', string $domain = null, string $message = ''): void
+    {
+        self::assertThat(self::getClient(), new BrowserKitConstraint\BrowserHasCookie($name, $path, $domain), $message);
+    }
+
+    public static function assertBrowserNotHasCookie(string $name, string $path = '/', string $domain = null, string $message = ''): void
+    {
+        self::assertThat(self::getClient(), new LogicalNot(new BrowserKitConstraint\BrowserHasCookie($name, $path, $domain)), $message);
+    }
+
+    public static function assertBrowserCookieValueSame(string $name, string $expectedValue, bool $raw = false, string $path = '/', string $domain = null, string $message = ''): void
+    {
+        self::assertThat(self::getClient(), LogicalAnd::fromConstraints(
+            new BrowserKitConstraint\BrowserHasCookie($name, $path, $domain),
+            new BrowserKitConstraint\BrowserCookieValueSame($name, $expectedValue, $raw, $path, $domain)
+        ), $message);
+    }
+
+    public static function assertRequestAttributeValueSame(string $name, string $expectedValue, string $message = ''): void
+    {
+        self::assertThat(self::getRequest(), new ResponseConstraint\RequestAttributeValueSame($name, $expectedValue), $message);
+    }
+
+    public static function assertRouteSame($expectedRoute, array $parameters = [], string $message = ''): void
+    {
+        $constraint = new ResponseConstraint\RequestAttributeValueSame('_route', $expectedRoute);
+        $constraints = [];
+        foreach ($parameters as $key => $value) {
+            $constraints[] = new ResponseConstraint\RequestAttributeValueSame($key, $value);
+        }
+        if ($constraints) {
+            $constraint = LogicalAnd::fromConstraints($constraint, ...$constraints);
+        }
+
+        self::assertThat(self::getRequest(), $constraint, $message);
+    }
+
+    private static function getClient(AbstractBrowser $newClient = null): ?AbstractBrowser
+    {
+        static $client;
+
+        if (0 < \func_num_args()) {
+            return $client = $newClient;
+        }
+
+        if (!$client instanceof AbstractBrowser) {
+            static::fail(sprintf('A client must be set to make assertions on it. Did you forget to call "%s::createClient()"?', __CLASS__));
+        }
+
+        return $client;
+    }
+
+    private static function getResponse(): Response
+    {
+        if (!$response = self::getClient()->getResponse()) {
+            static::fail('A client must have an HTTP Response to make assertions. Did you forget to make an HTTP request?');
+        }
+
+        return $response;
+    }
+
+    private static function getRequest(): Request
+    {
+        if (!$request = self::getClient()->getRequest()) {
+            static::fail('A client must have an HTTP Request to make assertions. Did you forget to make an HTTP request?');
+        }
+
+        return $request;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Test/DomCrawlerAssertionsTrait.php b/vendor/symfony/framework-bundle/Test/DomCrawlerAssertionsTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..465c265f6921daa33f748160de7c4d39c20214ea
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Test/DomCrawlerAssertionsTrait.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Test;
+
+use PHPUnit\Framework\Constraint\LogicalAnd;
+use PHPUnit\Framework\Constraint\LogicalNot;
+use Symfony\Component\DomCrawler\Crawler;
+use Symfony\Component\DomCrawler\Test\Constraint as DomCrawlerConstraint;
+
+/**
+ * Ideas borrowed from Laravel Dusk's assertions.
+ *
+ * @see https://laravel.com/docs/5.7/dusk#available-assertions
+ */
+trait DomCrawlerAssertionsTrait
+{
+    public static function assertSelectorExists(string $selector, string $message = ''): void
+    {
+        self::assertThat(self::getCrawler(), new DomCrawlerConstraint\CrawlerSelectorExists($selector), $message);
+    }
+
+    public static function assertSelectorNotExists(string $selector, string $message = ''): void
+    {
+        self::assertThat(self::getCrawler(), new LogicalNot(new DomCrawlerConstraint\CrawlerSelectorExists($selector)), $message);
+    }
+
+    public static function assertSelectorTextContains(string $selector, string $text, string $message = ''): void
+    {
+        self::assertThat(self::getCrawler(), LogicalAnd::fromConstraints(
+            new DomCrawlerConstraint\CrawlerSelectorExists($selector),
+            new DomCrawlerConstraint\CrawlerSelectorTextContains($selector, $text)
+        ), $message);
+    }
+
+    public static function assertSelectorTextSame(string $selector, string $text, string $message = ''): void
+    {
+        self::assertThat(self::getCrawler(), LogicalAnd::fromConstraints(
+            new DomCrawlerConstraint\CrawlerSelectorExists($selector),
+            new DomCrawlerConstraint\CrawlerSelectorTextSame($selector, $text)
+        ), $message);
+    }
+
+    public static function assertSelectorTextNotContains(string $selector, string $text, string $message = ''): void
+    {
+        self::assertThat(self::getCrawler(), LogicalAnd::fromConstraints(
+            new DomCrawlerConstraint\CrawlerSelectorExists($selector),
+            new LogicalNot(new DomCrawlerConstraint\CrawlerSelectorTextContains($selector, $text))
+        ), $message);
+    }
+
+    public static function assertPageTitleSame(string $expectedTitle, string $message = ''): void
+    {
+        self::assertSelectorTextSame('title', $expectedTitle, $message);
+    }
+
+    public static function assertPageTitleContains(string $expectedTitle, string $message = ''): void
+    {
+        self::assertSelectorTextContains('title', $expectedTitle, $message);
+    }
+
+    public static function assertInputValueSame(string $fieldName, string $expectedValue, string $message = ''): void
+    {
+        self::assertThat(self::getCrawler(), LogicalAnd::fromConstraints(
+            new DomCrawlerConstraint\CrawlerSelectorExists("input[name=\"$fieldName\"]"),
+            new DomCrawlerConstraint\CrawlerSelectorAttributeValueSame("input[name=\"$fieldName\"]", 'value', $expectedValue)
+        ), $message);
+    }
+
+    public static function assertInputValueNotSame(string $fieldName, string $expectedValue, string $message = ''): void
+    {
+        self::assertThat(self::getCrawler(), LogicalAnd::fromConstraints(
+            new DomCrawlerConstraint\CrawlerSelectorExists("input[name=\"$fieldName\"]"),
+            new LogicalNot(new DomCrawlerConstraint\CrawlerSelectorAttributeValueSame("input[name=\"$fieldName\"]", 'value', $expectedValue))
+        ), $message);
+    }
+
+    private static function getCrawler(): Crawler
+    {
+        if (!$crawler = self::getClient()->getCrawler()) {
+            static::fail('A client must have a crawler to make assertions. Did you forget to make an HTTP request?');
+        }
+
+        return $crawler;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Test/ForwardCompatTestTrait.php b/vendor/symfony/framework-bundle/Test/ForwardCompatTestTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a0dad403063c070eaeb20970e3cbed3fe05d282
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Test/ForwardCompatTestTrait.php
@@ -0,0 +1,78 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Test;
+
+use PHPUnit\Framework\TestCase;
+
+// Auto-adapt to PHPUnit 8 that added a `void` return-type to the setUp/tearDown methods
+
+if ((new \ReflectionMethod(TestCase::class, 'tearDown'))->hasReturnType()) {
+    /**
+     * @internal
+     */
+    trait ForwardCompatTestTrait
+    {
+        private function doSetUp(): void
+        {
+        }
+
+        private function doTearDown(): void
+        {
+        }
+
+        protected function setUp(): void
+        {
+            $this->doSetUp();
+        }
+
+        protected function tearDown(): void
+        {
+            $this->doTearDown();
+        }
+    }
+} else {
+    /**
+     * @internal
+     */
+    trait ForwardCompatTestTrait
+    {
+        /**
+         * @return void
+         */
+        private function doSetUp()
+        {
+        }
+
+        /**
+         * @return void
+         */
+        private function doTearDown()
+        {
+        }
+
+        /**
+         * @return void
+         */
+        protected function setUp()
+        {
+            $this->doSetUp();
+        }
+
+        /**
+         * @return void
+         */
+        protected function tearDown()
+        {
+            $this->doTearDown();
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Test/KernelTestCase.php b/vendor/symfony/framework-bundle/Test/KernelTestCase.php
new file mode 100644
index 0000000000000000000000000000000000000000..5df1cc87df7afaafcbafac0b48f1c5a442b75380
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Test/KernelTestCase.php
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Test;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpKernel\KernelInterface;
+use Symfony\Contracts\Service\ResetInterface;
+
+/**
+ * KernelTestCase is the base class for tests needing a Kernel.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class KernelTestCase extends TestCase
+{
+    use ForwardCompatTestTrait;
+
+    protected static $class;
+
+    /**
+     * @var KernelInterface
+     */
+    protected static $kernel;
+
+    /**
+     * @var ContainerInterface
+     */
+    protected static $container;
+
+    protected static $booted = false;
+
+    private function doTearDown()
+    {
+        static::ensureKernelShutdown();
+        static::$class = null;
+        static::$kernel = null;
+        static::$booted = false;
+    }
+
+    /**
+     * @return string The Kernel class name
+     *
+     * @throws \RuntimeException
+     * @throws \LogicException
+     */
+    protected static function getKernelClass()
+    {
+        if (!isset($_SERVER['KERNEL_CLASS']) && !isset($_ENV['KERNEL_CLASS'])) {
+            throw new \LogicException(sprintf('You must set the KERNEL_CLASS environment variable to the fully-qualified class name of your Kernel in phpunit.xml / phpunit.xml.dist or override the "%1$s::createKernel()" or "%1$s::getKernelClass()" method.', static::class));
+        }
+
+        if (!class_exists($class = $_ENV['KERNEL_CLASS'] ?? $_SERVER['KERNEL_CLASS'])) {
+            throw new \RuntimeException(sprintf('Class "%s" doesn\'t exist or cannot be autoloaded. Check that the KERNEL_CLASS value in phpunit.xml matches the fully-qualified class name of your Kernel or override the "%s::createKernel()" method.', $class, static::class));
+        }
+
+        return $class;
+    }
+
+    /**
+     * Boots the Kernel for this test.
+     *
+     * @return KernelInterface A KernelInterface instance
+     */
+    protected static function bootKernel(array $options = [])
+    {
+        static::ensureKernelShutdown();
+
+        $kernel = static::createKernel($options);
+        $kernel->boot();
+        static::$kernel = $kernel;
+        static::$booted = true;
+
+        $container = static::$kernel->getContainer();
+        static::$container = $container->has('test.service_container') ? $container->get('test.service_container') : $container;
+
+        return static::$kernel;
+    }
+
+    /**
+     * Creates a Kernel.
+     *
+     * Available options:
+     *
+     *  * environment
+     *  * debug
+     *
+     * @return KernelInterface A KernelInterface instance
+     */
+    protected static function createKernel(array $options = [])
+    {
+        if (null === static::$class) {
+            static::$class = static::getKernelClass();
+        }
+
+        if (isset($options['environment'])) {
+            $env = $options['environment'];
+        } elseif (isset($_ENV['APP_ENV'])) {
+            $env = $_ENV['APP_ENV'];
+        } elseif (isset($_SERVER['APP_ENV'])) {
+            $env = $_SERVER['APP_ENV'];
+        } else {
+            $env = 'test';
+        }
+
+        if (isset($options['debug'])) {
+            $debug = $options['debug'];
+        } elseif (isset($_ENV['APP_DEBUG'])) {
+            $debug = $_ENV['APP_DEBUG'];
+        } elseif (isset($_SERVER['APP_DEBUG'])) {
+            $debug = $_SERVER['APP_DEBUG'];
+        } else {
+            $debug = true;
+        }
+
+        return new static::$class($env, $debug);
+    }
+
+    /**
+     * Shuts the kernel down if it was used in the test - called by the tearDown method by default.
+     */
+    protected static function ensureKernelShutdown()
+    {
+        if (null !== static::$kernel) {
+            static::$kernel->boot();
+            $container = static::$kernel->getContainer();
+            static::$kernel->shutdown();
+            static::$booted = false;
+
+            if ($container instanceof ResetInterface) {
+                $container->reset();
+            }
+        }
+
+        static::$container = null;
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Test/MailerAssertionsTrait.php b/vendor/symfony/framework-bundle/Test/MailerAssertionsTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..d0ca84e25ae7a99b765713260762045f9b9f5726
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Test/MailerAssertionsTrait.php
@@ -0,0 +1,127 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Test;
+
+use PHPUnit\Framework\Constraint\LogicalNot;
+use Symfony\Component\Mailer\Event\MessageEvent;
+use Symfony\Component\Mailer\Event\MessageEvents;
+use Symfony\Component\Mailer\Test\Constraint as MailerConstraint;
+use Symfony\Component\Mime\RawMessage;
+use Symfony\Component\Mime\Test\Constraint as MimeConstraint;
+
+trait MailerAssertionsTrait
+{
+    public static function assertEmailCount(int $count, string $transport = null, string $message = ''): void
+    {
+        self::assertThat(self::getMessageMailerEvents(), new MailerConstraint\EmailCount($count, $transport), $message);
+    }
+
+    public static function assertQueuedEmailCount(int $count, string $transport = null, string $message = ''): void
+    {
+        self::assertThat(self::getMessageMailerEvents(), new MailerConstraint\EmailCount($count, $transport, true), $message);
+    }
+
+    public static function assertEmailIsQueued(MessageEvent $event, string $message = ''): void
+    {
+        self::assertThat($event, new MailerConstraint\EmailIsQueued(), $message);
+    }
+
+    public static function assertEmailIsNotQueued(MessageEvent $event, string $message = ''): void
+    {
+        self::assertThat($event, new LogicalNot(new MailerConstraint\EmailIsQueued()), $message);
+    }
+
+    public static function assertEmailAttachmentCount(RawMessage $email, int $count, string $message = ''): void
+    {
+        self::assertThat($email, new MimeConstraint\EmailAttachmentCount($count), $message);
+    }
+
+    public static function assertEmailTextBodyContains(RawMessage $email, string $text, string $message = ''): void
+    {
+        self::assertThat($email, new MimeConstraint\EmailTextBodyContains($text), $message);
+    }
+
+    public static function assertEmailTextBodyNotContains(RawMessage $email, string $text, string $message = ''): void
+    {
+        self::assertThat($email, new LogicalNot(new MimeConstraint\EmailTextBodyContains($text)), $message);
+    }
+
+    public static function assertEmailHtmlBodyContains(RawMessage $email, string $text, string $message = ''): void
+    {
+        self::assertThat($email, new MimeConstraint\EmailHtmlBodyContains($text), $message);
+    }
+
+    public static function assertEmailHtmlBodyNotContains(RawMessage $email, string $text, string $message = ''): void
+    {
+        self::assertThat($email, new LogicalNot(new MimeConstraint\EmailHtmlBodyContains($text)), $message);
+    }
+
+    public static function assertEmailHasHeader(RawMessage $email, string $headerName, string $message = ''): void
+    {
+        self::assertThat($email, new MimeConstraint\EmailHasHeader($headerName), $message);
+    }
+
+    public static function assertEmailNotHasHeader(RawMessage $email, string $headerName, string $message = ''): void
+    {
+        self::assertThat($email, new LogicalNot(new MimeConstraint\EmailHasHeader($headerName)), $message);
+    }
+
+    public static function assertEmailHeaderSame(RawMessage $email, string $headerName, string $expectedValue, string $message = ''): void
+    {
+        self::assertThat($email, new MimeConstraint\EmailHeaderSame($headerName, $expectedValue), $message);
+    }
+
+    public static function assertEmailHeaderNotSame(RawMessage $email, string $headerName, string $expectedValue, string $message = ''): void
+    {
+        self::assertThat($email, new LogicalNot(new MimeConstraint\EmailHeaderSame($headerName, $expectedValue)), $message);
+    }
+
+    public static function assertEmailAddressContains(RawMessage $email, string $headerName, string $expectedValue, string $message = ''): void
+    {
+        self::assertThat($email, new MimeConstraint\EmailAddressContains($headerName, $expectedValue), $message);
+    }
+
+    /**
+     * @return MessageEvents[]
+     */
+    public static function getMailerEvents(string $transport = null): array
+    {
+        return self::getMessageMailerEvents()->getEvents($transport);
+    }
+
+    public static function getMailerEvent(int $index = 0, string $transport = null): ?MessageEvent
+    {
+        return self::getMailerEvents($transport)[$index] ?? null;
+    }
+
+    /**
+     * @return RawMessage[]
+     */
+    public static function getMailerMessages(string $transport = null): array
+    {
+        return self::getMessageMailerEvents()->getMessages($transport);
+    }
+
+    public static function getMailerMessage(int $index = 0, string $transport = null): ?RawMessage
+    {
+        return self::getMailerMessages($transport)[$index] ?? null;
+    }
+
+    private static function getMessageMailerEvents(): MessageEvents
+    {
+        if (!self::$container->has('mailer.logger_message_listener')) {
+            static::fail('A client must have Mailer enabled to make email assertions. Did you forget to require symfony/mailer?');
+        }
+
+        return self::$container->get('mailer.logger_message_listener')->getEvents();
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Test/TestContainer.php b/vendor/symfony/framework-bundle/Test/TestContainer.php
new file mode 100644
index 0000000000000000000000000000000000000000..d5aec6830317e5bb335f0159c41737336fddd885
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Test/TestContainer.php
@@ -0,0 +1,156 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Test;
+
+use Psr\Container\ContainerInterface;
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class TestContainer extends Container
+{
+    private $kernel;
+    private $privateServicesLocatorId;
+
+    public function __construct(KernelInterface $kernel, string $privateServicesLocatorId)
+    {
+        $this->kernel = $kernel;
+        $this->privateServicesLocatorId = $privateServicesLocatorId;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function compile()
+    {
+        $this->getPublicContainer()->compile();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isCompiled(): bool
+    {
+        return $this->getPublicContainer()->isCompiled();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getParameterBag(): ParameterBagInterface
+    {
+        return $this->getPublicContainer()->getParameterBag();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return array|bool|float|int|string|\UnitEnum|null
+     */
+    public function getParameter($name)
+    {
+        return $this->getPublicContainer()->getParameter($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasParameter($name): bool
+    {
+        return $this->getPublicContainer()->hasParameter($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setParameter($name, $value)
+    {
+        $this->getPublicContainer()->setParameter($name, $value);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($id, $service)
+    {
+        $this->getPublicContainer()->set($id, $service);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($id): bool
+    {
+        return $this->getPublicContainer()->has($id) || $this->getPrivateContainer()->has($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return object|null
+     */
+    public function get($id, $invalidBehavior = /* self::EXCEPTION_ON_INVALID_REFERENCE */ 1)
+    {
+        return $this->getPrivateContainer()->has($id) ? $this->getPrivateContainer()->get($id) : $this->getPublicContainer()->get($id, $invalidBehavior);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialized($id): bool
+    {
+        return $this->getPublicContainer()->initialized($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        // ignore the call
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getServiceIds(): array
+    {
+        return $this->getPublicContainer()->getServiceIds();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRemovedIds(): array
+    {
+        return $this->getPublicContainer()->getRemovedIds();
+    }
+
+    private function getPublicContainer(): Container
+    {
+        if (null === $container = $this->kernel->getContainer()) {
+            throw new \LogicException('Cannot access the container on a non-booted kernel. Did you forget to boot it?');
+        }
+
+        return $container;
+    }
+
+    private function getPrivateContainer(): ContainerInterface
+    {
+        return $this->getPublicContainer()->get($this->privateServicesLocatorId);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Test/WebTestAssertionsTrait.php b/vendor/symfony/framework-bundle/Test/WebTestAssertionsTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f1742ee3e2ca7d86ac5770779f85f72d4b83aea
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Test/WebTestAssertionsTrait.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Test;
+
+trait WebTestAssertionsTrait
+{
+    use BrowserKitAssertionsTrait;
+    use DomCrawlerAssertionsTrait;
+}
diff --git a/vendor/symfony/framework-bundle/Test/WebTestCase.php b/vendor/symfony/framework-bundle/Test/WebTestCase.php
new file mode 100644
index 0000000000000000000000000000000000000000..19da82c83d0e3029c50e3d53a0f397c60e00c6aa
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Test/WebTestCase.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Test;
+
+use Symfony\Bundle\FrameworkBundle\KernelBrowser;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+
+/**
+ * WebTestCase is the base class for functional tests.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class WebTestCase extends KernelTestCase
+{
+    use ForwardCompatTestTrait;
+    use MailerAssertionsTrait;
+    use WebTestAssertionsTrait;
+
+    private function doTearDown()
+    {
+        parent::tearDown();
+        self::getClient(null);
+    }
+
+    /**
+     * Creates a KernelBrowser.
+     *
+     * @param array $options An array of options to pass to the createKernel method
+     * @param array $server  An array of server parameters
+     *
+     * @return KernelBrowser A KernelBrowser instance
+     */
+    protected static function createClient(array $options = [], array $server = [])
+    {
+        if (static::$booted) {
+            @trigger_error(sprintf('Calling "%s()" while a kernel has been booted is deprecated since Symfony 4.4 and will throw an exception in 5.0, ensure the kernel is shut down before calling the method.', __METHOD__), \E_USER_DEPRECATED);
+        }
+
+        $kernel = static::bootKernel($options);
+
+        try {
+            $client = $kernel->getContainer()->get('test.client');
+        } catch (ServiceNotFoundException $e) {
+            if (class_exists(KernelBrowser::class)) {
+                throw new \LogicException('You cannot create the client used in functional tests if the "framework.test" config is not set to true.');
+            }
+            throw new \LogicException('You cannot create the client used in functional tests if the BrowserKit component is not available. Try running "composer require symfony/browser-kit".');
+        }
+
+        $client->setServerParameters($server);
+
+        return self::getClient($client);
+    }
+}
diff --git a/vendor/symfony/framework-bundle/Translation/Translator.php b/vendor/symfony/framework-bundle/Translation/Translator.php
new file mode 100644
index 0000000000000000000000000000000000000000..cd5444034ba7cab87aab053bc6ff410cb7fca89a
--- /dev/null
+++ b/vendor/symfony/framework-bundle/Translation/Translator.php
@@ -0,0 +1,173 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Translation;
+
+use Psr\Container\ContainerInterface;
+use Symfony\Component\Config\Resource\DirectoryResource;
+use Symfony\Component\Config\Resource\FileExistenceResource;
+use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\Formatter\MessageFormatterInterface;
+use Symfony\Component\Translation\Translator as BaseTranslator;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Translator extends BaseTranslator implements WarmableInterface
+{
+    protected $container;
+    protected $loaderIds;
+
+    protected $options = [
+        'cache_dir' => null,
+        'debug' => false,
+        'resource_files' => [],
+        'scanned_directories' => [],
+        'cache_vary' => [],
+    ];
+
+    /**
+     * @var array
+     */
+    private $resourceLocales;
+
+    /**
+     * Holds parameters from addResource() calls so we can defer the actual
+     * parent::addResource() calls until initialize() is executed.
+     *
+     * @var array
+     */
+    private $resources = [];
+
+    private $resourceFiles;
+
+    /**
+     * @var string[]
+     */
+    private $scannedDirectories;
+
+    /**
+     * Constructor.
+     *
+     * Available options:
+     *
+     *   * cache_dir:      The cache directory (or null to disable caching)
+     *   * debug:          Whether to enable debugging or not (false by default)
+     *   * resource_files: List of translation resources available grouped by locale.
+     *   * cache_vary:     An array of data that is serialized to generate the cached catalogue name.
+     *
+     * @throws InvalidArgumentException
+     */
+    public function __construct(ContainerInterface $container, MessageFormatterInterface $formatter, string $defaultLocale, array $loaderIds = [], array $options = [])
+    {
+        $this->container = $container;
+        $this->loaderIds = $loaderIds;
+
+        // check option names
+        if ($diff = array_diff(array_keys($options), array_keys($this->options))) {
+            throw new InvalidArgumentException(sprintf('The Translator does not support the following options: \'%s\'.', implode('\', \'', $diff)));
+        }
+
+        $this->options = array_merge($this->options, $options);
+        $this->resourceLocales = array_keys($this->options['resource_files']);
+        $this->resourceFiles = $this->options['resource_files'];
+        $this->scannedDirectories = $this->options['scanned_directories'];
+
+        parent::__construct($defaultLocale, $formatter, $this->options['cache_dir'], $this->options['debug'], $this->options['cache_vary']);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function warmUp($cacheDir)
+    {
+        // skip warmUp when translator doesn't use cache
+        if (null === $this->options['cache_dir']) {
+            return;
+        }
+
+        $locales = array_merge($this->getFallbackLocales(), [$this->getLocale()], $this->resourceLocales);
+        foreach (array_unique($locales) as $locale) {
+            // reset catalogue in case it's already loaded during the dump of the other locales.
+            if (isset($this->catalogues[$locale])) {
+                unset($this->catalogues[$locale]);
+            }
+
+            $this->loadCatalogue($locale);
+        }
+    }
+
+    public function addResource($format, $resource, $locale, $domain = null)
+    {
+        if ($this->resourceFiles) {
+            $this->addResourceFiles();
+        }
+        $this->resources[] = [$format, $resource, $locale, $domain];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function initializeCatalogue($locale)
+    {
+        $this->initialize();
+        parent::initializeCatalogue($locale);
+    }
+
+    /**
+     * @internal
+     */
+    protected function doLoadCatalogue(string $locale): void
+    {
+        parent::doLoadCatalogue($locale);
+
+        foreach ($this->scannedDirectories as $directory) {
+            $resourceClass = file_exists($directory) ? DirectoryResource::class : FileExistenceResource::class;
+            $this->catalogues[$locale]->addResource(new $resourceClass($directory));
+        }
+    }
+
+    protected function initialize()
+    {
+        if ($this->resourceFiles) {
+            $this->addResourceFiles();
+        }
+        foreach ($this->resources as $key => $params) {
+            [$format, $resource, $locale, $domain] = $params;
+            parent::addResource($format, $resource, $locale, $domain);
+        }
+        $this->resources = [];
+
+        foreach ($this->loaderIds as $id => $aliases) {
+            foreach ($aliases as $alias) {
+                $this->addLoader($alias, $this->container->get($id));
+            }
+        }
+    }
+
+    private function addResourceFiles()
+    {
+        $filesByLocale = $this->resourceFiles;
+        $this->resourceFiles = [];
+
+        foreach ($filesByLocale as $locale => $files) {
+            foreach ($files as $key => $file) {
+                // filename is domain.locale.format
+                $fileNameParts = explode('.', basename($file));
+                $format = array_pop($fileNameParts);
+                $locale = array_pop($fileNameParts);
+                $domain = implode('.', $fileNameParts);
+                $this->addResource($format, $file, $locale, $domain);
+            }
+        }
+    }
+}
diff --git a/vendor/symfony/framework-bundle/composer.json b/vendor/symfony/framework-bundle/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..bf3ffcac6fe0fc607bcdc64f4fbb98d5f2f2c0f0
--- /dev/null
+++ b/vendor/symfony/framework-bundle/composer.json
@@ -0,0 +1,113 @@
+{
+    "name": "symfony/framework-bundle",
+    "type": "symfony-bundle",
+    "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=7.1.3",
+        "ext-xml": "*",
+        "symfony/cache": "^4.4|^5.0",
+        "symfony/config": "^4.4.11|~5.0.11|^5.1.3",
+        "symfony/dependency-injection": "^4.4.38|^5.0.1",
+        "symfony/error-handler": "^4.4.1|^5.0.1",
+        "symfony/http-foundation": "^4.4|^5.0",
+        "symfony/http-kernel": "^4.4",
+        "symfony/polyfill-mbstring": "~1.0",
+        "symfony/polyfill-php80": "^1.16",
+        "symfony/filesystem": "^3.4|^4.0|^5.0",
+        "symfony/finder": "^3.4|^4.0|^5.0",
+        "symfony/routing": "^4.4.12|^5.1.4"
+    },
+    "require-dev": {
+        "doctrine/annotations": "^1.10.4",
+        "doctrine/cache": "^1.0|^2.0",
+        "doctrine/persistence": "^1.3|^2|^3",
+        "paragonie/sodium_compat": "^1.8",
+        "symfony/asset": "^3.4|^4.0|^5.0",
+        "symfony/browser-kit": "^4.3|^5.0",
+        "symfony/console": "^4.4.42|^5.4.9",
+        "symfony/css-selector": "^3.4|^4.0|^5.0",
+        "symfony/dom-crawler": "^4.4.30|^5.3.7",
+        "symfony/dotenv": "^4.3.6|^5.0",
+        "symfony/polyfill-intl-icu": "~1.0",
+        "symfony/form": "^4.3.5|^5.0",
+        "symfony/expression-language": "^3.4|^4.0|^5.0",
+        "symfony/http-client": "^4.4|^5.0",
+        "symfony/lock": "^4.4|^5.0",
+        "symfony/mailer": "^4.4|^5.0",
+        "symfony/messenger": "^4.4|^5.0",
+        "symfony/mime": "^4.4|^5.0",
+        "symfony/process": "^3.4|^4.0|^5.0",
+        "symfony/security-core": "^3.4|^4.4|^5.2",
+        "symfony/security-csrf": "^3.4|^4.0|^5.0",
+        "symfony/security-http": "^3.4|^4.0|^5.0",
+        "symfony/serializer": "^4.4|^5.0",
+        "symfony/stopwatch": "^3.4|^4.0|^5.0",
+        "symfony/translation": "^4.4|^5.0",
+        "symfony/templating": "^3.4|^4.0|^5.0",
+        "symfony/twig-bundle": "^4.4|^5.0",
+        "symfony/validator": "^4.4|^5.0",
+        "symfony/workflow": "^4.3.6|^5.0",
+        "symfony/yaml": "^3.4|^4.0|^5.0",
+        "symfony/property-info": "^3.4|^4.0|^5.0",
+        "symfony/web-link": "^4.4|^5.0",
+        "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+        "twig/twig": "^1.43|^2.13|^3.0.4"
+    },
+    "conflict": {
+        "doctrine/persistence": "<1.3",
+        "phpdocumentor/reflection-docblock": "<3.0|>=3.2.0,<3.2.2",
+        "phpdocumentor/type-resolver": "<0.3.0|1.3.*",
+        "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+        "symfony/asset": "<3.4",
+        "symfony/browser-kit": "<4.3",
+        "symfony/console": "<4.4.21",
+        "symfony/dotenv": "<4.3.6",
+        "symfony/dom-crawler": "<4.3",
+        "symfony/http-client": "<4.4",
+        "symfony/form": "<4.3.5",
+        "symfony/lock": "<4.4",
+        "symfony/mailer": "<4.4",
+        "symfony/messenger": "<4.4",
+        "symfony/mime": "<4.4",
+        "symfony/property-info": "<3.4",
+        "symfony/security-bundle": "<4.4",
+        "symfony/serializer": "<4.4",
+        "symfony/stopwatch": "<3.4",
+        "symfony/translation": "<4.4",
+        "symfony/twig-bridge": "<4.1.1",
+        "symfony/twig-bundle": "<4.4",
+        "symfony/validator": "<4.4",
+        "symfony/web-profiler-bundle": "<4.4",
+        "symfony/workflow": "<4.3.6"
+    },
+    "suggest": {
+        "ext-apcu": "For best performance of the system caches",
+        "symfony/console": "For using the console commands",
+        "symfony/form": "For using forms",
+        "symfony/serializer": "For using the serializer service",
+        "symfony/validator": "For using validation",
+        "symfony/yaml": "For using the debug:config and lint:yaml commands",
+        "symfony/property-info": "For using the property_info service",
+        "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Bundle\\FrameworkBundle\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev"
+}
diff --git a/vendor/symfony/var-exporter/CHANGELOG.md b/vendor/symfony/var-exporter/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..3406c30efb4bf4081900058706df3164931e42a1
--- /dev/null
+++ b/vendor/symfony/var-exporter/CHANGELOG.md
@@ -0,0 +1,12 @@
+CHANGELOG
+=========
+
+5.1.0
+-----
+
+ * added argument `array &$foundClasses` to `VarExporter::export()` to ease with preloading exported values
+
+4.2.0
+-----
+
+ * added the component
diff --git a/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php b/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php
new file mode 100644
index 0000000000000000000000000000000000000000..4cebe44b0fe49daa6d7c5c3c2da3e5179647e482
--- /dev/null
+++ b/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarExporter\Exception;
+
+class ClassNotFoundException extends \Exception implements ExceptionInterface
+{
+    public function __construct(string $class, \Throwable $previous = null)
+    {
+        parent::__construct(sprintf('Class "%s" not found.', $class), 0, $previous);
+    }
+}
diff --git a/vendor/symfony/var-exporter/Exception/ExceptionInterface.php b/vendor/symfony/var-exporter/Exception/ExceptionInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..adfaed47c0da5d7cdeabade83d995914c23f3683
--- /dev/null
+++ b/vendor/symfony/var-exporter/Exception/ExceptionInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarExporter\Exception;
+
+interface ExceptionInterface extends \Throwable
+{
+}
diff --git a/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php b/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php
new file mode 100644
index 0000000000000000000000000000000000000000..771ee612dbc378bff55b5207d009802c5f36fa86
--- /dev/null
+++ b/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarExporter\Exception;
+
+class NotInstantiableTypeException extends \Exception implements ExceptionInterface
+{
+    public function __construct(string $type, \Throwable $previous = null)
+    {
+        parent::__construct(sprintf('Type "%s" is not instantiable.', $type), 0, $previous);
+    }
+}
diff --git a/vendor/symfony/var-exporter/Instantiator.php b/vendor/symfony/var-exporter/Instantiator.php
new file mode 100644
index 0000000000000000000000000000000000000000..368c769ac4fc7d4c5999f01af2c6f04f7c8ddef1
--- /dev/null
+++ b/vendor/symfony/var-exporter/Instantiator.php
@@ -0,0 +1,92 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarExporter;
+
+use Symfony\Component\VarExporter\Exception\ExceptionInterface;
+use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException;
+use Symfony\Component\VarExporter\Internal\Hydrator;
+use Symfony\Component\VarExporter\Internal\Registry;
+
+/**
+ * A utility class to create objects without calling their constructor.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+final class Instantiator
+{
+    /**
+     * Creates an object and sets its properties without calling its constructor nor any other methods.
+     *
+     * For example:
+     *
+     *     // creates an empty instance of Foo
+     *     Instantiator::instantiate(Foo::class);
+     *
+     *     // creates a Foo instance and sets one of its properties
+     *     Instantiator::instantiate(Foo::class, ['propertyName' => $propertyValue]);
+     *
+     *     // creates a Foo instance and sets a private property defined on its parent Bar class
+     *     Instantiator::instantiate(Foo::class, [], [
+     *         Bar::class => ['privateBarProperty' => $propertyValue],
+     *     ]);
+     *
+     * Instances of ArrayObject, ArrayIterator and SplObjectStorage can be created
+     * by using the special "\0" property name to define their internal value:
+     *
+     *     // creates an SplObjectStorage where $info1 is attached to $obj1, etc.
+     *     Instantiator::instantiate(SplObjectStorage::class, ["\0" => [$obj1, $info1, $obj2, $info2...]]);
+     *
+     *     // creates an ArrayObject populated with $inputArray
+     *     Instantiator::instantiate(ArrayObject::class, ["\0" => [$inputArray]]);
+     *
+     * @param string $class             The class of the instance to create
+     * @param array  $properties        The properties to set on the instance
+     * @param array  $privateProperties The private properties to set on the instance,
+     *                                  keyed by their declaring class
+     *
+     * @throws ExceptionInterface When the instance cannot be created
+     */
+    public static function instantiate(string $class, array $properties = [], array $privateProperties = []): object
+    {
+        $reflector = Registry::$reflectors[$class] ?? Registry::getClassReflector($class);
+
+        if (Registry::$cloneable[$class]) {
+            $wrappedInstance = [clone Registry::$prototypes[$class]];
+        } elseif (Registry::$instantiableWithoutConstructor[$class]) {
+            $wrappedInstance = [$reflector->newInstanceWithoutConstructor()];
+        } elseif (null === Registry::$prototypes[$class]) {
+            throw new NotInstantiableTypeException($class);
+        } elseif ($reflector->implementsInterface('Serializable') && (\PHP_VERSION_ID < 70400 || !method_exists($class, '__unserialize'))) {
+            $wrappedInstance = [unserialize('C:'.\strlen($class).':"'.$class.'":0:{}')];
+        } else {
+            $wrappedInstance = [unserialize('O:'.\strlen($class).':"'.$class.'":0:{}')];
+        }
+
+        if ($properties) {
+            $privateProperties[$class] = isset($privateProperties[$class]) ? $properties + $privateProperties[$class] : $properties;
+        }
+
+        foreach ($privateProperties as $class => $properties) {
+            if (!$properties) {
+                continue;
+            }
+            foreach ($properties as $name => $value) {
+                // because they're also used for "unserialization", hydrators
+                // deal with array of instances, so we need to wrap values
+                $properties[$name] = [$value];
+            }
+            (Hydrator::$hydrators[$class] ?? Hydrator::getHydrator($class))($properties, $wrappedInstance);
+        }
+
+        return $wrappedInstance[0];
+    }
+}
diff --git a/vendor/symfony/var-exporter/Internal/Exporter.php b/vendor/symfony/var-exporter/Internal/Exporter.php
new file mode 100644
index 0000000000000000000000000000000000000000..a034dddb989b458bfb9e6f7552f742daf93d6e31
--- /dev/null
+++ b/vendor/symfony/var-exporter/Internal/Exporter.php
@@ -0,0 +1,406 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarExporter\Internal;
+
+use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class Exporter
+{
+    /**
+     * Prepares an array of values for VarExporter.
+     *
+     * For performance this method is public and has no type-hints.
+     *
+     * @param array             &$values
+     * @param \SplObjectStorage $objectsPool
+     * @param array             &$refsPool
+     * @param int               &$objectsCount
+     * @param bool              &$valuesAreStatic
+     *
+     * @throws NotInstantiableTypeException When a value cannot be serialized
+     */
+    public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount, &$valuesAreStatic): array
+    {
+        $refs = $values;
+        foreach ($values as $k => $value) {
+            if (\is_resource($value)) {
+                throw new NotInstantiableTypeException(get_resource_type($value).' resource');
+            }
+            $refs[$k] = $objectsPool;
+
+            if ($isRef = !$valueIsStatic = $values[$k] !== $objectsPool) {
+                $values[$k] = &$value; // Break hard references to make $values completely
+                unset($value);         // independent from the original structure
+                $refs[$k] = $value = $values[$k];
+                if ($value instanceof Reference && 0 > $value->id) {
+                    $valuesAreStatic = false;
+                    ++$value->count;
+                    continue;
+                }
+                $refsPool[] = [&$refs[$k], $value, &$value];
+                $refs[$k] = $values[$k] = new Reference(-\count($refsPool), $value);
+            }
+
+            if (\is_array($value)) {
+                if ($value) {
+                    $value = self::prepare($value, $objectsPool, $refsPool, $objectsCount, $valueIsStatic);
+                }
+                goto handle_value;
+            } elseif (!\is_object($value) || $value instanceof \UnitEnum) {
+                goto handle_value;
+            }
+
+            $valueIsStatic = false;
+            if (isset($objectsPool[$value])) {
+                ++$objectsCount;
+                $value = new Reference($objectsPool[$value][0]);
+                goto handle_value;
+            }
+
+            $class = \get_class($value);
+            $reflector = Registry::$reflectors[$class] ?? Registry::getClassReflector($class);
+
+            if ($reflector->hasMethod('__serialize')) {
+                if (!$reflector->getMethod('__serialize')->isPublic()) {
+                    throw new \Error(sprintf('Call to %s method "%s::__serialize()".', $reflector->getMethod('__serialize')->isProtected() ? 'protected' : 'private', $class));
+                }
+
+                if (!\is_array($properties = $value->__serialize())) {
+                    throw new \TypeError($class.'::__serialize() must return an array');
+                }
+
+                goto prepare_value;
+            }
+
+            $properties = [];
+            $sleep = null;
+            $proto = Registry::$prototypes[$class];
+
+            if (($value instanceof \ArrayIterator || $value instanceof \ArrayObject) && null !== $proto) {
+                // ArrayIterator and ArrayObject need special care because their "flags"
+                // option changes the behavior of the (array) casting operator.
+                [$arrayValue, $properties] = self::getArrayObjectProperties($value, $proto);
+
+                // populates Registry::$prototypes[$class] with a new instance
+                Registry::getClassReflector($class, Registry::$instantiableWithoutConstructor[$class], Registry::$cloneable[$class]);
+            } elseif ($value instanceof \SplObjectStorage && Registry::$cloneable[$class] && null !== $proto) {
+                // By implementing Serializable, SplObjectStorage breaks
+                // internal references; let's deal with it on our own.
+                foreach (clone $value as $v) {
+                    $properties[] = $v;
+                    $properties[] = $value[$v];
+                }
+                $properties = ['SplObjectStorage' => ["\0" => $properties]];
+                $arrayValue = (array) $value;
+            } elseif ($value instanceof \Serializable
+                || $value instanceof \__PHP_Incomplete_Class
+                || \PHP_VERSION_ID < 80200 && $value instanceof \DatePeriod
+            ) {
+                ++$objectsCount;
+                $objectsPool[$value] = [$id = \count($objectsPool), serialize($value), [], 0];
+                $value = new Reference($id);
+                goto handle_value;
+            } else {
+                if (method_exists($class, '__sleep')) {
+                    if (!\is_array($sleep = $value->__sleep())) {
+                        trigger_error('serialize(): __sleep should return an array only containing the names of instance-variables to serialize', \E_USER_NOTICE);
+                        $value = null;
+                        goto handle_value;
+                    }
+                    $sleep = array_flip($sleep);
+                }
+
+                $arrayValue = (array) $value;
+            }
+
+            $proto = (array) $proto;
+
+            foreach ($arrayValue as $name => $v) {
+                $i = 0;
+                $n = (string) $name;
+                if ('' === $n || "\0" !== $n[0]) {
+                    $c = \PHP_VERSION_ID >= 80100 && $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass';
+                } elseif ('*' === $n[1]) {
+                    $n = substr($n, 3);
+                    $c = $reflector->getProperty($n)->class;
+                    if ('Error' === $c) {
+                        $c = 'TypeError';
+                    } elseif ('Exception' === $c) {
+                        $c = 'ErrorException';
+                    }
+                } else {
+                    $i = strpos($n, "\0", 2);
+                    $c = substr($n, 1, $i - 1);
+                    $n = substr($n, 1 + $i);
+                }
+                if (null !== $sleep) {
+                    if (!isset($sleep[$n]) || ($i && $c !== $class)) {
+                        continue;
+                    }
+                    $sleep[$n] = false;
+                }
+                if (!\array_key_exists($name, $proto) || $proto[$name] !== $v || "\x00Error\x00trace" === $name || "\x00Exception\x00trace" === $name) {
+                    $properties[$c][$n] = $v;
+                }
+            }
+            if ($sleep) {
+                foreach ($sleep as $n => $v) {
+                    if (false !== $v) {
+                        trigger_error(sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $n), \E_USER_NOTICE);
+                    }
+                }
+            }
+
+            prepare_value:
+            $objectsPool[$value] = [$id = \count($objectsPool)];
+            $properties = self::prepare($properties, $objectsPool, $refsPool, $objectsCount, $valueIsStatic);
+            ++$objectsCount;
+            $objectsPool[$value] = [$id, $class, $properties, method_exists($class, '__unserialize') ? -$objectsCount : (method_exists($class, '__wakeup') ? $objectsCount : 0)];
+
+            $value = new Reference($id);
+
+            handle_value:
+            if ($isRef) {
+                unset($value); // Break the hard reference created above
+            } elseif (!$valueIsStatic) {
+                $values[$k] = $value;
+            }
+            $valuesAreStatic = $valueIsStatic && $valuesAreStatic;
+        }
+
+        return $values;
+    }
+
+    public static function export($value, string $indent = '')
+    {
+        switch (true) {
+            case \is_int($value) || \is_float($value): return var_export($value, true);
+            case [] === $value: return '[]';
+            case false === $value: return 'false';
+            case true === $value: return 'true';
+            case null === $value: return 'null';
+            case '' === $value: return "''";
+            case $value instanceof \UnitEnum: return ltrim(var_export($value, true), '\\');
+        }
+
+        if ($value instanceof Reference) {
+            if (0 <= $value->id) {
+                return '$o['.$value->id.']';
+            }
+            if (!$value->count) {
+                return self::export($value->value, $indent);
+            }
+            $value = -$value->id;
+
+            return '&$r['.$value.']';
+        }
+        $subIndent = $indent.'    ';
+
+        if (\is_string($value)) {
+            $code = sprintf("'%s'", addcslashes($value, "'\\"));
+
+            $code = preg_replace_callback("/((?:[\\0\\r\\n]|\u{202A}|\u{202B}|\u{202D}|\u{202E}|\u{2066}|\u{2067}|\u{2068}|\u{202C}|\u{2069})++)(.)/", function ($m) use ($subIndent) {
+                $m[1] = sprintf('\'."%s".\'', str_replace(
+                    ["\0", "\r", "\n", "\u{202A}", "\u{202B}", "\u{202D}", "\u{202E}", "\u{2066}", "\u{2067}", "\u{2068}", "\u{202C}", "\u{2069}", '\n\\'],
+                    ['\0', '\r', '\n', '\u{202A}', '\u{202B}', '\u{202D}', '\u{202E}', '\u{2066}', '\u{2067}', '\u{2068}', '\u{202C}', '\u{2069}', '\n"'."\n".$subIndent.'."\\'],
+                    $m[1]
+                ));
+
+                if ("'" === $m[2]) {
+                    return substr($m[1], 0, -2);
+                }
+
+                if ('n".\'' === substr($m[1], -4)) {
+                    return substr_replace($m[1], "\n".$subIndent.".'".$m[2], -2);
+                }
+
+                return $m[1].$m[2];
+            }, $code, -1, $count);
+
+            if ($count && str_starts_with($code, "''.")) {
+                $code = substr($code, 3);
+            }
+
+            return $code;
+        }
+
+        if (\is_array($value)) {
+            $j = -1;
+            $code = '';
+            foreach ($value as $k => $v) {
+                $code .= $subIndent;
+                if (!\is_int($k) || 1 !== $k - $j) {
+                    $code .= self::export($k, $subIndent).' => ';
+                }
+                if (\is_int($k) && $k > $j) {
+                    $j = $k;
+                }
+                $code .= self::export($v, $subIndent).",\n";
+            }
+
+            return "[\n".$code.$indent.']';
+        }
+
+        if ($value instanceof Values) {
+            $code = $subIndent."\$r = [],\n";
+            foreach ($value->values as $k => $v) {
+                $code .= $subIndent.'$r['.$k.'] = '.self::export($v, $subIndent).",\n";
+            }
+
+            return "[\n".$code.$indent.']';
+        }
+
+        if ($value instanceof Registry) {
+            return self::exportRegistry($value, $indent, $subIndent);
+        }
+
+        if ($value instanceof Hydrator) {
+            return self::exportHydrator($value, $indent, $subIndent);
+        }
+
+        throw new \UnexpectedValueException(sprintf('Cannot export value of type "%s".', get_debug_type($value)));
+    }
+
+    private static function exportRegistry(Registry $value, string $indent, string $subIndent): string
+    {
+        $code = '';
+        $serializables = [];
+        $seen = [];
+        $prototypesAccess = 0;
+        $factoriesAccess = 0;
+        $r = '\\'.Registry::class;
+        $j = -1;
+
+        foreach ($value->classes as $k => $class) {
+            if (':' === ($class[1] ?? null)) {
+                $serializables[$k] = $class;
+                continue;
+            }
+            if (!Registry::$instantiableWithoutConstructor[$class]) {
+                if (is_subclass_of($class, 'Serializable') && !method_exists($class, '__unserialize')) {
+                    $serializables[$k] = 'C:'.\strlen($class).':"'.$class.'":0:{}';
+                } else {
+                    $serializables[$k] = 'O:'.\strlen($class).':"'.$class.'":0:{}';
+                }
+                if (is_subclass_of($class, 'Throwable')) {
+                    $eol = is_subclass_of($class, 'Error') ? "\0Error\0" : "\0Exception\0";
+                    $serializables[$k] = substr_replace($serializables[$k], '1:{s:'.(5 + \strlen($eol)).':"'.$eol.'trace";a:0:{}}', -4);
+                }
+                continue;
+            }
+            $code .= $subIndent.(1 !== $k - $j ? $k.' => ' : '');
+            $j = $k;
+            $eol = ",\n";
+            $c = '['.self::export($class).']';
+
+            if ($seen[$class] ?? false) {
+                if (Registry::$cloneable[$class]) {
+                    ++$prototypesAccess;
+                    $code .= 'clone $p'.$c;
+                } else {
+                    ++$factoriesAccess;
+                    $code .= '$f'.$c.'()';
+                }
+            } else {
+                $seen[$class] = true;
+                if (Registry::$cloneable[$class]) {
+                    $code .= 'clone ('.($prototypesAccess++ ? '$p' : '($p = &'.$r.'::$prototypes)').$c.' ?? '.$r.'::p';
+                } else {
+                    $code .= '('.($factoriesAccess++ ? '$f' : '($f = &'.$r.'::$factories)').$c.' ?? '.$r.'::f';
+                    $eol = '()'.$eol;
+                }
+                $code .= '('.substr($c, 1, -1).'))';
+            }
+            $code .= $eol;
+        }
+
+        if (1 === $prototypesAccess) {
+            $code = str_replace('($p = &'.$r.'::$prototypes)', $r.'::$prototypes', $code);
+        }
+        if (1 === $factoriesAccess) {
+            $code = str_replace('($f = &'.$r.'::$factories)', $r.'::$factories', $code);
+        }
+        if ('' !== $code) {
+            $code = "\n".$code.$indent;
+        }
+
+        if ($serializables) {
+            $code = $r.'::unserialize(['.$code.'], '.self::export($serializables, $indent).')';
+        } else {
+            $code = '['.$code.']';
+        }
+
+        return '$o = '.$code;
+    }
+
+    private static function exportHydrator(Hydrator $value, string $indent, string $subIndent): string
+    {
+        $code = '';
+        foreach ($value->properties as $class => $properties) {
+            $code .= $subIndent.'    '.self::export($class).' => '.self::export($properties, $subIndent.'    ').",\n";
+        }
+
+        $code = [
+            self::export($value->registry, $subIndent),
+            self::export($value->values, $subIndent),
+            '' !== $code ? "[\n".$code.$subIndent.']' : '[]',
+            self::export($value->value, $subIndent),
+            self::export($value->wakeups, $subIndent),
+        ];
+
+        return '\\'.\get_class($value)."::hydrate(\n".$subIndent.implode(",\n".$subIndent, $code)."\n".$indent.')';
+    }
+
+    /**
+     * @param \ArrayIterator|\ArrayObject $value
+     * @param \ArrayIterator|\ArrayObject $proto
+     */
+    private static function getArrayObjectProperties($value, $proto): array
+    {
+        $reflector = $value instanceof \ArrayIterator ? 'ArrayIterator' : 'ArrayObject';
+        $reflector = Registry::$reflectors[$reflector] ?? Registry::getClassReflector($reflector);
+
+        $properties = [
+            $arrayValue = (array) $value,
+            $reflector->getMethod('getFlags')->invoke($value),
+            $value instanceof \ArrayObject ? $reflector->getMethod('getIteratorClass')->invoke($value) : 'ArrayIterator',
+        ];
+
+        $reflector = $reflector->getMethod('setFlags');
+        $reflector->invoke($proto, \ArrayObject::STD_PROP_LIST);
+
+        if ($properties[1] & \ArrayObject::STD_PROP_LIST) {
+            $reflector->invoke($value, 0);
+            $properties[0] = (array) $value;
+        } else {
+            $reflector->invoke($value, \ArrayObject::STD_PROP_LIST);
+            $arrayValue = (array) $value;
+        }
+        $reflector->invoke($value, $properties[1]);
+
+        if ([[], 0, 'ArrayIterator'] === $properties) {
+            $properties = [];
+        } else {
+            if ('ArrayIterator' === $properties[2]) {
+                unset($properties[2]);
+            }
+            $properties = [$reflector->class => ["\0" => $properties]];
+        }
+
+        return [$arrayValue, $properties];
+    }
+}
diff --git a/vendor/symfony/var-exporter/Internal/Hydrator.php b/vendor/symfony/var-exporter/Internal/Hydrator.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ed6bdc948e632fc18628264488a50e012f0a2a6
--- /dev/null
+++ b/vendor/symfony/var-exporter/Internal/Hydrator.php
@@ -0,0 +1,152 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarExporter\Internal;
+
+use Symfony\Component\VarExporter\Exception\ClassNotFoundException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class Hydrator
+{
+    public static $hydrators = [];
+
+    public $registry;
+    public $values;
+    public $properties;
+    public $value;
+    public $wakeups;
+
+    public function __construct(?Registry $registry, ?Values $values, array $properties, $value, array $wakeups)
+    {
+        $this->registry = $registry;
+        $this->values = $values;
+        $this->properties = $properties;
+        $this->value = $value;
+        $this->wakeups = $wakeups;
+    }
+
+    public static function hydrate($objects, $values, $properties, $value, $wakeups)
+    {
+        foreach ($properties as $class => $vars) {
+            (self::$hydrators[$class] ?? self::getHydrator($class))($vars, $objects);
+        }
+        foreach ($wakeups as $k => $v) {
+            if (\is_array($v)) {
+                $objects[-$k]->__unserialize($v);
+            } else {
+                $objects[$v]->__wakeup();
+            }
+        }
+
+        return $value;
+    }
+
+    public static function getHydrator($class)
+    {
+        switch ($class) {
+            case 'stdClass':
+                return self::$hydrators[$class] = static function ($properties, $objects) {
+                    foreach ($properties as $name => $values) {
+                        foreach ($values as $i => $v) {
+                            $objects[$i]->$name = $v;
+                        }
+                    }
+                };
+
+            case 'ErrorException':
+                return self::$hydrators[$class] = (self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'))->bindTo(null, new class() extends \ErrorException {
+                });
+
+            case 'TypeError':
+                return self::$hydrators[$class] = (self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'))->bindTo(null, new class() extends \Error {
+                });
+
+            case 'SplObjectStorage':
+                return self::$hydrators[$class] = static function ($properties, $objects) {
+                    foreach ($properties as $name => $values) {
+                        if ("\0" === $name) {
+                            foreach ($values as $i => $v) {
+                                for ($j = 0; $j < \count($v); ++$j) {
+                                    $objects[$i]->attach($v[$j], $v[++$j]);
+                                }
+                            }
+                            continue;
+                        }
+                        foreach ($values as $i => $v) {
+                            $objects[$i]->$name = $v;
+                        }
+                    }
+                };
+        }
+
+        if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) {
+            throw new ClassNotFoundException($class);
+        }
+        $classReflector = new \ReflectionClass($class);
+
+        switch ($class) {
+            case 'ArrayIterator':
+            case 'ArrayObject':
+                $constructor = \Closure::fromCallable([$classReflector->getConstructor(), 'invokeArgs']);
+
+                return self::$hydrators[$class] = static function ($properties, $objects) use ($constructor) {
+                    foreach ($properties as $name => $values) {
+                        if ("\0" !== $name) {
+                            foreach ($values as $i => $v) {
+                                $objects[$i]->$name = $v;
+                            }
+                        }
+                    }
+                    foreach ($properties["\0"] ?? [] as $i => $v) {
+                        $constructor($objects[$i], $v);
+                    }
+                };
+        }
+
+        if (!$classReflector->isInternal()) {
+            return self::$hydrators[$class] = (self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'))->bindTo(null, $class);
+        }
+
+        if ($classReflector->name !== $class) {
+            return self::$hydrators[$classReflector->name] ?? self::getHydrator($classReflector->name);
+        }
+
+        $propertySetters = [];
+        foreach ($classReflector->getProperties() as $propertyReflector) {
+            if (!$propertyReflector->isStatic()) {
+                $propertyReflector->setAccessible(true);
+                $propertySetters[$propertyReflector->name] = \Closure::fromCallable([$propertyReflector, 'setValue']);
+            }
+        }
+
+        if (!$propertySetters) {
+            return self::$hydrators[$class] = self::$hydrators['stdClass'] ?? self::getHydrator('stdClass');
+        }
+
+        return self::$hydrators[$class] = static function ($properties, $objects) use ($propertySetters) {
+            foreach ($properties as $name => $values) {
+                if ($setValue = $propertySetters[$name] ?? null) {
+                    foreach ($values as $i => $v) {
+                        $setValue($objects[$i], $v);
+                    }
+                    continue;
+                }
+                foreach ($values as $i => $v) {
+                    $objects[$i]->$name = $v;
+                }
+            }
+        };
+    }
+}
diff --git a/vendor/symfony/var-exporter/Internal/Reference.php b/vendor/symfony/var-exporter/Internal/Reference.php
new file mode 100644
index 0000000000000000000000000000000000000000..e371c07b88341f419d842fbf0a37fad20d21dac6
--- /dev/null
+++ b/vendor/symfony/var-exporter/Internal/Reference.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarExporter\Internal;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class Reference
+{
+    public $id;
+    public $value;
+    public $count = 0;
+
+    public function __construct(int $id, $value = null)
+    {
+        $this->id = $id;
+        $this->value = $value;
+    }
+}
diff --git a/vendor/symfony/var-exporter/Internal/Registry.php b/vendor/symfony/var-exporter/Internal/Registry.php
new file mode 100644
index 0000000000000000000000000000000000000000..24b77b9ef6f72f3f9bd2939fb03a7323a37ec295
--- /dev/null
+++ b/vendor/symfony/var-exporter/Internal/Registry.php
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarExporter\Internal;
+
+use Symfony\Component\VarExporter\Exception\ClassNotFoundException;
+use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class Registry
+{
+    public static $reflectors = [];
+    public static $prototypes = [];
+    public static $factories = [];
+    public static $cloneable = [];
+    public static $instantiableWithoutConstructor = [];
+
+    public $classes = [];
+
+    public function __construct(array $classes)
+    {
+        $this->classes = $classes;
+    }
+
+    public static function unserialize($objects, $serializables)
+    {
+        $unserializeCallback = ini_set('unserialize_callback_func', __CLASS__.'::getClassReflector');
+
+        try {
+            foreach ($serializables as $k => $v) {
+                $objects[$k] = unserialize($v);
+            }
+        } finally {
+            ini_set('unserialize_callback_func', $unserializeCallback);
+        }
+
+        return $objects;
+    }
+
+    public static function p($class)
+    {
+        self::getClassReflector($class, true, true);
+
+        return self::$prototypes[$class];
+    }
+
+    public static function f($class)
+    {
+        $reflector = self::$reflectors[$class] ?? self::getClassReflector($class, true, false);
+
+        return self::$factories[$class] = \Closure::fromCallable([$reflector, 'newInstanceWithoutConstructor']);
+    }
+
+    public static function getClassReflector($class, $instantiableWithoutConstructor = false, $cloneable = null)
+    {
+        if (!($isClass = class_exists($class)) && !interface_exists($class, false) && !trait_exists($class, false)) {
+            throw new ClassNotFoundException($class);
+        }
+        $reflector = new \ReflectionClass($class);
+
+        if ($instantiableWithoutConstructor) {
+            $proto = $reflector->newInstanceWithoutConstructor();
+        } elseif (!$isClass || $reflector->isAbstract()) {
+            throw new NotInstantiableTypeException($class);
+        } elseif ($reflector->name !== $class) {
+            $reflector = self::$reflectors[$name = $reflector->name] ?? self::getClassReflector($name, false, $cloneable);
+            self::$cloneable[$class] = self::$cloneable[$name];
+            self::$instantiableWithoutConstructor[$class] = self::$instantiableWithoutConstructor[$name];
+            self::$prototypes[$class] = self::$prototypes[$name];
+
+            return self::$reflectors[$class] = $reflector;
+        } else {
+            try {
+                $proto = $reflector->newInstanceWithoutConstructor();
+                $instantiableWithoutConstructor = true;
+            } catch (\ReflectionException $e) {
+                $proto = $reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize') ? 'C:' : 'O:';
+                if ('C:' === $proto && !$reflector->getMethod('unserialize')->isInternal()) {
+                    $proto = null;
+                } else {
+                    try {
+                        $proto = @unserialize($proto.\strlen($class).':"'.$class.'":0:{}');
+                    } catch (\Exception $e) {
+                        if (__FILE__ !== $e->getFile()) {
+                            throw $e;
+                        }
+                        throw new NotInstantiableTypeException($class, $e);
+                    }
+                    if (false === $proto) {
+                        throw new NotInstantiableTypeException($class);
+                    }
+                }
+            }
+            if (null !== $proto && !$proto instanceof \Throwable && !$proto instanceof \Serializable && !method_exists($class, '__sleep') && (\PHP_VERSION_ID < 70400 || !method_exists($class, '__serialize'))) {
+                try {
+                    serialize($proto);
+                } catch (\Exception $e) {
+                    throw new NotInstantiableTypeException($class, $e);
+                }
+            }
+        }
+
+        if (null === $cloneable) {
+            if (($proto instanceof \Reflector || $proto instanceof \ReflectionGenerator || $proto instanceof \ReflectionType || $proto instanceof \IteratorIterator || $proto instanceof \RecursiveIteratorIterator) && (!$proto instanceof \Serializable && !method_exists($proto, '__wakeup') && (\PHP_VERSION_ID < 70400 || !method_exists($class, '__unserialize')))) {
+                throw new NotInstantiableTypeException($class);
+            }
+
+            $cloneable = $reflector->isCloneable() && !$reflector->hasMethod('__clone');
+        }
+
+        self::$cloneable[$class] = $cloneable;
+        self::$instantiableWithoutConstructor[$class] = $instantiableWithoutConstructor;
+        self::$prototypes[$class] = $proto;
+
+        if ($proto instanceof \Throwable) {
+            static $setTrace;
+
+            if (null === $setTrace) {
+                $setTrace = [
+                    new \ReflectionProperty(\Error::class, 'trace'),
+                    new \ReflectionProperty(\Exception::class, 'trace'),
+                ];
+                $setTrace[0]->setAccessible(true);
+                $setTrace[1]->setAccessible(true);
+                $setTrace[0] = \Closure::fromCallable([$setTrace[0], 'setValue']);
+                $setTrace[1] = \Closure::fromCallable([$setTrace[1], 'setValue']);
+            }
+
+            $setTrace[$proto instanceof \Exception]($proto, []);
+        }
+
+        return self::$reflectors[$class] = $reflector;
+    }
+}
diff --git a/vendor/symfony/var-exporter/Internal/Values.php b/vendor/symfony/var-exporter/Internal/Values.php
new file mode 100644
index 0000000000000000000000000000000000000000..21ae04e68b10acd6628db2406d7faf9e1663b111
--- /dev/null
+++ b/vendor/symfony/var-exporter/Internal/Values.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarExporter\Internal;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class Values
+{
+    public $values;
+
+    public function __construct(array $values)
+    {
+        $this->values = $values;
+    }
+}
diff --git a/vendor/symfony/var-exporter/LICENSE b/vendor/symfony/var-exporter/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..74cdc2dbf6dbec4aea949b7bd47e3ee1e8c421e7
--- /dev/null
+++ b/vendor/symfony/var-exporter/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2018-2022 Fabien Potencier
+
+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/vendor/symfony/var-exporter/README.md b/vendor/symfony/var-exporter/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..a34e4c23d725b27da8e6dcfc29ff78194c693d0c
--- /dev/null
+++ b/vendor/symfony/var-exporter/README.md
@@ -0,0 +1,38 @@
+VarExporter Component
+=====================
+
+The VarExporter component allows exporting any serializable PHP data structure to
+plain PHP code. While doing so, it preserves all the semantics associated with
+the serialization mechanism of PHP (`__wakeup`, `__sleep`, `Serializable`,
+`__serialize`, `__unserialize`).
+
+It also provides an instantiator that allows creating and populating objects
+without calling their constructor nor any other methods.
+
+The reason to use this component *vs* `serialize()` or
+[igbinary](https://github.com/igbinary/igbinary) is performance: thanks to
+OPcache, the resulting code is significantly faster and more memory efficient
+than using `unserialize()` or `igbinary_unserialize()`.
+
+Unlike `var_export()`, this works on any serializable PHP value.
+
+It also provides a few improvements over `var_export()`/`serialize()`:
+
+ * the output is PSR-2 compatible;
+ * the output can be re-indented without messing up with `\r` or `\n` in the data
+ * missing classes throw a `ClassNotFoundException` instead of being unserialized to
+   `PHP_Incomplete_Class` objects;
+ * references involving `SplObjectStorage`, `ArrayObject` or `ArrayIterator`
+   instances are preserved;
+ * `Reflection*`, `IteratorIterator` and `RecursiveIteratorIterator` classes
+   throw an exception when being serialized (their unserialized version is broken
+   anyway, see https://bugs.php.net/76737).
+
+Resources
+---------
+
+ * [Documentation](https://symfony.com/doc/current/components/var_exporter.html)
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+   [send Pull Requests](https://github.com/symfony/symfony/pulls)
+   in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/vendor/symfony/var-exporter/VarExporter.php b/vendor/symfony/var-exporter/VarExporter.php
new file mode 100644
index 0000000000000000000000000000000000000000..003388e7985f9a29901be8e967bfee5268673628
--- /dev/null
+++ b/vendor/symfony/var-exporter/VarExporter.php
@@ -0,0 +1,115 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarExporter;
+
+use Symfony\Component\VarExporter\Exception\ExceptionInterface;
+use Symfony\Component\VarExporter\Internal\Exporter;
+use Symfony\Component\VarExporter\Internal\Hydrator;
+use Symfony\Component\VarExporter\Internal\Registry;
+use Symfony\Component\VarExporter\Internal\Values;
+
+/**
+ * Exports serializable PHP values to PHP code.
+ *
+ * VarExporter allows serializing PHP data structures to plain PHP code (like var_export())
+ * while preserving all the semantics associated with serialize() (unlike var_export()).
+ *
+ * By leveraging OPcache, the generated PHP code is faster than doing the same with unserialize().
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+final class VarExporter
+{
+    /**
+     * Exports a serializable PHP value to PHP code.
+     *
+     * @param mixed $value          The value to export
+     * @param bool  &$isStaticValue Set to true after execution if the provided value is static, false otherwise
+     * @param bool  &$classes       Classes found in the value are added to this list as both keys and values
+     *
+     * @throws ExceptionInterface When the provided value cannot be serialized
+     */
+    public static function export($value, bool &$isStaticValue = null, array &$foundClasses = []): string
+    {
+        $isStaticValue = true;
+
+        if (!\is_object($value) && !(\is_array($value) && $value) && !\is_resource($value) || $value instanceof \UnitEnum) {
+            return Exporter::export($value);
+        }
+
+        $objectsPool = new \SplObjectStorage();
+        $refsPool = [];
+        $objectsCount = 0;
+
+        try {
+            $value = Exporter::prepare([$value], $objectsPool, $refsPool, $objectsCount, $isStaticValue)[0];
+        } finally {
+            $references = [];
+            foreach ($refsPool as $i => $v) {
+                if ($v[0]->count) {
+                    $references[1 + $i] = $v[2];
+                }
+                $v[0] = $v[1];
+            }
+        }
+
+        if ($isStaticValue) {
+            return Exporter::export($value);
+        }
+
+        $classes = [];
+        $values = [];
+        $states = [];
+        foreach ($objectsPool as $i => $v) {
+            [, $class, $values[], $wakeup] = $objectsPool[$v];
+            $foundClasses[$class] = $classes[] = $class;
+
+            if (0 < $wakeup) {
+                $states[$wakeup] = $i;
+            } elseif (0 > $wakeup) {
+                $states[-$wakeup] = [$i, array_pop($values)];
+                $values[] = [];
+            }
+        }
+        ksort($states);
+
+        $wakeups = [null];
+        foreach ($states as $k => $v) {
+            if (\is_array($v)) {
+                $wakeups[-$v[0]] = $v[1];
+            } else {
+                $wakeups[] = $v;
+            }
+        }
+
+        if (null === $wakeups[0]) {
+            unset($wakeups[0]);
+        }
+
+        $properties = [];
+        foreach ($values as $i => $vars) {
+            foreach ($vars as $class => $values) {
+                foreach ($values as $name => $v) {
+                    $properties[$class][$name][$i] = $v;
+                }
+            }
+        }
+
+        if ($classes || $references) {
+            $value = new Hydrator(new Registry($classes), $references ? new Values($references) : null, $properties, $value, $wakeups);
+        } else {
+            $isStaticValue = true;
+        }
+
+        return Exporter::export($value);
+    }
+}
diff --git a/vendor/symfony/var-exporter/composer.json b/vendor/symfony/var-exporter/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..29d4901d372218da9878d7773d4a2eb00691b3ee
--- /dev/null
+++ b/vendor/symfony/var-exporter/composer.json
@@ -0,0 +1,32 @@
+{
+    "name": "symfony/var-exporter",
+    "type": "library",
+    "description": "Allows exporting any serializable PHP data structure to plain PHP code",
+    "keywords": ["export", "serialize", "instantiate", "hydrate", "construct", "clone"],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nicolas Grekas",
+            "email": "p@tchwork.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=7.2.5",
+        "symfony/polyfill-php80": "^1.16"
+    },
+    "require-dev": {
+        "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\VarExporter\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev"
+}
diff --git a/vendor/webmozart/assert/.editorconfig b/vendor/webmozart/assert/.editorconfig
deleted file mode 100644
index 384453bfb0859785abde2713b0c99ca6b679f1f1..0000000000000000000000000000000000000000
--- a/vendor/webmozart/assert/.editorconfig
+++ /dev/null
@@ -1,12 +0,0 @@
-root = true
-
-[*]
-charset=utf-8
-end_of_line=lf
-trim_trailing_whitespace=true
-insert_final_newline=true
-indent_style=space
-indent_size=4
-
-[*.yml]
-indent_size=2
diff --git a/vendor/webmozart/assert/CHANGELOG.md b/vendor/webmozart/assert/CHANGELOG.md
index 9a7becb249f6bebbca855f508247eb85274d4404..56c8011dee1293bc9fb4c9a5a84b1387eb404c47 100644
--- a/vendor/webmozart/assert/CHANGELOG.md
+++ b/vendor/webmozart/assert/CHANGELOG.md
@@ -3,23 +3,127 @@ Changelog
 
 ## UNRELEASED
 
+## 1.11.0
+
+### Added
+
+* Added explicit (non magic) `allNullOr*` methods, with `@psalm-assert` annotations, for better Psalm support.
+
+### Changed
+
+* Trait methods will now check the assertion themselves, instead of using `__callStatic`
+* `isList` will now deal correctly with (modified) lists that contain `NaN`
+* `reportInvalidArgument` now has a return type of `never`.
+
+### Removed
+
+* Removed `symfony/polyfill-ctype` as a dependency, and require `ext-cytpe` instead.
+  * You can still require the `symfony/polyfill-ctype` in your project if you need it, as it provides `ext-ctype`
+
+## 1.10.0
+
+### Added
+
+* On invalid assertion, we throw a `Webmozart\Assert\InvalidArgumentException`
+* Added `Assert::positiveInteger()`
+
+### Changed
+
+* Using a trait with real implementations of `all*()` and `nullOr*()` methods to improve psalm compatibility.
+
+### Removed
+
+* Support for PHP <7.2
+
+## 1.9.1
+
+## Fixed
+
+* provisional support for PHP 8.0
+
+## 1.9.0
+
+* added better Psalm support for `all*` & `nullOr*` methods
+* These methods are now understood by Psalm through a mixin. You may need a newer version of Psalm in order to use this
+* added `@psalm-pure` annotation to `Assert::notFalse()`
+* added more `@psalm-assert` annotations where appropriate
+
+## Changed
+
+* the `all*` & `nullOr*` methods are now declared on an interface, instead of `@method` annotations.
+This interface is linked to the `Assert` class with a `@mixin` annotation. Most IDE's have supported this
+for a long time, and you should not lose any autocompletion capabilities. PHPStan has supported this since
+version `0.12.20`. This package is marked incompatible (with a composer conflict) with phpstan version prior to that.
+If you do not use PHPStan than this does not matter.
+
+## 1.8.0
+
+### Added
+
+* added `Assert::notStartsWith()`
+* added `Assert::notEndsWith()`
+* added `Assert::inArray()`
+* added `@psalm-pure` annotations to pure assertions
+
+### Fixed
+
+* Exception messages of comparisons between `DateTime(Immutable)` objects now display their date & time.
+* Custom Exception messages for `Assert::count()` now use the values to render the exception message.
+
+## 1.7.0 (2020-02-14)
+
+### Added
+
+* added `Assert::notFalse()`
+* added `Assert::isAOf()`
+* added `Assert::isAnyOf()`
+* added `Assert::isNotA()`
+
+## 1.6.0 (2019-11-24)
+
+### Added
+
+* added `Assert::validArrayKey()`
+* added `Assert::isNonEmptyList()`
+* added `Assert::isNonEmptyMap()`
+* added `@throws InvalidArgumentException` annotations to all methods that throw.
+* added `@psalm-assert` for the list type to the `isList` assertion.
+
+### Fixed
+
+* `ResourceBundle` & `SimpleXMLElement` now pass the `isCountable` assertions.
+They are countable, without implementing the `Countable` interface.
+* The doc block of `range` now has the proper variables.
+* An empty array will now pass `isList` and `isMap`. As it is a valid form of both.
+If a non-empty variant is needed, use `isNonEmptyList` or `isNonEmptyMap`.
+
+### Changed
+
+* Removed some `@psalm-assert` annotations, that were 'side effect' assertions See:
+  * [#144](https://github.com/webmozart/assert/pull/144)
+  * [#145](https://github.com/webmozart/assert/issues/145)
+  * [#146](https://github.com/webmozart/assert/pull/146)
+  * [#150](https://github.com/webmozart/assert/pull/150)
+* If you use Psalm, the minimum version needed is `3.6.0`. Which is enforced through a composer conflict.
+If you don't use Psalm, then this has no impact.
+
 ## 1.5.0 (2019-08-24)
 
-### Added 
+### Added
 
 * added `Assert::uniqueValues()`
 * added `Assert::unicodeLetters()`
 * added: `Assert::email()`
 * added support for [Psalm](https://github.com/vimeo/psalm), by adding `@psalm-assert` annotations where appropriate.
 
-## Fixed
+### Fixed
 
-* `Assert::endsWith()` would not give the correct result when dealing with multibyte suffix. 
-* `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters. 
+* `Assert::endsWith()` would not give the correct result when dealing with a multibyte suffix.
+* `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters.
 
 **NOTE**: These 2 changes may break your assertions if you relied on the fact that multibyte characters didn't behave correctly.
 
-## Changed
+### Changed
 
 * The names of some variables have been updated to better reflect what they are.
 * All function calls are now in their FQN form, slightly increasing performance.
diff --git a/vendor/webmozart/assert/README.md b/vendor/webmozart/assert/README.md
index 1b6299a42f2afe58ceb3306a8f2409f0598dd1c1..3b2397a1aba98e6e16ec28920d4e94b6907ced79 100644
--- a/vendor/webmozart/assert/README.md
+++ b/vendor/webmozart/assert/README.md
@@ -1,8 +1,6 @@
 Webmozart Assert
 ================
 
-[![Build Status](https://travis-ci.org/webmozart/assert.svg?branch=master)](https://travis-ci.org/webmozart/assert)
-[![Build status](https://ci.appveyor.com/api/projects/status/lyg83bcsisrr94se/branch/master?svg=true)](https://ci.appveyor.com/project/webmozart/assert/branch/master)
 [![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert)
 [![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert)
 
@@ -10,7 +8,7 @@ This library contains efficient assertions to test the input and output of
 your methods. With these assertions, you can greatly reduce the amount of coding
 needed to write a safe implementation.
 
-All assertions in the [`Assert`] class throw an `\InvalidArgumentException` if
+All assertions in the [`Assert`] class throw an `Webmozart\Assert\InvalidArgumentException` if
 they fail.
 
 FAQ
@@ -45,8 +43,8 @@ Installation
 
 Use [Composer] to install the package:
 
-```
-$ composer require webmozart/assert
+```bash
+composer require webmozart/assert
 ```
 
 Example
@@ -69,11 +67,11 @@ If you create an employee with an invalid ID, an exception is thrown:
 
 ```php
 new Employee('foobar');
-// => InvalidArgumentException:
+// => Webmozart\Assert\InvalidArgumentException:
 //    The employee ID must be an integer. Got: string
 
 new Employee(-10);
-// => InvalidArgumentException:
+// => Webmozart\Assert\InvalidArgumentException:
 //    The employee ID must be a positive integer. Got: -10
 ```
 
@@ -90,6 +88,7 @@ Method                                                   | Description
 `stringNotEmpty($value, $message = '')`                  | Check that a value is a non-empty string
 `integer($value, $message = '')`                         | Check that a value is an integer
 `integerish($value, $message = '')`                      | Check that a value casts to an integer
+`positiveInteger($value, $message = '')`                 | Check that a value is a positive (non-zero) integer
 `float($value, $message = '')`                           | Check that a value is a float
 `numeric($value, $message = '')`                         | Check that a value is numeric
 `natural($value, $message= ''')`                         | Check that a value is a non-negative integer
@@ -103,17 +102,21 @@ Method                                                   | Description
 `isIterable($value, $message = '')`                      | Check that a value is an array or a `\Traversable`
 `isCountable($value, $message = '')`                     | Check that a value is an array or a `\Countable`
 `isInstanceOf($value, $class, $message = '')`            | Check that a value is an `instanceof` a class
-`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` a at least one class on the array of classes
+`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` at least one class on the array of classes
 `notInstanceOf($value, $class, $message = '')`           | Check that a value is not an `instanceof` a class
+`isAOf($value, $class, $message = '')`                   | Check that a value is of the class or has one of its parents
+`isAnyOf($value, array $classes, $message = '')`         | Check that a value is of at least one of the classes or has one of its parents
+`isNotA($value, $class, $message = '')`                  | Check that a value is not of the class or has not one of its parents
 `isArrayAccessible($value, $message = '')`               | Check that a value can be accessed as an array
 `uniqueValues($values, $message = '')`                   | Check that the given array contains unique values
 
 ### Comparison Assertions
 
 Method                                          | Description
------------------------------------------------ | --------------------------------------------------
+----------------------------------------------- | ------------------------------------------------------------------
 `true($value, $message = '')`                   | Check that a value is `true`
 `false($value, $message = '')`                  | Check that a value is `false`
+`notFalse($value, $message = '')`               | Check that a value is not `false`
 `null($value, $message = '')`                   | Check that a value is `null`
 `notNull($value, $message = '')`                | Check that a value is not `null`
 `isEmpty($value, $message = '')`                | Check that a value is `empty()`
@@ -127,7 +130,8 @@ Method                                          | Description
 `lessThan($value, $value2, $message = '')`      | Check that a value is less than another
 `lessThanEq($value, $value2, $message = '')`    | Check that a value is less than or equal to another
 `range($value, $min, $max, $message = '')`      | Check that a value is within a range
-`oneOf($value, array $values, $message = '')`   | Check that a value is one of a list of values
+`inArray($value, array $values, $message = '')` | Check that a value is one of a list of values
+`oneOf($value, array $values, $message = '')`   | Check that a value is one of a list of values (alias of `inArray`)
 
 ### String Assertions
 
@@ -137,10 +141,12 @@ any of the following assertions.
 Method                                              | Description
 --------------------------------------------------- | -----------------------------------------------------------------
 `contains($value, $subString, $message = '')`       | Check that a string contains a substring
-`notContains($value, $subString, $message = '')`    | Check that a string does not contains a substring
+`notContains($value, $subString, $message = '')`    | Check that a string does not contain a substring
 `startsWith($value, $prefix, $message = '')`        | Check that a string has a prefix
+`notStartsWith($value, $prefix, $message = '')`     | Check that a string does not have a prefix
 `startsWithLetter($value, $message = '')`           | Check that a string starts with a letter
 `endsWith($value, $suffix, $message = '')`          | Check that a string has a suffix
+`notEndsWith($value, $suffix, $message = '')`       | Check that a string does not have a suffix
 `regex($value, $pattern, $message = '')`            | Check that a string matches a regular expression
 `notRegex($value, $pattern, $message = '')`         | Check that a string does not match a regular expression
 `unicodeLetters($value, $message = '')`             | Check that a string contains Unicode letters only
@@ -189,12 +195,15 @@ Method                                             | Description
 -------------------------------------------------- | ------------------------------------------------------------------
 `keyExists($array, $key, $message = '')`           | Check that a key exists in an array
 `keyNotExists($array, $key, $message = '')`        | Check that a key does not exist in an array
+`validArrayKey($key, $message = '')`               | Check that a value is a valid array key (int or string)
 `count($array, $number, $message = '')`            | Check that an array contains a specific number of elements
 `minCount($array, $min, $message = '')`            | Check that an array contains at least a certain number of elements
 `maxCount($array, $max, $message = '')`            | Check that an array contains at most a certain number of elements
 `countBetween($array, $min, $max, $message = '')`  | Check that an array has a count in the given range
 `isList($array, $message = '')`                    | Check that an array is a non-associative list
+`isNonEmptyList($array, $message = '')`            | Check that an array is a non-associative list, and not empty
 `isMap($array, $message = '')`                     | Check that an array is associative and has strings as keys
+`isNonEmptyMap($array, $message = '')`             | Check that an array is associative and has strings as keys, and is not empty
 
 ### Function Assertions
 
@@ -220,6 +229,33 @@ assertion only if it the value is not `null`:
 Assert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s');
 ```
 
+### Extending Assert
+
+The `Assert` class comes with a few methods, which can be overridden to change the class behaviour. You can also extend it to
+add your own assertions.
+
+#### Overriding methods
+
+Overriding the following methods in your assertion class allows you to change the behaviour of the assertions:
+
+* `public static function __callStatic($name, $arguments)`
+  * This method is used to 'create' the `nullOr` and `all` versions of the assertions.
+* `protected static function valueToString($value)`
+  * This method is used for error messages, to convert the value to a string value for displaying. You could use this for representing a value object with a `__toString` method for example.
+* `protected static function typeToString($value)`
+  * This method is used for error messages, to convert the a value to a string representing its type.
+* `protected static function strlen($value)`
+  * This method is used to calculate string length for relevant methods, using the `mb_strlen` if available and useful.
+* `protected static function reportInvalidArgument($message)`
+  * This method is called when an assertion fails, with the specified error message. Here you can throw your own exception, or log something.
+
+## Static analysis support
+
+Where applicable, assertion functions are annotated to support Psalm's
+[Assertion syntax](https://psalm.dev/docs/annotating_code/assertion_syntax/).
+A dedicated [PHPStan Plugin](https://github.com/phpstan/phpstan-webmozart-assert) is
+required for proper type support.
+
 Authors
 -------
 
@@ -242,7 +278,7 @@ All contents of this package are licensed under the [MIT license].
 [beberlei/assert]: https://github.com/beberlei/assert
 [assert package]: https://github.com/beberlei/assert
 [Composer]: https://getcomposer.org
-[Bernhard Schussek]: http://webmozarts.com
+[Bernhard Schussek]: https://webmozarts.com
 [The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors
 [issue tracker]: https://github.com/webmozart/assert/issues
 [Git repository]: https://github.com/webmozart/assert
diff --git a/vendor/webmozart/assert/ci/composer.json b/vendor/webmozart/assert/ci/composer.json
deleted file mode 100644
index b498949531e4054548eca60cb312e75629789db7..0000000000000000000000000000000000000000
--- a/vendor/webmozart/assert/ci/composer.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "require": {
-        "vimeo/psalm": "^3.4"
-    }
-}
diff --git a/vendor/webmozart/assert/composer.json b/vendor/webmozart/assert/composer.json
index 1aa9f270cc12c601606f612afc146e6573f7cfb5..b340452c7fe524cda07b5de6f000c5a40dba1860 100644
--- a/vendor/webmozart/assert/composer.json
+++ b/vendor/webmozart/assert/composer.json
@@ -1,12 +1,12 @@
 {
     "name": "webmozart/assert",
     "description": "Assertions to validate method input/output with nice error messages.",
+    "license": "MIT",
     "keywords": [
         "assert",
         "check",
         "validate"
     ],
-    "license": "MIT",
     "authors": [
         {
             "name": "Bernhard Schussek",
@@ -14,16 +14,15 @@
         }
     ],
     "require": {
-        "php": "^5.3.3 || ^7.0",
-        "symfony/polyfill-ctype": "^1.8"
+        "php": "^7.2 || ^8.0",
+        "ext-ctype": "*"
     },
     "require-dev": {
-        "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+        "phpunit/phpunit": "^8.5.13"
     },
-    "extra": {
-        "branch-alias": {
-            "dev-master": "1.3-dev"
-        }
+    "conflict": {
+        "phpstan/phpstan": "<0.12.20",
+        "vimeo/psalm": "<4.6.1 || 4.6.2"
     },
     "autoload": {
         "psr-4": {
@@ -32,7 +31,13 @@
     },
     "autoload-dev": {
         "psr-4": {
-            "Webmozart\\Assert\\Tests\\": "tests/"
+            "Webmozart\\Assert\\Tests\\": "tests/",
+            "Webmozart\\Assert\\Bin\\": "bin/src"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.10-dev"
         }
     }
 }
diff --git a/vendor/webmozart/assert/psalm.xml b/vendor/webmozart/assert/psalm.xml
deleted file mode 100644
index 44d37aabedb2a42ee6702391fb28d544dd299b2a..0000000000000000000000000000000000000000
--- a/vendor/webmozart/assert/psalm.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0"?>
-<psalm
-    totallyTyped="true"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns="https://getpsalm.org/schema/config"
-    xsi:schemaLocation="https://getpsalm.org/schema/config ci/vendor/vimeo/psalm/config.xsd"
->
-    <projectFiles>
-        <directory name="tests/static-analysis" />
-        <ignoreFiles>
-            <directory name="vendor" />
-        </ignoreFiles>
-    </projectFiles>
-
-</psalm>
diff --git a/vendor/webmozart/assert/src/Assert.php b/vendor/webmozart/assert/src/Assert.php
index 79b1036e51c9aa4e712929ea1def5c2f367c6d81..db1f3a51a360d5a860a1ad0e584f5da5d86464b7 100644
--- a/vendor/webmozart/assert/src/Assert.php
+++ b/vendor/webmozart/assert/src/Assert.php
@@ -15,188 +15,33 @@
 use BadMethodCallException;
 use Closure;
 use Countable;
+use DateTime;
+use DateTimeImmutable;
 use Exception;
-use InvalidArgumentException;
+use ResourceBundle;
+use SimpleXMLElement;
 use Throwable;
 use Traversable;
 
 /**
  * Efficient assertions to validate the input/output of your methods.
  *
- * @method static void nullOrString($value, $message = '')
- * @method static void nullOrStringNotEmpty($value, $message = '')
- * @method static void nullOrInteger($value, $message = '')
- * @method static void nullOrIntegerish($value, $message = '')
- * @method static void nullOrFloat($value, $message = '')
- * @method static void nullOrNumeric($value, $message = '')
- * @method static void nullOrNatural($value, $message = '')
- * @method static void nullOrBoolean($value, $message = '')
- * @method static void nullOrScalar($value, $message = '')
- * @method static void nullOrObject($value, $message = '')
- * @method static void nullOrResource($value, $type = null, $message = '')
- * @method static void nullOrIsCallable($value, $message = '')
- * @method static void nullOrIsArray($value, $message = '')
- * @method static void nullOrIsTraversable($value, $message = '')
- * @method static void nullOrIsArrayAccessible($value, $message = '')
- * @method static void nullOrIsCountable($value, $message = '')
- * @method static void nullOrIsIterable($value, $message = '')
- * @method static void nullOrIsInstanceOf($value, $class, $message = '')
- * @method static void nullOrNotInstanceOf($value, $class, $message = '')
- * @method static void nullOrIsInstanceOfAny($value, $classes, $message = '')
- * @method static void nullOrIsEmpty($value, $message = '')
- * @method static void nullOrNotEmpty($value, $message = '')
- * @method static void nullOrTrue($value, $message = '')
- * @method static void nullOrFalse($value, $message = '')
- * @method static void nullOrIp($value, $message = '')
- * @method static void nullOrIpv4($value, $message = '')
- * @method static void nullOrIpv6($value, $message = '')
- * @method static void nullOrEmail($value, $message = '')
- * @method static void nullOrUniqueValues($values, $message = '')
- * @method static void nullOrEq($value, $expect, $message = '')
- * @method static void nullOrNotEq($value, $expect, $message = '')
- * @method static void nullOrSame($value, $expect, $message = '')
- * @method static void nullOrNotSame($value, $expect, $message = '')
- * @method static void nullOrGreaterThan($value, $limit, $message = '')
- * @method static void nullOrGreaterThanEq($value, $limit, $message = '')
- * @method static void nullOrLessThan($value, $limit, $message = '')
- * @method static void nullOrLessThanEq($value, $limit, $message = '')
- * @method static void nullOrRange($value, $min, $max, $message = '')
- * @method static void nullOrOneOf($value, $values, $message = '')
- * @method static void nullOrContains($value, $subString, $message = '')
- * @method static void nullOrNotContains($value, $subString, $message = '')
- * @method static void nullOrNotWhitespaceOnly($value, $message = '')
- * @method static void nullOrStartsWith($value, $prefix, $message = '')
- * @method static void nullOrStartsWithLetter($value, $message = '')
- * @method static void nullOrEndsWith($value, $suffix, $message = '')
- * @method static void nullOrRegex($value, $pattern, $message = '')
- * @method static void nullOrNotRegex($value, $pattern, $message = '')
- * @method static void nullOrUnicodeLetters($value, $message = '')
- * @method static void nullOrAlpha($value, $message = '')
- * @method static void nullOrDigits($value, $message = '')
- * @method static void nullOrAlnum($value, $message = '')
- * @method static void nullOrLower($value, $message = '')
- * @method static void nullOrUpper($value, $message = '')
- * @method static void nullOrLength($value, $length, $message = '')
- * @method static void nullOrMinLength($value, $min, $message = '')
- * @method static void nullOrMaxLength($value, $max, $message = '')
- * @method static void nullOrLengthBetween($value, $min, $max, $message = '')
- * @method static void nullOrFileExists($value, $message = '')
- * @method static void nullOrFile($value, $message = '')
- * @method static void nullOrDirectory($value, $message = '')
- * @method static void nullOrReadable($value, $message = '')
- * @method static void nullOrWritable($value, $message = '')
- * @method static void nullOrClassExists($value, $message = '')
- * @method static void nullOrSubclassOf($value, $class, $message = '')
- * @method static void nullOrInterfaceExists($value, $message = '')
- * @method static void nullOrImplementsInterface($value, $interface, $message = '')
- * @method static void nullOrPropertyExists($value, $property, $message = '')
- * @method static void nullOrPropertyNotExists($value, $property, $message = '')
- * @method static void nullOrMethodExists($value, $method, $message = '')
- * @method static void nullOrMethodNotExists($value, $method, $message = '')
- * @method static void nullOrKeyExists($value, $key, $message = '')
- * @method static void nullOrKeyNotExists($value, $key, $message = '')
- * @method static void nullOrCount($value, $key, $message = '')
- * @method static void nullOrMinCount($value, $min, $message = '')
- * @method static void nullOrMaxCount($value, $max, $message = '')
- * @method static void nullOrIsList($value, $message = '')
- * @method static void nullOrIsMap($value, $message = '')
- * @method static void nullOrCountBetween($value, $min, $max, $message = '')
- * @method static void nullOrUuid($values, $message = '')
- * @method static void nullOrThrows($expression, $class = 'Exception', $message = '')
- * @method static void allString($values, $message = '')
- * @method static void allStringNotEmpty($values, $message = '')
- * @method static void allInteger($values, $message = '')
- * @method static void allIntegerish($values, $message = '')
- * @method static void allFloat($values, $message = '')
- * @method static void allNumeric($values, $message = '')
- * @method static void allNatural($values, $message = '')
- * @method static void allBoolean($values, $message = '')
- * @method static void allScalar($values, $message = '')
- * @method static void allObject($values, $message = '')
- * @method static void allResource($values, $type = null, $message = '')
- * @method static void allIsCallable($values, $message = '')
- * @method static void allIsArray($values, $message = '')
- * @method static void allIsTraversable($values, $message = '')
- * @method static void allIsArrayAccessible($values, $message = '')
- * @method static void allIsCountable($values, $message = '')
- * @method static void allIsIterable($values, $message = '')
- * @method static void allIsInstanceOf($values, $class, $message = '')
- * @method static void allNotInstanceOf($values, $class, $message = '')
- * @method static void allIsInstanceOfAny($values, $classes, $message = '')
- * @method static void allNull($values, $message = '')
- * @method static void allNotNull($values, $message = '')
- * @method static void allIsEmpty($values, $message = '')
- * @method static void allNotEmpty($values, $message = '')
- * @method static void allTrue($values, $message = '')
- * @method static void allFalse($values, $message = '')
- * @method static void allIp($values, $message = '')
- * @method static void allIpv4($values, $message = '')
- * @method static void allIpv6($values, $message = '')
- * @method static void allEmail($values, $message = '')
- * @method static void allUniqueValues($values, $message = '')
- * @method static void allEq($values, $expect, $message = '')
- * @method static void allNotEq($values, $expect, $message = '')
- * @method static void allSame($values, $expect, $message = '')
- * @method static void allNotSame($values, $expect, $message = '')
- * @method static void allGreaterThan($values, $limit, $message = '')
- * @method static void allGreaterThanEq($values, $limit, $message = '')
- * @method static void allLessThan($values, $limit, $message = '')
- * @method static void allLessThanEq($values, $limit, $message = '')
- * @method static void allRange($values, $min, $max, $message = '')
- * @method static void allOneOf($values, $values, $message = '')
- * @method static void allContains($values, $subString, $message = '')
- * @method static void allNotContains($values, $subString, $message = '')
- * @method static void allNotWhitespaceOnly($values, $message = '')
- * @method static void allStartsWith($values, $prefix, $message = '')
- * @method static void allStartsWithLetter($values, $message = '')
- * @method static void allEndsWith($values, $suffix, $message = '')
- * @method static void allRegex($values, $pattern, $message = '')
- * @method static void allNotRegex($values, $pattern, $message = '')
- * @method static void allUnicodeLetters($values, $message = '')
- * @method static void allAlpha($values, $message = '')
- * @method static void allDigits($values, $message = '')
- * @method static void allAlnum($values, $message = '')
- * @method static void allLower($values, $message = '')
- * @method static void allUpper($values, $message = '')
- * @method static void allLength($values, $length, $message = '')
- * @method static void allMinLength($values, $min, $message = '')
- * @method static void allMaxLength($values, $max, $message = '')
- * @method static void allLengthBetween($values, $min, $max, $message = '')
- * @method static void allFileExists($values, $message = '')
- * @method static void allFile($values, $message = '')
- * @method static void allDirectory($values, $message = '')
- * @method static void allReadable($values, $message = '')
- * @method static void allWritable($values, $message = '')
- * @method static void allClassExists($values, $message = '')
- * @method static void allSubclassOf($values, $class, $message = '')
- * @method static void allInterfaceExists($values, $message = '')
- * @method static void allImplementsInterface($values, $interface, $message = '')
- * @method static void allPropertyExists($values, $property, $message = '')
- * @method static void allPropertyNotExists($values, $property, $message = '')
- * @method static void allMethodExists($values, $method, $message = '')
- * @method static void allMethodNotExists($values, $method, $message = '')
- * @method static void allKeyExists($values, $key, $message = '')
- * @method static void allKeyNotExists($values, $key, $message = '')
- * @method static void allCount($values, $key, $message = '')
- * @method static void allMinCount($values, $min, $message = '')
- * @method static void allMaxCount($values, $max, $message = '')
- * @method static void allCountBetween($values, $min, $max, $message = '')
- * @method static void allIsList($values, $message = '')
- * @method static void allIsMap($values, $message = '')
- * @method static void allUuid($values, $message = '')
- * @method static void allThrows($expressions, $class = 'Exception', $message = '')
- *
  * @since  1.0
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
  */
 class Assert
 {
+    use Mixin;
+
     /**
+     * @psalm-pure
      * @psalm-assert string $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function string($value, $message = '')
     {
@@ -209,10 +54,13 @@ public static function string($value, $message = '')
     }
 
     /**
-     * @psalm-assert string $value
+     * @psalm-pure
+     * @psalm-assert non-empty-string $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function stringNotEmpty($value, $message = '')
     {
@@ -221,10 +69,13 @@ public static function stringNotEmpty($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert int $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function integer($value, $message = '')
     {
@@ -237,10 +88,13 @@ public static function integer($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert numeric $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function integerish($value, $message = '')
     {
@@ -253,10 +107,32 @@ public static function integerish($value, $message = '')
     }
 
     /**
+     * @psalm-pure
+     * @psalm-assert positive-int $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function positiveInteger($value, $message = '')
+    {
+        if (!(\is_int($value) && $value > 0)) {
+            static::reportInvalidArgument(\sprintf(
+                $message ?: 'Expected a positive integer. Got: %s',
+                static::valueToString($value)
+            ));
+        }
+    }
+
+    /**
+     * @psalm-pure
      * @psalm-assert float $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function float($value, $message = '')
     {
@@ -269,10 +145,13 @@ public static function float($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert numeric $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function numeric($value, $message = '')
     {
@@ -285,26 +164,32 @@ public static function numeric($value, $message = '')
     }
 
     /**
-     * @psalm-assert int $value
+     * @psalm-pure
+     * @psalm-assert positive-int|0 $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function natural($value, $message = '')
     {
         if (!\is_int($value) || $value < 0) {
             static::reportInvalidArgument(\sprintf(
-                $message ?: 'Expected a non-negative integer. Got %s',
+                $message ?: 'Expected a non-negative integer. Got: %s',
                 static::valueToString($value)
             ));
         }
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert bool $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function boolean($value, $message = '')
     {
@@ -317,10 +202,13 @@ public static function boolean($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert scalar $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function scalar($value, $message = '')
     {
@@ -333,10 +221,13 @@ public static function scalar($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert object $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function object($value, $message = '')
     {
@@ -349,11 +240,14 @@ public static function object($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert resource $value
      *
      * @param mixed       $value
      * @param string|null $type    type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php
      * @param string      $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function resource($value, $type = null, $message = '')
     {
@@ -374,10 +268,13 @@ public static function resource($value, $type = null, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert callable $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isCallable($value, $message = '')
     {
@@ -390,10 +287,13 @@ public static function isCallable($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert array $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isArray($value, $message = '')
     {
@@ -406,12 +306,15 @@ public static function isArray($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert iterable $value
      *
      * @deprecated use "isIterable" or "isInstanceOf" instead
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isTraversable($value, $message = '')
     {
@@ -432,8 +335,13 @@ public static function isTraversable($value, $message = '')
     }
 
     /**
+     * @psalm-pure
+     * @psalm-assert array|ArrayAccess $value
+     *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isArrayAccessible($value, $message = '')
     {
@@ -446,14 +354,22 @@ public static function isArrayAccessible($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert countable $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isCountable($value, $message = '')
     {
-        if (!\is_array($value) && !($value instanceof Countable)) {
+        if (
+            !\is_array($value)
+            && !($value instanceof Countable)
+            && !($value instanceof ResourceBundle)
+            && !($value instanceof SimpleXMLElement)
+        ) {
             static::reportInvalidArgument(\sprintf(
                 $message ?: 'Expected a countable. Got: %s',
                 static::typeToString($value)
@@ -462,10 +378,13 @@ public static function isCountable($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert iterable $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isIterable($value, $message = '')
     {
@@ -478,6 +397,7 @@ public static function isIterable($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-template ExpectedType of object
      * @psalm-param class-string<ExpectedType> $class
      * @psalm-assert ExpectedType $value
@@ -485,6 +405,8 @@ public static function isIterable($value, $message = '')
      * @param mixed         $value
      * @param string|object $class
      * @param string        $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isInstanceOf($value, $class, $message = '')
     {
@@ -498,6 +420,7 @@ public static function isInstanceOf($value, $class, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-template ExpectedType of object
      * @psalm-param class-string<ExpectedType> $class
      * @psalm-assert !ExpectedType $value
@@ -505,6 +428,8 @@ public static function isInstanceOf($value, $class, $message = '')
      * @param mixed         $value
      * @param string|object $class
      * @param string        $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function notInstanceOf($value, $class, $message = '')
     {
@@ -518,9 +443,14 @@ public static function notInstanceOf($value, $class, $message = '')
     }
 
     /**
+     * @psalm-pure
+     * @psalm-param array<class-string> $classes
+     *
      * @param mixed                $value
      * @param array<object|string> $classes
      * @param string               $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isInstanceOfAny($value, array $classes, $message = '')
     {
@@ -533,15 +463,96 @@ public static function isInstanceOfAny($value, array $classes, $message = '')
         static::reportInvalidArgument(\sprintf(
             $message ?: 'Expected an instance of any of %2$s. Got: %s',
             static::typeToString($value),
-            \implode(', ', \array_map(array('static', 'valueToString'), $classes))
+            \implode(', ', \array_map(array(static::class, 'valueToString'), $classes))
         ));
     }
 
     /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert ExpectedType|class-string<ExpectedType> $value
+     *
+     * @param object|string $value
+     * @param string        $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function isAOf($value, $class, $message = '')
+    {
+        static::string($class, 'Expected class as a string. Got: %s');
+
+        if (!\is_a($value, $class, \is_string($value))) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected an instance of this class or to this class among its parents "%2$s". Got: %s',
+                static::valueToString($value),
+                $class
+            ));
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template UnexpectedType of object
+     * @psalm-param class-string<UnexpectedType> $class
+     * @psalm-assert !UnexpectedType $value
+     * @psalm-assert !class-string<UnexpectedType> $value
+     *
+     * @param object|string $value
+     * @param string        $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function isNotA($value, $class, $message = '')
+    {
+        static::string($class, 'Expected class as a string. Got: %s');
+
+        if (\is_a($value, $class, \is_string($value))) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected an instance of this class or to this class among its parents other than "%2$s". Got: %s',
+                static::valueToString($value),
+                $class
+            ));
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param array<class-string> $classes
+     *
+     * @param object|string $value
+     * @param string[]      $classes
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function isAnyOf($value, array $classes, $message = '')
+    {
+        foreach ($classes as $class) {
+            static::string($class, 'Expected class as a string. Got: %s');
+
+            if (\is_a($value, $class, \is_string($value))) {
+                return;
+            }
+        }
+
+        static::reportInvalidArgument(sprintf(
+            $message ?: 'Expected an instance of any of this classes or any of those classes among their parents "%2$s". Got: %s',
+            static::valueToString($value),
+            \implode(', ', $classes)
+        ));
+    }
+
+    /**
+     * @psalm-pure
      * @psalm-assert empty $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isEmpty($value, $message = '')
     {
@@ -554,10 +565,13 @@ public static function isEmpty($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert !empty $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function notEmpty($value, $message = '')
     {
@@ -570,10 +584,13 @@ public static function notEmpty($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert null $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function null($value, $message = '')
     {
@@ -586,10 +603,13 @@ public static function null($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert !null $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function notNull($value, $message = '')
     {
@@ -601,10 +621,13 @@ public static function notNull($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert true $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function true($value, $message = '')
     {
@@ -617,10 +640,13 @@ public static function true($value, $message = '')
     }
 
     /**
+     * @psalm-pure
      * @psalm-assert false $value
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function false($value, $message = '')
     {
@@ -633,8 +659,28 @@ public static function false($value, $message = '')
     }
 
     /**
+     * @psalm-pure
+     * @psalm-assert !false $value
+     *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function notFalse($value, $message = '')
+    {
+        if (false === $value) {
+            static::reportInvalidArgument(
+                $message ?: 'Expected a value other than false.'
+            );
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function ip($value, $message = '')
     {
@@ -649,6 +695,8 @@ public static function ip($value, $message = '')
     /**
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function ipv4($value, $message = '')
     {
@@ -663,12 +711,14 @@ public static function ipv4($value, $message = '')
     /**
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function ipv6($value, $message = '')
     {
         if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) {
             static::reportInvalidArgument(\sprintf(
-                $message ?: 'Expected a value to be an IPv6. Got %s',
+                $message ?: 'Expected a value to be an IPv6. Got: %s',
                 static::valueToString($value)
             ));
         }
@@ -677,12 +727,14 @@ public static function ipv6($value, $message = '')
     /**
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function email($value, $message = '')
     {
         if (false === \filter_var($value, FILTER_VALIDATE_EMAIL)) {
             static::reportInvalidArgument(\sprintf(
-                $message ?: 'Expected a value to be a valid e-mail address. Got %s',
+                $message ?: 'Expected a value to be a valid e-mail address. Got: %s',
                 static::valueToString($value)
             ));
         }
@@ -693,6 +745,8 @@ public static function email($value, $message = '')
      *
      * @param array  $values
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function uniqueValues(array $values, $message = '')
     {
@@ -714,6 +768,8 @@ public static function uniqueValues(array $values, $message = '')
      * @param mixed  $value
      * @param mixed  $expect
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function eq($value, $expect, $message = '')
     {
@@ -730,6 +786,8 @@ public static function eq($value, $expect, $message = '')
      * @param mixed  $value
      * @param mixed  $expect
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function notEq($value, $expect, $message = '')
     {
@@ -742,13 +800,13 @@ public static function notEq($value, $expect, $message = '')
     }
 
     /**
-     * @psalm-template ExpectedType
-     * @psalm-param ExpectedType $expect
-     * @psalm-assert =ExpectedType $value
+     * @psalm-pure
      *
      * @param mixed  $value
      * @param mixed  $expect
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function same($value, $expect, $message = '')
     {
@@ -762,9 +820,13 @@ public static function same($value, $expect, $message = '')
     }
 
     /**
+     * @psalm-pure
+     *
      * @param mixed  $value
      * @param mixed  $expect
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function notSame($value, $expect, $message = '')
     {
@@ -777,9 +839,13 @@ public static function notSame($value, $expect, $message = '')
     }
 
     /**
+     * @psalm-pure
+     *
      * @param mixed  $value
      * @param mixed  $limit
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function greaterThan($value, $limit, $message = '')
     {
@@ -793,9 +859,13 @@ public static function greaterThan($value, $limit, $message = '')
     }
 
     /**
+     * @psalm-pure
+     *
      * @param mixed  $value
      * @param mixed  $limit
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function greaterThanEq($value, $limit, $message = '')
     {
@@ -809,9 +879,13 @@ public static function greaterThanEq($value, $limit, $message = '')
     }
 
     /**
+     * @psalm-pure
+     *
      * @param mixed  $value
      * @param mixed  $limit
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function lessThan($value, $limit, $message = '')
     {
@@ -825,9 +899,13 @@ public static function lessThan($value, $limit, $message = '')
     }
 
     /**
+     * @psalm-pure
+     *
      * @param mixed  $value
      * @param mixed  $limit
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function lessThanEq($value, $limit, $message = '')
     {
@@ -843,10 +921,14 @@ public static function lessThanEq($value, $limit, $message = '')
     /**
      * Inclusive range, so Assert::(3, 3, 5) passes.
      *
-     * @param mixed $value
-     * @param mixed min
-     * @param mixed max
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $min
+     * @param mixed  $max
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function range($value, $min, $max, $message = '')
     {
@@ -861,31 +943,51 @@ public static function range($value, $min, $max, $message = '')
     }
 
     /**
-     * Does strict comparison, so Assert::oneOf(3, ['3']) does not pass the assertion.
+     * A more human-readable alias of Assert::inArray().
      *
-     * @psalm-template ExpectedType
-     * @psalm-param array<ExpectedType> $values
-     * @psalm-assert ExpectedType $value
+     * @psalm-pure
      *
      * @param mixed  $value
      * @param array  $values
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function oneOf($value, array $values, $message = '')
+    {
+        static::inArray($value, $values, $message);
+    }
+
+    /**
+     * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion.
+     *
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param array  $values
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function inArray($value, array $values, $message = '')
     {
         if (!\in_array($value, $values, true)) {
             static::reportInvalidArgument(\sprintf(
                 $message ?: 'Expected one of: %2$s. Got: %s',
                 static::valueToString($value),
-                \implode(', ', \array_map(array('static', 'valueToString'), $values))
+                \implode(', ', \array_map(array(static::class, 'valueToString'), $values))
             ));
         }
     }
 
     /**
-     * @param mixed  $value
+     * @psalm-pure
+     *
+     * @param string $value
      * @param string $subString
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function contains($value, $subString, $message = '')
     {
@@ -899,9 +1001,13 @@ public static function contains($value, $subString, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @psalm-pure
+     *
+     * @param string $value
      * @param string $subString
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function notContains($value, $subString, $message = '')
     {
@@ -915,8 +1021,12 @@ public static function notContains($value, $subString, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @psalm-pure
+     *
+     * @param string $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function notWhitespaceOnly($value, $message = '')
     {
@@ -929,9 +1039,13 @@ public static function notWhitespaceOnly($value, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @psalm-pure
+     *
+     * @param string $value
      * @param string $prefix
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function startsWith($value, $prefix, $message = '')
     {
@@ -945,11 +1059,37 @@ public static function startsWith($value, $prefix, $message = '')
     }
 
     /**
+     * @psalm-pure
+     *
+     * @param string $value
+     * @param string $prefix
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function notStartsWith($value, $prefix, $message = '')
+    {
+        if (0 === \strpos($value, $prefix)) {
+            static::reportInvalidArgument(\sprintf(
+                $message ?: 'Expected a value not to start with %2$s. Got: %s',
+                static::valueToString($value),
+                static::valueToString($prefix)
+            ));
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function startsWithLetter($value, $message = '')
     {
+        static::string($value);
+
         $valid = isset($value[0]);
 
         if ($valid) {
@@ -968,9 +1108,13 @@ public static function startsWithLetter($value, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @psalm-pure
+     *
+     * @param string $value
      * @param string $suffix
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function endsWith($value, $suffix, $message = '')
     {
@@ -984,9 +1128,33 @@ public static function endsWith($value, $suffix, $message = '')
     }
 
     /**
-     * @param mixed  $value
-     * @param mixed  $pattern
+     * @psalm-pure
+     *
+     * @param string $value
+     * @param string $suffix
      * @param string $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function notEndsWith($value, $suffix, $message = '')
+    {
+        if ($suffix === \substr($value, -\strlen($suffix))) {
+            static::reportInvalidArgument(\sprintf(
+                $message ?: 'Expected a value not to end with %2$s. Got: %s',
+                static::valueToString($value),
+                static::valueToString($suffix)
+            ));
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string $value
+     * @param string $pattern
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function regex($value, $pattern, $message = '')
     {
@@ -999,9 +1167,13 @@ public static function regex($value, $pattern, $message = '')
     }
 
     /**
-     * @param mixed  $value
-     * @param mixed  $pattern
+     * @psalm-pure
+     *
+     * @param string $value
+     * @param string $pattern
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function notRegex($value, $pattern, $message = '')
     {
@@ -1016,10 +1188,12 @@ public static function notRegex($value, $pattern, $message = '')
     }
 
     /**
-     * @psalm-assert !numeric $value
+     * @psalm-pure
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function unicodeLetters($value, $message = '')
     {
@@ -1034,11 +1208,17 @@ public static function unicodeLetters($value, $message = '')
     }
 
     /**
+     * @psalm-pure
+     *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function alpha($value, $message = '')
     {
+        static::string($value);
+
         $locale = \setlocale(LC_CTYPE, 0);
         \setlocale(LC_CTYPE, 'C');
         $valid = !\ctype_alpha($value);
@@ -1053,8 +1233,12 @@ public static function alpha($value, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @psalm-pure
+     *
+     * @param string $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function digits($value, $message = '')
     {
@@ -1072,8 +1256,12 @@ public static function digits($value, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @psalm-pure
+     *
+     * @param string $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function alnum($value, $message = '')
     {
@@ -1091,8 +1279,13 @@ public static function alnum($value, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @psalm-pure
+     * @psalm-assert lowercase-string $value
+     *
+     * @param string $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function lower($value, $message = '')
     {
@@ -1110,8 +1303,13 @@ public static function lower($value, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @psalm-pure
+     * @psalm-assert !lowercase-string $value
+     *
+     * @param string $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function upper($value, $message = '')
     {
@@ -1129,9 +1327,13 @@ public static function upper($value, $message = '')
     }
 
     /**
-     * @param mixed  $value
-     * @param mixed  $length
+     * @psalm-pure
+     *
+     * @param string $value
+     * @param int    $length
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function length($value, $length, $message = '')
     {
@@ -1147,9 +1349,13 @@ public static function length($value, $length, $message = '')
     /**
      * Inclusive min.
      *
-     * @param mixed  $value
-     * @param mixed  $min
-     * @param string $message
+     * @psalm-pure
+     *
+     * @param string    $value
+     * @param int|float $min
+     * @param string    $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function minLength($value, $min, $message = '')
     {
@@ -1165,9 +1371,13 @@ public static function minLength($value, $min, $message = '')
     /**
      * Inclusive max.
      *
-     * @param mixed  $value
-     * @param mixed  $max
-     * @param string $message
+     * @psalm-pure
+     *
+     * @param string    $value
+     * @param int|float $max
+     * @param string    $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function maxLength($value, $max, $message = '')
     {
@@ -1183,10 +1393,14 @@ public static function maxLength($value, $max, $message = '')
     /**
      * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion.
      *
-     * @param mixed  $value
-     * @param mixed  $min
-     * @param mixed  $max
-     * @param string $message
+     * @psalm-pure
+     *
+     * @param string    $value
+     * @param int|float $min
+     * @param int|float $max
+     * @param string    $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function lengthBetween($value, $min, $max, $message = '')
     {
@@ -1207,6 +1421,8 @@ public static function lengthBetween($value, $min, $max, $message = '')
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function fileExists($value, $message = '')
     {
@@ -1223,6 +1439,8 @@ public static function fileExists($value, $message = '')
     /**
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function file($value, $message = '')
     {
@@ -1239,6 +1457,8 @@ public static function file($value, $message = '')
     /**
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function directory($value, $message = '')
     {
@@ -1253,8 +1473,10 @@ public static function directory($value, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @param string $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function readable($value, $message = '')
     {
@@ -1267,8 +1489,10 @@ public static function readable($value, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @param string $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function writable($value, $message = '')
     {
@@ -1285,6 +1509,8 @@ public static function writable($value, $message = '')
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function classExists($value, $message = '')
     {
@@ -1297,9 +1523,16 @@ public static function classExists($value, $message = '')
     }
 
     /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert class-string<ExpectedType>|ExpectedType $value
+     *
      * @param mixed         $value
      * @param string|object $class
      * @param string        $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function subclassOf($value, $class, $message = '')
     {
@@ -1317,6 +1550,8 @@ public static function subclassOf($value, $class, $message = '')
      *
      * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function interfaceExists($value, $message = '')
     {
@@ -1329,9 +1564,16 @@ public static function interfaceExists($value, $message = '')
     }
 
     /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $interface
+     * @psalm-assert class-string<ExpectedType> $value
+     *
      * @param mixed  $value
      * @param mixed  $interface
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function implementsInterface($value, $interface, $message = '')
     {
@@ -1345,9 +1587,14 @@ public static function implementsInterface($value, $interface, $message = '')
     }
 
     /**
+     * @psalm-pure
+     * @psalm-param class-string|object $classOrObject
+     *
      * @param string|object $classOrObject
      * @param mixed         $property
      * @param string        $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function propertyExists($classOrObject, $property, $message = '')
     {
@@ -1360,9 +1607,14 @@ public static function propertyExists($classOrObject, $property, $message = '')
     }
 
     /**
+     * @psalm-pure
+     * @psalm-param class-string|object $classOrObject
+     *
      * @param string|object $classOrObject
      * @param mixed         $property
      * @param string        $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function propertyNotExists($classOrObject, $property, $message = '')
     {
@@ -1375,13 +1627,18 @@ public static function propertyNotExists($classOrObject, $property, $message = '
     }
 
     /**
+     * @psalm-pure
+     * @psalm-param class-string|object $classOrObject
+     *
      * @param string|object $classOrObject
      * @param mixed         $method
      * @param string        $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function methodExists($classOrObject, $method, $message = '')
     {
-        if (!\method_exists($classOrObject, $method)) {
+        if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) {
             static::reportInvalidArgument(\sprintf(
                 $message ?: 'Expected the method %s to exist.',
                 static::valueToString($method)
@@ -1390,13 +1647,18 @@ public static function methodExists($classOrObject, $method, $message = '')
     }
 
     /**
+     * @psalm-pure
+     * @psalm-param class-string|object $classOrObject
+     *
      * @param string|object $classOrObject
      * @param mixed         $method
      * @param string        $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function methodNotExists($classOrObject, $method, $message = '')
     {
-        if (\method_exists($classOrObject, $method)) {
+        if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) {
             static::reportInvalidArgument(\sprintf(
                 $message ?: 'Expected the method %s to not exist.',
                 static::valueToString($method)
@@ -1405,9 +1667,13 @@ public static function methodNotExists($classOrObject, $method, $message = '')
     }
 
     /**
+     * @psalm-pure
+     *
      * @param array      $array
      * @param string|int $key
      * @param string     $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function keyExists($array, $key, $message = '')
     {
@@ -1420,9 +1686,13 @@ public static function keyExists($array, $key, $message = '')
     }
 
     /**
+     * @psalm-pure
+     *
      * @param array      $array
      * @param string|int $key
      * @param string     $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function keyNotExists($array, $key, $message = '')
     {
@@ -1435,27 +1705,56 @@ public static function keyNotExists($array, $key, $message = '')
     }
 
     /**
-     * Does not check if $array is countable, this can generate a warning on php versions after 7.2.
+     * Checks if a value is a valid array key (int or string).
      *
-     * @param mixed  $array
-     * @param mixed  $number
+     * @psalm-pure
+     * @psalm-assert array-key $value
+     *
+     * @param mixed  $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function validArrayKey($value, $message = '')
+    {
+        if (!(\is_int($value) || \is_string($value))) {
+            static::reportInvalidArgument(\sprintf(
+                $message ?: 'Expected string or integer. Got: %s',
+                static::typeToString($value)
+            ));
+        }
+    }
+
+    /**
+     * Does not check if $array is countable, this can generate a warning on php versions after 7.2.
+     *
+     * @param Countable|array $array
+     * @param int             $number
+     * @param string          $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function count($array, $number, $message = '')
     {
         static::eq(
             \count($array),
             $number,
-            $message ?: \sprintf('Expected an array to contain %d elements. Got: %d.', $number, \count($array))
+            \sprintf(
+                $message ?: 'Expected an array to contain %d elements. Got: %d.',
+                $number,
+                \count($array)
+            )
         );
     }
 
     /**
      * Does not check if $array is countable, this can generate a warning on php versions after 7.2.
      *
-     * @param mixed  $array
-     * @param mixed  $min
-     * @param string $message
+     * @param Countable|array $array
+     * @param int|float       $min
+     * @param string          $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function minCount($array, $min, $message = '')
     {
@@ -1471,9 +1770,11 @@ public static function minCount($array, $min, $message = '')
     /**
      * Does not check if $array is countable, this can generate a warning on php versions after 7.2.
      *
-     * @param mixed  $array
-     * @param mixed  $max
-     * @param string $message
+     * @param Countable|array $array
+     * @param int|float       $max
+     * @param string          $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function maxCount($array, $max, $message = '')
     {
@@ -1489,10 +1790,12 @@ public static function maxCount($array, $max, $message = '')
     /**
      * Does not check if $array is countable, this can generate a warning on php versions after 7.2.
      *
-     * @param mixed  $array
-     * @param mixed  $min
-     * @param mixed  $max
-     * @param string $message
+     * @param Countable|array $array
+     * @param int|float       $min
+     * @param int|float       $max
+     * @param string          $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function countBetween($array, $min, $max, $message = '')
     {
@@ -1509,30 +1812,67 @@ public static function countBetween($array, $min, $max, $message = '')
     }
 
     /**
+     * @psalm-pure
+     * @psalm-assert list $array
+     *
      * @param mixed  $array
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isList($array, $message = '')
     {
-        if (!\is_array($array) || !$array || \array_keys($array) !== \range(0, \count($array) - 1)) {
+        if (!\is_array($array)) {
             static::reportInvalidArgument(
                 $message ?: 'Expected list - non-associative array.'
             );
         }
+
+        if ($array === \array_values($array)) {
+            return;
+        }
+
+        $nextKey = -1;
+        foreach ($array as $k => $v) {
+            if ($k !== ++$nextKey) {
+                static::reportInvalidArgument(
+                    $message ?: 'Expected list - non-associative array.'
+                );
+            }
+        }
     }
 
     /**
+     * @psalm-pure
+     * @psalm-assert non-empty-list $array
+     *
      * @param mixed  $array
      * @param string $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function isNonEmptyList($array, $message = '')
+    {
+        static::isList($array, $message);
+        static::notEmpty($array, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template T
+     * @psalm-param mixed|array<T> $array
+     * @psalm-assert array<string, T> $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function isMap($array, $message = '')
     {
         if (
             !\is_array($array) ||
-            !$array ||
-            \array_keys($array) !== \array_filter(\array_keys($array), function ($key) {
-                return \is_string($key);
-            })
+            \array_keys($array) !== \array_filter(\array_keys($array), '\is_string')
         ) {
             static::reportInvalidArgument(
                 $message ?: 'Expected map - associative array with string keys.'
@@ -1541,8 +1881,30 @@ public static function isMap($array, $message = '')
     }
 
     /**
-     * @param mixed  $value
+     * @psalm-pure
+     * @psalm-template T
+     * @psalm-param mixed|array<T> $array
+     * @psalm-assert array<string, T> $array
+     * @psalm-assert !empty $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     */
+    public static function isNonEmptyMap($array, $message = '')
+    {
+        static::isMap($array, $message);
+        static::notEmpty($array, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string $value
      * @param string $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function uuid($value, $message = '')
     {
@@ -1563,9 +1925,13 @@ public static function uuid($value, $message = '')
     }
 
     /**
-     * @param Closure       $expression
-     * @param string|object $class
-     * @param string        $message
+     * @psalm-param class-string<Throwable> $class
+     *
+     * @param Closure $expression
+     * @param string  $class
+     * @param string  $message
+     *
+     * @throws InvalidArgumentException
      */
     public static function throws(Closure $expression, $class = 'Exception', $message = '')
     {
@@ -1594,12 +1960,15 @@ public static function throws(Closure $expression, $class = 'Exception', $messag
         ));
     }
 
+    /**
+     * @throws BadMethodCallException
+     */
     public static function __callStatic($name, $arguments)
     {
         if ('nullOr' === \substr($name, 0, 6)) {
             if (null !== $arguments[0]) {
                 $method = \lcfirst(\substr($name, 6));
-                \call_user_func_array(array('static', $method), $arguments);
+                \call_user_func_array(array(static::class, $method), $arguments);
             }
 
             return;
@@ -1614,7 +1983,7 @@ public static function __callStatic($name, $arguments)
             foreach ($arguments[0] as $entry) {
                 $args[0] = $entry;
 
-                \call_user_func_array(array('static', $method), $args);
+                \call_user_func_array(array(static::class, $method), $args);
             }
 
             return;
@@ -1651,6 +2020,10 @@ protected static function valueToString($value)
                 return \get_class($value).': '.self::valueToString($value->__toString());
             }
 
+            if ($value instanceof DateTime || $value instanceof DateTimeImmutable) {
+                return \get_class($value).': '.self::valueToString($value->format('c'));
+            }
+
             return \get_class($value);
         }
 
@@ -1690,6 +2063,11 @@ protected static function strlen($value)
 
     /**
      * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @psalm-pure this method is not supposed to perform side-effects
+     * @psalm-return never
      */
     protected static function reportInvalidArgument($message)
     {
diff --git a/vendor/webmozart/assert/src/InvalidArgumentException.php b/vendor/webmozart/assert/src/InvalidArgumentException.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d95a58c50061c6bab033016c8c04d974c2fc4f1
--- /dev/null
+++ b/vendor/webmozart/assert/src/InvalidArgumentException.php
@@ -0,0 +1,16 @@
+<?php
+
+/*
+ * This file is part of the webmozart/assert package.
+ *
+ * (c) Bernhard Schussek <bschussek@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Webmozart\Assert;
+
+class InvalidArgumentException extends \InvalidArgumentException
+{
+}
diff --git a/vendor/webmozart/assert/src/Mixin.php b/vendor/webmozart/assert/src/Mixin.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f0a75e3304ab7e6d24f5126920dbac7c534af94
--- /dev/null
+++ b/vendor/webmozart/assert/src/Mixin.php
@@ -0,0 +1,5089 @@
+<?php
+
+namespace Webmozart\Assert;
+
+use ArrayAccess;
+use Closure;
+use Countable;
+use Throwable;
+
+/**
+ * This trait provides nurllOr*, all* and allNullOr* variants of assertion base methods.
+ * Do not use this trait directly: it will change, and is not designed for reuse.
+ */
+trait Mixin
+{
+    /**
+     * @psalm-pure
+     * @psalm-assert string|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrString($value, $message = '')
+    {
+        null === $value || static::string($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<string> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allString($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::string($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<string|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrString($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::string($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert non-empty-string|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrStringNotEmpty($value, $message = '')
+    {
+        null === $value || static::stringNotEmpty($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<non-empty-string> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allStringNotEmpty($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::stringNotEmpty($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<non-empty-string|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrStringNotEmpty($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::stringNotEmpty($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert int|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrInteger($value, $message = '')
+    {
+        null === $value || static::integer($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<int> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allInteger($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::integer($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<int|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrInteger($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::integer($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert numeric|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIntegerish($value, $message = '')
+    {
+        null === $value || static::integerish($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<numeric> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIntegerish($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::integerish($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<numeric|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIntegerish($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::integerish($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert positive-int|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrPositiveInteger($value, $message = '')
+    {
+        null === $value || static::positiveInteger($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<positive-int> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allPositiveInteger($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::positiveInteger($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<positive-int|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrPositiveInteger($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::positiveInteger($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert float|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrFloat($value, $message = '')
+    {
+        null === $value || static::float($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<float> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allFloat($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::float($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<float|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrFloat($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::float($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert numeric|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNumeric($value, $message = '')
+    {
+        null === $value || static::numeric($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<numeric> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNumeric($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::numeric($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<numeric|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNumeric($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::numeric($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert positive-int|0|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNatural($value, $message = '')
+    {
+        null === $value || static::natural($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<positive-int|0> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNatural($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::natural($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<positive-int|0|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNatural($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::natural($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert bool|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrBoolean($value, $message = '')
+    {
+        null === $value || static::boolean($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<bool> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allBoolean($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::boolean($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<bool|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrBoolean($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::boolean($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert scalar|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrScalar($value, $message = '')
+    {
+        null === $value || static::scalar($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<scalar> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allScalar($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::scalar($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<scalar|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrScalar($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::scalar($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert object|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrObject($value, $message = '')
+    {
+        null === $value || static::object($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<object> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allObject($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::object($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<object|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrObject($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::object($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert resource|null $value
+     *
+     * @param mixed       $value
+     * @param string|null $type    type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrResource($value, $type = null, $message = '')
+    {
+        null === $value || static::resource($value, $type, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<resource> $value
+     *
+     * @param mixed       $value
+     * @param string|null $type    type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allResource($value, $type = null, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::resource($entry, $type, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<resource|null> $value
+     *
+     * @param mixed       $value
+     * @param string|null $type    type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrResource($value, $type = null, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::resource($entry, $type, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert callable|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsCallable($value, $message = '')
+    {
+        null === $value || static::isCallable($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<callable> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsCallable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isCallable($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<callable|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsCallable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isCallable($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert array|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsArray($value, $message = '')
+    {
+        null === $value || static::isArray($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<array> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsArray($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isArray($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<array|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsArray($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isArray($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable|null $value
+     *
+     * @deprecated use "isIterable" or "isInstanceOf" instead
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsTraversable($value, $message = '')
+    {
+        null === $value || static::isTraversable($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<iterable> $value
+     *
+     * @deprecated use "isIterable" or "isInstanceOf" instead
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsTraversable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isTraversable($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<iterable|null> $value
+     *
+     * @deprecated use "isIterable" or "isInstanceOf" instead
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsTraversable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isTraversable($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert array|ArrayAccess|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsArrayAccessible($value, $message = '')
+    {
+        null === $value || static::isArrayAccessible($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<array|ArrayAccess> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsArrayAccessible($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isArrayAccessible($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<array|ArrayAccess|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsArrayAccessible($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isArrayAccessible($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert countable|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsCountable($value, $message = '')
+    {
+        null === $value || static::isCountable($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<countable> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsCountable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isCountable($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<countable|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsCountable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isCountable($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsIterable($value, $message = '')
+    {
+        null === $value || static::isIterable($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<iterable> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsIterable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isIterable($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<iterable|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsIterable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isIterable($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert ExpectedType|null $value
+     *
+     * @param mixed         $value
+     * @param string|object $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsInstanceOf($value, $class, $message = '')
+    {
+        null === $value || static::isInstanceOf($value, $class, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert iterable<ExpectedType> $value
+     *
+     * @param mixed         $value
+     * @param string|object $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsInstanceOf($value, $class, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isInstanceOf($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert iterable<ExpectedType|null> $value
+     *
+     * @param mixed         $value
+     * @param string|object $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsInstanceOf($value, $class, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isInstanceOf($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     *
+     * @param mixed         $value
+     * @param string|object $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNotInstanceOf($value, $class, $message = '')
+    {
+        null === $value || static::notInstanceOf($value, $class, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     *
+     * @param mixed         $value
+     * @param string|object $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotInstanceOf($value, $class, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notInstanceOf($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert iterable<!ExpectedType|null> $value
+     *
+     * @param mixed         $value
+     * @param string|object $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNotInstanceOf($value, $class, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::notInstanceOf($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param array<class-string> $classes
+     *
+     * @param mixed                $value
+     * @param array<object|string> $classes
+     * @param string               $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsInstanceOfAny($value, $classes, $message = '')
+    {
+        null === $value || static::isInstanceOfAny($value, $classes, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param array<class-string> $classes
+     *
+     * @param mixed                $value
+     * @param array<object|string> $classes
+     * @param string               $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsInstanceOfAny($value, $classes, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isInstanceOfAny($entry, $classes, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param array<class-string> $classes
+     *
+     * @param mixed                $value
+     * @param array<object|string> $classes
+     * @param string               $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsInstanceOfAny($value, $classes, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isInstanceOfAny($entry, $classes, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert ExpectedType|class-string<ExpectedType>|null $value
+     *
+     * @param object|string|null $value
+     * @param string             $class
+     * @param string             $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsAOf($value, $class, $message = '')
+    {
+        null === $value || static::isAOf($value, $class, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert iterable<ExpectedType|class-string<ExpectedType>> $value
+     *
+     * @param iterable<object|string> $value
+     * @param string                  $class
+     * @param string                  $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsAOf($value, $class, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isAOf($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert iterable<ExpectedType|class-string<ExpectedType>|null> $value
+     *
+     * @param iterable<object|string|null> $value
+     * @param string                       $class
+     * @param string                       $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsAOf($value, $class, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isAOf($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template UnexpectedType of object
+     * @psalm-param class-string<UnexpectedType> $class
+     *
+     * @param object|string|null $value
+     * @param string             $class
+     * @param string             $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsNotA($value, $class, $message = '')
+    {
+        null === $value || static::isNotA($value, $class, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template UnexpectedType of object
+     * @psalm-param class-string<UnexpectedType> $class
+     *
+     * @param iterable<object|string> $value
+     * @param string                  $class
+     * @param string                  $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsNotA($value, $class, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isNotA($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template UnexpectedType of object
+     * @psalm-param class-string<UnexpectedType> $class
+     * @psalm-assert iterable<!UnexpectedType|null> $value
+     * @psalm-assert iterable<!class-string<UnexpectedType>|null> $value
+     *
+     * @param iterable<object|string|null> $value
+     * @param string                       $class
+     * @param string                       $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsNotA($value, $class, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isNotA($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param array<class-string> $classes
+     *
+     * @param object|string|null $value
+     * @param string[]           $classes
+     * @param string             $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsAnyOf($value, $classes, $message = '')
+    {
+        null === $value || static::isAnyOf($value, $classes, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param array<class-string> $classes
+     *
+     * @param iterable<object|string> $value
+     * @param string[]                $classes
+     * @param string                  $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsAnyOf($value, $classes, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isAnyOf($entry, $classes, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param array<class-string> $classes
+     *
+     * @param iterable<object|string|null> $value
+     * @param string[]                     $classes
+     * @param string                       $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsAnyOf($value, $classes, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isAnyOf($entry, $classes, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert empty $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsEmpty($value, $message = '')
+    {
+        null === $value || static::isEmpty($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<empty> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsEmpty($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::isEmpty($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<empty|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsEmpty($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::isEmpty($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNotEmpty($value, $message = '')
+    {
+        null === $value || static::notEmpty($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotEmpty($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notEmpty($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<!empty|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNotEmpty($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::notEmpty($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNull($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::null($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotNull($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notNull($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert true|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrTrue($value, $message = '')
+    {
+        null === $value || static::true($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<true> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allTrue($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::true($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<true|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrTrue($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::true($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert false|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrFalse($value, $message = '')
+    {
+        null === $value || static::false($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<false> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allFalse($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::false($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<false|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrFalse($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::false($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNotFalse($value, $message = '')
+    {
+        null === $value || static::notFalse($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotFalse($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notFalse($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<!false|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNotFalse($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::notFalse($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIp($value, $message = '')
+    {
+        null === $value || static::ip($value, $message);
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIp($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::ip($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIp($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::ip($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIpv4($value, $message = '')
+    {
+        null === $value || static::ipv4($value, $message);
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIpv4($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::ipv4($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIpv4($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::ipv4($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIpv6($value, $message = '')
+    {
+        null === $value || static::ipv6($value, $message);
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIpv6($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::ipv6($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIpv6($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::ipv6($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrEmail($value, $message = '')
+    {
+        null === $value || static::email($value, $message);
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allEmail($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::email($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrEmail($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::email($entry, $message);
+        }
+    }
+
+    /**
+     * @param array|null $values
+     * @param string     $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrUniqueValues($values, $message = '')
+    {
+        null === $values || static::uniqueValues($values, $message);
+    }
+
+    /**
+     * @param iterable<array> $values
+     * @param string          $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allUniqueValues($values, $message = '')
+    {
+        static::isIterable($values);
+
+        foreach ($values as $entry) {
+            static::uniqueValues($entry, $message);
+        }
+    }
+
+    /**
+     * @param iterable<array|null> $values
+     * @param string               $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrUniqueValues($values, $message = '')
+    {
+        static::isIterable($values);
+
+        foreach ($values as $entry) {
+            null === $entry || static::uniqueValues($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrEq($value, $expect, $message = '')
+    {
+        null === $value || static::eq($value, $expect, $message);
+    }
+
+    /**
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allEq($value, $expect, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::eq($entry, $expect, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrEq($value, $expect, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::eq($entry, $expect, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNotEq($value, $expect, $message = '')
+    {
+        null === $value || static::notEq($value, $expect, $message);
+    }
+
+    /**
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotEq($value, $expect, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notEq($entry, $expect, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNotEq($value, $expect, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::notEq($entry, $expect, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrSame($value, $expect, $message = '')
+    {
+        null === $value || static::same($value, $expect, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allSame($value, $expect, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::same($entry, $expect, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrSame($value, $expect, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::same($entry, $expect, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNotSame($value, $expect, $message = '')
+    {
+        null === $value || static::notSame($value, $expect, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotSame($value, $expect, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notSame($entry, $expect, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $expect
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNotSame($value, $expect, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::notSame($entry, $expect, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrGreaterThan($value, $limit, $message = '')
+    {
+        null === $value || static::greaterThan($value, $limit, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allGreaterThan($value, $limit, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::greaterThan($entry, $limit, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrGreaterThan($value, $limit, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::greaterThan($entry, $limit, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrGreaterThanEq($value, $limit, $message = '')
+    {
+        null === $value || static::greaterThanEq($value, $limit, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allGreaterThanEq($value, $limit, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::greaterThanEq($entry, $limit, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrGreaterThanEq($value, $limit, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::greaterThanEq($entry, $limit, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrLessThan($value, $limit, $message = '')
+    {
+        null === $value || static::lessThan($value, $limit, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allLessThan($value, $limit, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::lessThan($entry, $limit, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrLessThan($value, $limit, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::lessThan($entry, $limit, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrLessThanEq($value, $limit, $message = '')
+    {
+        null === $value || static::lessThanEq($value, $limit, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allLessThanEq($value, $limit, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::lessThanEq($entry, $limit, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $limit
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrLessThanEq($value, $limit, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::lessThanEq($entry, $limit, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $min
+     * @param mixed  $max
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrRange($value, $min, $max, $message = '')
+    {
+        null === $value || static::range($value, $min, $max, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $min
+     * @param mixed  $max
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allRange($value, $min, $max, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::range($entry, $min, $max, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param mixed  $min
+     * @param mixed  $max
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrRange($value, $min, $max, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::range($entry, $min, $max, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param array  $values
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrOneOf($value, $values, $message = '')
+    {
+        null === $value || static::oneOf($value, $values, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param array  $values
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allOneOf($value, $values, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::oneOf($entry, $values, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param array  $values
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrOneOf($value, $values, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::oneOf($entry, $values, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param array  $values
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrInArray($value, $values, $message = '')
+    {
+        null === $value || static::inArray($value, $values, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param array  $values
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allInArray($value, $values, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::inArray($entry, $values, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param array  $values
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrInArray($value, $values, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::inArray($entry, $values, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $subString
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrContains($value, $subString, $message = '')
+    {
+        null === $value || static::contains($value, $subString, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $subString
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allContains($value, $subString, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::contains($entry, $subString, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $subString
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrContains($value, $subString, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::contains($entry, $subString, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $subString
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNotContains($value, $subString, $message = '')
+    {
+        null === $value || static::notContains($value, $subString, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $subString
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotContains($value, $subString, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notContains($entry, $subString, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $subString
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNotContains($value, $subString, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::notContains($entry, $subString, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNotWhitespaceOnly($value, $message = '')
+    {
+        null === $value || static::notWhitespaceOnly($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotWhitespaceOnly($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notWhitespaceOnly($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNotWhitespaceOnly($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::notWhitespaceOnly($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $prefix
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrStartsWith($value, $prefix, $message = '')
+    {
+        null === $value || static::startsWith($value, $prefix, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $prefix
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allStartsWith($value, $prefix, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::startsWith($entry, $prefix, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $prefix
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrStartsWith($value, $prefix, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::startsWith($entry, $prefix, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $prefix
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNotStartsWith($value, $prefix, $message = '')
+    {
+        null === $value || static::notStartsWith($value, $prefix, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $prefix
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotStartsWith($value, $prefix, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notStartsWith($entry, $prefix, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $prefix
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNotStartsWith($value, $prefix, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::notStartsWith($entry, $prefix, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrStartsWithLetter($value, $message = '')
+    {
+        null === $value || static::startsWithLetter($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allStartsWithLetter($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::startsWithLetter($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrStartsWithLetter($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::startsWithLetter($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $suffix
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrEndsWith($value, $suffix, $message = '')
+    {
+        null === $value || static::endsWith($value, $suffix, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $suffix
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allEndsWith($value, $suffix, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::endsWith($entry, $suffix, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $suffix
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrEndsWith($value, $suffix, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::endsWith($entry, $suffix, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $suffix
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNotEndsWith($value, $suffix, $message = '')
+    {
+        null === $value || static::notEndsWith($value, $suffix, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $suffix
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotEndsWith($value, $suffix, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notEndsWith($entry, $suffix, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $suffix
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNotEndsWith($value, $suffix, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::notEndsWith($entry, $suffix, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $pattern
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrRegex($value, $pattern, $message = '')
+    {
+        null === $value || static::regex($value, $pattern, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $pattern
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allRegex($value, $pattern, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::regex($entry, $pattern, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $pattern
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrRegex($value, $pattern, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::regex($entry, $pattern, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $pattern
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrNotRegex($value, $pattern, $message = '')
+    {
+        null === $value || static::notRegex($value, $pattern, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $pattern
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNotRegex($value, $pattern, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::notRegex($entry, $pattern, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $pattern
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrNotRegex($value, $pattern, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::notRegex($entry, $pattern, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrUnicodeLetters($value, $message = '')
+    {
+        null === $value || static::unicodeLetters($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allUnicodeLetters($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::unicodeLetters($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrUnicodeLetters($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::unicodeLetters($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrAlpha($value, $message = '')
+    {
+        null === $value || static::alpha($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allAlpha($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::alpha($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrAlpha($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::alpha($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrDigits($value, $message = '')
+    {
+        null === $value || static::digits($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allDigits($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::digits($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrDigits($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::digits($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrAlnum($value, $message = '')
+    {
+        null === $value || static::alnum($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allAlnum($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::alnum($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrAlnum($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::alnum($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert lowercase-string|null $value
+     *
+     * @param string|null $value
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrLower($value, $message = '')
+    {
+        null === $value || static::lower($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<lowercase-string> $value
+     *
+     * @param iterable<string> $value
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allLower($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::lower($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<lowercase-string|null> $value
+     *
+     * @param iterable<string|null> $value
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrLower($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::lower($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrUpper($value, $message = '')
+    {
+        null === $value || static::upper($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allUpper($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::upper($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<!lowercase-string|null> $value
+     *
+     * @param iterable<string|null> $value
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrUpper($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::upper($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param int         $length
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrLength($value, $length, $message = '')
+    {
+        null === $value || static::length($value, $length, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param int              $length
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allLength($value, $length, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::length($entry, $length, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param int                   $length
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrLength($value, $length, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::length($entry, $length, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param int|float   $min
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrMinLength($value, $min, $message = '')
+    {
+        null === $value || static::minLength($value, $min, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param int|float        $min
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allMinLength($value, $min, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::minLength($entry, $min, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param int|float             $min
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrMinLength($value, $min, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::minLength($entry, $min, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param int|float   $max
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrMaxLength($value, $max, $message = '')
+    {
+        null === $value || static::maxLength($value, $max, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param int|float        $max
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allMaxLength($value, $max, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::maxLength($entry, $max, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param int|float             $max
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrMaxLength($value, $max, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::maxLength($entry, $max, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param int|float   $min
+     * @param int|float   $max
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrLengthBetween($value, $min, $max, $message = '')
+    {
+        null === $value || static::lengthBetween($value, $min, $max, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param int|float        $min
+     * @param int|float        $max
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allLengthBetween($value, $min, $max, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::lengthBetween($entry, $min, $max, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param int|float             $min
+     * @param int|float             $max
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrLengthBetween($value, $min, $max, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::lengthBetween($entry, $min, $max, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrFileExists($value, $message = '')
+    {
+        null === $value || static::fileExists($value, $message);
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allFileExists($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::fileExists($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrFileExists($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::fileExists($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrFile($value, $message = '')
+    {
+        null === $value || static::file($value, $message);
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allFile($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::file($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrFile($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::file($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrDirectory($value, $message = '')
+    {
+        null === $value || static::directory($value, $message);
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allDirectory($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::directory($entry, $message);
+        }
+    }
+
+    /**
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrDirectory($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::directory($entry, $message);
+        }
+    }
+
+    /**
+     * @param string|null $value
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrReadable($value, $message = '')
+    {
+        null === $value || static::readable($value, $message);
+    }
+
+    /**
+     * @param iterable<string> $value
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allReadable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::readable($entry, $message);
+        }
+    }
+
+    /**
+     * @param iterable<string|null> $value
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrReadable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::readable($entry, $message);
+        }
+    }
+
+    /**
+     * @param string|null $value
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrWritable($value, $message = '')
+    {
+        null === $value || static::writable($value, $message);
+    }
+
+    /**
+     * @param iterable<string> $value
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allWritable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::writable($entry, $message);
+        }
+    }
+
+    /**
+     * @param iterable<string|null> $value
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrWritable($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::writable($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-assert class-string|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrClassExists($value, $message = '')
+    {
+        null === $value || static::classExists($value, $message);
+    }
+
+    /**
+     * @psalm-assert iterable<class-string> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allClassExists($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::classExists($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-assert iterable<class-string|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrClassExists($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::classExists($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert class-string<ExpectedType>|ExpectedType|null $value
+     *
+     * @param mixed         $value
+     * @param string|object $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrSubclassOf($value, $class, $message = '')
+    {
+        null === $value || static::subclassOf($value, $class, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert iterable<class-string<ExpectedType>|ExpectedType> $value
+     *
+     * @param mixed         $value
+     * @param string|object $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allSubclassOf($value, $class, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::subclassOf($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $class
+     * @psalm-assert iterable<class-string<ExpectedType>|ExpectedType|null> $value
+     *
+     * @param mixed         $value
+     * @param string|object $class
+     * @param string        $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrSubclassOf($value, $class, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::subclassOf($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-assert class-string|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrInterfaceExists($value, $message = '')
+    {
+        null === $value || static::interfaceExists($value, $message);
+    }
+
+    /**
+     * @psalm-assert iterable<class-string> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allInterfaceExists($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::interfaceExists($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-assert iterable<class-string|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrInterfaceExists($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::interfaceExists($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $interface
+     * @psalm-assert class-string<ExpectedType>|null $value
+     *
+     * @param mixed  $value
+     * @param mixed  $interface
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrImplementsInterface($value, $interface, $message = '')
+    {
+        null === $value || static::implementsInterface($value, $interface, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $interface
+     * @psalm-assert iterable<class-string<ExpectedType>> $value
+     *
+     * @param mixed  $value
+     * @param mixed  $interface
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allImplementsInterface($value, $interface, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::implementsInterface($entry, $interface, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template ExpectedType of object
+     * @psalm-param class-string<ExpectedType> $interface
+     * @psalm-assert iterable<class-string<ExpectedType>|null> $value
+     *
+     * @param mixed  $value
+     * @param mixed  $interface
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrImplementsInterface($value, $interface, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::implementsInterface($entry, $interface, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param class-string|object|null $classOrObject
+     *
+     * @param string|object|null $classOrObject
+     * @param mixed              $property
+     * @param string             $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrPropertyExists($classOrObject, $property, $message = '')
+    {
+        null === $classOrObject || static::propertyExists($classOrObject, $property, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param iterable<class-string|object> $classOrObject
+     *
+     * @param iterable<string|object> $classOrObject
+     * @param mixed                   $property
+     * @param string                  $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allPropertyExists($classOrObject, $property, $message = '')
+    {
+        static::isIterable($classOrObject);
+
+        foreach ($classOrObject as $entry) {
+            static::propertyExists($entry, $property, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param iterable<class-string|object|null> $classOrObject
+     *
+     * @param iterable<string|object|null> $classOrObject
+     * @param mixed                        $property
+     * @param string                       $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrPropertyExists($classOrObject, $property, $message = '')
+    {
+        static::isIterable($classOrObject);
+
+        foreach ($classOrObject as $entry) {
+            null === $entry || static::propertyExists($entry, $property, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param class-string|object|null $classOrObject
+     *
+     * @param string|object|null $classOrObject
+     * @param mixed              $property
+     * @param string             $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrPropertyNotExists($classOrObject, $property, $message = '')
+    {
+        null === $classOrObject || static::propertyNotExists($classOrObject, $property, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param iterable<class-string|object> $classOrObject
+     *
+     * @param iterable<string|object> $classOrObject
+     * @param mixed                   $property
+     * @param string                  $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allPropertyNotExists($classOrObject, $property, $message = '')
+    {
+        static::isIterable($classOrObject);
+
+        foreach ($classOrObject as $entry) {
+            static::propertyNotExists($entry, $property, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param iterable<class-string|object|null> $classOrObject
+     *
+     * @param iterable<string|object|null> $classOrObject
+     * @param mixed                        $property
+     * @param string                       $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrPropertyNotExists($classOrObject, $property, $message = '')
+    {
+        static::isIterable($classOrObject);
+
+        foreach ($classOrObject as $entry) {
+            null === $entry || static::propertyNotExists($entry, $property, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param class-string|object|null $classOrObject
+     *
+     * @param string|object|null $classOrObject
+     * @param mixed              $method
+     * @param string             $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrMethodExists($classOrObject, $method, $message = '')
+    {
+        null === $classOrObject || static::methodExists($classOrObject, $method, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param iterable<class-string|object> $classOrObject
+     *
+     * @param iterable<string|object> $classOrObject
+     * @param mixed                   $method
+     * @param string                  $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allMethodExists($classOrObject, $method, $message = '')
+    {
+        static::isIterable($classOrObject);
+
+        foreach ($classOrObject as $entry) {
+            static::methodExists($entry, $method, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param iterable<class-string|object|null> $classOrObject
+     *
+     * @param iterable<string|object|null> $classOrObject
+     * @param mixed                        $method
+     * @param string                       $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrMethodExists($classOrObject, $method, $message = '')
+    {
+        static::isIterable($classOrObject);
+
+        foreach ($classOrObject as $entry) {
+            null === $entry || static::methodExists($entry, $method, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param class-string|object|null $classOrObject
+     *
+     * @param string|object|null $classOrObject
+     * @param mixed              $method
+     * @param string             $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrMethodNotExists($classOrObject, $method, $message = '')
+    {
+        null === $classOrObject || static::methodNotExists($classOrObject, $method, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param iterable<class-string|object> $classOrObject
+     *
+     * @param iterable<string|object> $classOrObject
+     * @param mixed                   $method
+     * @param string                  $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allMethodNotExists($classOrObject, $method, $message = '')
+    {
+        static::isIterable($classOrObject);
+
+        foreach ($classOrObject as $entry) {
+            static::methodNotExists($entry, $method, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-param iterable<class-string|object|null> $classOrObject
+     *
+     * @param iterable<string|object|null> $classOrObject
+     * @param mixed                        $method
+     * @param string                       $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrMethodNotExists($classOrObject, $method, $message = '')
+    {
+        static::isIterable($classOrObject);
+
+        foreach ($classOrObject as $entry) {
+            null === $entry || static::methodNotExists($entry, $method, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param array|null $array
+     * @param string|int $key
+     * @param string     $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrKeyExists($array, $key, $message = '')
+    {
+        null === $array || static::keyExists($array, $key, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<array> $array
+     * @param string|int      $key
+     * @param string          $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allKeyExists($array, $key, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            static::keyExists($entry, $key, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<array|null> $array
+     * @param string|int           $key
+     * @param string               $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrKeyExists($array, $key, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            null === $entry || static::keyExists($entry, $key, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param array|null $array
+     * @param string|int $key
+     * @param string     $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrKeyNotExists($array, $key, $message = '')
+    {
+        null === $array || static::keyNotExists($array, $key, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<array> $array
+     * @param string|int      $key
+     * @param string          $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allKeyNotExists($array, $key, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            static::keyNotExists($entry, $key, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<array|null> $array
+     * @param string|int           $key
+     * @param string               $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrKeyNotExists($array, $key, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            null === $entry || static::keyNotExists($entry, $key, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert array-key|null $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrValidArrayKey($value, $message = '')
+    {
+        null === $value || static::validArrayKey($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<array-key> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allValidArrayKey($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::validArrayKey($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<array-key|null> $value
+     *
+     * @param mixed  $value
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrValidArrayKey($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::validArrayKey($entry, $message);
+        }
+    }
+
+    /**
+     * @param Countable|array|null $array
+     * @param int                  $number
+     * @param string               $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrCount($array, $number, $message = '')
+    {
+        null === $array || static::count($array, $number, $message);
+    }
+
+    /**
+     * @param iterable<Countable|array> $array
+     * @param int                       $number
+     * @param string                    $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allCount($array, $number, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            static::count($entry, $number, $message);
+        }
+    }
+
+    /**
+     * @param iterable<Countable|array|null> $array
+     * @param int                            $number
+     * @param string                         $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrCount($array, $number, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            null === $entry || static::count($entry, $number, $message);
+        }
+    }
+
+    /**
+     * @param Countable|array|null $array
+     * @param int|float            $min
+     * @param string               $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrMinCount($array, $min, $message = '')
+    {
+        null === $array || static::minCount($array, $min, $message);
+    }
+
+    /**
+     * @param iterable<Countable|array> $array
+     * @param int|float                 $min
+     * @param string                    $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allMinCount($array, $min, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            static::minCount($entry, $min, $message);
+        }
+    }
+
+    /**
+     * @param iterable<Countable|array|null> $array
+     * @param int|float                      $min
+     * @param string                         $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrMinCount($array, $min, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            null === $entry || static::minCount($entry, $min, $message);
+        }
+    }
+
+    /**
+     * @param Countable|array|null $array
+     * @param int|float            $max
+     * @param string               $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrMaxCount($array, $max, $message = '')
+    {
+        null === $array || static::maxCount($array, $max, $message);
+    }
+
+    /**
+     * @param iterable<Countable|array> $array
+     * @param int|float                 $max
+     * @param string                    $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allMaxCount($array, $max, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            static::maxCount($entry, $max, $message);
+        }
+    }
+
+    /**
+     * @param iterable<Countable|array|null> $array
+     * @param int|float                      $max
+     * @param string                         $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrMaxCount($array, $max, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            null === $entry || static::maxCount($entry, $max, $message);
+        }
+    }
+
+    /**
+     * @param Countable|array|null $array
+     * @param int|float            $min
+     * @param int|float            $max
+     * @param string               $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrCountBetween($array, $min, $max, $message = '')
+    {
+        null === $array || static::countBetween($array, $min, $max, $message);
+    }
+
+    /**
+     * @param iterable<Countable|array> $array
+     * @param int|float                 $min
+     * @param int|float                 $max
+     * @param string                    $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allCountBetween($array, $min, $max, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            static::countBetween($entry, $min, $max, $message);
+        }
+    }
+
+    /**
+     * @param iterable<Countable|array|null> $array
+     * @param int|float                      $min
+     * @param int|float                      $max
+     * @param string                         $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrCountBetween($array, $min, $max, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            null === $entry || static::countBetween($entry, $min, $max, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert list|null $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsList($array, $message = '')
+    {
+        null === $array || static::isList($array, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<list> $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsList($array, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            static::isList($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<list|null> $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsList($array, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            null === $entry || static::isList($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert non-empty-list|null $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsNonEmptyList($array, $message = '')
+    {
+        null === $array || static::isNonEmptyList($array, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<non-empty-list> $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsNonEmptyList($array, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            static::isNonEmptyList($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-assert iterable<non-empty-list|null> $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsNonEmptyList($array, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            null === $entry || static::isNonEmptyList($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template T
+     * @psalm-param mixed|array<T>|null $array
+     * @psalm-assert array<string, T>|null $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsMap($array, $message = '')
+    {
+        null === $array || static::isMap($array, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template T
+     * @psalm-param iterable<mixed|array<T>> $array
+     * @psalm-assert iterable<array<string, T>> $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsMap($array, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            static::isMap($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template T
+     * @psalm-param iterable<mixed|array<T>|null> $array
+     * @psalm-assert iterable<array<string, T>|null> $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsMap($array, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            null === $entry || static::isMap($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template T
+     * @psalm-param mixed|array<T>|null $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrIsNonEmptyMap($array, $message = '')
+    {
+        null === $array || static::isNonEmptyMap($array, $message);
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template T
+     * @psalm-param iterable<mixed|array<T>> $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allIsNonEmptyMap($array, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            static::isNonEmptyMap($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     * @psalm-template T
+     * @psalm-param iterable<mixed|array<T>|null> $array
+     * @psalm-assert iterable<array<string, T>|null> $array
+     * @psalm-assert iterable<!empty|null> $array
+     *
+     * @param mixed  $array
+     * @param string $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrIsNonEmptyMap($array, $message = '')
+    {
+        static::isIterable($array);
+
+        foreach ($array as $entry) {
+            null === $entry || static::isNonEmptyMap($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param string|null $value
+     * @param string      $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrUuid($value, $message = '')
+    {
+        null === $value || static::uuid($value, $message);
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string> $value
+     * @param string           $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allUuid($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            static::uuid($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-pure
+     *
+     * @param iterable<string|null> $value
+     * @param string                $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrUuid($value, $message = '')
+    {
+        static::isIterable($value);
+
+        foreach ($value as $entry) {
+            null === $entry || static::uuid($entry, $message);
+        }
+    }
+
+    /**
+     * @psalm-param class-string<Throwable> $class
+     *
+     * @param Closure|null $expression
+     * @param string       $class
+     * @param string       $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function nullOrThrows($expression, $class = 'Exception', $message = '')
+    {
+        null === $expression || static::throws($expression, $class, $message);
+    }
+
+    /**
+     * @psalm-param class-string<Throwable> $class
+     *
+     * @param iterable<Closure> $expression
+     * @param string            $class
+     * @param string            $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allThrows($expression, $class = 'Exception', $message = '')
+    {
+        static::isIterable($expression);
+
+        foreach ($expression as $entry) {
+            static::throws($entry, $class, $message);
+        }
+    }
+
+    /**
+     * @psalm-param class-string<Throwable> $class
+     *
+     * @param iterable<Closure|null> $expression
+     * @param string                 $class
+     * @param string                 $message
+     *
+     * @throws InvalidArgumentException
+     *
+     * @return void
+     */
+    public static function allNullOrThrows($expression, $class = 'Exception', $message = '')
+    {
+        static::isIterable($expression);
+
+        foreach ($expression as $entry) {
+            null === $entry || static::throws($entry, $class, $message);
+        }
+    }
+}
diff --git a/web/modules/simplesamlphp_auth/composer.json b/web/modules/simplesamlphp_auth/composer.json
index 51bd14a854319f59bef7a3f3c6eae9ef353ac072..89cad7895960071e0471bd4aa36d4773ebf00471 100644
--- a/web/modules/simplesamlphp_auth/composer.json
+++ b/web/modules/simplesamlphp_auth/composer.json
@@ -5,8 +5,8 @@
     "license": "GPL-2.0+",
     "homepage": "https://www.drupal.org/project/simplesamlphp_auth",
     "require": {
-        "drupal/externalauth": "^1.1",
-        "simplesamlphp/simplesamlphp": "^1.18.2",
-        "drupal/core": "^8.7|^9.0"
+        "drupal/externalauth": "^1.1||^2.0",
+        "simplesamlphp/simplesamlphp": "^1.18.2||^1.19",
+        "drupal/core": "^8.7||^9.0"
     }
 }
diff --git a/web/modules/simplesamlphp_auth/simplesamlphp_auth.info.yml b/web/modules/simplesamlphp_auth/simplesamlphp_auth.info.yml
index bdada5b9e7c143ab63220cbe84f74f4da8aacacb..5d88a96a9c88c5182a8939c4b9f258a978caf368 100644
--- a/web/modules/simplesamlphp_auth/simplesamlphp_auth.info.yml
+++ b/web/modules/simplesamlphp_auth/simplesamlphp_auth.info.yml
@@ -8,7 +8,7 @@ dependencies:
  - drupal:user
  - externalauth:externalauth
 
-# Information added by Drupal.org packaging script on 2020-01-30
-version: '8.x-3.2'
+# Information added by Drupal.org packaging script on 2022-08-16
+version: '8.x-3.3'
 project: 'simplesamlphp_auth'
-datestamp: 1580423955
+datestamp: 1660687556
diff --git a/web/modules/simplesamlphp_auth/simplesamlphp_auth.module b/web/modules/simplesamlphp_auth/simplesamlphp_auth.module
index 1f4783cbbe04bf7b32938df4582db412ab36c659..fc6f828fd7162d39d59980d42e008acf318f0bf9 100644
--- a/web/modules/simplesamlphp_auth/simplesamlphp_auth.module
+++ b/web/modules/simplesamlphp_auth/simplesamlphp_auth.module
@@ -109,7 +109,7 @@ function simplesamlphp_auth_form_user_form_alter(&$form, FormStateInterface $for
   // e-mail address, and set a Drupal password if they want to
   // (and are allowed).
   $account = $form_state->getFormObject()->getEntity();
-  $saml_enabled = $authmap->get($account->id(), 'simplesamlphp_auth');
+  $saml_enabled = $account->id() && $authmap->get($account->id(), 'simplesamlphp_auth');
 
   if ($saml_enabled) {
     $form['simplesamlphp_auth_user_enable']['#default_value'] = TRUE;
diff --git a/web/modules/simplesamlphp_auth/tests/simplesamlphp_auth_test/simplesamlphp_auth_test.info.yml b/web/modules/simplesamlphp_auth/tests/simplesamlphp_auth_test/simplesamlphp_auth_test.info.yml
index 4f88bcba9e9079b8ef73b77a73c4c8a534411b0a..ed444ce0cbf882c8699049fe58ee23b95c510dde 100644
--- a/web/modules/simplesamlphp_auth/tests/simplesamlphp_auth_test/simplesamlphp_auth_test.info.yml
+++ b/web/modules/simplesamlphp_auth/tests/simplesamlphp_auth_test/simplesamlphp_auth_test.info.yml
@@ -2,11 +2,12 @@ name: 'SimpleSAMLPHP Authentication Test module'
 type: module
 description: 'Support module for SimpleSAMLPHP Authentication tests'
 core: 8.x
+core_version_requirement: ^8 || ^9
 dependencies:
   - drupal:user
 hidden: true
 
-# Information added by Drupal.org packaging script on 2020-01-30
-version: '8.x-3.2'
+# Information added by Drupal.org packaging script on 2022-08-16
+version: '8.x-3.3'
 project: 'simplesamlphp_auth'
-datestamp: 1580423955
+datestamp: 1660687556
diff --git a/web/modules/simplesamlphp_auth/tests/src/Unit/Service/SimplesamlphpAuthManagerTest.php b/web/modules/simplesamlphp_auth/tests/src/Unit/Service/SimplesamlphpAuthManagerTest.php
index 3642287a4a147fe2ae6287bb7f5a3535dd658043..3cb5e8f7200211ab546ddb36cda15ff5bf895b74 100644
--- a/web/modules/simplesamlphp_auth/tests/src/Unit/Service/SimplesamlphpAuthManagerTest.php
+++ b/web/modules/simplesamlphp_auth/tests/src/Unit/Service/SimplesamlphpAuthManagerTest.php
@@ -7,6 +7,7 @@
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Tests\UnitTestCase;
 use Drupal\simplesamlphp_auth\Service\SimplesamlphpAuthManager;
+use Drupal\simplesamlphp_auth\Exception\SimplesamlphpAttributeException;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use SimpleSAML\Auth\Simple;
@@ -272,12 +273,10 @@ public function testAttributes() {
    *
    * @covers ::__construct
    * @covers ::getAttribute
-   *
-   * @expectedException \Drupal\simplesamlphp_auth\Exception\SimplesamlphpAttributeException
-   *
-   * @expectedExceptionMessage Error in simplesamlphp_auth.module: no valid "name" attribute set.
    */
   public function testAttributesException() {
+    $this->expectException(SimplesamlphpAttributeException::class);
+    $this->expectExceptionMessage('Error in simplesamlphp_auth.module: no valid "name" attribute set.');
     // Set expectations for instance.
     $this->instance->expects($this->any())
       ->method('getAttributes')